Tcl Source Code

Hex Artifact Content
Login

Artifact d000a06a6ca4676e2af63dee9b8363d03186923b:

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