Attachment "halfclose-4.patch" to
ticket [219159ffff]
added by
ferrieux
2008-12-01 22:44:29.
0000: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 Index: generic/t
0010: 63 6c 2e 64 65 63 6c 73 0a 3d 3d 3d 3d 3d 3d 3d cl.decls.=======
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 ============.RCS
0060: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f file: /cvsroot/
0070: 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f tcl/tcl/generic/
0080: 74 63 6c 2e 64 65 63 6c 73 2c 76 0a 72 65 74 72 tcl.decls,v.retr
0090: 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 ieving revision
00a0: 31 2e 31 35 34 0a 64 69 66 66 20 2d 75 20 2d 72 1.154.diff -u -r
00b0: 31 2e 31 35 34 20 74 63 6c 2e 64 65 63 6c 73 0a 1.154 tcl.decls.
00c0: 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 2e --- generic/tcl.
00d0: 64 65 63 6c 73 09 31 37 20 4e 6f 76 20 32 30 30 decls.17 Nov 200
00e0: 38 20 32 32 3a 31 35 3a 33 34 20 2d 30 30 30 30 8 22:15:34 -0000
00f0: 09 31 2e 31 35 34 0a 2b 2b 2b 20 67 65 6e 65 72 .1.154.+++ gener
0100: 69 63 2f 74 63 6c 2e 64 65 63 6c 73 09 31 20 44 ic/tcl.decls.1 D
0110: 65 63 20 32 30 30 38 20 31 35 3a 32 39 3a 35 39 ec 2008 15:29:59
0120: 20 2d 30 30 30 30 0a 40 40 20 2d 32 32 30 34 2c -0000.@@ -2204,
0130: 36 20 2b 32 32 30 34 2c 31 31 20 40 40 0a 20 09 6 +2204,11 @@. .
0140: 20 20 20 20 69 6e 74 20 2a 6f 62 6a 63 50 74 72 int *objcPtr
0150: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
0160: 20 2a 6f 62 6a 76 2c 20 54 63 6c 5f 4f 62 6a 20 *objv, Tcl_Obj
0170: 2a 2a 2a 72 65 6d 4f 62 6a 76 29 0a 20 7d 0a 20 ***remObjv). }.
0180: 0a 2b 23 20 54 49 50 23 33 33 32 2c 20 48 61 6c .+# TIP#332, Hal
0190: 66 20 43 6c 6f 73 65 20 6d 61 64 65 20 70 75 62 f Close made pub
01a0: 6c 69 63 0a 2b 64 65 63 6c 61 72 65 20 36 30 35 lic.+declare 605
01b0: 20 67 65 6e 65 72 69 63 20 7b 0a 2b 20 20 20 20 generic {.+
01c0: 69 6e 74 20 54 63 6c 5f 43 6c 6f 73 65 45 78 28 int Tcl_CloseEx(
01d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
01e0: 72 70 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 rp, Tcl_Channel
01f0: 63 68 61 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 chan, int flags)
0200: 0a 2b 7d 0a 2b 0a 20 23 23 23 23 23 23 23 23 23 .+}.+. #########
0210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0250: 23 23 23 23 23 0a 20 0a 20 23 20 44 65 66 69 6e #####. . # Defin
0260: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 73 e the platform s
0270: 70 65 63 69 66 69 63 20 70 75 62 6c 69 63 20 54 pecific public T
0280: 63 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 cl interface. T
0290: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 hese functions a
02a0: 72 65 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 re.Index: generi
02b0: 63 2f 74 63 6c 44 65 63 6c 73 2e 68 0a 3d 3d 3d c/tclDecls.h.===
02c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
02d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
02e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
02f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0300: 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 .RCS file: /cvsr
0310: 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 oot/tcl/tcl/gene
0320: 72 69 63 2f 74 63 6c 44 65 63 6c 73 2e 68 2c 76 ric/tclDecls.h,v
0330: 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65 76 69 .retrieving revi
0340: 73 69 6f 6e 20 31 2e 31 35 36 0a 64 69 66 66 20 sion 1.156.diff
0350: 2d 75 20 2d 72 31 2e 31 35 36 20 74 63 6c 44 65 -u -r1.156 tclDe
0360: 63 6c 73 2e 68 0a 2d 2d 2d 20 67 65 6e 65 72 69 cls.h.--- generi
0370: 63 2f 74 63 6c 44 65 63 6c 73 2e 68 09 31 37 20 c/tclDecls.h.17
0380: 4e 6f 76 20 32 30 30 38 20 32 32 3a 31 35 3a 33 Nov 2008 22:15:3
0390: 34 20 2d 30 30 30 30 09 31 2e 31 35 36 0a 2b 2b 4 -0000.1.156.++
03a0: 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 44 65 63 + generic/tclDec
03b0: 6c 73 2e 68 09 31 20 44 65 63 20 32 30 30 38 20 ls.h.1 Dec 2008
03c0: 31 35 3a 32 39 3a 35 39 20 2d 30 30 30 30 0a 40 15:29:59 -0000.@
03d0: 40 20 2d 33 36 35 37 2c 36 20 2b 33 36 35 37 2c @ -3657,6 +3657,
03e0: 31 32 20 40 40 0a 20 09 09 09 09 63 6f 6e 73 74 12 @@. ....const
03f0: 20 54 63 6c 5f 41 72 67 76 49 6e 66 6f 20 2a 20 Tcl_ArgvInfo *
0400: 61 72 67 54 61 62 6c 65 2c 20 69 6e 74 20 2a 20 argTable, int *
0410: 6f 62 6a 63 50 74 72 2c 0a 20 09 09 09 09 54 63 objcPtr,. ....Tc
0420: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 20 6f l_Obj *const * o
0430: 62 6a 76 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a bjv, Tcl_Obj ***
0440: 20 72 65 6d 4f 62 6a 76 29 3b 0a 20 23 65 6e 64 remObjv);. #end
0450: 69 66 0a 2b 23 69 66 6e 64 65 66 20 54 63 6c 5f if.+#ifndef Tcl_
0460: 43 6c 6f 73 65 45 78 5f 54 43 4c 5f 44 45 43 4c CloseEx_TCL_DECL
0470: 41 52 45 44 0a 2b 23 64 65 66 69 6e 65 20 54 63 ARED.+#define Tc
0480: 6c 5f 43 6c 6f 73 65 45 78 5f 54 43 4c 5f 44 45 l_CloseEx_TCL_DE
0490: 43 4c 41 52 45 44 0a 2b 2f 2a 20 36 30 35 20 2a CLARED.+/* 605 *
04a0: 2f 0a 2b 45 58 54 45 52 4e 20 69 6e 74 09 09 54 /.+EXTERN int..T
04b0: 63 6c 5f 43 6c 6f 73 65 45 78 20 28 54 63 6c 5f cl_CloseEx (Tcl_
04c0: 49 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c Interp * interp,
04d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
04e0: 6e 2c 0a 2b 09 09 09 09 69 6e 74 20 66 6c 61 67 n,.+....int flag
04f0: 73 29 3b 0a 2b 23 65 6e 64 69 66 0a 20 0a 20 74 s);.+#endif. . t
0500: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 63 ypedef struct Tc
0510: 6c 53 74 75 62 48 6f 6f 6b 73 20 7b 0a 20 20 20 lStubHooks {.
0520: 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 54 const struct T
0530: 63 6c 50 6c 61 74 53 74 75 62 73 20 2a 74 63 6c clPlatStubs *tcl
0540: 50 6c 61 74 53 74 75 62 73 3b 0a 40 40 20 2d 34 PlatStubs;.@@ -4
0550: 33 32 31 2c 36 20 2b 34 33 32 37 2c 37 20 40 40 321,6 +4327,7 @@
0560: 0a 20 20 20 20 20 69 6e 74 20 28 2a 74 63 6c 5f . int (*tcl_
0570: 53 65 74 45 6e 73 65 6d 62 6c 65 50 61 72 61 6d SetEnsembleParam
0580: 65 74 65 72 4c 69 73 74 29 20 28 54 63 6c 5f 49 eterList) (Tcl_I
0590: 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 nterp * interp,
05a0: 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 Tcl_Command toke
05b0: 6e 2c 20 54 63 6c 5f 4f 62 6a 20 2a 20 70 61 72 n, Tcl_Obj * par
05c0: 61 6d 4c 69 73 74 29 3b 20 2f 2a 20 36 30 32 20 amList); /* 602
05d0: 2a 2f 0a 20 20 20 20 20 69 6e 74 20 28 2a 74 63 */. int (*tc
05e0: 6c 5f 47 65 74 45 6e 73 65 6d 62 6c 65 50 61 72 l_GetEnsemblePar
05f0: 61 6d 65 74 65 72 4c 69 73 74 29 20 28 54 63 6c ameterList) (Tcl
0600: 5f 49 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 _Interp * interp
0610: 2c 20 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f , Tcl_Command to
0620: 6b 65 6e 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 20 ken, Tcl_Obj **
0630: 70 61 72 61 6d 4c 69 73 74 50 74 72 29 3b 20 2f paramListPtr); /
0640: 2a 20 36 30 33 20 2a 2f 0a 20 20 20 20 20 69 6e * 603 */. in
0650: 74 20 28 2a 74 63 6c 5f 50 61 72 73 65 41 72 67 t (*tcl_ParseArg
0660: 73 4f 62 6a 76 29 20 28 54 63 6c 5f 49 6e 74 65 sObjv) (Tcl_Inte
0670: 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 63 6f 6e rp * interp, con
0680: 73 74 20 54 63 6c 5f 41 72 67 76 49 6e 66 6f 20 st Tcl_ArgvInfo
0690: 2a 20 61 72 67 54 61 62 6c 65 2c 20 69 6e 74 20 * argTable, int
06a0: 2a 20 6f 62 6a 63 50 74 72 2c 20 54 63 6c 5f 4f * objcPtr, Tcl_O
06b0: 62 6a 20 2a 63 6f 6e 73 74 20 2a 20 6f 62 6a 76 bj *const * objv
06c0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 20 72 65 , Tcl_Obj *** re
06d0: 6d 4f 62 6a 76 29 3b 20 2f 2a 20 36 30 34 20 2a mObjv); /* 604 *
06e0: 2f 0a 2b 20 20 20 20 69 6e 74 20 28 2a 74 63 6c /.+ int (*tcl
06f0: 5f 43 6c 6f 73 65 45 78 29 20 28 54 63 6c 5f 49 _CloseEx) (Tcl_I
0700: 6e 74 65 72 70 20 2a 20 69 6e 74 65 72 70 2c 20 nterp * interp,
0710: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
0720: 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 20 2f 2a , int flags); /*
0730: 20 36 30 35 20 2a 2f 0a 20 7d 20 54 63 6c 53 74 605 */. } TclSt
0740: 75 62 73 3b 0a 20 0a 20 23 69 66 20 64 65 66 69 ubs;. . #if defi
0750: 6e 65 64 28 55 53 45 5f 54 43 4c 5f 53 54 55 42 ned(USE_TCL_STUB
0760: 53 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 S) && !defined(U
0770: 53 45 5f 54 43 4c 5f 53 54 55 42 5f 50 52 4f 43 SE_TCL_STUB_PROC
0780: 53 29 0a 40 40 20 2d 36 38 31 33 2c 36 20 2b 36 S).@@ -6813,6 +6
0790: 38 32 30 2c 31 30 20 40 40 0a 20 23 64 65 66 69 820,10 @@. #defi
07a0: 6e 65 20 54 63 6c 5f 50 61 72 73 65 41 72 67 73 ne Tcl_ParseArgs
07b0: 4f 62 6a 76 20 5c 0a 20 09 28 74 63 6c 53 74 75 Objv \. .(tclStu
07c0: 62 73 50 74 72 2d 3e 74 63 6c 5f 50 61 72 73 65 bsPtr->tcl_Parse
07d0: 41 72 67 73 4f 62 6a 76 29 20 2f 2a 20 36 30 34 ArgsObjv) /* 604
07e0: 20 2a 2f 0a 20 23 65 6e 64 69 66 0a 2b 23 69 66 */. #endif.+#if
07f0: 6e 64 65 66 20 54 63 6c 5f 43 6c 6f 73 65 45 78 ndef Tcl_CloseEx
0800: 0a 2b 23 64 65 66 69 6e 65 20 54 63 6c 5f 43 6c .+#define Tcl_Cl
0810: 6f 73 65 45 78 20 5c 0a 2b 09 28 74 63 6c 53 74 oseEx \.+.(tclSt
0820: 75 62 73 50 74 72 2d 3e 74 63 6c 5f 43 6c 6f 73 ubsPtr->tcl_Clos
0830: 65 45 78 29 20 2f 2a 20 36 30 35 20 2a 2f 0a 2b eEx) /* 605 */.+
0840: 23 65 6e 64 69 66 0a 20 0a 20 23 65 6e 64 69 66 #endif. . #endif
0850: 20 2f 2a 20 64 65 66 69 6e 65 64 28 55 53 45 5f /* defined(USE_
0860: 54 43 4c 5f 53 54 55 42 53 29 20 26 26 20 21 64 TCL_STUBS) && !d
0870: 65 66 69 6e 65 64 28 55 53 45 5f 54 43 4c 5f 53 efined(USE_TCL_S
0880: 54 55 42 5f 50 52 4f 43 53 29 20 2a 2f 0a 20 0a TUB_PROCS) */. .
0890: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 Index: generic/t
08a0: 63 6c 49 4f 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d clIO.c.=========
08b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
08c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
08d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
08e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 ==========.RCS f
08f0: 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 ile: /cvsroot/tc
0900: 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f 74 63 l/tcl/generic/tc
0910: 6c 49 4f 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 lIO.c,v.retrievi
0920: 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 35 ng revision 1.15
0930: 30 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 31 35 0.diff -u -r1.15
0940: 30 20 74 63 6c 49 4f 2e 63 0a 2d 2d 2d 20 67 65 0 tclIO.c.--- ge
0950: 6e 65 72 69 63 2f 74 63 6c 49 4f 2e 63 09 32 35 neric/tclIO.c.25
0960: 20 4e 6f 76 20 32 30 30 38 20 32 33 3a 31 39 3a Nov 2008 23:19:
0970: 30 31 20 2d 30 30 30 30 09 31 2e 31 35 30 0a 2b 01 -0000.1.150.+
0980: 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 49 4f ++ generic/tclIO
0990: 2e 63 09 31 20 44 65 63 20 32 30 30 38 20 31 35 .c.1 Dec 2008 15
09a0: 3a 33 30 3a 30 30 20 2d 30 30 30 30 0a 40 40 20 :30:00 -0000.@@
09b0: 2d 33 30 32 38 2c 36 20 2b 33 30 32 38 2c 31 33 -3028,6 +3028,13
09c0: 37 20 40 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 7 @@. /*. *----
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 0a 20 20 2a 0a 2b 20 2a 20 54 63 6c 5f 43 --. *.+ * Tcl_C
0a20: 6c 6f 73 65 45 78 20 2d 2d 0a 2b 20 2a 0a 2b 20 loseEx --.+ *.+
0a30: 2a 09 48 61 6c 66 20 63 6c 6f 73 65 73 20 61 20 *.Half closes a
0a40: 63 68 61 6e 6e 65 6c 2e 0a 2b 20 2a 0a 2b 20 2a channel..+ *.+ *
0a50: 20 52 65 73 75 6c 74 73 3a 0a 2b 20 2a 09 41 20 Results:.+ *.A
0a60: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
0a70: 75 6c 74 2e 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 ult..+ *.+ * Sid
0a80: 65 20 65 66 66 65 63 74 73 3a 0a 2b 20 2a 09 43 e effects:.+ *.C
0a90: 6c 6f 73 65 73 20 6f 6e 65 20 64 69 72 65 63 74 loses one direct
0aa0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 6e ion of the chann
0ab0: 65 6c 2e 0a 2b 20 2a 0a 2b 20 2a 20 4e 4f 54 45 el..+ *.+ * NOTE
0ac0: 3a 0a 2b 20 2a 09 54 63 6c 5f 43 6c 6f 73 65 45 :.+ *.Tcl_CloseE
0ad0: 78 20 63 6c 6f 73 65 73 20 74 68 65 20 73 70 65 x closes the spe
0ae0: 63 69 66 69 65 64 20 64 69 72 65 63 74 69 6f 6e cified direction
0af0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 of the channel
0b00: 61 73 20 66 61 72 20 61 73 0a 2b 20 2a 09 74 68 as far as.+ *.th
0b10: 65 20 75 73 65 72 20 69 73 20 63 6f 6e 63 65 72 e user is concer
0b20: 6e 65 64 2e 20 54 68 65 20 63 68 61 6e 6e 65 6c ned. The channel
0b30: 20 6b 65 65 70 73 20 65 78 69 73 74 69 6e 67 20 keeps existing
0b40: 68 6f 77 65 76 65 72 2e 20 59 6f 75 20 63 61 6e however. You can
0b50: 6e 6f 74 0a 2b 20 2a 09 63 61 6c 6c 73 20 74 68 not.+ *.calls th
0b60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 is function to c
0b70: 6c 6f 73 65 20 74 68 65 20 6c 61 73 74 20 70 6f lose the last po
0b80: 73 73 69 62 6c 65 20 64 69 72 65 63 74 69 6f 6e ssible direction
0b90: 20 6f 66 20 74 68 65 0a 2b 20 2a 09 63 68 61 6e of the.+ *.chan
0ba0: 6e 65 6c 2e 20 55 73 65 20 54 63 6c 5f 43 6c 6f nel. Use Tcl_Clo
0bb0: 73 65 20 66 6f 72 20 74 68 61 74 2e 0a 2b 20 2a se for that..+ *
0bc0: 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .+ *------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f 0a ----------.+ */.
0c10: 2b 0a 2b 09 2f 2a 20 41 52 47 53 55 53 45 44 20 +.+./* ARGSUSED
0c20: 2a 2f 0a 2b 69 6e 74 0a 2b 54 63 6c 5f 43 6c 6f */.+int.+Tcl_Clo
0c30: 73 65 45 78 28 0a 2b 20 20 20 20 54 63 6c 5f 49 seEx(.+ Tcl_I
0c40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
0c50: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 66 /* Interpreter f
0c60: 6f 72 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 2b 20 or errors. */.+
0c70: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
0c80: 68 61 6e 2c 09 09 2f 2a 20 54 68 65 20 63 68 61 han,../* The cha
0c90: 6e 6e 65 6c 20 62 65 69 6e 67 20 63 6c 6f 73 65 nnel being close
0ca0: 64 2e 20 4d 61 79 20 73 74 69 6c 6c 20 62 65 20 d. May still be
0cb0: 75 73 65 64 20 62 79 20 73 6f 6d 65 20 69 6e 74 used by some int
0cc0: 65 72 70 72 65 74 65 72 20 2a 2f 0a 2b 20 20 20 erpreter */.+
0cd0: 20 69 6e 74 20 66 6c 61 67 73 29 20 20 20 20 20 int flags)
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
0cf0: 46 6c 61 67 73 20 74 65 6c 6c 69 6e 67 20 75 73 Flags telling us
0d00: 20 77 68 69 63 68 20 73 69 64 65 20 74 6f 20 63 which side to c
0d10: 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b 0a 2b 20 20 20 lose. */.+{.+
0d20: 20 43 68 61 6e 6e 65 6c 20 2a 63 68 61 6e 50 74 Channel *chanPt
0d30: 72 3b 09 09 2f 2a 20 54 68 65 20 72 65 61 6c 20 r;../* The real
0d40: 49 4f 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b IO channel. */.+
0d50: 20 20 20 20 43 68 61 6e 6e 65 6c 53 74 61 74 65 ChannelState
0d60: 20 2a 73 74 61 74 65 50 74 72 3b 09 2f 2a 20 53 *statePtr;./* S
0d70: 74 61 74 65 20 6f 66 20 72 65 61 6c 20 49 4f 20 tate of real IO
0d80: 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b 20 20 20 channel. */.+
0d90: 20 69 6e 74 20 72 65 73 75 6c 74 3b 09 09 09 2f int result;.../
0da0: 2a 20 4f 66 20 63 61 6c 6c 69 6e 67 20 46 6c 75 * Of calling Flu
0db0: 73 68 43 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2b 0a shChannel. */.+.
0dc0: 2b 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d + if (chan ==
0dd0: 20 4e 55 4c 4c 29 20 7b 0a 2b 09 72 65 74 75 72 NULL) {.+.retur
0de0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 2b 20 20 20 20 7d n TCL_OK;.+ }
0df0: 0a 2b 0a 2b 20 20 20 20 2f 2a 20 54 4f 44 4f 3a .+.+ /* TODO:
0e00: 20 61 73 73 65 72 74 20 66 6c 61 67 73 20 76 61 assert flags va
0e10: 6c 69 64 69 74 79 20 3f 20 2a 2f 0a 2b 0a 2b 20 lidity ? */.+.+
0e20: 20 20 20 63 68 61 6e 50 74 72 20 3d 20 28 43 68 chanPtr = (Ch
0e30: 61 6e 6e 65 6c 20 2a 29 20 63 68 61 6e 3b 0a 2b annel *) chan;.+
0e40: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 63 statePtr = c
0e50: 68 61 6e 50 74 72 2d 3e 73 74 61 74 65 3b 0a 2b hanPtr->state;.+
0e60: 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a .+ /*.+ *
0e70: 20 44 6f 65 73 20 74 68 65 20 63 68 61 6e 6e 65 Does the channe
0e80: 6c 20 73 75 70 70 6f 72 74 20 68 61 6c 66 2d 63 l support half-c
0e90: 6c 6f 73 65 20 61 6e 79 77 61 79 20 3f 20 45 72 lose anyway ? Er
0ea0: 72 6f 72 20 69 66 20 6e 6f 74 2e 0a 2b 20 20 20 ror if not..+
0eb0: 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28 */.+.+ if (
0ec0: 21 63 68 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 !chanPtr->typePt
0ed0: 72 2d 3e 63 6c 6f 73 65 32 50 72 6f 63 29 20 7b r->close2Proc) {
0ee0: 0a 2b 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 .+.Tcl_AppendRes
0ef0: 75 6c 74 20 28 69 6e 74 65 72 70 2c 20 22 48 61 ult (interp, "Ha
0f00: 6c 66 2d 63 6c 6f 73 65 20 6f 66 20 63 68 61 6e lf-close of chan
0f10: 6e 65 6c 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 nels not support
0f20: 65 64 20 62 79 20 22 2c 0a 2b 09 09 09 20 20 63 ed by ",.+... c
0f30: 68 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 72 2d hanPtr->typePtr-
0f40: 3e 74 79 70 65 4e 61 6d 65 2c 20 22 73 22 2c 20 >typeName, "s",
0f50: 4e 55 4c 4c 29 3b 0a 2b 09 72 65 74 75 72 6e 20 NULL);.+.return
0f60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 20 20 20 20 TCL_ERROR;.+
0f70: 7d 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 }.+.+ /*.+
0f80: 20 20 2a 20 49 73 20 74 68 65 20 63 68 61 6e 6e * Is the chann
0f90: 65 6c 20 75 6e 73 74 61 63 6b 65 64 20 3f 20 49 el unstacked ? I
0fa0: 66 20 6e 6f 74 20 77 65 20 66 61 69 6c 2e 0a 2b f not we fail..+
0fb0: 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20 20 20 69 */.+.+ i
0fc0: 66 20 28 63 68 61 6e 50 74 72 20 21 3d 20 73 74 f (chanPtr != st
0fd0: 61 74 65 50 74 72 2d 3e 74 6f 70 43 68 61 6e 50 atePtr->topChanP
0fe0: 74 72 29 20 7b 0a 2b 09 54 63 6c 5f 41 70 70 65 tr) {.+.Tcl_Appe
0ff0: 6e 64 52 65 73 75 6c 74 20 28 69 6e 74 65 72 70 ndResult (interp
1000: 2c 0a 2b 09 09 09 20 20 22 48 61 6c 66 2d 63 6c ,.+... "Half-cl
1010: 6f 73 65 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 ose not applicab
1020: 6c 65 20 74 6f 20 73 74 61 63 6b 20 6f 66 20 74 le to stack of t
1030: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 22 2c ransformations",
1040: 0a 2b 09 09 09 20 20 4e 55 4c 4c 29 3b 0a 2b 09 .+... NULL);.+.
1050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1060: 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 0a 2b ;.+ }.+ .+
1070: 20 20 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 43 /*.+ * C
1080: 68 65 63 6b 20 64 69 72 65 63 74 69 6f 6e 20 61 heck direction a
1090: 67 61 69 6e 73 74 20 63 68 61 6e 6e 65 6c 20 6d gainst channel m
10a0: 6f 64 65 2e 20 49 74 20 69 73 20 61 6e 20 65 72 ode. It is an er
10b0: 72 6f 72 20 69 66 20 77 65 20 74 72 79 20 74 6f ror if we try to
10c0: 20 63 6c 6f 73 65 0a 2b 20 20 20 20 20 2a 20 61 close.+ * a
10d0: 20 64 69 72 65 63 74 69 6f 6e 20 6e 6f 74 20 73 direction not s
10e0: 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 upported by the
10f0: 63 68 61 6e 6e 65 6c 20 28 61 6c 72 65 61 64 79 channel (already
1100: 20 63 6c 6f 73 65 64 2c 20 6f 72 20 6e 65 76 65 closed, or neve
1110: 72 0a 2b 20 20 20 20 20 2a 20 6f 70 65 6e 65 64 r.+ * opened
1120: 20 66 6f 72 20 74 68 61 74 20 64 69 72 65 63 74 for that direct
1130: 69 6f 6e 29 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b ion)..+ */.+
1140: 0a 2b 20 20 20 20 69 66 20 28 21 28 73 74 61 74 .+ if (!(stat
1150: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 28 54 ePtr->flags & (T
1160: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 CL_READABLE | TC
1170: 4c 5f 57 52 49 54 41 42 4c 45 29 20 26 20 66 6c L_WRITABLE) & fl
1180: 61 67 73 29 29 20 7b 0a 2b 09 63 6f 6e 73 74 20 ags)) {.+.const
1190: 63 68 61 72 20 2a 6d 73 67 3b 0a 2b 09 69 66 20 char *msg;.+.if
11a0: 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 43 4c 4f (flags & TCL_CLO
11b0: 53 45 5f 52 45 41 44 29 20 7b 0a 2b 09 20 20 20 SE_READ) {.+.
11c0: 20 6d 73 67 20 3d 20 22 72 65 61 64 22 3b 0a 2b msg = "read";.+
11d0: 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20 .} else {.+.
11e0: 6d 73 67 20 3d 20 22 77 72 69 74 65 22 3b 0a 2b msg = "write";.+
11f0: 09 7d 0a 2b 09 54 63 6c 5f 41 70 70 65 6e 64 52 .}.+.Tcl_AppendR
1200: 65 73 75 6c 74 20 28 69 6e 74 65 72 70 2c 20 22 esult (interp, "
1210: 48 61 6c 66 2d 63 6c 6f 73 65 20 6f 66 20 22 2c Half-close of ",
1220: 20 6d 73 67 2c 0a 2b 09 09 09 20 20 20 20 20 20 msg,.+...
1230: 22 2d 73 69 64 65 20 6e 6f 74 20 70 6f 73 73 69 "-side not possi
1240: 62 6c 65 2c 20 73 69 64 65 20 6e 6f 74 20 6f 70 ble, side not op
1250: 65 6e 65 64 20 6f 72 20 61 6c 72 65 61 64 79 20 ened or already
1260: 63 6c 6f 73 65 64 22 2c 0a 2b 09 09 09 20 20 20 closed",.+...
1270: 20 20 20 4e 55 4c 4c 29 3b 0a 2b 09 72 65 74 75 NULL);.+.retu
1280: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 20 rn TCL_ERROR;.+
1290: 20 20 20 7d 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b }.+.+ /*.+
12a0: 20 20 20 20 20 2a 20 41 20 75 73 65 72 20 6d 61 * A user ma
12b0: 79 20 74 72 79 20 74 6f 20 63 61 6c 6c 20 68 61 y try to call ha
12c0: 6c 66 2d 63 6c 6f 73 65 20 66 72 6f 6d 20 77 69 lf-close from wi
12d0: 74 68 69 6e 20 61 20 63 68 61 6e 6e 65 6c 20 63 thin a channel c
12e0: 6c 6f 73 65 0a 2b 20 20 20 20 20 2a 20 68 61 6e lose.+ * han
12f0: 64 6c 65 72 2e 20 54 68 61 74 20 77 6f 6e 27 74 dler. That won't
1300: 20 64 6f 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a do..+ */.+.
1310: 2b 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 + if (statePt
1320: 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 4e r->flags & CHANN
1330: 45 4c 5f 49 4e 43 4c 4f 53 45 29 20 7b 0a 2b 09 EL_INCLOSE) {.+.
1340: 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 2b 09 if (interp) {.+.
1350: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
1360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6c sult(interp, "Il
1370: 6c 65 67 61 6c 20 72 65 63 75 72 73 69 76 65 20 legal recursive
1380: 63 61 6c 6c 20 74 6f 20 63 6c 6f 73 65 20 22 0a call to close ".
1390: 2b 09 09 20 20 20 20 22 74 68 72 6f 75 67 68 20 +.. "through
13a0: 63 6c 6f 73 65 2d 68 61 6e 64 6c 65 72 20 6f 66 close-handler of
13b0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 channel", NULL)
13c0: 3b 0a 2b 09 7d 0a 2b 09 72 65 74 75 72 6e 20 54 ;.+.}.+.return T
13d0: 43 4c 5f 45 52 52 4f 52 3b 0a 2b 20 20 20 20 7d CL_ERROR;.+ }
13e0: 0a 2b 0a 2b 20 20 20 20 2f 2a 0a 2b 20 20 20 20 .+.+ /*.+
13f0: 20 2a 20 46 69 6e 61 6c 6c 79 20 64 6f 20 77 68 * Finally do wh
1400: 61 74 20 69 73 20 61 73 6b 65 64 20 6f 66 20 75 at is asked of u
1410: 73 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 s..+ */.+.+
1420: 20 20 20 72 65 73 75 6c 74 20 3d 20 63 68 61 6e result = chan
1430: 50 74 72 2d 3e 74 79 70 65 50 74 72 2d 3e 63 6c Ptr->typePtr->cl
1440: 6f 73 65 32 50 72 6f 63 28 63 68 61 6e 50 74 72 ose2Proc(chanPtr
1450: 2d 3e 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 ->instanceData,
1460: 69 6e 74 65 72 70 2c 0a 2b 09 09 09 09 09 20 20 interp,.+.....
1470: 66 6c 61 67 73 29 3b 0a 2b 0a 2b 20 20 20 20 2f flags);.+.+ /
1480: 2a 0a 2b 20 20 20 20 20 2a 20 54 49 50 20 23 32 *.+ * TIP #2
1490: 31 39 2e 0a 2b 20 20 20 20 20 2a 20 43 61 70 74 19..+ * Capt
14a0: 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 ure error messag
14b0: 65 73 20 70 75 74 20 62 79 20 74 68 65 20 64 72 es put by the dr
14c0: 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 iver into the by
14d0: 70 61 73 73 20 61 72 65 61 20 61 6e 64 20 70 75 pass area and pu
14e0: 74 0a 2b 20 20 20 20 20 2a 20 74 68 65 6d 20 69 t.+ * them i
14f0: 6e 74 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 nto the regular
1500: 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 interpreter resu
1510: 6c 74 2e 0a 2b 20 20 20 20 20 2a 0a 2b 09 20 2a lt..+ *.+. *
1520: 0a 2b 09 20 2a 20 5b 41 6c 65 78 3a 20 49 20 64 .+. * [Alex: I d
1530: 6f 6e 27 74 20 75 6e 64 65 72 73 74 61 6e 64 20 on't understand
1540: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f the comment belo
1550: 77 2e 20 54 68 65 20 68 61 6c 66 2d 63 6c 6f 73 w. The half-clos
1560: 65 20 70 72 65 73 65 72 76 65 73 20 63 68 61 6e e preserves chan
1570: 50 74 72 20 5d 0a 2b 09 20 2a 0a 2b 20 20 20 20 Ptr ].+. *.+
1580: 20 2a 20 4e 6f 74 65 73 3a 20 44 75 65 20 74 6f * Notes: Due to
1590: 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 6f the assertion o
15a0: 66 20 43 48 41 4e 4e 45 4c 5f 43 4c 4f 53 45 44 f CHANNEL_CLOSED
15b0: 20 69 6e 20 74 68 65 20 66 6c 61 67 73 0a 2b 20 in the flags.+
15c0: 20 20 20 20 2a 20 46 6c 75 73 68 43 68 61 6e 6e * FlushChann
15d0: 65 6c 28 29 20 68 61 73 20 63 61 6c 6c 65 64 20 el() has called
15e0: 43 6c 6f 73 65 43 68 61 6e 6e 65 6c 28 29 20 61 CloseChannel() a
15f0: 6e 64 20 74 68 75 73 20 66 72 65 65 64 20 61 6c nd thus freed al
1600: 6c 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 2b 20 l the channel.+
1610: 20 20 20 20 2a 20 73 74 72 75 63 74 75 72 65 73 * structures
1620: 2e 20 57 65 20 6d 75 73 74 20 6e 6f 74 20 74 72 . We must not tr
1630: 79 20 74 6f 20 61 63 63 65 73 73 20 22 63 68 61 y to access "cha
1640: 6e 22 20 61 6e 79 6d 6f 72 65 2c 20 68 65 6e 63 n" anymore, henc
1650: 65 20 74 68 65 20 4e 55 4c 4c 0a 2b 20 20 20 20 e the NULL.+
1660: 20 2a 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 74 * argument in t
1670: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 54 he call below. T
1680: 68 65 20 6f 6e 6c 79 20 70 6c 61 63 65 20 77 68 he only place wh
1690: 69 63 68 20 6d 61 79 20 73 74 69 6c 6c 20 63 6f ich may still co
16a0: 6e 74 61 69 6e 20 61 0a 2b 20 20 20 20 20 2a 20 ntain a.+ *
16b0: 6d 65 73 73 61 67 65 20 69 73 20 74 68 65 20 69 message is the i
16c0: 6e 74 65 72 70 72 65 74 65 72 20 69 74 73 65 6c nterpreter itsel
16d0: 66 2c 20 61 6e 64 20 22 43 6c 6f 73 65 43 68 61 f, and "CloseCha
16e0: 6e 6e 65 6c 22 20 6d 61 64 65 20 73 75 72 65 20 nnel" made sure
16f0: 74 6f 20 6c 69 66 74 0a 2b 20 20 20 20 20 2a 20 to lift.+ *
1700: 61 6e 79 20 63 68 61 6e 6e 65 6c 20 6d 65 73 73 any channel mess
1710: 61 67 65 20 69 74 20 67 65 6e 65 72 61 74 65 64 age it generated
1720: 20 69 6e 74 6f 20 69 74 2e 0a 2b 20 20 20 20 20 into it..+
1730: 2a 2f 0a 2b 0a 2b 20 20 20 20 69 66 20 28 54 63 */.+.+ if (Tc
1740: 6c 43 68 61 6e 43 61 75 67 68 74 45 72 72 6f 72 lChanCaughtError
1750: 42 79 70 61 73 73 28 69 6e 74 65 72 70 2c 20 4e Bypass(interp, N
1760: 55 4c 4c 29 29 20 7b 0a 2b 09 72 65 73 75 6c 74 ULL)) {.+.result
1770: 20 3d 20 45 49 4e 56 41 4c 3b 0a 2b 20 20 20 20 = EINVAL;.+
1780: 7d 0a 2b 0a 2b 20 20 20 20 69 66 20 28 72 65 73 }.+.+ if (res
1790: 75 6c 74 20 21 3d 20 30 29 20 7b 0a 2b 09 72 65 ult != 0) {.+.re
17a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
17b0: 2b 20 20 20 20 7d 0a 2b 0a 2b 09 73 74 61 74 65 + }.+.+.state
17c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 Ptr->flags &= ~(
17d0: 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 52 45 41 flags & (TCL_REA
17e0: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 DABLE | TCL_WRIT
17f0: 41 42 4c 45 29 29 3b 0a 2b 0a 2b 20 20 20 20 72 ABLE));.+.+ r
1800: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 2b 7d eturn TCL_OK;.+}
1810: 0a 2b 0c 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d .+..+/*.+ *-----
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1860: 2d 0a 2b 20 2a 0a 20 20 2a 20 54 63 6c 5f 43 6c -.+ *. * Tcl_Cl
1870: 65 61 72 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 earChannelHandle
1880: 72 73 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09 52 65 rs --. *. *.Re
1890: 6d 6f 76 65 73 20 61 6c 6c 20 63 68 61 6e 6e 65 moves all channe
18a0: 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e 64 20 65 l handlers and e
18b0: 76 65 6e 74 20 73 63 72 69 70 74 73 20 66 72 6f vent scripts fro
18c0: 6d 20 74 68 65 20 63 68 61 6e 6e 65 6c 2c 0a 49 m the channel,.I
18d0: 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74 63 ndex: generic/tc
18e0: 6c 49 4f 43 6d 64 2e 63 0a 3d 3d 3d 3d 3d 3d 3d lIOCmd.c.=======
18f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 ============.RCS
1930: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f file: /cvsroot/
1940: 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f tcl/tcl/generic/
1950: 74 63 6c 49 4f 43 6d 64 2e 63 2c 76 0a 72 65 74 tclIOCmd.c,v.ret
1960: 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e rieving revision
1970: 20 31 2e 35 39 0a 64 69 66 66 20 2d 75 20 2d 72 1.59.diff -u -r
1980: 31 2e 35 39 20 74 63 6c 49 4f 43 6d 64 2e 63 0a 1.59 tclIOCmd.c.
1990: 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 49 --- generic/tclI
19a0: 4f 43 6d 64 2e 63 09 31 36 20 4f 63 74 20 32 30 OCmd.c.16 Oct 20
19b0: 30 38 20 32 32 3a 33 34 3a 31 39 20 2d 30 30 30 08 22:34:19 -000
19c0: 30 09 31 2e 35 39 0a 2b 2b 2b 20 67 65 6e 65 72 0.1.59.+++ gener
19d0: 69 63 2f 74 63 6c 49 4f 43 6d 64 2e 63 09 31 20 ic/tclIOCmd.c.1
19e0: 44 65 63 20 32 30 30 38 20 31 35 3a 33 30 3a 30 Dec 2008 15:30:0
19f0: 30 20 2d 30 30 30 30 0a 40 40 20 2d 36 34 38 2c 0 -0000.@@ -648,
1a00: 38 20 2b 36 34 38 2c 38 20 40 40 0a 20 7b 0a 20 8 +648,8 @@. {.
1a10: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
1a20: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
1a30: 61 6e 6e 65 6c 20 74 6f 20 63 6c 6f 73 65 2e 20 annel to close.
1a40: 2a 2f 0a 20 0a 2d 20 20 20 20 69 66 20 28 6f 62 */. .- if (ob
1a50: 6a 63 20 21 3d 20 32 29 20 7b 0a 2d 09 54 63 6c jc != 2) {.-.Tcl
1a60: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
1a70: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
1a80: 63 68 61 6e 6e 65 6c 49 64 22 29 3b 0a 2b 20 20 channelId");.+
1a90: 20 20 69 66 20 28 28 6f 62 6a 63 20 21 3d 20 32 if ((objc != 2
1aa0: 29 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 29 ) && (objc != 3)
1ab0: 29 20 7b 0a 2b 09 54 63 6c 5f 57 72 6f 6e 67 4e ) {.+.Tcl_WrongN
1ac0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
1ad0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
1ae0: 49 64 20 3f 64 69 72 65 63 74 69 6f 6e 3f 22 29 Id ?direction?")
1af0: 3b 0a 20 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;. .return TCL_E
1b00: 52 52 4f 52 3b 0a 20 20 20 20 20 7d 0a 20 0a 40 RROR;. }. .@
1b10: 40 20 2d 36 35 37 2c 36 20 2b 36 35 37 2c 34 38 @ -657,6 +657,48
1b20: 20 40 40 0a 20 09 72 65 74 75 72 6e 20 54 43 4c @@. .return TCL
1b30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 7d 0a 20 _ERROR;. }.
1b40: 0a 2b 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d .+ if (objc =
1b50: 3d 20 33 29 20 7b 0a 2b 09 69 6e 74 20 6f 70 74 = 3) {.+.int opt
1b60: 69 6f 6e 49 6e 64 65 78 2c 20 64 69 72 3b 0a 2b ionIndex, dir;.+
1b70: 09 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
1b80: 61 72 20 2a 63 6f 6e 73 74 20 64 69 72 4f 70 74 ar *const dirOpt
1b90: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 2b 09 20 20 20 ions[] = {.+.
1ba0: 20 22 72 65 61 64 22 2c 20 22 77 72 69 74 65 22 "read", "write"
1bb0: 2c 20 4e 55 4c 4c 0a 2b 09 7d 3b 0a 2b 09 73 74 , NULL.+.};.+.st
1bc0: 61 74 69 63 20 69 6e 74 20 64 69 72 41 72 72 61 atic int dirArra
1bd0: 79 5b 5d 20 3d 20 7b 54 43 4c 5f 43 4c 4f 53 45 y[] = {TCL_CLOSE
1be0: 5f 52 45 41 44 2c 20 54 43 4c 5f 43 4c 4f 53 45 _READ, TCL_CLOSE
1bf0: 5f 57 52 49 54 45 7d 3b 0a 2b 0a 2b 09 2f 2a 0a _WRITE};.+.+./*.
1c00: 2b 09 20 2a 20 47 65 74 20 64 69 72 65 63 74 69 +. * Get directi
1c10: 6f 6e 20 72 65 71 75 65 73 74 65 64 20 74 6f 20 on requested to
1c20: 63 6c 6f 73 65 2c 20 61 6e 64 20 63 68 65 63 6b close, and check
1c30: 20 73 79 6e 74 61 78 2e 0a 2b 09 20 2a 2f 0a 2b syntax..+. */.+
1c40: 0a 2b 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e .+.if (Tcl_GetIn
1c50: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
1c60: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 64 69 72 4f p, objv[2], dirO
1c70: 70 74 69 6f 6e 73 2c 20 22 64 69 72 65 63 74 69 ptions, "directi
1c80: 6f 6e 22 2c 20 30 2c 0a 2b 09 09 26 6f 70 74 69 on", 0,.+..&opti
1c90: 6f 6e 49 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f onIndex) != TCL_
1ca0: 4f 4b 29 20 7b 0a 2b 09 20 20 20 20 72 65 74 75 OK) {.+. retu
1cb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 2b 09 rn TCL_ERROR;.+.
1cc0: 7d 0a 2b 09 64 69 72 20 3d 20 64 69 72 41 72 72 }.+.dir = dirArr
1cd0: 61 79 5b 6f 70 74 69 6f 6e 49 6e 64 65 78 5d 3b ay[optionIndex];
1ce0: 0a 2b 0a 2b 09 2f 2a 0a 2b 09 20 2a 20 43 68 65 .+.+./*.+. * Che
1cf0: 63 6b 20 64 69 72 65 63 74 69 6f 6e 20 61 67 61 ck direction aga
1d00: 69 6e 73 74 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 inst channel mod
1d10: 65 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f e. It is an erro
1d20: 72 20 69 66 20 77 65 20 74 72 79 20 74 6f 0a 2b r if we try to.+
1d30: 09 20 2a 20 63 6c 6f 73 65 20 61 20 64 69 72 65 . * close a dire
1d40: 63 74 69 6f 6e 20 6e 6f 74 20 73 75 70 70 6f 72 ction not suppor
1d50: 74 65 64 20 62 79 20 74 68 65 20 63 68 61 6e 6e ted by the chann
1d60: 65 6c 20 28 61 6c 72 65 61 64 79 20 63 6c 6f 73 el (already clos
1d70: 65 64 2c 20 6f 72 0a 2b 09 20 2a 20 6e 65 76 65 ed, or.+. * neve
1d80: 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 74 68 61 r opened for tha
1d90: 74 20 64 69 72 65 63 74 69 6f 6e 29 2e 0a 2b 09 t direction)..+.
1da0: 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 21 28 64 69 */.+.+.if (!(di
1db0: 72 20 26 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e r & Tcl_GetChann
1dc0: 65 6c 4d 6f 64 65 20 28 63 68 61 6e 29 29 29 20 elMode (chan)))
1dd0: 7b 0a 2b 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.+. Tcl_Appe
1de0: 6e 64 52 65 73 75 6c 74 20 28 69 6e 74 65 72 70 ndResult (interp
1df0: 2c 20 22 48 61 6c 66 2d 63 6c 6f 73 65 20 6f 66 , "Half-close of
1e00: 20 22 2c 20 64 69 72 4f 70 74 69 6f 6e 73 5b 6f ", dirOptions[o
1e10: 70 74 69 6f 6e 49 6e 64 65 78 5d 2c 0a 2b 09 09 ptionIndex],.+..
1e20: 09 20 20 20 20 20 20 22 2d 73 69 64 65 20 6e 6f . "-side no
1e30: 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 69 64 65 t possible, side
1e40: 20 6e 6f 74 20 6f 70 65 6e 65 64 20 6f 72 20 61 not opened or a
1e50: 6c 72 65 61 64 79 20 63 6c 6f 73 65 64 22 2c 0a lready closed",.
1e60: 2b 09 09 09 20 20 20 20 20 20 4e 55 4c 4c 29 3b +... NULL);
1e70: 0a 2b 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 .+. return TC
1e80: 4c 5f 45 52 52 4f 52 3b 0a 2b 09 7d 0a 2b 0a 2b L_ERROR;.+.}.+.+
1e90: 09 2f 2a 0a 2b 09 20 2a 20 53 70 65 63 69 61 6c ./*.+. * Special
1ea0: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 6e 65 65 handling is nee
1eb0: 64 65 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 ded if and only
1ec0: 69 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 6d if the channel m
1ed0: 6f 64 65 20 73 75 70 70 6f 72 74 73 0a 2b 09 20 ode supports.+.
1ee0: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 * more than the
1ef0: 64 69 72 65 63 74 69 6f 6e 20 74 6f 20 63 6c 6f direction to clo
1f00: 73 65 2e 20 42 65 63 61 75 73 65 20 69 66 20 74 se. Because if t
1f10: 68 65 20 63 6c 6f 73 65 20 74 68 65 20 6c 61 73 he close the las
1f20: 74 0a 2b 09 20 2a 20 64 69 72 65 63 74 69 6f 6e t.+. * direction
1f30: 20 73 75 70 70 70 6f 72 74 65 64 20 77 65 20 63 suppported we c
1f40: 61 6e 20 61 6e 64 20 77 69 6c 6c 20 67 6f 20 74 an and will go t
1f50: 68 72 6f 75 67 68 20 74 68 65 20 72 65 67 75 6c hrough the regul
1f60: 61 72 0a 2b 09 20 2a 20 70 72 6f 63 65 73 73 2e ar.+. * process.
1f70: 0a 2b 09 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 28 .+. */.+.+.if ((
1f80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4d 6f Tcl_GetChannelMo
1f90: 64 65 20 28 63 68 61 6e 29 20 26 20 28 54 43 4c de (chan) & (TCL
1fa0: 5f 43 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f _CLOSE_READ|TCL_
1fb0: 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 21 3d CLOSE_WRITE)) !=
1fc0: 20 64 69 72 29 20 7b 0a 2b 09 20 20 20 20 72 65 dir) {.+. re
1fd0: 74 75 72 6e 20 54 63 6c 5f 43 6c 6f 73 65 45 78 turn Tcl_CloseEx
1fe0: 20 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 (interp, chan,
1ff0: 64 69 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 3b 0a dir) != TCL_OK;.
2000: 2b 09 7d 0a 2b 20 20 20 20 7d 0a 2b 0a 20 20 20 +.}.+ }.+.
2010: 20 20 69 66 20 28 54 63 6c 5f 55 6e 72 65 67 69 if (Tcl_Unregi
2020: 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 sterChannel(inte
2030: 72 70 2c 20 63 68 61 6e 29 20 21 3d 20 54 43 4c rp, chan) != TCL
2040: 5f 4f 4b 29 20 7b 0a 20 09 2f 2a 0a 20 09 20 2a _OK) {. ./*. . *
2050: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 If there is an
2060: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e error message an
2070: 64 20 69 74 20 65 6e 64 73 20 77 69 74 68 20 61 d it ends with a
2080: 20 6e 65 77 6c 69 6e 65 2c 20 72 65 6d 6f 76 65 newline, remove
2090: 20 74 68 65 0a 49 6e 64 65 78 3a 20 67 65 6e 65 the.Index: gene
20a0: 72 69 63 2f 74 63 6c 53 74 75 62 49 6e 69 74 2e ric/tclStubInit.
20b0: 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d c.==============
20c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
20d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
20e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
20f0: 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 =====.RCS file:
2100: 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c /cvsroot/tcl/tcl
2110: 2f 67 65 6e 65 72 69 63 2f 74 63 6c 53 74 75 62 /generic/tclStub
2120: 49 6e 69 74 2e 63 2c 76 0a 72 65 74 72 69 65 76 Init.c,v.retriev
2130: 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 ing revision 1.1
2140: 36 37 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e 31 67.diff -u -r1.1
2150: 36 37 20 74 63 6c 53 74 75 62 49 6e 69 74 2e 63 67 tclStubInit.c
2160: 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c .--- generic/tcl
2170: 53 74 75 62 49 6e 69 74 2e 63 09 32 32 20 4f 63 StubInit.c.22 Oc
2180: 74 20 32 30 30 38 20 32 30 3a 32 33 3a 35 39 20 t 2008 20:23:59
2190: 2d 30 30 30 30 09 31 2e 31 36 37 0a 2b 2b 2b 20 -0000.1.167.+++
21a0: 67 65 6e 65 72 69 63 2f 74 63 6c 53 74 75 62 49 generic/tclStubI
21b0: 6e 69 74 2e 63 09 31 20 44 65 63 20 32 30 30 38 nit.c.1 Dec 2008
21c0: 20 31 35 3a 33 30 3a 30 30 20 2d 30 30 30 30 0a 15:30:00 -0000.
21d0: 40 40 20 2d 31 31 33 30 2c 36 20 2b 31 31 33 30 @@ -1130,6 +1130
21e0: 2c 37 20 40 40 0a 20 20 20 20 20 54 63 6c 5f 53 ,7 @@. Tcl_S
21f0: 65 74 45 6e 73 65 6d 62 6c 65 50 61 72 61 6d 65 etEnsembleParame
2200: 74 65 72 4c 69 73 74 2c 20 2f 2a 20 36 30 32 20 terList, /* 602
2210: 2a 2f 0a 20 20 20 20 20 54 63 6c 5f 47 65 74 45 */. Tcl_GetE
2220: 6e 73 65 6d 62 6c 65 50 61 72 61 6d 65 74 65 72 nsembleParameter
2230: 4c 69 73 74 2c 20 2f 2a 20 36 30 33 20 2a 2f 0a List, /* 603 */.
2240: 20 20 20 20 20 54 63 6c 5f 50 61 72 73 65 41 72 Tcl_ParseAr
2250: 67 73 4f 62 6a 76 2c 20 2f 2a 20 36 30 34 20 2a gsObjv, /* 604 *
2260: 2f 0a 2b 20 20 20 20 54 63 6c 5f 43 6c 6f 73 65 /.+ Tcl_Close
2270: 45 78 2c 20 2f 2a 20 36 30 35 20 2a 2f 0a 20 7d Ex, /* 605 */. }
2280: 3b 0a 20 0a 20 2f 2a 20 21 45 4e 44 21 3a 20 44 ;. . /* !END!: D
2290: 6f 20 6e 6f 74 20 65 64 69 74 20 61 62 6f 76 65 o not edit above
22a0: 20 74 68 69 73 20 6c 69 6e 65 2e 20 2a 2f 0a 49 this line. */.I
22b0: 6e 64 65 78 3a 20 75 6e 69 78 2f 74 63 6c 55 6e ndex: unix/tclUn
22c0: 69 78 43 68 61 6e 2e 63 0a 3d 3d 3d 3d 3d 3d 3d ixChan.c.=======
22d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
22e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
22f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2300: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 ============.RCS
2310: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f file: /cvsroot/
2320: 74 63 6c 2f 74 63 6c 2f 75 6e 69 78 2f 74 63 6c tcl/tcl/unix/tcl
2330: 55 6e 69 78 43 68 61 6e 2e 63 2c 76 0a 72 65 74 UnixChan.c,v.ret
2340: 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e rieving revision
2350: 20 31 2e 39 36 0a 64 69 66 66 20 2d 75 20 2d 72 1.96.diff -u -r
2360: 31 2e 39 36 20 74 63 6c 55 6e 69 78 43 68 61 6e 1.96 tclUnixChan
2370: 2e 63 0a 2d 2d 2d 20 75 6e 69 78 2f 74 63 6c 55 .c.--- unix/tclU
2380: 6e 69 78 43 68 61 6e 2e 63 09 32 36 20 4f 63 74 nixChan.c.26 Oct
2390: 20 32 30 30 38 20 31 32 3a 34 35 3a 30 34 20 2d 2008 12:45:04 -
23a0: 30 30 30 30 09 31 2e 39 36 0a 2b 2b 2b 20 75 6e 0000.1.96.+++ un
23b0: 69 78 2f 74 63 6c 55 6e 69 78 43 68 61 6e 2e 63 ix/tclUnixChan.c
23c0: 09 31 20 44 65 63 20 32 30 30 38 20 31 35 3a 33 .1 Dec 2008 15:3
23d0: 30 3a 30 31 20 2d 30 30 30 30 0a 40 40 20 2d 32 0:01 -0000.@@ -2
23e0: 31 38 2c 36 20 2b 32 31 38 2c 39 20 40 40 0a 20 18,6 +218,9 @@.
23f0: 73 74 61 74 69 63 20 69 6e 74 09 09 54 63 70 42 static int..TcpB
2400: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 lockModeProc(Cli
2410: 65 6e 74 44 61 74 61 20 64 61 74 61 2c 20 69 6e entData data, in
2420: 74 20 6d 6f 64 65 29 3b 0a 20 73 74 61 74 69 63 t mode);. static
2430: 20 69 6e 74 09 09 54 63 70 43 6c 6f 73 65 50 72 int..TcpClosePr
2440: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e oc(ClientData in
2450: 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 09 09 09 stanceData,. ...
2460: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
2470: 69 6e 74 65 72 70 29 3b 0a 2b 73 74 61 74 69 63 interp);.+static
2480: 20 69 6e 74 09 09 54 63 70 43 6c 6f 73 65 32 50 int..TcpClose2P
2490: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 roc(ClientData i
24a0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 2b 09 09 nstanceData,.+..
24b0: 09 09 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 .. Tcl_Inte
24c0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 2b 09 09 09 rp *interp,.+...
24d0: 09 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 . int flags
24e0: 29 3b 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09 );. static int..
24f0: 54 63 70 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 TcpGetHandleProc
2500: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
2510: 61 6e 63 65 44 61 74 61 2c 0a 20 09 09 09 20 20 anceData,. ...
2520: 20 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c int direction,
2530: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e ClientData *han
2540: 64 6c 65 50 74 72 29 3b 0a 20 73 74 61 74 69 63 dlePtr);. static
2550: 20 69 6e 74 09 09 54 63 70 47 65 74 4f 70 74 69 int..TcpGetOpti
2560: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 onProc(ClientDat
2570: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a a instanceData,.
2580: 40 40 20 2d 33 31 38 2c 37 20 2b 33 32 31 2c 37 @@ -318,7 +321,7
2590: 20 40 40 0a 20 20 20 20 20 54 63 70 47 65 74 4f @@. TcpGetO
25a0: 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 ptionProc,../* G
25b0: 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 et option proc.
25c0: 2a 2f 0a 20 20 20 20 20 54 63 70 57 61 74 63 68 */. TcpWatch
25d0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 Proc,../* Initia
25e0: 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 2e 20 2a lize notifier. *
25f0: 2f 0a 20 20 20 20 20 54 63 70 47 65 74 48 61 6e /. TcpGetHan
2600: 64 6c 65 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 dleProc,../* Get
2610: 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 OS handles out
2620: 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2d of channel. */.-
2630: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 63 NULL,.../* c
2640: 6c 6f 73 65 32 70 72 6f 63 2e 20 2a 2f 0a 2b 20 lose2proc. */.+
2650: 20 20 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 TcpClose2Proc
2660: 2c 09 09 2f 2a 20 43 6c 6f 73 65 32 20 70 72 6f ,../* Close2 pro
2670: 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70 42 6c c. */. TcpBl
2680: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a ockModeProc,../*
2690: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 Set blocking or
26a0: 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f non-blocking mo
26b0: 64 65 2e 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c de.*/. NULL,
26c0: 09 09 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 .../* flush proc
26d0: 2e 20 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 . */. NULL,.
26e0: 09 09 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72 6f ../* handler pro
26f0: 63 2e 20 2a 2f 0a 40 40 20 2d 32 30 31 38 2c 36 c. */.@@ -2018,6
2700: 20 2b 32 30 32 31 2c 35 37 20 40 40 0a 20 2f 2a +2021,57 @@. /*
2710: 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *------------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2b ----------. *.+
2760: 20 2a 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 * TcpClose2Proc
2770: 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 54 68 69 73 --.+ *.+ *.This
2780: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c function is cal
2790: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 led by the gener
27a0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 ic IO level to p
27b0: 65 72 66 6f 72 6d 20 74 68 65 20 63 68 61 6e 6e erform the chann
27c0: 65 6c 0a 2b 20 2a 09 74 79 70 65 20 73 70 65 63 el.+ *.type spec
27d0: 69 66 69 63 20 70 61 72 74 20 6f 66 20 61 20 68 ific part of a h
27e0: 61 6c 66 2d 63 6c 6f 73 65 3a 20 6e 61 6d 65 6c alf-close: namel
27f0: 79 2c 20 61 20 73 68 75 74 64 6f 77 6e 28 29 20 y, a shutdown()
2800: 6f 6e 20 61 20 73 6f 63 6b 65 74 2e 0a 2b 20 2a on a socket..+ *
2810: 0a 2b 20 2a 20 52 65 73 75 6c 74 73 3a 0a 2b 20 .+ * Results:.+
2820: 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 *.0 if successfu
2830: 6c 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 l, the value of
2840: 65 72 72 6e 6f 20 69 66 20 66 61 69 6c 65 64 2e errno if failed.
2850: 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 .+ *.+ * Side ef
2860: 66 65 63 74 73 3a 0a 2b 20 2a 09 53 68 75 74 73 fects:.+ *.Shuts
2870: 20 64 6f 77 6e 20 6f 6e 65 20 73 69 64 65 20 6f down one side o
2880: 66 20 74 68 65 20 73 6f 63 6b 65 74 2e 0a 2b 20 f the socket..+
2890: 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.+ *-----------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 2f -----------.+ */
28e0: 0a 2b 0a 2b 73 74 61 74 69 63 20 69 6e 74 0a 2b .+.+static int.+
28f0: 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 28 0a 2b TcpClose2Proc(.+
2900: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 ClientData i
2910: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 nstanceData,./*
2920: 54 68 65 20 73 6f 63 6b 65 74 20 74 6f 20 63 6c The socket to cl
2930: 6f 73 65 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 6c ose. */.+ Tcl
2940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
2950: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 ../* For error r
2960: 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 2b 20 20 eporting. */.+
2970: 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09 2f int flags).../
2980: 2a 20 46 6c 61 67 73 20 74 68 61 74 20 69 6e 64 * Flags that ind
2990: 69 63 61 74 65 20 77 68 69 63 68 20 73 69 64 65 icate which side
29a0: 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b to close. */.+{
29b0: 0a 2b 20 20 20 20 54 63 70 53 74 61 74 65 20 2a .+ TcpState *
29c0: 73 74 61 74 65 50 74 72 20 3d 20 28 54 63 70 53 statePtr = (TcpS
29d0: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
29e0: 44 61 74 61 3b 0a 2b 20 20 20 20 69 6e 74 20 65 Data;.+ int e
29f0: 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 2b 20 rrorCode = 0;.+
2a00: 20 20 20 69 6e 74 20 73 64 3b 0a 2b 0a 2b 20 20 int sd;.+.+
2a10: 20 20 2f 2a 0a 2b 20 20 20 20 20 2a 20 53 68 75 /*.+ * Shu
2a20: 74 64 6f 77 6e 20 74 68 65 20 4f 53 20 73 6f 63 tdown the OS soc
2a30: 6b 65 74 20 68 61 6e 64 6c 65 2e 0a 2b 20 20 20 ket handle..+
2a40: 20 20 2a 2f 0a 2b 20 20 20 20 73 77 69 74 63 68 */.+ switch
2a50: 28 66 6c 61 67 73 29 0a 2b 09 7b 0a 2b 09 63 61 (flags).+.{.+.ca
2a60: 73 65 20 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 se TCL_CLOSE_REA
2a70: 44 3a 0a 2b 09 20 20 20 20 73 64 3d 53 48 55 54 D:.+. sd=SHUT
2a80: 5f 52 44 3b 0a 2b 09 20 20 20 20 62 72 65 61 6b _RD;.+. break
2a90: 3b 0a 2b 09 63 61 73 65 20 54 43 4c 5f 43 4c 4f ;.+.case TCL_CLO
2aa0: 53 45 5f 57 52 49 54 45 3a 0a 2b 09 20 20 20 20 SE_WRITE:.+.
2ab0: 73 64 3d 53 48 55 54 5f 57 52 3b 0a 2b 09 20 20 sd=SHUT_WR;.+.
2ac0: 20 20 62 72 65 61 6b 3b 0a 2b 09 64 65 66 61 75 break;.+.defau
2ad0: 6c 74 3a 0a 2b 09 20 20 20 20 69 66 20 28 69 6e lt:.+. if (in
2ae0: 74 65 72 70 29 20 7b 0a 2b 09 09 54 63 6c 5f 41 terp) {.+..Tcl_A
2af0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
2b00: 72 70 2c 20 22 53 6f 63 6b 65 74 20 63 6c 6f 73 rp, "Socket clos
2b10: 65 32 70 72 6f 63 20 63 61 6c 6c 65 64 20 62 69 e2proc called bi
2b20: 64 69 72 65 63 74 69 6f 6e 61 6c 6c 79 22 2c 20 directionally",
2b30: 4e 55 4c 4c 29 3b 0a 2b 09 20 20 20 20 7d 0a 2b NULL);.+. }.+
2b40: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
2b50: 45 52 52 4f 52 3b 0a 2b 09 7d 0a 2b 20 20 20 20 ERROR;.+.}.+
2b60: 69 66 20 28 73 68 75 74 64 6f 77 6e 28 73 74 61 if (shutdown(sta
2b70: 74 65 50 74 72 2d 3e 66 64 2c 73 64 29 3c 30 29 tePtr->fd,sd)<0)
2b80: 20 7b 0a 2b 09 65 72 72 6f 72 43 6f 64 65 20 3d {.+.errorCode =
2b90: 20 65 72 72 6e 6f 3b 0a 2b 20 20 20 20 7d 0a 2b errno;.+ }.+
2ba0: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 .+ return err
2bb0: 6f 72 43 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f orCode;.+}.+..+/
2bc0: 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.+ *-----------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a -----------.+ *.
2c10: 20 20 2a 20 54 63 70 47 65 74 4f 70 74 69 6f 6e * TcpGetOption
2c20: 50 72 6f 63 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09 Proc --. *. *.
2c30: 43 6f 6d 70 75 74 65 73 20 61 6e 20 6f 70 74 69 Computes an opti
2c40: 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 54 on value for a T
2c50: 43 50 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 CP socket based
2c60: 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 20 6c 69 channel, or a li
2c70: 73 74 20 6f 66 0a 49 6e 64 65 78 3a 20 75 6e 69 st of.Index: uni
2c80: 78 2f 74 63 6c 55 6e 69 78 50 69 70 65 2e 63 0a x/tclUnixPipe.c.
2c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2cd0: 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 ===.RCS file: /c
2ce0: 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 75 vsroot/tcl/tcl/u
2cf0: 6e 69 78 2f 74 63 6c 55 6e 69 78 50 69 70 65 2e nix/tclUnixPipe.
2d00: 63 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72 c,v.retrieving r
2d10: 65 76 69 73 69 6f 6e 20 31 2e 34 34 0a 64 69 66 evision 1.44.dif
2d20: 66 20 2d 75 20 2d 72 31 2e 34 34 20 74 63 6c 55 f -u -r1.44 tclU
2d30: 6e 69 78 50 69 70 65 2e 63 0a 2d 2d 2d 20 75 6e nixPipe.c.--- un
2d40: 69 78 2f 74 63 6c 55 6e 69 78 50 69 70 65 2e 63 ix/tclUnixPipe.c
2d50: 09 32 31 20 4a 75 6c 20 32 30 30 38 20 32 31 3a .21 Jul 2008 21:
2d60: 34 36 3a 34 37 20 2d 30 30 30 30 09 31 2e 34 34 46:47 -0000.1.44
2d70: 0a 2b 2b 2b 20 75 6e 69 78 2f 74 63 6c 55 6e 69 .+++ unix/tclUni
2d80: 78 50 69 70 65 2e 63 09 31 20 44 65 63 20 32 30 xPipe.c.1 Dec 20
2d90: 30 38 20 31 35 3a 33 30 3a 30 31 20 2d 30 30 30 08 15:30:01 -000
2da0: 30 0a 40 40 20 2d 35 31 2c 38 20 2b 35 31 2c 31 0.@@ -51,8 +51,1
2db0: 30 20 40 40 0a 20 20 2a 2f 0a 20 0a 20 73 74 61 0 @@. */. . sta
2dc0: 74 69 63 20 69 6e 74 09 09 50 69 70 65 42 6c 6f tic int..PipeBlo
2dd0: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e ckModeProc(Clien
2de0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
2df0: 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 2d ta, int mode);.-
2e00: 73 74 61 74 69 63 20 69 6e 74 09 09 50 69 70 65 static int..Pipe
2e10: 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 CloseProc(Client
2e20: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
2e30: 61 2c 0a 2d 09 09 09 20 20 20 20 54 63 6c 5f 49 a,.-... Tcl_I
2e40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a nterp *interp);.
2e50: 2b 73 74 61 74 69 63 20 69 6e 74 09 09 50 69 70 +static int..Pip
2e60: 65 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 eClose2Proc(Clie
2e70: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
2e80: 61 74 61 2c 0a 2b 09 09 09 20 20 20 20 54 63 6c ata,.+... Tcl
2e90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
2ea0: 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 2b 2f 2a int flags);.+/*
2eb0: 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 69 70 static int..Pip
2ec0: 65 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e eCloseProc(Clien
2ed0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
2ee0: 74 61 2c 0a 2b 20 20 20 54 63 6c 5f 49 6e 74 65 ta,.+ Tcl_Inte
2ef0: 72 70 20 2a 69 6e 74 65 72 70 29 3b 20 2a 2f 0a rp *interp); */.
2f00: 20 73 74 61 74 69 63 20 69 6e 74 09 09 50 69 70 static int..Pip
2f10: 65 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 43 eGetHandleProc(C
2f20: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
2f30: 63 65 44 61 74 61 2c 0a 20 09 09 09 20 20 20 20 ceData,. ...
2f40: 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 int direction, C
2f50: 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c lientData *handl
2f60: 65 50 74 72 29 3b 0a 20 73 74 61 74 69 63 20 69 ePtr);. static i
2f70: 6e 74 09 09 50 69 70 65 49 6e 70 75 74 50 72 6f nt..PipeInputPro
2f80: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
2f90: 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20 tanceData, char
2fa0: 2a 62 75 66 2c 0a 40 40 20 2d 37 31 2c 37 20 2b *buf,.@@ -71,7 +
2fb0: 37 33 2c 37 20 40 40 0a 20 73 74 61 74 69 63 20 73,7 @@. static
2fc0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 Tcl_ChannelType
2fd0: 70 69 70 65 43 68 61 6e 6e 65 6c 54 79 70 65 20 pipeChannelType
2fe0: 3d 20 7b 0a 20 20 20 20 20 22 70 69 70 65 22 2c = {. "pipe",
2ff0: 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e .../* Type name.
3000: 20 2a 2f 0a 20 20 20 20 20 54 43 4c 5f 43 48 41 */. TCL_CHA
3010: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 NNEL_VERSION_5,.
3020: 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f /* v5 channel */
3030: 0a 2d 20 20 20 20 50 69 70 65 43 6c 6f 73 65 50 .- PipeCloseP
3040: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 roc,../* Close p
3050: 72 6f 63 2e 20 2a 2f 0a 2b 20 20 20 20 54 43 4c roc. */.+ TCL
3060: 5f 43 4c 4f 53 45 32 50 52 4f 43 2c 09 09 2f 2a _CLOSE2PROC,../*
3070: 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f 0a Close proc. */.
3080: 20 20 20 20 20 50 69 70 65 49 6e 70 75 74 50 72 PipeInputPr
3090: 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 oc,../* Input pr
30a0: 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 50 69 70 65 oc. */. Pipe
30b0: 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 OutputProc,../*
30c0: 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a Output proc. */.
30d0: 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 NULL,.../*
30e0: 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f 0a 40 40 Seek proc. */.@@
30f0: 20 2d 37 39 2c 37 20 2b 38 31 2c 37 20 40 40 0a -79,7 +81,7 @@.
3100: 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 NULL,.../*
3110: 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e Get option proc.
3120: 20 2a 2f 0a 20 20 20 20 20 50 69 70 65 57 61 74 */. PipeWat
3130: 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 chProc,../* Init
3140: 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 2e ialize notifier.
3150: 20 2a 2f 0a 20 20 20 20 20 50 69 70 65 47 65 74 */. PipeGet
3160: 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f 2a 20 HandleProc,../*
3170: 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f Get OS handles o
3180: 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 2e 20 2a ut of channel. *
3190: 2f 0a 2d 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f /.- NULL,.../
31a0: 2a 20 63 6c 6f 73 65 32 70 72 6f 63 2e 20 2a 2f * close2proc. */
31b0: 0a 2b 20 20 20 20 50 69 70 65 43 6c 6f 73 65 32 .+ PipeClose2
31c0: 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 Proc,../* close2
31d0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 50 69 proc. */. Pi
31e0: 70 65 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c peBlockModeProc,
31f0: 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e ../* Set blockin
3200: 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e g or non-blockin
3210: 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 20 4e g mode.*/. N
3220: 55 4c 4c 2c 09 09 09 2f 2a 20 66 6c 75 73 68 20 ULL,.../* flush
3230: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 4e 55 proc. */. NU
3240: 4c 4c 2c 09 09 09 2f 2a 20 68 61 6e 64 6c 65 72 LL,.../* handler
3250: 20 70 72 6f 63 2e 20 2a 2f 0a 40 40 20 2d 39 30 proc. */.@@ -90
3260: 35 2c 37 20 2b 39 30 37 2c 39 36 20 40 40 0a 20 5,7 +907,96 @@.
3270: 2f 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *----------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a ------------. *
32c0: 0a 2d 20 2a 20 50 69 70 65 43 6c 6f 73 65 50 72 .- * PipeClosePr
32d0: 6f 63 20 2d 2d 0a 2b 20 2a 20 50 69 70 65 43 6c oc --.+ * PipeCl
32e0: 6f 73 65 32 50 72 6f 63 0a 2b 20 2a 0a 2b 20 2a ose2Proc.+ *.+ *
32f0: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
3300: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 s invoked by the
3310: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 generic IO leve
3320: 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 2b 20 2a l to perform.+ *
3330: 09 70 69 70 65 6c 69 6e 65 2d 74 79 70 65 2d 73 .pipeline-type-s
3340: 70 65 63 69 66 69 63 20 68 61 6c 66 20 6f 72 20 pecific half or
3350: 66 75 6c 6c 2d 63 6c 6f 73 65 2e 0a 2b 20 2a 0a full-close..+ *.
3360: 2b 20 2a 20 52 65 73 75 6c 74 73 3a 0a 2b 20 2a + * Results:.+ *
3370: 09 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 65 .0 on success, e
3380: 72 72 6e 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a rrno otherwise..
3390: 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 + *.+ * Side eff
33a0: 65 63 74 73 3a 0a 2b 20 2a 09 43 6c 6f 73 65 73 ects:.+ *.Closes
33b0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 70 69 70 the command pip
33c0: 65 6c 69 6e 65 20 63 68 61 6e 6e 65 6c 2e 0a 2b eline channel..+
33d0: 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *.+ *----------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a ------------.+ *
3420: 2f 0a 2b 0a 2b 73 74 61 74 69 63 20 69 6e 74 0a /.+.+static int.
3430: 2b 50 69 70 65 43 6c 6f 73 65 32 50 72 6f 63 28 +PipeClose2Proc(
3440: 0a 2b 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 .+ ClientData
3450: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f instanceData,./
3460: 2a 20 54 68 65 20 70 69 70 65 20 74 6f 20 63 6c * The pipe to cl
3470: 6f 73 65 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 6c ose. */.+ Tcl
3480: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
3490: 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 20 72 ../* For error r
34a0: 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 2b 20 20 eporting. */.+
34b0: 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09 2f int flags).../
34c0: 2a 20 46 6c 61 67 73 20 74 68 61 74 20 69 6e 64 * Flags that ind
34d0: 69 63 61 74 65 20 77 68 69 63 68 20 73 69 64 65 icate which side
34e0: 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 2b 7b to close. */.+{
34f0: 0a 2b 20 20 20 20 50 69 70 65 53 74 61 74 65 20 .+ PipeState
3500: 2a 70 69 70 65 50 74 72 3d 20 28 50 69 70 65 53 *pipePtr= (PipeS
3510: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
3520: 44 61 74 61 3b 0a 2b 20 20 20 20 54 63 6c 5f 43 Data;.+ Tcl_C
3530: 68 61 6e 6e 65 6c 20 65 72 72 43 68 61 6e 3b 0a hannel errChan;.
3540: 2b 20 20 20 20 69 6e 74 20 65 72 72 6f 72 43 6f + int errorCo
3550: 64 65 2c 20 72 65 73 75 6c 74 3b 0a 2b 0a 2b 20 de, result;.+.+
3560: 20 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 errorCode = 0
3570: 3b 0a 2b 20 20 20 20 72 65 73 75 6c 74 20 3d 20 ;.+ result =
3580: 30 3b 0a 2b 0a 2b 20 20 20 20 69 66 20 28 28 28 0;.+.+ if (((
3590: 21 66 6c 61 67 73 29 7c 7c 28 66 6c 61 67 73 20 !flags)||(flags
35a0: 26 20 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 & TCL_CLOSE_READ
35b0: 29 29 20 26 26 20 28 70 69 70 65 50 74 72 2d 3e )) && (pipePtr->
35c0: 69 6e 46 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 29 inFile != NULL))
35d0: 20 7b 0a 2b 09 69 66 20 28 54 63 6c 70 43 6c 6f {.+.if (TclpClo
35e0: 73 65 46 69 6c 65 28 70 69 70 65 50 74 72 2d 3e seFile(pipePtr->
35f0: 69 6e 46 69 6c 65 29 20 3c 20 30 29 20 7b 0a 2b inFile) < 0) {.+
3600: 09 20 20 20 20 65 72 72 6f 72 43 6f 64 65 20 3d . errorCode =
3610: 20 65 72 72 6e 6f 3b 0a 2b 09 7d 20 65 6c 73 65 errno;.+.} else
3620: 20 7b 0a 2b 09 20 20 20 20 70 69 70 65 50 74 72 {.+. pipePtr
3630: 2d 3e 69 6e 46 69 6c 65 3d 4e 55 4c 4c 3b 0a 2b ->inFile=NULL;.+
3640: 09 7d 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 69 .}.+ }.+ i
3650: 66 20 28 28 28 21 66 6c 61 67 73 29 7c 7c 28 66 f (((!flags)||(f
3660: 6c 61 67 73 20 26 20 54 43 4c 5f 43 4c 4f 53 45 lags & TCL_CLOSE
3670: 5f 57 52 49 54 45 29 29 20 26 26 20 28 70 69 70 _WRITE)) && (pip
3680: 65 50 74 72 2d 3e 6f 75 74 46 69 6c 65 20 21 3d ePtr->outFile !=
3690: 20 4e 55 4c 4c 29 20 26 26 20 28 65 72 72 6f 72 NULL) && (error
36a0: 43 6f 64 65 20 3d 3d 20 30 29 29 20 7b 0a 2b 09 Code == 0)) {.+.
36b0: 69 66 20 28 54 63 6c 70 43 6c 6f 73 65 46 69 6c if (TclpCloseFil
36c0: 65 28 70 69 70 65 50 74 72 2d 3e 6f 75 74 46 69 e(pipePtr->outFi
36d0: 6c 65 29 20 3c 20 30 29 20 7b 0a 2b 09 20 20 20 le) < 0) {.+.
36e0: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 65 72 72 errorCode = err
36f0: 6e 6f 3b 0a 2b 09 7d 20 65 6c 73 65 20 7b 0a 2b no;.+.} else {.+
3700: 09 20 20 20 20 70 69 70 65 50 74 72 2d 3e 6f 75 . pipePtr->ou
3710: 74 46 69 6c 65 3d 4e 55 4c 4c 3b 0a 2b 09 7d 0a tFile=NULL;.+.}.
3720: 2b 20 20 20 20 7d 0a 2b 20 20 20 20 0a 2b 20 20 + }.+ .+
3730: 20 20 2f 2a 20 69 66 20 68 61 6c 66 2d 63 6c 6f /* if half-clo
3740: 73 69 6e 67 2c 20 73 74 6f 70 20 68 65 72 65 2e sing, stop here.
3750: 20 2a 2f 0a 2b 20 20 20 20 69 66 20 28 66 6c 61 */.+ if (fla
3760: 67 73 29 20 7b 0a 2b 09 09 72 65 74 75 72 6e 20 gs) {.+..return
3770: 65 72 72 6f 72 43 6f 64 65 3b 0a 2b 20 20 20 20 errorCode;.+
3780: 7d 0a 2b 0a 2b 20 20 20 20 69 66 20 28 70 69 70 }.+.+ if (pip
3790: 65 50 74 72 2d 3e 69 73 4e 6f 6e 42 6c 6f 63 6b ePtr->isNonBlock
37a0: 69 6e 67 20 7c 7c 20 54 63 6c 49 6e 45 78 69 74 ing || TclInExit
37b0: 28 29 29 20 7b 0a 2b 09 2f 2a 0a 2b 09 20 2a 20 ()) {.+./*.+. *
37c0: 49 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 If the channel i
37d0: 73 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6f s non-blocking o
37e0: 72 20 54 63 6c 20 69 73 20 62 65 69 6e 67 20 63 r Tcl is being c
37f0: 6c 65 61 6e 65 64 20 75 70 2c 20 6a 75 73 74 0a leaned up, just.
3800: 2b 09 20 2a 20 64 65 74 61 63 68 20 74 68 65 20 +. * detach the
3810: 63 68 69 6c 64 72 65 6e 20 50 49 44 73 2c 20 72 children PIDs, r
3820: 65 61 70 20 74 68 65 6d 20 28 69 6d 70 6f 72 74 eap them (import
3830: 61 6e 74 20 69 66 20 77 65 20 61 72 65 20 69 6e ant if we are in
3840: 20 61 0a 2b 09 20 2a 20 64 79 6e 61 6d 69 63 20 a.+. * dynamic
3850: 6c 6f 61 64 20 6d 6f 64 75 6c 65 29 2c 20 61 6e load module), an
3860: 64 20 64 69 73 63 61 72 64 20 74 68 65 20 65 72 d discard the er
3870: 72 6f 72 46 69 6c 65 2e 0a 2b 09 20 2a 2f 0a 2b rorFile..+. */.+
3880: 0a 2b 09 54 63 6c 5f 44 65 74 61 63 68 50 69 64 .+.Tcl_DetachPid
3890: 73 28 70 69 70 65 50 74 72 2d 3e 6e 75 6d 50 69 s(pipePtr->numPi
38a0: 64 73 2c 20 70 69 70 65 50 74 72 2d 3e 70 69 64 ds, pipePtr->pid
38b0: 50 74 72 29 3b 0a 2b 09 54 63 6c 5f 52 65 61 70 Ptr);.+.Tcl_Reap
38c0: 44 65 74 61 63 68 65 64 50 72 6f 63 73 28 29 3b DetachedProcs();
38d0: 0a 2b 0a 2b 09 69 66 20 28 70 69 70 65 50 74 72 .+.+.if (pipePtr
38e0: 2d 3e 65 72 72 6f 72 46 69 6c 65 29 20 7b 0a 2b ->errorFile) {.+
38f0: 09 20 20 20 20 54 63 6c 70 43 6c 6f 73 65 46 69 . TclpCloseFi
3900: 6c 65 28 70 69 70 65 50 74 72 2d 3e 65 72 72 6f le(pipePtr->erro
3910: 72 46 69 6c 65 29 3b 0a 2b 09 7d 0a 2b 20 20 20 rFile);.+.}.+
3920: 20 7d 20 65 6c 73 65 20 7b 0a 2b 09 2f 2a 0a 2b } else {.+./*.+
3930: 09 20 2a 20 57 72 61 70 20 74 68 65 20 65 72 72 . * Wrap the err
3940: 6f 72 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 63 or file into a c
3950: 68 61 6e 6e 65 6c 20 61 6e 64 20 67 69 76 65 20 hannel and give
3960: 69 74 20 74 6f 20 74 68 65 20 63 6c 65 61 6e 75 it to the cleanu
3970: 70 0a 2b 09 20 2a 20 72 6f 75 74 69 6e 65 2e 0a p.+. * routine..
3980: 2b 09 20 2a 2f 0a 2b 0a 2b 09 69 66 20 28 70 69 +. */.+.+.if (pi
3990: 70 65 50 74 72 2d 3e 65 72 72 6f 72 46 69 6c 65 pePtr->errorFile
39a0: 29 20 7b 0a 2b 09 20 20 20 20 65 72 72 43 68 61 ) {.+. errCha
39b0: 6e 20 3d 20 54 63 6c 5f 4d 61 6b 65 46 69 6c 65 n = Tcl_MakeFile
39c0: 43 68 61 6e 6e 65 6c 28 0a 2b 09 09 28 43 6c 69 Channel(.+..(Cli
39d0: 65 6e 74 44 61 74 61 29 20 49 4e 54 32 50 54 52 entData) INT2PTR
39e0: 28 47 65 74 46 64 28 70 69 70 65 50 74 72 2d 3e (GetFd(pipePtr->
39f0: 65 72 72 6f 72 46 69 6c 65 29 29 2c 20 54 43 4c errorFile)), TCL
3a00: 5f 52 45 41 44 41 42 4c 45 29 3b 0a 2b 09 7d 20 _READABLE);.+.}
3a10: 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20 65 72 72 else {.+. err
3a20: 43 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 2b 09 7d Chan = NULL;.+.}
3a30: 0a 2b 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 43 .+.result = TclC
3a40: 6c 65 61 6e 75 70 43 68 69 6c 64 72 65 6e 28 69 leanupChildren(i
3a50: 6e 74 65 72 70 2c 20 70 69 70 65 50 74 72 2d 3e nterp, pipePtr->
3a60: 6e 75 6d 50 69 64 73 2c 20 70 69 70 65 50 74 72 numPids, pipePtr
3a70: 2d 3e 70 69 64 50 74 72 2c 0a 2b 09 09 65 72 72 ->pidPtr,.+..err
3a80: 43 68 61 6e 29 3b 0a 2b 20 20 20 20 7d 0a 2b 0a Chan);.+ }.+.
3a90: 2b 20 20 20 20 69 66 20 28 70 69 70 65 50 74 72 + if (pipePtr
3aa0: 2d 3e 6e 75 6d 50 69 64 73 20 21 3d 20 30 29 20 ->numPids != 0)
3ab0: 7b 0a 2b 09 63 6b 66 72 65 65 28 28 63 68 61 72 {.+.ckfree((char
3ac0: 20 2a 29 20 70 69 70 65 50 74 72 2d 3e 70 69 64 *) pipePtr->pid
3ad0: 50 74 72 29 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 Ptr);.+ }.+
3ae0: 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a ckfree((char *
3af0: 29 20 70 69 70 65 50 74 72 29 3b 0a 2b 20 20 20 ) pipePtr);.+
3b00: 20 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d if (errorCode =
3b10: 3d 20 30 29 20 7b 0a 2b 09 72 65 74 75 72 6e 20 = 0) {.+.return
3b20: 72 65 73 75 6c 74 3b 0a 2b 20 20 20 20 7d 0a 2b result;.+ }.+
3b30: 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 6f 72 return error
3b40: 43 6f 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a 0a Code;.+}.+..+/*.
3b50: 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d + *-------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 2b 20 ---------.+ *.+
3ba0: 2a 20 50 69 70 65 43 6c 6f 73 65 50 72 6f 63 20 * PipeCloseProc
3bb0: 2d 2d 20 4f 42 53 4f 4c 45 54 45 0a 20 20 2a 0a -- OBSOLETE. *.
3bc0: 20 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f *.This functio
3bd0: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 n is invoked by
3be0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c the generic IO l
3bf0: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a evel to perform.
3c00: 20 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 *.channel-type
3c10: 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 -specific cleanu
3c20: 70 20 77 68 65 6e 20 61 20 63 6f 6d 6d 61 6e 64 p when a command
3c30: 20 70 69 70 65 6c 69 6e 65 20 63 68 61 6e 6e 65 pipeline channe
3c40: 6c 20 69 73 0a 40 40 20 2d 39 33 33 2c 36 20 2b l is.@@ -933,6 +
3c50: 31 30 32 34 2c 37 20 40 40 0a 20 20 20 20 20 65 1024,7 @@. e
3c60: 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 rrorCode = 0;.
3c70: 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 result = 0;.
3c80: 20 20 20 20 70 69 70 65 50 74 72 20 3d 20 28 50 pipePtr = (P
3c90: 69 70 65 53 74 61 74 65 20 2a 29 20 69 6e 73 74 ipeState *) inst
3ca0: 61 6e 63 65 44 61 74 61 3b 0a 2b 0a 20 20 20 20 anceData;.+.
3cb0: 20 69 66 20 28 70 69 70 65 50 74 72 2d 3e 69 6e if (pipePtr->in
3cc0: 46 69 6c 65 29 20 7b 0a 20 09 69 66 20 28 54 63 File) {. .if (Tc
3cd0: 6c 70 43 6c 6f 73 65 46 69 6c 65 28 70 69 70 65 lpCloseFile(pipe
3ce0: 50 74 72 2d 3e 69 6e 46 69 6c 65 29 20 3c 20 30 Ptr->inFile) < 0
3cf0: 29 20 7b 0a 20 09 20 20 20 20 65 72 72 6f 72 43 ) {. . errorC
3d00: 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 49 6e 64 ode = errno;.Ind
3d10: 65 78 3a 20 77 69 6e 2f 74 63 6c 57 69 6e 53 6f ex: win/tclWinSo
3d20: 63 6b 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ck.c.===========
3d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d60: 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c ========.RCS fil
3d70: 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f e: /cvsroot/tcl/
3d80: 74 63 6c 2f 77 69 6e 2f 74 63 6c 57 69 6e 53 6f tcl/win/tclWinSo
3d90: 63 6b 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e ck.c,v.retrievin
3da0: 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 36 33 0a g revision 1.63.
3db0: 64 69 66 66 20 2d 75 20 2d 72 31 2e 36 33 20 74 diff -u -r1.63 t
3dc0: 63 6c 57 69 6e 53 6f 63 6b 2e 63 0a 2d 2d 2d 20 clWinSock.c.---
3dd0: 77 69 6e 2f 74 63 6c 57 69 6e 53 6f 63 6b 2e 63 win/tclWinSock.c
3de0: 09 32 36 20 4f 63 74 20 32 30 30 38 20 31 38 3a .26 Oct 2008 18:
3df0: 34 33 3a 32 37 20 2d 30 30 30 30 09 31 2e 36 33 43:27 -0000.1.63
3e00: 0a 2b 2b 2b 20 77 69 6e 2f 74 63 6c 57 69 6e 53 .+++ win/tclWinS
3e10: 6f 63 6b 2e 63 09 31 20 44 65 63 20 32 30 30 38 ock.c.1 Dec 2008
3e20: 20 31 35 3a 33 30 3a 30 31 20 2d 30 30 30 30 0a 15:30:01 -0000.
3e30: 40 40 20 2d 31 36 38 2c 36 20 2b 31 36 38 2c 37 @@ -168,6 +168,7
3e40: 20 40 40 0a 20 73 74 61 74 69 63 20 54 63 6c 5f @@. static Tcl_
3e50: 45 76 65 6e 74 53 65 74 75 70 50 72 6f 63 09 53 EventSetupProc.S
3e60: 6f 63 6b 65 74 53 65 74 75 70 50 72 6f 63 3b 0a ocketSetupProc;.
3e70: 20 73 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 static Tcl_Driv
3e80: 65 72 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 09 erBlockModeProc.
3e90: 54 63 70 42 6c 6f 63 6b 50 72 6f 63 3b 0a 20 73 TcpBlockProc;. s
3ea0: 74 61 74 69 63 20 54 63 6c 5f 44 72 69 76 65 72 tatic Tcl_Driver
3eb0: 43 6c 6f 73 65 50 72 6f 63 09 54 63 70 43 6c 6f CloseProc.TcpClo
3ec0: 73 65 50 72 6f 63 3b 0a 2b 73 74 61 74 69 63 20 seProc;.+static
3ed0: 54 63 6c 5f 44 72 69 76 65 72 43 6c 6f 73 65 32 Tcl_DriverClose2
3ee0: 50 72 6f 63 09 54 63 70 43 6c 6f 73 65 32 50 72 Proc.TcpClose2Pr
3ef0: 6f 63 3b 0a 20 73 74 61 74 69 63 20 54 63 6c 5f oc;. static Tcl_
3f00: 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 DriverSetOptionP
3f10: 72 6f 63 09 54 63 70 53 65 74 4f 70 74 69 6f 6e roc.TcpSetOption
3f20: 50 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 54 63 Proc;. static Tc
3f30: 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f l_DriverGetOptio
3f40: 6e 50 72 6f 63 09 54 63 70 47 65 74 4f 70 74 69 nProc.TcpGetOpti
3f50: 6f 6e 50 72 6f 63 3b 0a 20 73 74 61 74 69 63 20 onProc;. static
3f60: 54 63 6c 5f 44 72 69 76 65 72 49 6e 70 75 74 50 Tcl_DriverInputP
3f70: 72 6f 63 09 54 63 70 49 6e 70 75 74 50 72 6f 63 roc.TcpInputProc
3f80: 3b 0a 40 40 20 2d 31 39 31 2c 37 20 2b 31 39 32 ;.@@ -191,7 +192
3f90: 2c 37 20 40 40 0a 20 20 20 20 20 54 63 70 47 65 ,7 @@. TcpGe
3fa0: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 20 20 20 tOptionProc,.
3fb0: 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 /* Get option p
3fc0: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70 roc. */. Tcp
3fd0: 57 61 74 63 68 50 72 6f 63 2c 09 20 20 20 20 2f WatchProc,. /
3fe0: 2a 20 53 65 74 20 75 70 20 6e 6f 74 69 66 69 65 * Set up notifie
3ff0: 72 20 74 6f 20 77 61 74 63 68 20 74 68 69 73 20 r to watch this
4000: 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 20 20 20 20 channel. */.
4010: 20 54 63 70 47 65 74 48 61 6e 64 6c 65 50 72 6f TcpGetHandlePro
4020: 63 2c 09 20 20 20 20 2f 2a 20 47 65 74 20 61 6e c,. /* Get an
4030: 20 4f 53 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 OS handle from
4040: 63 68 61 6e 6e 65 6c 2e 20 2a 2f 0a 2d 20 20 20 channel. */.-
4050: 20 4e 55 4c 4c 2c 09 09 20 20 20 20 2f 2a 20 63 NULL,.. /* c
4060: 6c 6f 73 65 32 70 72 6f 63 2e 20 2a 2f 0a 2b 20 lose2proc. */.+
4070: 20 20 20 54 63 70 43 6c 6f 73 65 32 50 72 6f 63 TcpClose2Proc
4080: 2c 09 20 20 20 20 2f 2a 20 43 6c 6f 73 65 32 70 ,. /* Close2p
4090: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70 roc. */. Tcp
40a0: 42 6c 6f 63 6b 50 72 6f 63 2c 09 20 20 20 20 2f BlockProc,. /
40b0: 2a 20 53 65 74 20 73 6f 63 6b 65 74 20 69 6e 74 * Set socket int
40c0: 6f 20 28 6e 6f 6e 2d 29 62 6c 6f 63 6b 69 6e 67 o (non-)blocking
40d0: 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 4e mode. */. N
40e0: 55 4c 4c 2c 09 09 20 20 20 20 2f 2a 20 66 6c 75 ULL,.. /* flu
40f0: 73 68 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 sh proc. */.
4100: 20 4e 55 4c 4c 2c 09 09 20 20 20 20 2f 2a 20 68 NULL,.. /* h
4110: 61 6e 64 6c 65 72 20 70 72 6f 63 2e 20 2a 2f 0a andler proc. */.
4120: 40 40 20 2d 38 31 38 2c 36 20 2b 38 31 39 2c 35 @@ -818,6 +819,5
4130: 38 20 40 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d 8 @@. /*. *----
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 0a 20 20 2a 0a 2b 20 2a 20 54 63 70 43 6c --. *.+ * TcpCl
4190: 6f 73 65 32 50 72 6f 63 20 2d 2d 0a 2b 20 2a 0a ose2Proc --.+ *.
41a0: 2b 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f + *.This functio
41b0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 n is called by t
41c0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 he generic IO le
41d0: 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 vel to perform t
41e0: 68 65 20 63 68 61 6e 6e 65 6c 0a 2b 20 2a 09 74 he channel.+ *.t
41f0: 79 70 65 20 73 70 65 63 69 66 69 63 20 70 61 72 ype specific par
4200: 74 20 6f 66 20 61 20 68 61 6c 66 2d 63 6c 6f 73 t of a half-clos
4210: 65 3a 20 6e 61 6d 65 6c 79 2c 20 61 20 73 68 75 e: namely, a shu
4220: 74 64 6f 77 6e 28 29 20 6f 6e 20 61 20 73 6f 63 tdown() on a soc
4230: 6b 65 74 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 ket..+ *.+ * Res
4240: 75 6c 74 73 3a 0a 2b 20 2a 09 30 20 69 66 20 73 ults:.+ *.0 if s
4250: 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 76 uccessful, the v
4260: 61 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 69 66 alue of errno if
4270: 20 66 61 69 6c 65 64 2e 0a 2b 20 2a 0a 2b 20 2a failed..+ *.+ *
4280: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2b Side effects:.+
4290: 20 2a 09 53 68 75 74 73 20 64 6f 77 6e 20 6f 6e *.Shuts down on
42a0: 65 20 73 69 64 65 20 6f 66 20 74 68 65 20 73 6f e side of the so
42b0: 63 6b 65 74 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d cket..+ *.+ *---
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4300: 2d 2d 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 73 74 61 74 ---.+ */.+.+stat
4310: 69 63 20 69 6e 74 0a 2b 54 63 70 43 6c 6f 73 65 ic int.+TcpClose
4320: 32 50 72 6f 63 28 0a 2b 20 20 20 20 43 6c 69 65 2Proc(.+ Clie
4330: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
4340: 61 74 61 2c 09 2f 2a 20 54 68 65 20 73 6f 63 6b ata,./* The sock
4350: 65 74 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a et to close. */.
4360: 2b 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 + Tcl_Interp
4370: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 *interp,../* For
4380: 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 error reporting
4390: 2e 20 2a 2f 0a 2b 20 20 20 20 69 6e 74 20 66 6c . */.+ int fl
43a0: 61 67 73 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 ags).../* Flags
43b0: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 that indicate wh
43c0: 69 63 68 20 73 69 64 65 20 74 6f 20 63 6c 6f 73 ich side to clos
43d0: 65 2e 20 2a 2f 0a 2b 7b 0a 2b 20 20 20 20 53 6f e. */.+{.+ So
43e0: 63 6b 65 74 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 cketInfo *infoPt
43f0: 72 20 3d 20 28 53 6f 63 6b 65 74 49 6e 66 6f 20 r = (SocketInfo
4400: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
4410: 0a 2b 20 20 20 20 69 6e 74 20 65 72 72 6f 72 43 .+ int errorC
4420: 6f 64 65 20 3d 20 30 3b 0a 2b 20 20 20 20 69 6e ode = 0;.+ in
4430: 74 20 73 64 3b 0a 2b 0a 2b 20 20 20 20 2f 2a 0a t sd;.+.+ /*.
4440: 2b 20 20 20 20 20 2a 20 53 68 75 74 64 6f 77 6e + * Shutdown
4450: 20 74 68 65 20 4f 53 20 73 6f 63 6b 65 74 20 68 the OS socket h
4460: 61 6e 64 6c 65 2e 0a 2b 20 20 20 20 20 2a 2f 0a andle..+ */.
4470: 2b 20 20 20 20 73 77 69 74 63 68 28 66 6c 61 67 + switch(flag
4480: 73 29 0a 2b 09 7b 0a 2b 09 63 61 73 65 20 54 43 s).+.{.+.case TC
4490: 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 3a 0a 2b 09 L_CLOSE_READ:.+.
44a0: 20 20 20 20 73 64 3d 53 44 5f 52 45 43 45 49 56 sd=SD_RECEIV
44b0: 45 3b 0a 2b 09 20 20 20 20 62 72 65 61 6b 3b 0a E;.+. break;.
44c0: 2b 09 63 61 73 65 20 54 43 4c 5f 43 4c 4f 53 45 +.case TCL_CLOSE
44d0: 5f 57 52 49 54 45 3a 0a 2b 09 20 20 20 20 73 64 _WRITE:.+. sd
44e0: 3d 53 44 5f 53 45 4e 44 3b 0a 2b 09 20 20 20 20 =SD_SEND;.+.
44f0: 62 72 65 61 6b 3b 0a 2b 09 64 65 66 61 75 6c 74 break;.+.default
4500: 3a 0a 2b 09 20 20 20 20 69 66 20 28 69 6e 74 65 :.+. if (inte
4510: 72 70 29 20 7b 0a 2b 09 09 54 63 6c 5f 41 70 70 rp) {.+..Tcl_App
4520: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
4530: 2c 20 22 53 6f 63 6b 65 74 20 63 6c 6f 73 65 32 , "Socket close2
4540: 70 72 6f 63 20 63 61 6c 6c 65 64 20 62 69 64 69 proc called bidi
4550: 72 65 63 74 69 6f 6e 61 6c 6c 79 22 2c 20 4e 55 rectionally", NU
4560: 4c 4c 29 3b 0a 2b 09 20 20 20 20 7d 0a 2b 09 20 LL);.+. }.+.
4570: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
4580: 52 4f 52 3b 0a 2b 09 7d 0a 2b 20 20 20 20 69 66 ROR;.+.}.+ if
4590: 20 28 73 68 75 74 64 6f 77 6e 28 69 6e 66 6f 50 (shutdown(infoP
45a0: 74 72 2d 3e 73 6f 63 6b 65 74 2c 73 64 29 20 3d tr->socket,sd) =
45b0: 3d 20 53 4f 43 4b 45 54 5f 45 52 52 4f 52 29 20 = SOCKET_ERROR)
45c0: 7b 0a 2b 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 {.+.TclWinConver
45d0: 74 57 53 41 45 72 72 6f 72 28 28 44 57 4f 52 44 tWSAError((DWORD
45e0: 29 20 57 53 41 47 65 74 4c 61 73 74 45 72 72 6f ) WSAGetLastErro
45f0: 72 28 29 29 3b 0a 2b 09 65 72 72 6f 72 43 6f 64 r());.+.errorCod
4600: 65 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f e = Tcl_GetErrno
4610: 28 29 3b 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 ();.+ }.+.+
4620: 20 20 72 65 74 75 72 6e 20 65 72 72 6f 72 43 6f return errorCo
4630: 64 65 3b 0a 2b 7d 0a 2b 0c 0a 2b 2f 2a 0a 2b 20 de;.+}.+..+/*.+
4640: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4680: 2d 2d 2d 2d 2d 2d 2d 0a 2b 20 2a 0a 20 20 2a 20 -------.+ *. *
4690: 4e 65 77 53 6f 63 6b 65 74 49 6e 66 6f 20 2d 2d NewSocketInfo --
46a0: 0a 20 20 2a 0a 20 20 2a 09 54 68 69 73 20 66 75 . *. *.This fu
46b0: 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 nction allocates
46c0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 73 and initializes
46d0: 20 61 20 6e 65 77 20 53 6f 63 6b 65 74 49 6e 66 a new SocketInf
46e0: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a o structure..