0000: 2f 2a 0a 20 2a 20 74 63 6c 49 4f 43 6d 64 2e 63 /*. * tclIOCmd.c
0010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 74 61 69 --. *. *.Contai
0020: 6e 73 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f ns the definitio
0030: 6e 73 20 6f 66 20 6d 6f 73 74 20 6f 66 20 74 68 ns of most of th
0040: 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 20 72 e Tcl commands r
0050: 65 6c 61 74 69 6e 67 20 74 6f 20 49 4f 2e 0a 20 elating to IO..
0060: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 c2 *. * Copyright �
0070: a9 20 31 39 39 35 2d 31 39 39 37 20 53 75 6e 20 � 1995-1997 Sun
0080: 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e Microsystems, In
0090: 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 c.. *. * See the
00a0: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 file "license.t
00b0: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d erms" for inform
00c0: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 ation on usage a
00d0: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f nd redistributio
00e0: 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c n of. * this fil
00f0: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 e, and for a DIS
0100: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 CLAIMER OF ALL W
0110: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a ARRANTIES.. */..
0120: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 49 6e 74 #include "tclInt
0130: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 .h".#include "tc
0140: 6c 49 4f 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 lIO.h".#include
0150: 22 74 63 6c 54 6f 6d 4d 61 74 68 2e 68 22 0a 0a "tclTomMath.h"..
0160: 2f 2a 0a 20 2a 20 43 61 6c 6c 62 61 63 6b 20 73 /*. * Callback s
0170: 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 63 63 tructure for acc
0180: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 69 6e 20 ept callback in
0190: 61 20 54 43 50 20 73 65 72 76 65 72 2e 0a 20 2a a TCP server.. *
01a0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
01b0: 74 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 t {. Tcl_Obj
01c0: 2a 73 63 72 69 70 74 3b 09 09 2f 2a 20 53 63 72 *script;../* Scr
01d0: 69 70 74 20 74 6f 20 69 6e 76 6f 6b 65 2e 20 2a ipt to invoke. *
01e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
01f0: 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 49 6e *interp;../* In
0200: 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 terpreter in whi
0210: 63 68 20 74 6f 20 72 75 6e 20 69 74 2e 20 2a 2f ch to run it. */
0220: 0a 7d 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 .} AcceptCallbac
0230: 6b 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 k;../*. * Thread
0240: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 75 local storage u
0250: 73 65 64 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 sed to maintain
0260: 61 20 70 65 72 2d 74 68 72 65 61 64 20 73 74 64 a per-thread std
0270: 6f 75 74 20 63 68 61 6e 6e 65 6c 20 6f 62 6a 2e out channel obj.
0280: 0a 20 2a 20 49 74 20 6d 75 73 74 20 62 65 20 70 . * It must be p
0290: 65 72 2d 74 68 72 65 61 64 20 62 65 63 61 75 73 er-thread becaus
02a0: 65 20 6f 66 20 73 74 64 20 63 68 61 6e 6e 65 6c e of std channel
02b0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 0a 20 2a limitations.. *
02c0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
02d0: 74 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 69 74 t {. int init
02e0: 69 61 6c 69 7a 65 64 3b 09 09 2f 2a 20 53 65 74 ialized;../* Set
02f0: 20 74 6f 20 31 20 77 68 65 6e 20 74 68 65 20 6d to 1 when the m
0300: 6f 64 75 6c 65 20 69 73 20 69 6e 69 74 69 61 6c odule is initial
0310: 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c ized. */. Tcl
0320: 5f 4f 62 6a 20 2a 73 74 64 6f 75 74 4f 62 6a 50 _Obj *stdoutObjP
0330: 74 72 3b 09 2f 2a 20 43 61 63 68 65 64 20 73 74 tr;./* Cached st
0340: 64 6f 75 74 20 63 68 61 6e 6e 65 6c 20 54 63 6c dout channel Tcl
0350: 5f 4f 62 6a 20 2a 2f 0a 7d 20 54 68 72 65 61 64 _Obj */.} Thread
0360: 53 70 65 63 69 66 69 63 44 61 74 61 3b 0a 0a 73 SpecificData;..s
0370: 74 61 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64 tatic Tcl_Thread
0380: 44 61 74 61 4b 65 79 20 64 61 74 61 4b 65 79 3b DataKey dataKey;
0390: 0a 0a 2f 2a 0a 20 2a 20 4b 65 79 20 66 6f 72 20 ../*. * Key for
03a0: 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 looking up the t
03b0: 61 62 6c 65 20 6f 66 20 72 65 67 69 73 74 65 72 able of register
03c0: 65 64 20 54 43 50 20 61 63 63 65 70 74 20 63 61 ed TCP accept ca
03d0: 6c 6c 62 61 63 6b 73 2c 20 61 20 68 61 73 68 0a llbacks, a hash.
03e0: 20 2a 20 74 61 62 6c 65 20 69 6e 64 65 78 65 64 * table indexed
03f0: 20 62 79 20 41 63 63 65 70 74 43 61 6c 6c 62 61 by AcceptCallba
0400: 63 6b 20 72 65 66 65 72 65 6e 63 65 73 2c 20 75 ck references, u
0410: 73 65 64 20 61 73 20 61 20 73 65 74 20 28 76 61 sed as a set (va
0420: 6c 75 65 73 20 61 72 65 0a 20 2a 20 6d 65 61 6e lues are. * mean
0430: 69 6e 67 6c 65 73 73 29 2e 0a 20 2a 2f 0a 23 64 ingless).. */.#d
0440: 65 66 69 6e 65 20 41 53 53 4f 43 5f 4b 45 59 20 efine ASSOC_KEY
0450: 22 74 63 6c 54 43 50 41 63 63 65 70 74 43 61 6c "tclTCPAcceptCal
0460: 6c 62 61 63 6b 73 22 0a 0a 2f 2a 0a 20 2a 20 53 lbacks"../*. * S
0470: 74 61 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 tatic functions
0480: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 3a 0a 20 for this file:.
0490: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 45 */..static Tcl_E
04a0: 78 69 74 50 72 6f 63 09 46 69 6e 61 6c 69 7a 65 xitProc.Finalize
04b0: 49 4f 43 6d 64 54 53 44 3b 0a 73 74 61 74 69 63 IOCmdTSD;.static
04c0: 20 54 63 6c 5f 54 63 70 41 63 63 65 70 74 50 72 Tcl_TcpAcceptPr
04d0: 6f 63 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 oc AcceptCallbac
04e0: 6b 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63 kProc;.static Tc
04f0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 32 09 43 68 l_ObjCmdProc2.Ch
0500: 61 6e 49 73 42 69 6e 61 72 79 43 6d 64 3b 0a 73 anIsBinaryCmd;.s
0510: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 tatic Tcl_ObjCmd
0520: 50 72 6f 63 32 09 43 68 61 6e 50 65 6e 64 69 6e Proc2.ChanPendin
0530: 67 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20 gObjCmd;.static
0540: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 32 09 Tcl_ObjCmdProc2.
0550: 43 68 61 6e 50 69 70 65 4f 62 6a 43 6d 64 3b 0a ChanPipeObjCmd;.
0560: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d static Tcl_ObjCm
0570: 64 50 72 6f 63 32 09 43 68 61 6e 54 72 75 6e 63 dProc2.ChanTrunc
0580: 61 74 65 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 ateObjCmd;.stati
0590: 63 20 76 6f 69 64 09 09 52 65 67 69 73 74 65 72 c void..Register
05a0: 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 TcpServerInterpC
05b0: 6c 65 61 6e 75 70 28 0a 09 09 09 20 20 20 20 54 leanup(.... T
05c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
05d0: 70 2c 0a 09 09 09 20 20 20 20 41 63 63 65 70 74 p,.... Accept
05e0: 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 74 Callback *accept
05f0: 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 73 74 CallbackPtr);.st
0600: 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 44 atic Tcl_InterpD
0610: 65 6c 65 74 65 50 72 6f 63 09 54 63 70 41 63 63 eleteProc.TcpAcc
0620: 65 70 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 eptCallbacksDele
0630: 74 65 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 76 teProc;.static v
0640: 6f 69 64 09 09 54 63 70 53 65 72 76 65 72 43 6c oid..TcpServerCl
0650: 6f 73 65 50 72 6f 63 28 76 6f 69 64 20 2a 63 61 oseProc(void *ca
0660: 6c 6c 62 61 63 6b 44 61 74 61 29 3b 0a 73 74 61 llbackData);.sta
0670: 74 69 63 20 76 6f 69 64 09 09 55 6e 72 65 67 69 tic void..Unregi
0680: 73 74 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 sterTcpServerInt
0690: 65 72 70 43 6c 65 61 6e 75 70 50 72 6f 63 28 0a erpCleanupProc(.
06a0: 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ... Tcl_Inter
06b0: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 p *interp,....
06c0: 20 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b AcceptCallback
06d0: 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b *acceptCallback
06e0: 50 74 72 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 Ptr);../*. * The
06f0: 20 62 61 73 69 63 20 64 65 73 63 72 69 70 74 69 basic descripti
0700: 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 73 20 on of the parts
0710: 6f 66 20 74 68 65 20 5b 63 68 61 6e 5d 20 65 6e of the [chan] en
0720: 73 65 6d 62 6c 65 2e 0a 20 2a 20 41 6c 73 6f 20 semble.. * Also
0730: 63 6f 6e 74 61 69 6e 73 20 5b 63 68 61 6e 20 63 contains [chan c
0740: 6f 6e 66 69 67 75 72 65 5d 2c 20 77 68 69 63 68 onfigure], which
0750: 20 69 73 20 5b 66 63 6f 6e 66 69 67 75 72 65 5d is [fconfigure]
0760: 2e 0a 20 2a 2f 0a 63 6f 6e 73 74 20 45 6e 73 65 .. */.const Ense
0770: 6d 62 6c 65 49 6d 70 6c 4d 61 70 20 74 63 6c 43 mbleImplMap tclC
0780: 68 61 6e 49 6d 70 6c 4d 61 70 5b 5d 20 3d 20 7b hanImplMap[] = {
0790: 0a 20 20 20 20 7b 22 62 6c 6f 63 6b 65 64 22 2c . {"blocked",
07a0: 09 09 54 63 6c 5f 46 62 6c 6f 63 6b 65 64 4f 62 ..Tcl_FblockedOb
07b0: 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 jCmd,.TclCompile
07c0: 42 61 73 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 Basic1ArgCmd, NU
07d0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 LL, NULL, 0},.
07e0: 20 20 7b 22 63 6c 6f 73 65 22 2c 09 09 54 63 6c {"close",..Tcl
07f0: 5f 43 6c 6f 73 65 4f 62 6a 43 6d 64 2c 09 54 63 _CloseObjCmd,.Tc
0800: 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 4f 72 lCompileBasic1Or
0810: 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 2ArgCmd, NULL, N
0820: 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b 22 63 ULL, 0},. {"c
0830: 6f 70 79 22 2c 09 09 54 63 6c 5f 46 63 6f 70 79 opy",..Tcl_Fcopy
0840: 4f 62 6a 43 6d 64 2c 09 4e 55 4c 4c 2c 09 09 09 ObjCmd,.NULL,...
0850: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a NULL, NULL, 0},.
0860: 20 20 20 20 7b 22 63 72 65 61 74 65 22 2c 09 09 {"create",..
0870: 54 63 6c 43 68 61 6e 43 72 65 61 74 65 4f 62 6a TclChanCreateObj
0880: 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 Cmd,.TclCompileB
0890: 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c asic2ArgCmd, NUL
08a0: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 20 20 20 L, NULL, 0},.
08b0: 2f 2a 20 54 49 50 20 23 32 31 39 20 2a 2f 0a 20 /* TIP #219 */.
08c0: 20 20 20 7b 22 65 6f 66 22 2c 09 09 54 63 6c 5f {"eof",..Tcl_
08d0: 45 6f 66 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 EofObjCmd,..TclC
08e0: 6f 6d 70 69 6c 65 42 61 73 69 63 31 41 72 67 43 ompileBasic1ArgC
08f0: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 md, NULL, NULL,
0900: 30 7d 2c 0a 20 20 20 20 7b 22 65 76 65 6e 74 22 0},. {"event"
0910: 2c 09 09 54 63 6c 5f 46 69 6c 65 45 76 65 6e 74 ,..Tcl_FileEvent
0920: 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 ObjCmd,.TclCompi
0930: 6c 65 42 61 73 69 63 32 4f 72 33 41 72 67 43 6d leBasic2Or3ArgCm
0940: 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 d, NULL, NULL, 0
0950: 7d 2c 0a 20 20 20 20 7b 22 66 6c 75 73 68 22 2c },. {"flush",
0960: 09 09 54 63 6c 5f 46 6c 75 73 68 4f 62 6a 43 6d ..Tcl_FlushObjCm
0970: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 d,.TclCompileBas
0980: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c ic1ArgCmd, NULL,
0990: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b NULL, 0},. {
09a0: 22 67 65 74 73 22 2c 09 09 54 63 6c 5f 47 65 74 "gets",..Tcl_Get
09b0: 73 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d sObjCmd,..TclCom
09c0: 70 69 6c 65 42 61 73 69 63 31 4f 72 32 41 72 67 pileBasic1Or2Arg
09d0: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c Cmd, NULL, NULL,
09e0: 20 30 7d 2c 0a 20 20 20 20 7b 22 69 73 62 69 6e 0},. {"isbin
09f0: 61 72 79 22 2c 09 43 68 61 6e 49 73 42 69 6e 61 ary",.ChanIsBina
0a00: 72 79 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c ryCmd,.TclCompil
0a10: 65 42 61 73 69 63 31 41 72 67 43 6d 64 2c 20 4e eBasic1ArgCmd, N
0a20: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 ULL, NULL, 0},.
0a30: 20 20 20 7b 22 6e 61 6d 65 73 22 2c 09 09 54 63 {"names",..Tc
0a40: 6c 43 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 lChannelNamesCmd
0a50: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 ,.TclCompileBasi
0a60: 63 30 4f 72 31 41 72 67 43 6d 64 2c 20 4e 55 4c c0Or1ArgCmd, NUL
0a70: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 L, NULL, 0},.
0a80: 20 7b 22 70 65 6e 64 69 6e 67 22 2c 09 09 43 68 {"pending",..Ch
0a90: 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 2c anPendingObjCmd,
0aa0: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 .TclCompileBasic
0ab0: 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 2ArgCmd, NULL, N
0ac0: 55 4c 4c 2c 20 30 7d 2c 09 20 20 20 2f 2a 20 54 ULL, 0},. /* T
0ad0: 49 50 20 23 32 38 37 20 2a 2f 0a 20 20 20 20 7b IP #287 */. {
0ae0: 22 70 69 70 65 22 2c 09 09 43 68 61 6e 50 69 70 "pipe",..ChanPip
0af0: 65 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d eObjCmd,..TclCom
0b00: 70 69 6c 65 42 61 73 69 63 30 41 72 67 43 6d 64 pileBasic0ArgCmd
0b10: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d , NULL, NULL, 0}
0b20: 2c 09 20 20 20 2f 2a 20 54 49 50 20 23 33 30 34 ,. /* TIP #304
0b30: 20 2a 2f 0a 20 20 20 20 7b 22 70 6f 70 22 2c 09 */. {"pop",.
0b40: 09 54 63 6c 43 68 61 6e 50 6f 70 4f 62 6a 43 6d .TclChanPopObjCm
0b50: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 d,.TclCompileBas
0b60: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c ic1ArgCmd, NULL,
0b70: 20 4e 55 4c 4c 2c 20 30 7d 2c 20 20 20 20 2f 2a NULL, 0}, /*
0b80: 20 54 49 50 20 23 32 33 30 20 2a 2f 0a 20 20 20 TIP #230 */.
0b90: 20 7b 22 70 6f 73 74 65 76 65 6e 74 22 2c 09 54 {"postevent",.T
0ba0: 63 6c 43 68 61 6e 50 6f 73 74 45 76 65 6e 74 4f clChanPostEventO
0bb0: 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c bjCmd,.TclCompil
0bc0: 65 42 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e eBasic2ArgCmd, N
0bd0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 20 ULL, NULL, 0},.
0be0: 20 20 2f 2a 20 54 49 50 20 23 32 31 39 20 2a 2f /* TIP #219 */
0bf0: 0a 20 20 20 20 7b 22 70 75 73 68 22 2c 09 09 54 . {"push",..T
0c00: 63 6c 43 68 61 6e 50 75 73 68 4f 62 6a 43 6d 64 clChanPushObjCmd
0c10: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 ,.TclCompileBasi
0c20: 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 c2ArgCmd, NULL,
0c30: 4e 55 4c 4c 2c 20 30 7d 2c 09 20 20 20 2f 2a 20 NULL, 0},. /*
0c40: 54 49 50 20 23 32 33 30 20 2a 2f 0a 20 20 20 20 TIP #230 */.
0c50: 7b 22 70 75 74 73 22 2c 09 09 54 63 6c 5f 50 75 {"puts",..Tcl_Pu
0c60: 74 73 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c tsObjCmd,..NULL,
0c70: 09 09 09 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 ...NULL, NULL, 0
0c80: 7d 2c 0a 20 20 20 20 7b 22 72 65 61 64 22 2c 09 },. {"read",.
0c90: 09 54 63 6c 5f 52 65 61 64 4f 62 6a 43 6d 64 2c .Tcl_ReadObjCmd,
0ca0: 09 09 4e 55 4c 4c 2c 09 09 09 4e 55 4c 4c 2c 20 ..NULL,...NULL,
0cb0: 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b 22 NULL, 0},. {"
0cc0: 73 65 65 6b 22 2c 09 09 54 63 6c 5f 53 65 65 6b seek",..Tcl_Seek
0cd0: 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d 70 ObjCmd,..TclComp
0ce0: 69 6c 65 42 61 73 69 63 32 4f 72 33 41 72 67 43 ileBasic2Or3ArgC
0cf0: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 md, NULL, NULL,
0d00: 30 7d 2c 0a 20 20 20 20 7b 22 74 65 6c 6c 22 2c 0},. {"tell",
0d10: 09 09 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 ..Tcl_TellObjCmd
0d20: 2c 09 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 ,..TclCompileBas
0d30: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c ic1ArgCmd, NULL,
0d40: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b NULL, 0},. {
0d50: 22 74 72 75 6e 63 61 74 65 22 2c 09 43 68 61 6e "truncate",.Chan
0d60: 54 72 75 6e 63 61 74 65 4f 62 6a 43 6d 64 2c 09 TruncateObjCmd,.
0d70: 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 TclCompileBasic1
0d80: 4f 72 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c Or2ArgCmd, NULL,
0d90: 20 4e 55 4c 4c 2c 20 30 7d 2c 20 2f 2a 20 54 49 NULL, 0}, /* TI
0da0: 50 20 23 32 30 38 20 2a 2f 0a 20 20 20 20 7b 4e P #208 */. {N
0db0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c ULL, NULL, NULL,
0dc0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 0a NULL, NULL, 0}.
0dd0: 7d 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d };.../*. *------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 0a 20 2a 0a 20 2a 20 46 69 6e 61 6c 69 7a 65 49 . *. * FinalizeI
0e30: 4f 43 6d 64 54 53 44 20 2d 2d 0a 20 2a 0a 20 2a OCmdTSD --. *. *
0e40: 09 52 65 6c 65 61 73 65 20 74 68 65 20 73 74 6f .Release the sto
0e50: 72 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 20 rage associated
0e60: 77 69 74 68 20 74 68 65 20 70 65 72 2d 74 68 72 with the per-thr
0e70: 65 61 64 20 63 61 63 68 65 2e 0a 20 2a 0a 20 2a ead cache.. *. *
0e80: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
0e90: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
0ea0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
0eb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 46 69 6e .static void.Fin
0f10: 61 6c 69 7a 65 49 4f 43 6d 64 54 53 44 28 0a 20 alizeIOCmdTSD(.
0f20: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
0f30: 69 64 20 2a 29 29 0a 7b 0a 20 20 20 20 54 68 72 id *)).{. Thr
0f40: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 eadSpecificData
0f50: 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 *tsdPtr = TCL_TS
0f60: 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29 D_INIT(&dataKey)
0f70: 3b 0a 0a 20 20 20 20 69 66 20 28 74 73 64 50 74 ;.. if (tsdPt
0f80: 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 20 r->stdoutObjPtr
0f90: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
0fa0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 73 64 DecrRefCount(tsd
0fb0: 50 74 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 Ptr->stdoutObjPt
0fc0: 72 29 3b 0a 09 74 73 64 50 74 72 2d 3e 73 74 64 r);..tsdPtr->std
0fd0: 6f 75 74 4f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c outObjPtr = NULL
0fe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 73 64 50 ;. }. tsdP
0ff0: 74 72 2d 3e 69 6e 69 74 69 61 6c 69 7a 65 64 20 tr->initialized
1000: 3d 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d = 0;.}.../*. *--
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1050: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 50 ----. *. * Tcl_P
1060: 75 74 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a utsObjCmd --. *.
1070: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
1080: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
1090: 72 6f 63 65 73 73 20 74 68 65 20 22 70 75 74 73 rocess the "puts
10a0: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 " Tcl command. S
10b0: 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 ee the. *.user d
10c0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
10d0: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
10e0: 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 it does.. *. *
10f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
1100: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
1110: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
1120: 66 65 63 74 73 3a 0a 20 2a 09 50 72 6f 64 75 63 fects:. *.Produc
1130: 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 61 20 63 es output on a c
1140: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
11a0: 5f 50 75 74 73 4f 62 6a 43 6d 64 28 0a 20 20 20 _PutsObjCmd(.
11b0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
11c0: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
11d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
11e0: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 Current interpr
11f0: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c eter. */. Tcl
1200: 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 _Size objc,../*
1210: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 Number of argume
1220: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nts. */. Tcl_
1230: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
1240: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 )./* Argument ob
1250: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 jects. */.{.
1260: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
1270: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
1280: 6c 20 74 6f 20 70 75 74 73 20 6f 6e 2e 20 2a 2f l to puts on. */
1290: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 74 . Tcl_Obj *st
12a0: 72 69 6e 67 3b 09 09 2f 2a 20 53 74 72 69 6e 67 ring;../* String
12b0: 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 20 20 to write. */.
12c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 68 61 6e 4f Tcl_Obj *chanO
12d0: 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 09 2f 2a bjPtr = NULL;./*
12e0: 20 63 68 61 6e 6e 65 6c 20 6f 62 6a 65 63 74 2e channel object.
12f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 6c */. int newl
1300: 69 6e 65 3b 09 09 2f 2a 20 41 64 64 20 61 20 6e ine;../* Add a n
1310: 65 77 6c 69 6e 65 20 61 74 20 65 6e 64 3f 20 2a ewline at end? *
1320: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 72 /. Tcl_Size r
1330: 65 73 75 6c 74 3b 09 09 2f 2a 20 52 65 73 75 6c esult;../* Resul
1340: 74 20 6f 66 20 70 75 74 73 20 6f 70 65 72 61 74 t of puts operat
1350: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ion. */. int
1360: 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64 65 20 mode;.../* Mode
1370: 69 6e 20 77 68 69 63 68 20 63 68 61 6e 6e 65 6c in which channel
1380: 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 0a is opened. */..
1390: 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63 switch (objc
13a0: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 32 3a 09 ) {. case 2:.
13b0: 09 09 2f 2a 20 5b 70 75 74 73 20 24 78 5d 20 2a ../* [puts $x] *
13c0: 2f 0a 09 73 74 72 69 6e 67 20 3d 20 6f 62 6a 76 /..string = objv
13d0: 5b 31 5d 3b 0a 09 6e 65 77 6c 69 6e 65 20 3d 20 [1];..newline =
13e0: 31 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 1;..break;..
13f0: 63 61 73 65 20 33 3a 09 09 09 2f 2a 20 5b 70 75 case 3:.../* [pu
1400: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 78 ts -nonewline $x
1410: 5d 20 6f 72 20 5b 70 75 74 73 20 24 63 68 61 6e ] or [puts $chan
1420: 20 24 78 5d 20 2a 2f 0a 09 69 66 20 28 73 74 72 $x] */..if (str
1430: 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69 6e 67 cmp(TclGetString
1440: 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e 6f 6e (objv[1]), "-non
1450: 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29 20 7b ewline") == 0) {
1460: 0a 09 20 20 20 20 6e 65 77 6c 69 6e 65 20 3d 20 .. newline =
1470: 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 0;..} else {..
1480: 20 20 6e 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 09 newline = 1;..
1490: 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d chanObjPtr =
14a0: 20 6f 62 6a 76 5b 31 5d 3b 0a 09 7d 0a 09 73 74 objv[1];..}..st
14b0: 72 69 6e 67 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a ring = objv[2];.
14c0: 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 .break;.. cas
14d0: 65 20 34 3a 09 09 09 2f 2a 20 5b 70 75 74 73 20 e 4:.../* [puts
14e0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 63 68 61 6e -nonewline $chan
14f0: 20 24 78 5d 20 6f 72 0a 09 09 09 09 20 2a 20 5b $x] or..... * [
1500: 70 75 74 73 20 24 63 68 61 6e 20 24 78 20 6e 6f puts $chan $x no
1510: 6e 65 77 6c 69 6e 65 5d 20 2a 2f 0a 09 6e 65 77 newline] */..new
1520: 6c 69 6e 65 20 3d 20 30 3b 0a 09 69 66 20 28 73 line = 0;..if (s
1530: 74 72 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69 trcmp(TclGetStri
1540: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e ng(objv[1]), "-n
1550: 6f 6e 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29 onewline") == 0)
1560: 20 7b 0a 09 20 20 20 20 63 68 61 6e 4f 62 6a 50 {.. chanObjP
1570: 74 72 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 20 tr = objv[2];..
1580: 20 20 20 73 74 72 69 6e 67 20 3d 20 6f 62 6a 76 string = objv
1590: 5b 33 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b [3];.. break;
15a0: 0a 09 7d 0a 09 54 43 4c 5f 46 41 4c 4c 54 48 52 ..}..TCL_FALLTHR
15b0: 4f 55 47 48 28 29 3b 0a 20 20 20 20 64 65 66 61 OUGH();. defa
15c0: 75 6c 74 3a 09 09 09 2f 2a 20 5b 70 75 74 73 5d ult:.../* [puts]
15d0: 20 6f 72 0a 09 09 09 09 20 2a 20 5b 70 75 74 73 or..... * [puts
15e0: 20 73 6f 6d 65 20 62 61 64 20 6e 75 6d 62 65 72 some bad number
15f0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 2e 2e of arguments...
1600: 5d 20 2a 2f 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e ] */..Tcl_WrongN
1610: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
1620: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6e 6f 6e 65 77 , objv, "?-nonew
1630: 6c 69 6e 65 3f 20 3f 63 68 61 6e 6e 65 6c 3f 20 line? ?channel?
1640: 73 74 72 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 string");..retur
1650: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
1660: 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e }.. if (chan
1670: 4f 62 6a 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 ObjPtr == NULL)
1680: 7b 0a 09 54 68 72 65 61 64 53 70 65 63 69 66 69 {..ThreadSpecifi
1690: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20 cData *tsdPtr =
16a0: 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61 TCL_TSD_INIT(&da
16b0: 74 61 4b 65 79 29 3b 0a 0a 09 69 66 20 28 21 74 taKey);...if (!t
16c0: 73 64 50 74 72 2d 3e 69 6e 69 74 69 61 6c 69 7a sdPtr->initializ
16d0: 65 64 29 20 7b 0a 09 20 20 20 20 74 73 64 50 74 ed) {.. tsdPt
16e0: 72 2d 3e 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d r->initialized =
16f0: 20 31 3b 0a 09 20 20 20 20 54 63 6c 4e 65 77 4c 1;.. TclNewL
1700: 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28 iteralStringObj(
1710: 74 73 64 50 74 72 2d 3e 73 74 64 6f 75 74 4f 62 tsdPtr->stdoutOb
1720: 6a 50 74 72 2c 20 22 73 74 64 6f 75 74 22 29 3b jPtr, "stdout");
1730: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
1740: 66 43 6f 75 6e 74 28 74 73 64 50 74 72 2d 3e 73 fCount(tsdPtr->s
1750: 74 64 6f 75 74 4f 62 6a 50 74 72 29 3b 0a 09 20 tdoutObjPtr);..
1760: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 54 68 72 Tcl_CreateThr
1770: 65 61 64 45 78 69 74 48 61 6e 64 6c 65 72 28 46 eadExitHandler(F
1780: 69 6e 61 6c 69 7a 65 49 4f 43 6d 64 54 53 44 2c inalizeIOCmdTSD,
1790: 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 63 68 61 6e NULL);..}..chan
17a0: 4f 62 6a 50 74 72 20 3d 20 74 73 64 50 74 72 2d ObjPtr = tsdPtr-
17b0: 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 3b 0a 20 >stdoutObjPtr;.
17c0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
17d0: 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 GetChannelFromOb
17e0: 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 4f 62 j(interp, chanOb
17f0: 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 26 6d 6f jPtr, &chan, &mo
1800: 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b de, 0) != TCL_OK
1810: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
1820: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
1830: 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 if (!(mode & TC
1840: 4c 5f 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09 L_WRITABLE)) {..
1850: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
1860: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
1870: 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 6e 6e Printf(..."chann
1880: 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e 27 74 el \"%s\" wasn't
1890: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 opened for writ
18a0: 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 ing",...TclGetSt
18b0: 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 ring(chanObjPtr)
18c0: 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ));..return TCL_
18d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
18e0: 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 65 73 TclChannelPres
18f0: 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 erve(chan);.
1900: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 57 72 69 result = Tcl_Wri
1910: 74 65 4f 62 6a 28 63 68 61 6e 2c 20 73 74 72 69 teObj(chan, stri
1920: 6e 67 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 ng);. if (res
1930: 75 6c 74 20 3d 3d 20 54 43 4c 5f 49 4e 44 45 58 ult == TCL_INDEX
1940: 5f 4e 4f 4e 45 29 20 7b 0a 09 67 6f 74 6f 20 65 _NONE) {..goto e
1950: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
1960: 69 66 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30 if (newline != 0
1970: 29 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 ) {..result = Tc
1980: 6c 5f 57 72 69 74 65 43 68 61 72 73 28 63 68 61 l_WriteChars(cha
1990: 6e 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 09 69 66 n, "\n", 1);..if
19a0: 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f (result == TCL_
19b0: 49 4e 44 45 58 5f 4e 4f 4e 45 29 20 7b 0a 09 20 INDEX_NONE) {..
19c0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 goto error;..
19d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 43 }. }. TclC
19e0: 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 hannelRelease(ch
19f0: 61 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 an);. return
1a00: 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 0a TCL_OK;.. /*.
1a10: 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 2e * TIP #219.
1a20: 0a 20 20 20 20 20 2a 20 43 61 70 74 75 72 65 20 . * Capture
1a30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 70 error messages p
1a40: 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 72 ut by the driver
1a50: 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 73 into the bypass
1a60: 20 61 72 65 61 20 61 6e 64 20 70 75 74 0a 20 20 area and put.
1a70: 20 20 20 2a 20 74 68 65 6d 20 69 6e 74 6f 20 74 * them into t
1a80: 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 he regular inter
1a90: 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 preter result. F
1aa0: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 all back to the
1ab0: 72 65 67 75 6c 61 72 0a 20 20 20 20 20 2a 20 6d regular. * m
1ac0: 65 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e essage if nothin
1ad0: 67 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 g was found in t
1ae0: 68 65 20 62 79 70 61 73 73 2e 0a 20 20 20 20 20 he bypass..
1af0: 2a 2f 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 */.. error:.
1b00: 20 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61 75 if (!TclChanCau
1b10: 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 69 ghtErrorBypass(i
1b20: 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a nterp, chan)) {.
1b30: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
1b40: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
1b50: 6a 50 72 69 6e 74 66 28 22 65 72 72 6f 72 20 77 jPrintf("error w
1b60: 72 69 74 69 6e 67 20 5c 22 25 73 5c 22 3a 20 25 riting \"%s\": %
1b70: 73 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 69 s",...TclGetStri
1b80: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20 ng(chanObjPtr),
1b90: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
1ba0: 6e 74 65 72 70 29 29 29 3b 0a 20 20 20 20 7d 0a nterp)));. }.
1bb0: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 TclChannelRe
1bc0: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 lease(chan);.
1bd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
1be0: 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d R;.}.../*. *----
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c30: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 6c 75 --. *. * Tcl_Flu
1c40: 73 68 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 shObjCmd --. *.
1c50: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
1c60: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f is called to pro
1c70: 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 66 6c cess the Tcl "fl
1c80: 75 73 68 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 ush" command. Se
1c90: 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f e the. *.user do
1ca0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 cumentation for
1cb0: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 details on what
1cc0: 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 it does.. *. * R
1cd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
1ce0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
1cf0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
1d00: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 75 ects:. *.May cau
1d10: 73 65 20 6f 75 74 70 75 74 20 74 6f 20 61 70 70 se output to app
1d20: 65 61 72 20 6f 6e 20 74 68 65 20 73 70 65 63 69 ear on the speci
1d30: 66 69 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a fied channel.. *
1d40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
1d90: 6e 74 0a 54 63 6c 5f 46 6c 75 73 68 4f 62 6a 43 nt.Tcl_FlushObjC
1da0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
1db0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
1dc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1dd0: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 rp,../* Current
1de0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a interpreter. */.
1df0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 6a Tcl_Size obj
1e00: 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 c,../* Number of
1e10: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 arguments. */.
1e20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
1e30: 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67 75 t *objv)./* Argu
1e40: 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f ment objects. */
1e50: 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a .{. Tcl_Obj *
1e60: 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20 20 chanObjPtr;.
1e70: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
1e80: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 ;../* The channe
1e90: 6c 20 74 6f 20 66 6c 75 73 68 20 6f 6e 2e 20 2a l to flush on. *
1ea0: 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a /. int mode;.
1eb0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
1ec0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
1ed0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
1ee0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
1ef0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
1f00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
1f10: 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f chanObjPtr = o
1f20: 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28 bjv[1];. if (
1f30: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f TclGetChannelFro
1f40: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 mObj(interp, cha
1f50: 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 nObjPtr, &chan,
1f60: 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c &mode, 0) != TCL
1f70: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
1f80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
1f90: 20 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 if (!(mode &
1fa0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 20 TCL_WRITABLE))
1fb0: 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 {..Tcl_SetObjRes
1fc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
1fd0: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 ObjPrintf(..."ch
1fe0: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 annel \"%s\" was
1ff0: 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 n't opened for w
2000: 72 69 74 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 riting",...TclGe
2010: 74 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 tString(chanObjP
2020: 74 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 tr)));..return T
2030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
2040: 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 . TclChannelP
2050: 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 reserve(chan);.
2060: 20 20 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 if (Tcl_Flush
2070: 28 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b (chan) != TCL_OK
2080: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 ) {../*.. * TIP
2090: 23 32 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 #219... * Captur
20a0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 e error messages
20b0: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 put by the driv
20c0: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 er into the bypa
20d0: 73 73 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 ss area and.. *
20e0: 70 75 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 put them into th
20f0: 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70 e regular interp
2100: 72 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61 reter result. Fa
2110: 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 ll back to the..
2120: 20 2a 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 * regular messa
2130: 67 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 ge if nothing wa
2140: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 s found in the b
2150: 79 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 ypass... */...if
2160: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 (!TclChanCaught
2170: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 ErrorBypass(inte
2180: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 rp, chan)) {..
2190: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
21a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
21b0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 bjPrintf(...
21c0: 22 65 72 72 6f 72 20 66 6c 75 73 68 69 6e 67 20 "error flushing
21d0: 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 20 \"%s\": %s",...
21e0: 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 TclGetString(
21f0: 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20 54 63 6c chanObjPtr), Tcl
2200: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
2210: 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43 68 rp)));..}..TclCh
2220: 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 61 annelRelease(cha
2230: 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f n);..return TCL_
2240: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
2250: 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 TclChannelRelea
2260: 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 65 se(chan);. re
2270: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
2280: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
22d0: 20 2a 20 54 63 6c 5f 47 65 74 73 4f 62 6a 43 6d * Tcl_GetsObjCm
22e0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
22f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c function is call
2300: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
2310: 65 20 54 63 6c 20 22 67 65 74 73 22 20 63 6f 6d e Tcl "gets" com
2320: 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 2a mand. See the. *
2330: 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 .user documentat
2340: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
2350: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
2360: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
2370: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
2380: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
2390: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
23a0: 09 4d 61 79 20 63 6f 6e 73 75 6d 65 20 69 6e 70 .May consume inp
23b0: 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 2e ut from channel.
23c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2410: 0a 0a 69 6e 74 0a 54 63 6c 5f 47 65 74 73 4f 62 ..int.Tcl_GetsOb
2420: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e jCmd(. TCL_UN
2430: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
2440: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
2450: 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e terp,../* Curren
2460: 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a t interpreter. *
2470: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f /. Tcl_Size o
2480: 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 bjc,../* Number
2490: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f of arguments. */
24a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
24b0: 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 nst *objv)./* Ar
24c0: 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 gument objects.
24d0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 */.{. Tcl_Cha
24e0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
24f0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 72 65 he channel to re
2500: 61 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 ad from. */.
2510: 54 63 6c 5f 53 69 7a 65 20 6c 69 6e 65 4c 65 6e Tcl_Size lineLen
2520: 3b 09 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 ;../* Length of
2530: 6c 69 6e 65 20 6a 75 73 74 20 72 65 61 64 2e 20 line just read.
2540: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b */. int mode;
2550: 09 09 09 2f 2a 20 4d 6f 64 65 20 69 6e 20 77 68 .../* Mode in wh
2560: 69 63 68 20 63 68 61 6e 6e 65 6c 20 69 73 20 6f ich channel is o
2570: 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 pened. */. Tc
2580: 6c 5f 4f 62 6a 20 2a 6c 69 6e 65 50 74 72 2c 20 l_Obj *linePtr,
2590: 2a 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20 *chanObjPtr;.
25a0: 20 69 6e 74 20 63 6f 64 65 20 3d 20 54 43 4c 5f int code = TCL_
25b0: 4f 4b 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 OK;.. if ((ob
25c0: 6a 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a jc != 2) && (obj
25d0: 63 20 21 3d 20 33 29 29 20 7b 0a 09 54 63 6c 5f c != 3)) {..Tcl_
25e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
25f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
2600: 68 61 6e 6e 65 6c 20 3f 76 61 72 4e 61 6d 65 3f hannel ?varName?
2610: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
2620: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
2630: 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f 62 chanObjPtr = ob
2640: 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28 54 jv[1];. if (T
2650: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d clGetChannelFrom
2660: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 6e Obj(interp, chan
2670: 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 26 ObjPtr, &chan, &
2680: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f mode, 0) != TCL_
2690: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
26a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
26b0: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 if (!(mode &
26c0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b TCL_READABLE)) {
26d0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
26e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
26f0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 bjPrintf(..."cha
2700: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e nnel \"%s\" wasn
2710: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 't opened for re
2720: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 ading",...TclGet
2730: 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 String(chanObjPt
2740: 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 r)));..return TC
2750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
2760: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 TclChannelPr
2770: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 eserve(chan);.
2780: 20 20 54 63 6c 4e 65 77 4f 62 6a 28 6c 69 6e 65 TclNewObj(line
2790: 50 74 72 29 3b 0a 20 20 20 20 6c 69 6e 65 4c 65 Ptr);. lineLe
27a0: 6e 20 3d 20 54 63 6c 5f 47 65 74 73 4f 62 6a 28 n = Tcl_GetsObj(
27b0: 63 68 61 6e 2c 20 6c 69 6e 65 50 74 72 29 3b 0a chan, linePtr);.
27c0: 20 20 20 20 69 66 20 28 6c 69 6e 65 4c 65 6e 20 if (lineLen
27d0: 3d 3d 20 54 43 4c 5f 49 4f 5f 46 41 49 4c 55 52 == TCL_IO_FAILUR
27e0: 45 29 20 7b 0a 09 69 66 20 28 21 54 63 6c 5f 45 E) {..if (!Tcl_E
27f0: 6f 66 28 63 68 61 6e 29 20 26 26 20 21 54 63 6c of(chan) && !Tcl
2800: 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 _InputBlocked(ch
2810: 61 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f an)) {.. Tcl_
2820: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 6e DecrRefCount(lin
2830: 65 50 74 72 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a ePtr);... /*.
2840: 09 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 . * TIP #219
2850: 2e 0a 09 20 20 20 20 20 2a 20 43 61 70 74 75 72 ... * Captur
2860: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 e error messages
2870: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 put by the driv
2880: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 er into the bypa
2890: 73 73 20 61 72 65 61 0a 09 20 20 20 20 20 2a 20 ss area.. *
28a0: 61 6e 64 20 70 75 74 20 74 68 65 6d 20 69 6e 74 and put them int
28b0: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e o the regular in
28c0: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 terpreter result
28d0: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 09 . Fall back to..
28e0: 20 20 20 20 20 2a 20 74 68 65 20 72 65 67 75 6c * the regul
28f0: 61 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f ar message if no
2900: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20 thing was found
2910: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09 in the bypass...
2920: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
2930: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 (!TclChanCaught
2940: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 ErrorBypass(inte
2950: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 09 54 rp, chan)) {...T
2960: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
2970: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 interp, Tcl_ObjP
2980: 72 69 6e 74 66 28 0a 09 09 09 22 65 72 72 6f 72 rintf(...."error
2990: 20 72 65 61 64 69 6e 67 20 5c 22 25 73 5c 22 3a reading \"%s\":
29a0: 20 25 73 22 2c 0a 09 09 09 54 63 6c 47 65 74 53 %s",....TclGetS
29b0: 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 tring(chanObjPtr
29c0: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f ), Tcl_PosixErro
29d0: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 r(interp)));..
29e0: 20 20 7d 0a 09 20 20 20 20 63 6f 64 65 20 3d 20 }.. code =
29f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
2a00: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 6c goto done;..}..l
2a10: 69 6e 65 4c 65 6e 20 3d 20 54 43 4c 5f 49 4f 5f ineLen = TCL_IO_
2a20: 46 41 49 4c 55 52 45 3b 0a 20 20 20 20 7d 0a 20 FAILURE;. }.
2a30: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 if (objc == 3
2a40: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 4f 62 6a ) {..if (Tcl_Obj
2a50: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 SetVar2(interp,
2a60: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 6c objv[2], NULL, l
2a70: 69 6e 65 50 74 72 2c 0a 09 09 54 43 4c 5f 4c 45 inePtr,...TCL_LE
2a80: 41 56 45 5f 45 52 52 5f 4d 53 47 29 20 3d 3d 20 AVE_ERR_MSG) ==
2a90: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 64 NULL) {.. cod
2aa0: 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 e = TCL_ERROR;..
2ab0: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 goto done;..
2ac0: 7d 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 6e 65 }..Tcl_Obj *line
2ad0: 4c 65 6e 4f 62 6a 3b 0a 09 54 63 6c 4e 65 77 49 LenObj;..TclNewI
2ae0: 6e 64 65 78 4f 62 6a 28 6c 69 6e 65 4c 65 6e 4f ndexObj(lineLenO
2af0: 62 6a 2c 20 6c 69 6e 65 4c 65 6e 29 3b 0a 09 54 bj, lineLen);..T
2b00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
2b10: 69 6e 74 65 72 70 2c 20 6c 69 6e 65 4c 65 6e 4f interp, lineLenO
2b20: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 bj);. } else
2b30: 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 {..Tcl_SetObjRes
2b40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 6e 65 ult(interp, line
2b50: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 64 6f Ptr);. }. do
2b60: 6e 65 3a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e ne:. TclChann
2b70: 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b elRelease(chan);
2b80: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 . return code
2b90: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2be0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 52 65 61 64 -. *. * Tcl_Read
2bf0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
2c00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
2c10: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
2c20: 65 73 73 20 74 68 65 20 54 63 6c 20 22 72 65 61 ess the Tcl "rea
2c30: 64 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 d" command. See
2c40: 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 the. *.user docu
2c50: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 mentation for de
2c60: 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 tails on what it
2c70: 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 does.. *. * Res
2c80: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
2c90: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
2ca0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2cb0: 74 73 3a 0a 20 2a 09 4d 61 79 20 63 6f 6e 73 75 ts:. *.May consu
2cc0: 6d 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 63 68 me input from ch
2cd0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d annel.. *. *----
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d20: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f --. */..int.Tcl_
2d30: 52 65 61 64 4f 62 6a 43 6d 64 28 0a 20 20 20 20 ReadObjCmd(.
2d40: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
2d50: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
2d60: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
2d70: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
2d80: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ter. */. Tcl_
2d90: 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e Size objc,../* N
2da0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
2db0: 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f ts. */. Tcl_O
2dc0: 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 bj *const *objv)
2dd0: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
2de0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 ects. */.{. T
2df0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
2e00: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
2e10: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 2a to read from. *
2e20: 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 6c 69 6e /. int newlin
2e30: 65 3b 09 09 2f 2a 20 44 69 73 63 61 72 64 20 6e e;../* Discard n
2e40: 65 77 6c 69 6e 65 20 61 74 20 65 6e 64 3f 20 2a ewline at end? *
2e50: 2f 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e /. Tcl_WideIn
2e60: 74 20 74 6f 52 65 61 64 3b 09 09 2f 2a 20 48 6f t toRead;../* Ho
2e70: 77 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 w many bytes to
2e80: 72 65 61 64 3f 20 2a 2f 0a 20 20 20 20 54 63 6c read? */. Tcl
2e90: 5f 53 69 7a 65 20 63 68 61 72 61 63 74 65 72 73 _Size characters
2ea0: 52 65 61 64 3b 09 2f 2a 20 48 6f 77 20 6d 61 6e Read;./* How man
2eb0: 79 20 63 68 61 72 61 63 74 65 72 73 20 77 65 72 y characters wer
2ec0: 65 20 72 65 61 64 3f 20 2a 2f 0a 20 20 20 20 69 e read? */. i
2ed0: 6e 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f nt mode;.../* Mo
2ee0: 64 65 20 69 6e 20 77 68 69 63 68 20 63 68 61 6e de in which chan
2ef0: 6e 65 6c 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a nel is opened. *
2f00: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 /. Tcl_Size i
2f10: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 ;. Tcl_Obj *r
2f20: 65 73 75 6c 74 50 74 72 2c 20 2a 63 68 61 6e 4f esultPtr, *chanO
2f30: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 bjPtr;.. if (
2f40: 28 6f 62 6a 63 20 21 3d 20 32 29 20 26 26 20 28 (objc != 2) && (
2f50: 6f 62 6a 63 20 21 3d 20 33 29 29 20 7b 0a 09 49 objc != 3)) {..I
2f60: 6e 74 65 72 70 20 2a 69 50 74 72 3b 0a 0a 20 20 nterp *iPtr;..
2f70: 20 20 61 72 67 65 72 72 6f 72 3a 0a 09 69 50 74 argerror:..iPt
2f80: 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29 20 69 r = (Interp *) i
2f90: 6e 74 65 72 70 3b 0a 09 54 63 6c 5f 57 72 6f 6e nterp;..Tcl_Wron
2fa0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
2fb0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
2fc0: 65 6c 20 3f 6e 75 6d 43 68 61 72 73 3f 22 29 3b el ?numChars?");
2fd0: 0a 0a 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e 6f 74 .../*.. * Do not
2fe0: 20 61 70 70 65 6e 64 20 64 69 72 65 63 74 6c 79 append directly
2ff0: 3b 20 74 68 61 74 20 6d 61 6b 65 73 20 65 6e 73 ; that makes ens
3000: 65 6d 62 6c 65 73 20 75 73 69 6e 67 20 74 68 69 embles using thi
3010: 73 20 63 6f 6d 6d 61 6e 64 20 61 73 0a 09 20 2a s command as.. *
3020: 20 61 20 73 75 62 63 6f 6d 6d 61 6e 64 20 70 72 a subcommand pr
3030: 6f 64 75 63 65 20 74 68 65 20 77 72 6f 6e 67 20 oduce the wrong
3040: 6d 65 73 73 61 67 65 2e 0a 09 20 2a 2f 0a 0a 09 message... */...
3050: 69 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 49 iPtr->flags |= I
3060: 4e 54 45 52 50 5f 41 4c 54 45 52 4e 41 54 45 5f NTERP_ALTERNATE_
3070: 57 52 4f 4e 47 5f 41 52 47 53 3b 0a 09 54 63 6c WRONG_ARGS;..Tcl
3080: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
3090: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
30a0: 3f 2d 6e 6f 6e 65 77 6c 69 6e 65 3f 20 63 68 61 ?-nonewline? cha
30b0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
30c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
30d0: 0a 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 .. i = 1;.
30e0: 20 6e 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 20 20 newline = 0;.
30f0: 20 20 69 66 20 28 73 74 72 63 6d 70 28 54 63 6c if (strcmp(Tcl
3100: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
3110: 5d 29 2c 20 22 2d 6e 6f 6e 65 77 6c 69 6e 65 22 ]), "-nonewline"
3120: 29 20 3d 3d 20 30 29 20 7b 0a 09 6e 65 77 6c 69 ) == 0) {..newli
3130: 6e 65 20 3d 20 31 3b 0a 09 69 2b 2b 3b 0a 20 20 ne = 1;..i++;.
3140: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 20 3d }.. if (i =
3150: 3d 20 6f 62 6a 63 29 20 7b 0a 09 67 6f 74 6f 20 = objc) {..goto
3160: 61 72 67 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a argerror;. }.
3170: 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 . chanObjPtr
3180: 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 20 20 20 20 69 = objv[i];. i
3190: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c f (TclGetChannel
31a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
31b0: 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 chanObjPtr, &cha
31c0: 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 n, &mode, 0) !=
31d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
31e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
31f0: 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64 }. if (!(mod
3200: 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 e & TCL_READABLE
3210: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a )) {..Tcl_SetObj
3220: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
3230: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
3240: 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 "channel \"%s\"
3250: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f wasn't opened fo
3260: 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 09 54 63 r reading",...Tc
3270: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f lGetString(chanO
3280: 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72 bjPtr)));..retur
3290: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
32a0: 20 7d 0a 20 20 20 20 69 2b 2b 3b 09 09 09 2f 2a }. i++;.../*
32b0: 20 43 6f 6e 73 75 6d 65 64 20 63 68 61 6e 6e 65 Consumed channe
32c0: 6c 20 6e 61 6d 65 2e 20 2a 2f 0a 0a 20 20 20 20 l name. */..
32d0: 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6d 70 75 74 /*. * Comput
32e0: 65 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 e how many bytes
32f0: 20 74 6f 20 72 65 61 64 2e 0a 20 20 20 20 20 2a to read.. *
3300: 2f 0a 0a 20 20 20 20 74 6f 52 65 61 64 20 3d 20 /.. toRead =
3310: 2d 31 3b 0a 20 20 20 20 69 66 20 28 69 20 3c 20 -1;. if (i <
3320: 6f 62 6a 63 29 20 7b 0a 09 69 66 20 28 28 54 63 objc) {..if ((Tc
3330: 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f lGetWideIntFromO
3340: 62 6a 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 69 5d bj(NULL, objv[i]
3350: 2c 20 26 74 6f 52 65 61 64 29 20 21 3d 20 54 43 , &toRead) != TC
3360: 4c 5f 4f 4b 29 0a 09 09 7c 7c 20 28 74 6f 52 65 L_OK)...|| (toRe
3370: 61 64 20 3c 20 30 29 29 20 7b 0a 09 20 20 20 20 ad < 0)) {..
3380: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
3390: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
33a0: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 65 Printf(... "e
33b0: 78 70 65 63 74 65 64 20 6e 6f 6e 2d 6e 65 67 61 xpected non-nega
33c0: 74 69 76 65 20 69 6e 74 65 67 65 72 20 62 75 74 tive integer but
33d0: 20 67 6f 74 20 5c 22 25 73 5c 22 22 2c 0a 09 09 got \"%s\"",...
33e0: 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 TclGetString
33f0: 28 6f 62 6a 76 5b 69 5d 29 29 29 3b 0a 09 20 20 (objv[i])));..
3400: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f Tcl_SetErrorCo
3410: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 de(interp, "TCL"
3420: 2c 20 22 56 41 4c 55 45 22 2c 20 22 4e 55 4d 42 , "VALUE", "NUMB
3430: 45 52 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c ER", (char *)NUL
3440: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
3450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 TCL_ERROR;..}..i
3460: 66 20 28 74 6f 52 65 61 64 20 3e 20 54 43 4c 5f f (toRead > TCL_
3470: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 20 20 20 SIZE_MAX) {..
3480: 20 2f 2a 20 42 75 67 20 36 65 38 32 37 32 30 65 /* Bug 6e82720e
3490: 31 34 20 2a 2f 0a 09 20 20 20 20 74 6f 52 65 61 14 */.. toRea
34a0: 64 20 3d 20 54 43 4c 5f 53 49 5a 45 5f 4d 41 58 d = TCL_SIZE_MAX
34b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
34c0: 54 63 6c 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74 TclNewObj(result
34d0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 43 68 61 Ptr);. TclCha
34e0: 6e 6e 65 6c 50 72 65 73 65 72 76 65 28 63 68 61 nnelPreserve(cha
34f0: 6e 29 3b 0a 20 20 20 20 63 68 61 72 61 63 74 65 n);. characte
3500: 72 73 52 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 rsRead = Tcl_Rea
3510: 64 43 68 61 72 73 28 63 68 61 6e 2c 20 72 65 73 dChars(chan, res
3520: 75 6c 74 50 74 72 2c 20 74 6f 52 65 61 64 2c 20 ultPtr, toRead,
3530: 30 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 72 0);. if (char
3540: 61 63 74 65 72 73 52 65 61 64 20 3d 3d 20 54 43 actersRead == TC
3550: 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 29 20 7b 0a L_IO_FAILURE) {.
3560: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 75 72 6e .Tcl_Obj *return
3570: 4f 70 74 73 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a OptsPtr = NULL;.
3580: 09 69 66 20 28 54 63 6c 43 68 61 6e 6e 65 6c 47 .if (TclChannelG
3590: 65 74 42 6c 6f 63 6b 69 6e 67 4d 6f 64 65 28 63 etBlockingMode(c
35a0: 68 61 6e 29 29 20 7b 0a 09 20 20 20 20 72 65 74 han)) {.. ret
35b0: 75 72 6e 4f 70 74 73 50 74 72 20 3d 20 54 63 6c urnOptsPtr = Tcl
35c0: 5f 4e 65 77 44 69 63 74 4f 62 6a 28 29 3b 0a 09 _NewDictObj();..
35d0: 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a 50 Tcl_DictObjP
35e0: 75 74 28 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 4f ut(NULL, returnO
35f0: 70 74 73 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ptsPtr, Tcl_NewS
3600: 74 72 69 6e 67 4f 62 6a 28 22 2d 64 61 74 61 22 tringObj("-data"
3610: 2c 20 2d 31 29 2c 0a 09 09 20 20 20 20 72 65 73 , -1),... res
3620: 75 6c 74 50 74 72 29 3b 0a 09 7d 20 65 6c 73 65 ultPtr);..} else
3630: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 {.. Tcl_Decr
3640: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 50 RefCount(resultP
3650: 74 72 29 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a 20 tr);..}../*.. *
3660: 54 49 50 20 23 32 31 39 2e 0a 09 20 2a 20 43 61 TIP #219... * Ca
3670: 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 pture error mess
3680: 61 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20 ages put by the
3690: 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 driver into the
36a0: 62 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 0a bypass area and.
36b0: 09 20 2a 20 70 75 74 20 74 68 65 6d 20 69 6e 74 . * put them int
36c0: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e o the regular in
36d0: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 terpreter result
36e0: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 . Fall back to t
36f0: 68 65 0a 09 20 2a 20 72 65 67 75 6c 61 72 20 6d he.. * regular m
3700: 65 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e essage if nothin
3710: 67 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 g was found in t
3720: 68 65 20 62 79 70 61 73 73 2e 0a 09 20 2a 2f 0a he bypass... */.
3730: 0a 09 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61 ..if (!TclChanCa
3740: 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 ughtErrorBypass(
3750: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b interp, chan)) {
3760: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
3770: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
3780: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
3790: 20 20 20 20 22 65 72 72 6f 72 20 72 65 61 64 69 "error readi
37a0: 6e 67 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a ng \"%s\": %s",.
37b0: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 .. TclGetStri
37c0: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20 ng(chanObjPtr),
37d0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
37e0: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 nterp)));..}..Tc
37f0: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 lChannelRelease(
3800: 63 68 61 6e 29 3b 0a 09 69 66 20 28 72 65 74 75 chan);..if (retu
3810: 72 6e 4f 70 74 73 50 74 72 29 20 7b 0a 09 20 20 rnOptsPtr) {..
3820: 20 20 54 63 6c 5f 53 65 74 52 65 74 75 72 6e 4f Tcl_SetReturnO
3830: 70 74 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 72 ptions(interp, r
3840: 65 74 75 72 6e 4f 70 74 73 50 74 72 29 3b 0a 09 eturnOptsPtr);..
3850: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 }..return TCL_ER
3860: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
3870: 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 72 65 71 /*. * If req
3880: 75 65 73 74 65 64 2c 20 72 65 6d 6f 76 65 20 74 uested, remove t
3890: 68 65 20 6c 61 73 74 20 6e 65 77 6c 69 6e 65 20 he last newline
38a0: 69 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 in the channel i
38b0: 66 20 61 74 20 45 4f 46 2e 0a 20 20 20 20 20 2a f at EOF.. *
38c0: 2f 0a 0a 20 20 20 20 69 66 20 28 28 63 68 61 72 /.. if ((char
38d0: 61 63 74 65 72 73 52 65 61 64 20 3e 20 30 29 20 actersRead > 0)
38e0: 26 26 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30 && (newline != 0
38f0: 29 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 )) {..const char
3900: 20 2a 72 65 73 75 6c 74 3b 0a 09 54 63 6c 5f 53 *result;..Tcl_S
3910: 69 7a 65 20 6c 65 6e 67 74 68 3b 0a 0a 09 72 65 ize length;...re
3920: 73 75 6c 74 20 3d 20 54 63 6c 47 65 74 53 74 72 sult = TclGetStr
3930: 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c ingFromObj(resul
3940: 74 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a tPtr, &length);.
3950: 09 69 66 20 28 72 65 73 75 6c 74 5b 6c 65 6e 67 .if (result[leng
3960: 74 68 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 th - 1] == '\n')
3970: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f {.. Tcl_SetO
3980: 62 6a 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 50 bjLength(resultP
3990: 74 72 2c 20 6c 65 6e 67 74 68 20 2d 20 31 29 3b tr, length - 1);
39a0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ..}. }. Tc
39b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
39c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 nterp, resultPtr
39d0: 29 3b 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 );. TclChanne
39e0: 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a lRelease(chan);.
39f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
3a00: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a50: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 53 65 65 --. *. * Tcl_See
3a60: 6b 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a kObjCmd --. *. *
3a70: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
3a80: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
3a90: 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 73 65 cess the Tcl "se
3aa0: 65 6b 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 ek" command. See
3ab0: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 the. *.user doc
3ac0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
3ad0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
3ae0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
3af0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
3b00: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
3b10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3b20: 63 74 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 74 68 cts:. *.Moves th
3b30: 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 e position of th
3b40: 65 20 61 63 63 65 73 73 20 70 6f 69 6e 74 20 6f e access point o
3b50: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 n the specified
3b60: 63 68 61 6e 6e 65 6c 2e 20 20 4d 61 79 0a 20 2a channel. May. *
3b70: 09 66 6c 75 73 68 20 71 75 65 75 65 64 20 6f 75 .flush queued ou
3b80: 74 70 75 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d tput.. *. *-----
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bd0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 -. */..int.Tcl_S
3be0: 65 65 6b 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 eekObjCmd(. T
3bf0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
3c00: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
3c10: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 p *interp,../* C
3c20: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
3c30: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 er. */. Tcl_S
3c40: 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 ize objc,../* Nu
3c50: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
3c60: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
3c70: 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 j *const *objv).
3c80: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
3c90: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 cts. */.{. Tc
3ca0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
3cb0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
3cc0: 74 6f 20 74 65 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20 to tell on. */.
3cd0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6f Tcl_WideInt o
3ce0: 66 66 73 65 74 3b 09 09 2f 2a 20 57 68 65 72 65 ffset;../* Where
3cf0: 20 74 6f 20 73 65 65 6b 3f 20 2a 2f 0a 20 20 20 to seek? */.
3d00: 20 69 6e 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 int mode;.../*
3d10: 48 6f 77 20 74 6f 20 73 65 65 6b 3f 20 2a 2f 0a How to seek? */.
3d20: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 Tcl_WideInt
3d30: 72 65 73 75 6c 74 3b 09 09 2f 2a 20 4f 66 20 63 result;../* Of c
3d40: 61 6c 6c 69 6e 67 20 54 63 6c 5f 53 65 65 6b 2e alling Tcl_Seek.
3d50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 74 69 */. int opti
3d60: 6f 6e 49 6e 64 65 78 3b 0a 20 20 20 20 73 74 61 onIndex;. sta
3d70: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
3d80: 63 6f 6e 73 74 20 6f 72 69 67 69 6e 4f 70 74 69 const originOpti
3d90: 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 73 74 61 72 ons[] = {.."star
3da0: 74 22 2c 20 22 63 75 72 72 65 6e 74 22 2c 20 22 t", "current", "
3db0: 65 6e 64 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 7d end", NULL. }
3dc0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e ;. static con
3dd0: 73 74 20 69 6e 74 20 6d 6f 64 65 41 72 72 61 79 st int modeArray
3de0: 5b 5d 20 3d 20 7b 53 45 45 4b 5f 53 45 54 2c 20 [] = {SEEK_SET,
3df0: 53 45 45 4b 5f 43 55 52 2c 20 53 45 45 4b 5f 45 SEEK_CUR, SEEK_E
3e00: 4e 44 7d 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f ND};.. if ((o
3e10: 62 6a 63 20 21 3d 20 33 29 20 26 26 20 28 6f 62 bjc != 3) && (ob
3e20: 6a 63 20 21 3d 20 34 29 29 20 7b 0a 09 54 63 6c jc != 4)) {..Tcl
3e30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
3e40: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
3e50: 63 68 61 6e 6e 65 6c 20 6f 66 66 73 65 74 20 3f channel offset ?
3e60: 6f 72 69 67 69 6e 3f 22 29 3b 0a 09 72 65 74 75 origin?");..retu
3e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
3e80: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 47 }. if (TclG
3e90: 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a etChannelFromObj
3ea0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
3eb0: 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 , &chan, NULL, 0
3ec0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
3ed0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3ef0: 54 63 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f TclGetWideIntFro
3f00: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
3f10: 76 5b 32 5d 2c 20 26 6f 66 66 73 65 74 29 20 21 v[2], &offset) !
3f20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
3f30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3f40: 20 20 20 7d 0a 20 20 20 20 6d 6f 64 65 20 3d 20 }. mode =
3f50: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 69 66 SEEK_SET;. if
3f60: 20 28 6f 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09 (objc == 4) {..
3f70: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
3f80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
3f90: 6f 62 6a 76 5b 33 5d 2c 20 6f 72 69 67 69 6e 4f objv[3], originO
3fa0: 70 74 69 6f 6e 73 2c 20 22 6f 72 69 67 69 6e 22 ptions, "origin"
3fb0: 2c 20 30 2c 0a 09 09 26 6f 70 74 69 6f 6e 49 6e , 0,...&optionIn
3fc0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
3fd0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
3fe0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 6d 6f 64 L_ERROR;..}..mod
3ff0: 65 20 3d 20 6d 6f 64 65 41 72 72 61 79 5b 6f 70 e = modeArray[op
4000: 74 69 6f 6e 49 6e 64 65 78 5d 3b 0a 20 20 20 20 tionIndex];.
4010: 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 }.. TclChanne
4020: 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b lPreserve(chan);
4030: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 . result = Tc
4040: 6c 5f 53 65 65 6b 28 63 68 61 6e 2c 20 6f 66 66 l_Seek(chan, off
4050: 73 65 74 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 set, mode);.
4060: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31 if (result == -1
4070: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 ) {../*.. * TIP
4080: 23 32 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 #219... * Captur
4090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 e error messages
40a0: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 put by the driv
40b0: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 er into the bypa
40c0: 73 73 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 ss area and.. *
40d0: 70 75 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 put them into th
40e0: 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70 e regular interp
40f0: 72 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61 reter result. Fa
4100: 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 ll back to the..
4110: 20 2a 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 * regular messa
4120: 67 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 ge if nothing wa
4130: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 s found in the b
4140: 79 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 ypass... */...if
4150: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 (!TclChanCaught
4160: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 ErrorBypass(inte
4170: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 rp, chan)) {..
4180: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
4190: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
41a0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 bjPrintf(...
41b0: 22 65 72 72 6f 72 20 64 75 72 69 6e 67 20 73 65 "error during se
41c0: 65 6b 20 6f 6e 20 5c 22 25 73 5c 22 3a 20 25 73 ek on \"%s\": %s
41d0: 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53 ",... TclGetS
41e0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
41f0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
4200: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 nterp)));..}..Tc
4210: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 lChannelRelease(
4220: 63 68 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 chan);..return T
4230: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4240: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 TclChannelRe
4250: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 lease(chan);.
4260: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
4270: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
42c0: 20 2a 0a 20 2a 20 54 63 6c 5f 54 65 6c 6c 4f 62 *. * Tcl_TellOb
42d0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
42e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 is function is i
42f0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
4300: 73 20 74 68 65 20 54 63 6c 20 22 74 65 6c 6c 22 s the Tcl "tell"
4310: 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 command. See th
4320: 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 e. *.user docume
4330: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 ntation for deta
4340: 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 ils on what it d
4350: 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c oes.. *. * Resul
4360: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
4370: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
4380: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4390: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
43f0: 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 28 0a Tcl_TellObjCmd(.
4400: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
4410: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
4420: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
4430: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 ./* Current inte
4440: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 rpreter. */.
4450: 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 Tcl_Size objc,..
4460: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 /* Number of arg
4470: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 uments. */. T
4480: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
4490: 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 bjv)./* Argument
44a0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 objects. */.{.
44b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
44c0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
44d0: 6e 6e 65 6c 20 74 6f 20 74 65 6c 6c 20 6f 6e 2e nnel to tell on.
44e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 */. Tcl_Wide
44f0: 49 6e 74 20 6e 65 77 4c 6f 63 3b 0a 20 20 20 20 Int newLoc;.
4500: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 69 int code;.. i
4510: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
4520: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
4530: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
4540: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 v, "channel");..
4550: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4560: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
4570: 20 20 20 20 20 2a 20 54 72 79 20 74 6f 20 66 69 * Try to fi
4580: 6e 64 20 61 20 63 68 61 6e 6e 65 6c 20 77 69 74 nd a channel wit
4590: 68 20 74 68 65 20 72 69 67 68 74 20 6e 61 6d 65 h the right name
45a0: 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 and permissions
45b0: 20 69 6e 20 74 68 65 20 49 4f 0a 20 20 20 20 20 in the IO.
45c0: 2a 20 63 68 61 6e 6e 65 6c 20 74 61 62 6c 65 20 * channel table
45d0: 6f 66 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 of this interpre
45e0: 74 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ter.. */..
45f0: 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e if (TclGetChan
4600: 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 nelFromObj(inter
4610: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 p, objv[1], &cha
4620: 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 n, NULL, 0) != T
4630: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
4640: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
4650: 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 }.. TclChanne
4660: 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b lPreserve(chan);
4670: 0a 20 20 20 20 6e 65 77 4c 6f 63 20 3d 20 54 63 . newLoc = Tc
4680: 6c 5f 54 65 6c 6c 28 63 68 61 6e 29 3b 0a 0a 20 l_Tell(chan);..
4690: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 /*. * TIP
46a0: 20 23 32 31 39 2e 0a 20 20 20 20 20 2a 20 43 61 #219.. * Ca
46b0: 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 pture error mess
46c0: 61 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20 ages put by the
46d0: 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 driver into the
46e0: 62 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 20 bypass area and
46f0: 70 75 74 0a 20 20 20 20 20 2a 20 74 68 65 6d 20 put. * them
4700: 69 6e 74 6f 20 74 68 65 20 72 65 67 75 6c 61 72 into the regular
4710: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 interpreter res
4720: 75 6c 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ult.. */..
4730: 20 20 63 6f 64 65 20 20 3d 20 54 63 6c 43 68 61 code = TclCha
4740: 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 nCaughtErrorBypa
4750: 73 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 ss(interp, chan)
4760: 3b 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c ;. TclChannel
4770: 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 Release(chan);.
4780: 20 20 20 69 66 20 28 63 6f 64 65 29 20 7b 0a 09 if (code) {..
4790: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
47a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
47b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
47c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 terp, Tcl_NewWid
47d0: 65 49 6e 74 4f 62 6a 28 6e 65 77 4c 6f 63 29 29 eIntObj(newLoc))
47e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
47f0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 43 ----. *. * Tcl_C
4850: 6c 6f 73 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a loseObjCmd --. *
4860: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
4870: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 n is invoked to
4880: 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 process the Tcl
4890: 22 63 6c 6f 73 65 22 20 63 6f 6d 6d 61 6e 64 2e "close" command.
48a0: 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 See the. *.user
48b0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
48c0: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
48d0: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 at it does.. *.
48e0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
48f0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
4900: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
4910: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
4920: 64 69 73 63 61 72 64 20 71 75 65 75 65 64 20 69 discard queued i
4930: 6e 70 75 74 3b 20 6d 61 79 20 66 6c 75 73 68 20 nput; may flush
4940: 71 75 65 75 65 64 20 6f 75 74 70 75 74 2e 0a 20 queued output..
4950: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
49a0: 69 6e 74 0a 54 63 6c 5f 43 6c 6f 73 65 4f 62 6a int.Tcl_CloseObj
49b0: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
49c0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
49d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
49e0: 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 erp,../* Current
49f0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f interpreter. */
4a00: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 . Tcl_Size ob
4a10: 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f jc,../* Number o
4a20: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a f arguments. */.
4a30: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
4a40: 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67 st *objv)./* Arg
4a50: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a ument objects. *
4a60: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e /.{. Tcl_Chan
4a70: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
4a80: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 63 6c 6f e channel to clo
4a90: 73 65 2e 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 se. */. stati
4aa0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f c const char *co
4ab0: 6e 73 74 20 64 69 72 4f 70 74 69 6f 6e 73 5b 5d nst dirOptions[]
4ac0: 20 3d 20 7b 0a 09 22 72 65 61 64 22 2c 20 22 77 = {.."read", "w
4ad0: 72 69 74 65 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 rite", NULL.
4ae0: 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f };. static co
4af0: 6e 73 74 20 69 6e 74 20 64 69 72 41 72 72 61 79 nst int dirArray
4b00: 5b 5d 20 3d 20 7b 54 43 4c 5f 43 4c 4f 53 45 5f [] = {TCL_CLOSE_
4b10: 52 45 41 44 2c 20 54 43 4c 5f 43 4c 4f 53 45 5f READ, TCL_CLOSE_
4b20: 57 52 49 54 45 7d 3b 0a 0a 20 20 20 20 69 66 20 WRITE};.. if
4b30: 28 28 6f 62 6a 63 20 21 3d 20 32 29 20 26 26 20 ((objc != 2) &&
4b40: 28 6f 62 6a 63 20 21 3d 20 33 29 29 20 7b 0a 09 (objc != 3)) {..
4b50: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
4b60: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
4b70: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 64 69 72 65 , "channel ?dire
4b80: 63 74 69 6f 6e 3f 22 29 3b 0a 09 72 65 74 75 72 ction?");..retur
4b90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
4ba0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 47 }.. if (TclG
4bb0: 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a etChannelFromObj
4bc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
4bd0: 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 , &chan, NULL, 0
4be0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
4bf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4c00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
4c10: 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 69 (objc == 3) {..i
4c20: 6e 74 20 69 6e 64 65 78 2c 20 64 69 72 3b 0a 0a nt index, dir;..
4c30: 09 2f 2a 0a 09 20 2a 20 47 65 74 20 64 69 72 65 ./*.. * Get dire
4c40: 63 74 69 6f 6e 20 72 65 71 75 65 73 74 65 64 20 ction requested
4c50: 74 6f 20 63 6c 6f 73 65 2c 20 61 6e 64 20 63 68 to close, and ch
4c60: 65 63 6b 20 73 79 6e 74 61 78 2e 0a 09 20 2a 2f eck syntax... */
4c70: 0a 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e ...if (Tcl_GetIn
4c80: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
4c90: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 64 69 72 4f p, objv[2], dirO
4ca0: 70 74 69 6f 6e 73 2c 20 22 64 69 72 65 63 74 69 ptions, "directi
4cb0: 6f 6e 22 2c 20 30 2c 0a 09 09 26 69 6e 64 65 78 on", 0,...&index
4cc0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
4cd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
4ce0: 52 52 4f 52 3b 0a 09 7d 0a 09 64 69 72 20 3d 20 RROR;..}..dir =
4cf0: 64 69 72 41 72 72 61 79 5b 69 6e 64 65 78 5d 3b dirArray[index];
4d00: 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 .../*.. * Check
4d10: 64 69 72 65 63 74 69 6f 6e 20 61 67 61 69 6e 73 direction agains
4d20: 74 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65 2e 20 t channel mode.
4d30: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 It is an error i
4d40: 66 20 77 65 20 74 72 79 20 74 6f 0a 09 20 2a 20 f we try to.. *
4d50: 63 6c 6f 73 65 20 61 20 64 69 72 65 63 74 69 6f close a directio
4d60: 6e 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 n not supported
4d70: 62 79 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 28 by the channel (
4d80: 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64 2c 20 already closed,
4d90: 6f 72 0a 09 20 2a 20 6e 65 76 65 72 20 6f 70 65 or.. * never ope
4da0: 6e 65 64 20 66 6f 72 20 74 68 61 74 20 64 69 72 ned for that dir
4db0: 65 63 74 69 6f 6e 29 2e 0a 09 20 2a 2f 0a 0a 09 ection)... */...
4dc0: 69 66 20 28 21 28 64 69 72 20 26 20 54 63 6c 5f if (!(dir & Tcl_
4dd0: 47 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65 28 63 GetChannelMode(c
4de0: 68 61 6e 29 29 29 20 7b 0a 09 20 20 20 20 54 63 han))) {.. Tc
4df0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
4e00: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
4e10: 69 6e 74 66 28 0a 09 09 20 20 20 20 22 48 61 6c intf(... "Hal
4e20: 66 2d 63 6c 6f 73 65 20 6f 66 20 25 73 2d 73 69 f-close of %s-si
4e30: 64 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c de not possible,
4e40: 20 73 69 64 65 20 6e 6f 74 20 6f 70 65 6e 65 64 side not opened
4e50: 22 0a 09 09 20 20 20 20 22 20 6f 72 20 61 6c 72 "... " or alr
4e60: 65 61 64 79 20 63 6c 6f 73 65 64 22 2c 20 64 69 eady closed", di
4e70: 72 4f 70 74 69 6f 6e 73 5b 69 6e 64 65 78 5d 29 rOptions[index])
4e80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
4e90: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
4ea0: 2a 0a 09 20 2a 20 53 70 65 63 69 61 6c 20 68 61 *.. * Special ha
4eb0: 6e 64 6c 69 6e 67 20 69 73 20 6e 65 65 64 65 64 ndling is needed
4ec0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 if and only if
4ed0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65 the channel mode
4ee0: 20 73 75 70 70 6f 72 74 73 0a 09 20 2a 20 6d 6f supports.. * mo
4ef0: 72 65 20 74 68 61 6e 20 74 68 65 20 64 69 72 65 re than the dire
4f00: 63 74 69 6f 6e 20 74 6f 20 63 6c 6f 73 65 2e 20 ction to close.
4f10: 42 65 63 61 75 73 65 20 69 66 20 74 68 65 20 63 Because if the c
4f20: 6c 6f 73 65 20 74 68 65 20 6c 61 73 74 0a 09 20 lose the last..
4f30: 2a 20 64 69 72 65 63 74 69 6f 6e 20 73 75 70 70 * direction supp
4f40: 6f 72 74 65 64 20 77 65 20 63 61 6e 20 61 6e 64 orted we can and
4f50: 20 77 69 6c 6c 20 67 6f 20 74 68 72 6f 75 67 68 will go through
4f60: 20 74 68 65 20 72 65 67 75 6c 61 72 0a 09 20 2a the regular.. *
4f70: 20 70 72 6f 63 65 73 73 2e 0a 09 20 2a 2f 0a 0a process... */..
4f80: 09 69 66 20 28 28 54 63 6c 5f 47 65 74 43 68 61 .if ((Tcl_GetCha
4f90: 6e 6e 65 6c 4d 6f 64 65 28 63 68 61 6e 29 20 26 nnelMode(chan) &
4fa0: 0a 09 09 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 ...(TCL_CLOSE_RE
4fb0: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 AD|TCL_CLOSE_WRI
4fc0: 54 45 29 29 20 21 3d 20 64 69 72 29 20 7b 0a 09 TE)) != dir) {..
4fd0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 43 return Tcl_C
4fe0: 6c 6f 73 65 45 78 28 69 6e 74 65 72 70 2c 20 63 loseEx(interp, c
4ff0: 68 61 6e 2c 20 64 69 72 29 3b 0a 09 7d 0a 20 20 han, dir);..}.
5000: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c }.. if (Tcl
5010: 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e _UnregisterChann
5020: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
5030: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f != TCL_OK) {../
5040: 2a 0a 09 20 2a 20 49 66 20 74 68 65 72 65 20 69 *.. * If there i
5050: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 s an error messa
5060: 67 65 20 61 6e 64 20 69 74 20 65 6e 64 73 20 77 ge and it ends w
5070: 69 74 68 20 61 20 6e 65 77 6c 69 6e 65 2c 20 72 ith a newline, r
5080: 65 6d 6f 76 65 20 74 68 65 0a 09 20 2a 20 6e 65 emove the.. * ne
5090: 77 6c 69 6e 65 2e 20 54 68 69 73 20 69 73 20 64 wline. This is d
50a0: 6f 6e 65 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 20 one for command
50b0: 70 69 70 65 6c 69 6e 65 20 63 68 61 6e 6e 65 6c pipeline channel
50c0: 73 20 77 68 65 72 65 20 74 68 65 20 65 72 72 6f s where the erro
50d0: 72 0a 09 20 2a 20 6f 75 74 70 75 74 20 66 72 6f r.. * output fro
50e0: 6d 20 74 68 65 20 73 75 62 70 72 6f 63 65 73 73 m the subprocess
50f0: 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 es is stored in
5100: 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 2e interp's result.
5110: 0a 09 20 2a 0a 09 20 2a 20 4e 4f 54 45 3a 20 54 .. *.. * NOTE: T
5120: 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f his is likely to
5130: 20 6e 6f 74 20 68 61 76 65 20 61 6e 79 20 65 66 not have any ef
5140: 66 65 63 74 20 6f 6e 20 72 65 67 75 6c 61 72 20 fect on regular
5150: 65 72 72 6f 72 0a 09 20 2a 20 6d 65 73 73 61 67 error.. * messag
5160: 65 73 20 70 72 6f 64 75 63 65 64 20 62 79 20 64 es produced by d
5170: 72 69 76 65 72 73 20 64 75 72 69 6e 67 20 74 68 rivers during th
5180: 65 20 63 6c 6f 73 69 6e 67 20 6f 66 20 61 20 63 e closing of a c
5190: 68 61 6e 6e 65 6c 2c 0a 09 20 2a 20 62 65 63 61 hannel,.. * beca
51a0: 75 73 65 20 74 68 65 20 54 63 6c 20 63 6f 6e 76 use the Tcl conv
51b0: 65 6e 74 69 6f 6e 20 69 73 20 74 68 61 74 20 73 ention is that s
51c0: 75 63 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67 uch error messag
51d0: 65 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 0a 09 es do not have..
51e0: 20 2a 20 61 20 74 65 72 6d 69 6e 61 74 69 6e 67 * a terminating
51f0: 20 6e 65 77 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a newline... */..
5200: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 .Tcl_Obj *result
5210: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a Ptr = Tcl_GetObj
5220: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a Result(interp);.
5230: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 .const char *str
5240: 69 6e 67 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c ing;..Tcl_Size l
5250: 65 6e 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 49 73 en;...if (Tcl_Is
5260: 53 68 61 72 65 64 28 72 65 73 75 6c 74 50 74 72 Shared(resultPtr
5270: 29 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 )) {.. result
5280: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 Ptr = Tcl_Duplic
5290: 61 74 65 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 ateObj(resultPtr
52a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f );.. Tcl_SetO
52b0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
52c0: 20 72 65 73 75 6c 74 50 74 72 29 3b 0a 09 7d 0a resultPtr);..}.
52d0: 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 47 65 74 .string = TclGet
52e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 StringFromObj(re
52f0: 73 75 6c 74 50 74 72 2c 20 26 6c 65 6e 29 3b 0a sultPtr, &len);.
5300: 09 69 66 20 28 28 6c 65 6e 20 3e 20 30 29 20 26 .if ((len > 0) &
5310: 26 20 28 73 74 72 69 6e 67 5b 6c 65 6e 20 2d 20 & (string[len -
5320: 31 5d 20 3d 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 1] == '\n')) {..
5330: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 Tcl_SetObjLe
5340: 6e 67 74 68 28 72 65 73 75 6c 74 50 74 72 2c 20 ngth(resultPtr,
5350: 6c 65 6e 20 2d 20 31 29 3b 0a 09 7d 0a 09 72 65 len - 1);..}..re
5360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5370: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
5380: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
5390: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
53e0: 54 63 6c 5f 46 63 6f 6e 66 69 67 75 72 65 4f 62 Tcl_FconfigureOb
53f0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
5400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 is function is i
5410: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
5420: 73 20 74 68 65 20 54 63 6c 20 22 66 63 6f 6e 66 s the Tcl "fconf
5430: 69 67 75 72 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 igure" command.
5440: 53 65 65 0a 20 2a 09 74 68 65 20 75 73 65 72 20 See. *.the user
5450: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f documentation fo
5460: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 r details on wha
5470: 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a t it does.. *. *
5480: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
5490: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
54a0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
54b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d ffects:. *.May m
54c0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 odify the behavi
54d0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e or of an IO chan
54e0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5530: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 46 63 . */..int.Tcl_Fc
5540: 6f 6e 66 69 67 75 72 65 4f 62 6a 43 6d 64 28 0a onfigureObjCmd(.
5550: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
5560: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
5570: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
5580: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 ./* Current inte
5590: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 rpreter. */.
55a0: 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 Tcl_Size objc,..
55b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 /* Number of arg
55c0: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 uments. */. T
55d0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
55e0: 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 bjv)./* Argument
55f0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 objects. */.{.
5600: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f const char *o
5610: 70 74 69 6f 6e 4e 61 6d 65 2c 20 2a 76 61 6c 75 ptionName, *valu
5620: 65 4e 61 6d 65 3b 0a 20 20 20 20 54 63 6c 5f 43 eName;. Tcl_C
5630: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
5640: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
5650: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a set a mode on. *
5660: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 /. Tcl_Size i
5670: 3b 09 09 09 2f 2a 20 49 74 65 72 61 74 65 20 6f ;.../* Iterate o
5680: 76 65 72 20 61 72 67 2d 76 61 6c 75 65 20 70 61 ver arg-value pa
5690: 69 72 73 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 20 irs. */.. if
56a0: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
56b0: 28 28 6f 62 6a 63 20 25 20 32 29 20 3d 3d 20 31 ((objc % 2) == 1
56c0: 29 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 29 ) && (objc != 3)
56d0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
56e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
56f0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
5700: 20 3f 2d 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 ?-option value
5710: 2e 2e 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 ...?");..return
5720: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
5730: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 .. if (TclGet
5740: 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 ChannelFromObj(i
5750: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
5760: 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 &chan, NULL, 0)
5770: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
5780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5790: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f }.. if (o
57a0: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 54 63 6c bjc == 2) {..Tcl
57b0: 5f 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a _DString ds;../*
57c0: 20 44 53 74 72 69 6e 67 20 74 6f 20 68 6f 6c 64 DString to hold
57d0: 20 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c 69 result of calli
57e0: 6e 67 0a 09 09 09 09 20 2a 20 54 63 6c 5f 47 65 ng..... * Tcl_Ge
57f0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2e 20 tChannelOption.
5800: 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 */...Tcl_DString
5810: 49 6e 69 74 28 26 64 73 29 3b 0a 09 69 66 20 28 Init(&ds);..if (
5820: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
5830: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
5840: 6e 2c 20 4e 55 4c 4c 2c 20 26 64 73 29 20 21 3d n, NULL, &ds) !=
5850: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
5860: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
5870: 26 64 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 &ds);.. retur
5880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
5890: 09 54 63 6c 5f 44 53 74 72 69 6e 67 52 65 73 75 .Tcl_DStringResu
58a0: 6c 74 28 69 6e 74 65 72 70 2c 20 26 64 73 29 3b lt(interp, &ds);
58b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
58c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
58d0: 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 54 63 objc == 3) {..Tc
58e0: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f l_DString ds;../
58f0: 2a 20 44 53 74 72 69 6e 67 20 74 6f 20 68 6f 6c * DString to hol
5900: 64 20 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c d result of call
5910: 69 6e 67 0a 09 09 09 09 20 2a 20 54 63 6c 5f 47 ing..... * Tcl_G
5920: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2e etChannelOption.
5930: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e */...Tcl_DStrin
5940: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 6f 70 74 gInit(&ds);..opt
5950: 69 6f 6e 4e 61 6d 65 20 3d 20 54 63 6c 47 65 74 ionName = TclGet
5960: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b String(objv[2]);
5970: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 ..if (Tcl_GetCha
5980: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
5990: 70 2c 20 63 68 61 6e 2c 20 6f 70 74 69 6f 6e 4e p, chan, optionN
59a0: 61 6d 65 2c 20 26 64 73 29 20 21 3d 20 54 43 4c ame, &ds) != TCL
59b0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f _OK) {.. Tcl_
59c0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
59d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ;.. return TC
59e0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 6c L_ERROR;..}..Tcl
59f0: 5f 44 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 _DStringResult(i
5a00: 6e 74 65 72 70 2c 20 26 64 73 29 3b 0a 09 72 65 nterp, &ds);..re
5a10: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
5a20: 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d }.. for (i =
5a30: 20 33 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 20 3; i < objc; i
5a40: 2b 3d 20 32 29 20 7b 0a 09 6f 70 74 69 6f 6e 4e += 2) {..optionN
5a50: 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 ame = TclGetStri
5a60: 6e 67 28 6f 62 6a 76 5b 69 2d 31 5d 29 3b 0a 09 ng(objv[i-1]);..
5a70: 76 61 6c 75 65 4e 61 6d 65 20 3d 20 54 63 6c 47 valueName = TclG
5a80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d etString(objv[i]
5a90: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 53 65 74 43 );..if (Tcl_SetC
5aa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
5ab0: 65 72 70 2c 20 63 68 61 6e 2c 20 6f 70 74 69 6f erp, chan, optio
5ac0: 6e 4e 61 6d 65 2c 20 76 61 6c 75 65 4e 61 6d 65 nName, valueName
5ad0: 29 0a 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b )...!= TCL_OK) {
5ae0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5af0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
5b00: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5b10: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5b70: 54 63 6c 5f 45 6f 66 4f 62 6a 43 6d 64 20 2d 2d Tcl_EofObjCmd --
5b80: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
5b90: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
5ba0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 to process the T
5bb0: 63 6c 20 22 65 6f 66 22 20 63 6f 6d 6d 61 6e 64 cl "eof" command
5bc0: 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 . See the. *.use
5bd0: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
5be0: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 for details on w
5bf0: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a hat it does.. *.
5c00: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
5c10: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
5c20: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
5c30: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 effects:. *.Set
5c40: 73 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c s interp's resul
5c50: 74 20 74 6f 20 62 6f 6f 6c 65 61 6e 20 74 72 75 t to boolean tru
5c60: 65 20 6f 72 20 66 61 6c 73 65 20 64 65 70 65 6e e or false depen
5c70: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 ding on whether
5c80: 74 68 65 0a 20 2a 09 73 70 65 63 69 66 69 65 64 the. *.specified
5c90: 20 63 68 61 6e 6e 65 6c 20 68 61 73 20 61 6e 20 channel has an
5ca0: 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 EOF condition..
5cb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5d00: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 45 6f 66 */..int.Tcl_Eof
5d10: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f ObjCmd(. TCL_
5d20: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a UNUSED(void *),.
5d30: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
5d40: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 interp,../* Curr
5d50: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e ent interpreter.
5d60: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 */. Tcl_Size
5d70: 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 objc,../* Numbe
5d80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 r of arguments.
5d90: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
5da0: 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 const *objv)./*
5db0: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 Argument objects
5dc0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
5dd0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 0a 20 20 hannel chan;..
5de0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 if (objc != 2)
5df0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
5e00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
5e10: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 objv, "channel")
5e20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5e40: 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 if (TclGetChanne
5e50: 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c lFromObj(interp,
5e60: 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c objv[1], &chan,
5e70: 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 43 4c NULL, 0) != TCL
5e80: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
5e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5ea0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
5eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
5ec0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
5ed0: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 29 3b Tcl_Eof(chan)));
5ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
5ef0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
5f50: 68 61 6e 49 73 42 69 6e 61 72 79 43 6d 64 20 2d hanIsBinaryCmd -
5f60: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
5f70: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 ction is invoked
5f80: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
5f90: 54 63 6c 20 22 63 68 61 6e 20 69 73 62 69 6e 61 Tcl "chan isbina
5fa0: 72 79 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 ry" command. See
5fb0: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 the. *.user doc
5fc0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
5fd0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
5fe0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
5ff0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
6000: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
6010: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6020: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 69 6e 74 cts:. *.Sets int
6030: 65 72 70 27 73 20 72 65 73 75 6c 74 20 74 6f 20 erp's result to
6040: 62 6f 6f 6c 65 61 6e 20 74 72 75 65 20 6f 72 20 boolean true or
6050: 66 61 6c 73 65 20 64 65 70 65 6e 64 69 6e 67 20 false depending
6060: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0a 20 on whether the.
6070: 2a 09 73 70 65 63 69 66 69 65 64 20 63 68 61 6e *.specified chan
6080: 6e 65 6c 20 69 73 20 61 20 62 69 6e 61 72 79 20 nel is a binary
6090: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
60f0: 74 61 74 69 63 20 69 6e 74 0a 43 68 61 6e 49 73 tatic int.ChanIs
6100: 42 69 6e 61 72 79 43 6d 64 28 0a 20 20 20 20 54 BinaryCmd(. T
6110: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
6120: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
6130: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 p *interp,../* C
6140: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
6150: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 er. */. Tcl_S
6160: 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 ize objc,../* Nu
6170: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
6180: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
6190: 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 j *const *objv).
61a0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
61b0: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 cts. */.{. Tc
61c0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
61d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
61e0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
61f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
6200: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
6210: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
6220: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6230: 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 if (TclGetCha
6240: 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 nnelFromObj(inte
6250: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 rp, objv[1], &ch
6260: 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 an, NULL, 0) !=
6270: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
6280: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
6290: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f }.. Tcl_SetO
62a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
62b0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f Tcl_NewBooleanO
62c0: 62 6a 28 54 63 6c 43 68 61 6e 49 73 42 69 6e 61 bj(TclChanIsBina
62d0: 72 79 28 63 68 61 6e 29 29 29 3b 0a 20 20 20 20 ry(chan)));.
62e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
62f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6340: 2a 0a 20 2a 20 54 63 6c 5f 45 78 65 63 4f 62 6a *. * Tcl_ExecObj
6350: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
6360: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
6370: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
6380: 20 74 68 65 20 22 65 78 65 63 22 20 54 63 6c 20 the "exec" Tcl
6390: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 command. See the
63a0: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e . *.user documen
63b0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 tation for detai
63c0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f ls on what it do
63d0: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 es.. *. * Result
63e0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
63f0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
6400: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
6410: 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 . *.See the user
6420: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a documentation..
6430: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6480: 0a 69 6e 74 0a 54 63 6c 5f 45 78 65 63 4f 62 6a .int.Tcl_ExecObj
6490: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 Cmd(. TCL_UNU
64a0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 SED(void *),.
64b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
64c0: 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 erp,../* Current
64d0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f interpreter. */
64e0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 . Tcl_Size ob
64f0: 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f jc,../* Number o
6500: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a f arguments. */.
6510: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
6520: 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67 st *objv)./* Arg
6530: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a ument objects. *
6540: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 /.{. Tcl_Obj
6550: 2a 72 65 73 75 6c 74 50 74 72 3b 0a 20 20 20 20 *resultPtr;.
6560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 const char **arg
6570: 76 3b 09 09 2f 2a 20 41 6e 20 61 72 72 61 79 20 v;../* An array
6580: 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 61 for the string a
6590: 72 67 75 6d 65 6e 74 73 2e 20 53 74 6f 72 65 64 rguments. Stored
65a0: 0a 09 09 09 09 20 2a 20 6f 6e 20 74 68 65 20 5f ..... * on the _
65b0: 54 63 6c 5f 20 73 74 61 63 6b 2e 20 2a 2f 0a 20 Tcl_ stack. */.
65c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 const char *s
65d0: 74 72 69 6e 67 3b 0a 20 20 20 20 54 63 6c 5f 43 tring;. Tcl_C
65e0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
65f0: 20 69 6e 74 20 62 61 63 6b 67 72 6f 75 6e 64 2c int background,
6600: 20 69 2c 20 69 6e 64 65 78 2c 20 6b 65 65 70 4e i, index, keepN
6610: 65 77 6c 69 6e 65 2c 20 72 65 73 75 6c 74 2c 20 ewline, result,
6620: 69 67 6e 6f 72 65 53 74 64 65 72 72 3b 0a 20 20 ignoreStderr;.
6630: 20 20 54 63 6c 5f 53 69 7a 65 20 61 72 67 63 2c Tcl_Size argc,
6640: 20 6c 65 6e 67 74 68 2c 20 73 6b 69 70 3b 0a 20 length, skip;.
6650: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
6660: 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f 70 74 69 char *const opti
6670: 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 69 67 6e ons[] = {.."-ign
6680: 6f 72 65 73 74 64 65 72 72 22 2c 20 22 2d 6b 65 orestderr", "-ke
6690: 65 70 6e 65 77 6c 69 6e 65 22 2c 20 22 2d 65 6e epnewline", "-en
66a0: 63 6f 64 69 6e 67 22 2c 20 22 2d 2d 22 2c 20 4e coding", "--", N
66b0: 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 ULL. };. e
66c0: 6e 75 6d 20 65 78 65 63 4f 70 74 69 6f 6e 73 45 num execOptionsE
66d0: 6e 75 6d 20 7b 0a 09 45 58 45 43 5f 49 47 4e 4f num {..EXEC_IGNO
66e0: 52 45 53 54 44 45 52 52 2c 20 45 58 45 43 5f 4b RESTDERR, EXEC_K
66f0: 45 45 50 4e 45 57 4c 49 4e 45 2c 20 45 58 45 43 EEPNEWLINE, EXEC
6700: 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 58 45 43 5f _ENCODING, EXEC_
6710: 4c 41 53 54 0a 20 20 20 20 7d 3b 0a 20 20 20 20 LAST. };.
6720: 54 63 6c 5f 4f 62 6a 20 2a 65 6e 63 6f 64 69 6e Tcl_Obj *encodin
6730: 67 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 gObj = NULL;..
6740: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 /*. * Chec
6750: 6b 20 66 6f 72 20 61 6e 79 20 6c 65 61 64 69 6e k for any leadin
6760: 67 20 6f 70 74 69 6f 6e 20 61 72 67 75 6d 65 6e g option argumen
6770: 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ts.. */..
6780: 20 6b 65 65 70 4e 65 77 6c 69 6e 65 20 3d 20 30 keepNewline = 0
6790: 3b 0a 20 20 20 20 69 67 6e 6f 72 65 53 74 64 65 ;. ignoreStde
67a0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 20 rr = 0;. for
67b0: 28 73 6b 69 70 20 3d 20 31 3b 20 73 6b 69 70 20 (skip = 1; skip
67c0: 3c 20 6f 62 6a 63 3b 20 73 6b 69 70 2b 2b 29 20 < objc; skip++)
67d0: 7b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 47 {..string = TclG
67e0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 73 6b etString(objv[sk
67f0: 69 70 5d 29 3b 0a 09 69 66 20 28 73 74 72 69 6e ip]);..if (strin
6800: 67 5b 30 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09 g[0] != '-') {..
6810: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 69 break;..}..i
6820: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 f (Tcl_GetIndexF
6830: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
6840: 62 6a 76 5b 73 6b 69 70 5d 2c 20 6f 70 74 69 6f bjv[skip], optio
6850: 6e 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 0a 09 09 ns, "option",...
6860: 54 43 4c 5f 45 58 41 43 54 2c 20 26 69 6e 64 65 TCL_EXACT, &inde
6870: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
6880: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6890: 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 69 ERROR;..}..if (i
68a0: 6e 64 65 78 20 3d 3d 20 45 58 45 43 5f 4c 41 53 ndex == EXEC_LAS
68b0: 54 29 20 7b 0a 09 20 20 20 20 73 6b 69 70 2b 2b T) {.. skip++
68c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d ;.. break;..}
68d0: 0a 09 73 77 69 74 63 68 20 28 69 6e 64 65 78 29 ..switch (index)
68e0: 20 7b 0a 09 63 61 73 65 20 45 58 45 43 5f 4b 45 {..case EXEC_KE
68f0: 45 50 4e 45 57 4c 49 4e 45 3a 0a 09 20 20 20 20 EPNEWLINE:..
6900: 6b 65 65 70 4e 65 77 6c 69 6e 65 20 3d 20 31 3b keepNewline = 1;
6910: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
6920: 73 65 20 45 58 45 43 5f 49 47 4e 4f 52 45 53 54 se EXEC_IGNOREST
6930: 44 45 52 52 3a 0a 09 20 20 20 20 69 67 6e 6f 72 DERR:.. ignor
6940: 65 53 74 64 65 72 72 20 3d 20 31 3b 0a 09 20 20 eStderr = 1;..
6950: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45 break;..case E
6960: 58 45 43 5f 45 4e 43 4f 44 49 4e 47 3a 0a 09 20 XEC_ENCODING:..
6970: 20 20 20 69 66 20 28 2b 2b 73 6b 69 70 20 3e 3d if (++skip >=
6980: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 objc) {...Tcl_S
6990: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
69a0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
69b0: 67 4f 62 6a 28 22 4e 6f 20 76 61 6c 75 65 20 67 gObj("No value g
69c0: 69 76 65 6e 20 66 6f 72 20 6f 70 74 69 6f 6e 20 iven for option
69d0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 2d 31 29 29 -encoding", -1))
69e0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
69f0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 RROR;.. } els
6a00: 65 20 7b 0a 09 09 54 63 6c 5f 45 6e 63 6f 64 69 e {...Tcl_Encodi
6a10: 6e 67 20 65 6e 63 6f 64 69 6e 67 3b 0a 09 09 65 ng encoding;...e
6a20: 6e 63 6f 64 69 6e 67 4f 62 6a 20 3d 20 6f 62 6a ncodingObj = obj
6a30: 76 5b 73 6b 69 70 5d 3b 0a 09 09 2f 2a 20 56 65 v[skip];.../* Ve
6a40: 72 69 66 79 20 76 61 6c 69 64 69 74 79 20 2d 20 rify validity -
6a50: 62 75 67 20 5b 64 61 35 65 31 62 63 37 62 63 5d bug [da5e1bc7bc]
6a60: 20 2a 2f 0a 09 09 69 66 20 28 54 63 6c 5f 47 65 */...if (Tcl_Ge
6a70: 74 45 6e 63 6f 64 69 6e 67 46 72 6f 6d 4f 62 6a tEncodingFromObj
6a80: 28 69 6e 74 65 72 70 2c 20 65 6e 63 6f 64 69 6e (interp, encodin
6a90: 67 4f 62 6a 2c 20 26 65 6e 63 6f 64 69 6e 67 29 gObj, &encoding)
6aa0: 0a 09 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ....!= TCL_OK) {
6ab0: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 ... return TC
6ac0: 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 54 L_ERROR;...}...T
6ad0: 63 6c 5f 46 72 65 65 45 6e 63 6f 64 69 6e 67 28 cl_FreeEncoding(
6ae0: 65 6e 63 6f 64 69 6e 67 29 3b 0a 09 20 20 20 20 encoding);..
6af0: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 64 }.. break;..d
6b00: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 43 4c efault:.. TCL
6b10: 5f 55 4e 52 45 41 43 48 41 42 4c 45 28 29 3b 0a _UNREACHABLE();.
6b20: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 .}. }. if
6b30: 28 6f 62 6a 63 20 3c 3d 20 73 6b 69 70 29 20 7b (objc <= skip) {
6b40: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
6b50: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
6b60: 6a 76 2c 20 22 3f 2d 6f 70 74 69 6f 6e 20 2e 2e jv, "?-option ..
6b70: 2e 3f 20 61 72 67 20 3f 61 72 67 20 2e 2e 2e 3f .? arg ?arg ...?
6b80: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
6b90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6ba0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 20 /*. * See
6bb0: 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69 if the command i
6bc0: 73 20 74 6f 20 62 65 20 72 75 6e 20 69 6e 20 62 s to be run in b
6bd0: 61 63 6b 67 72 6f 75 6e 64 2e 0a 20 20 20 20 20 ackground..
6be0: 2a 2f 0a 0a 20 20 20 20 62 61 63 6b 67 72 6f 75 */.. backgrou
6bf0: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 69 nd = 0;. stri
6c00: 6e 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e ng = TclGetStrin
6c10: 67 28 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d g(objv[objc - 1]
6c20: 29 3b 0a 20 20 20 20 69 66 20 28 28 73 74 72 69 );. if ((stri
6c30: 6e 67 5b 30 5d 20 3d 3d 20 27 26 27 29 20 26 26 ng[0] == '&') &&
6c40: 20 28 73 74 72 69 6e 67 5b 31 5d 20 3d 3d 20 27 (string[1] == '
6c50: 5c 30 27 29 29 20 7b 0a 09 6f 62 6a 63 2d 2d 3b \0')) {..objc--;
6c60: 0a 09 62 61 63 6b 67 72 6f 75 6e 64 20 3d 20 31 ..background = 1
6c70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
6c80: 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 74 68 * Create th
6c90: 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e e string argumen
6ca0: 74 20 61 72 72 61 79 20 22 61 72 67 76 22 2e 20 t array "argv".
6cb0: 4d 61 6b 65 20 73 75 72 65 20 61 72 67 76 20 69 Make sure argv i
6cc0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 0a 20 s large enough.
6cd0: 20 20 20 20 2a 20 74 6f 20 68 6f 6c 64 20 74 68 * to hold th
6ce0: 65 20 61 72 67 63 20 61 72 67 75 6d 65 6e 74 73 e argc arguments
6cf0: 20 70 6c 75 73 20 31 20 65 78 74 72 61 20 66 6f plus 1 extra fo
6d00: 72 20 74 68 65 20 7a 65 72 6f 20 65 6e 64 2d 6f r the zero end-o
6d10: 66 2d 61 72 67 76 20 77 6f 72 64 2e 0a 20 20 20 f-argv word..
6d20: 20 20 2a 2f 0a 0a 20 20 20 20 61 72 67 63 20 3d */.. argc =
6d30: 20 6f 62 6a 63 20 2d 20 73 6b 69 70 3b 0a 20 20 objc - skip;.
6d40: 20 20 61 72 67 76 20 3d 20 28 63 6f 6e 73 74 20 argv = (const
6d50: 63 68 61 72 20 2a 2a 29 54 63 6c 53 74 61 63 6b char **)TclStack
6d60: 41 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 28 61 Alloc(interp, (a
6d70: 72 67 63 20 2b 20 31 29 20 2a 20 73 69 7a 65 6f rgc + 1) * sizeo
6d80: 66 28 63 68 61 72 20 2a 29 29 3b 0a 0a 20 20 20 f(char *));..
6d90: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 70 79 20 /*. * Copy
6da0: 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 the string conve
6db0: 72 73 69 6f 6e 73 20 6f 66 20 65 61 63 68 20 28 rsions of each (
6dc0: 70 6f 73 74 20 6f 70 74 69 6f 6e 29 20 6f 62 6a post option) obj
6dd0: 65 63 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 ect into the.
6de0: 20 20 2a 20 61 72 67 75 6d 65 6e 74 20 76 65 63 * argument vec
6df0: 74 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 tor.. */..
6e00: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 for (i = 0; i
6e10: 3c 20 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 09 < argc; i++) {..
6e20: 61 72 67 76 5b 69 5d 20 3d 20 54 63 6c 47 65 74 argv[i] = TclGet
6e30: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 20 2b 20 String(objv[i +
6e40: 73 6b 69 70 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 skip]);. }.
6e50: 20 20 61 72 67 76 5b 61 72 67 63 5d 20 3d 20 4e argv[argc] = N
6e60: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 ULL;. chan =
6e70: 54 63 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 43 Tcl_OpenCommandC
6e80: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 61 hannel(interp, a
6e90: 72 67 63 2c 20 61 72 67 76 2c 20 28 62 61 63 6b rgc, argv, (back
6ea0: 67 72 6f 75 6e 64 20 3f 20 30 20 3a 0a 09 20 20 ground ? 0 :..
6eb0: 20 20 69 67 6e 6f 72 65 53 74 64 65 72 72 20 3f ignoreStderr ?
6ec0: 20 54 43 4c 5f 53 54 44 4f 55 54 20 3a 20 54 43 TCL_STDOUT : TC
6ed0: 4c 5f 53 54 44 4f 55 54 7c 54 43 4c 5f 53 54 44 L_STDOUT|TCL_STD
6ee0: 45 52 52 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 ERR));.. /*.
6ef0: 20 20 20 20 2a 20 46 72 65 65 20 74 68 65 20 61 * Free the a
6f00: 72 67 76 20 61 72 72 61 79 2e 0a 20 20 20 20 20 rgv array..
6f10: 2a 2f 0a 0a 20 20 20 20 54 63 6c 53 74 61 63 6b */.. TclStack
6f20: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 28 76 6f Free(interp, (vo
6f30: 69 64 20 2a 29 20 61 72 67 76 29 3b 0a 0a 20 20 id *) argv);..
6f40: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55 if (chan == NU
6f50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
6f60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
6f70: 20 20 20 20 69 66 20 28 62 61 63 6b 67 72 6f 75 if (backgrou
6f80: 6e 64 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74 nd) {../*.. * St
6f90: 6f 72 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 ore the list of
6fa0: 50 49 44 73 20 66 72 6f 6d 20 74 68 65 20 70 69 PIDs from the pi
6fb0: 70 65 6c 69 6e 65 20 69 6e 20 69 6e 74 65 72 70 peline in interp
6fc0: 27 73 20 72 65 73 75 6c 74 20 61 6e 64 0a 09 20 's result and..
6fd0: 2a 20 64 65 74 61 63 68 20 74 68 65 20 50 49 44 * detach the PID
6fe0: 73 20 28 69 6e 73 74 65 61 64 20 6f 66 20 77 61 s (instead of wa
6ff0: 69 74 69 6e 67 20 66 6f 72 20 74 68 65 6d 29 2e iting for them).
7000: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 47 65 74 41 6e .. */...TclGetAn
7010: 64 44 65 74 61 63 68 50 69 64 73 28 69 6e 74 65 dDetachPids(inte
7020: 72 70 2c 20 63 68 61 6e 29 3b 0a 09 69 66 20 28 rp, chan);..if (
7030: 54 63 6c 5f 43 6c 6f 73 65 45 78 28 69 6e 74 65 Tcl_CloseEx(inte
7040: 72 70 2c 20 63 68 61 6e 2c 20 30 29 20 21 3d 20 rp, chan, 0) !=
7050: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 TCL_OK) {.. r
7060: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7070: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ..}..return TCL_
7080: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OK;. }.. /
7090: 2a 20 42 75 67 20 5b 30 66 31 64 64 63 30 64 66 * Bug [0f1ddc0df
70a0: 37 5d 20 2d 20 65 6e 63 6f 64 69 6e 67 20 65 72 7] - encoding er
70b0: 72 6f 72 73 20 2d 20 75 73 65 20 72 65 70 6c 61 rors - use repla
70c0: 63 65 20 70 72 6f 66 69 6c 65 20 2a 2f 0a 20 20 ce profile */.
70d0: 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 68 61 if (Tcl_SetCha
70e0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
70f0: 70 2c 20 63 68 61 6e 2c 20 22 2d 70 72 6f 66 69 p, chan, "-profi
7100: 6c 65 22 2c 20 22 72 65 70 6c 61 63 65 22 29 20 le", "replace")
7110: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f != TCL_OK) {..go
7120: 74 6f 20 65 72 72 6f 72 57 69 74 68 4f 70 65 6e to errorWithOpen
7130: 43 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 7d 0a 0a Channel;. }..
7140: 20 20 20 20 2f 2a 20 54 49 50 20 37 31 36 20 2a /* TIP 716 *
7150: 2f 0a 20 20 20 20 69 66 20 28 65 6e 63 6f 64 69 /. if (encodi
7160: 6e 67 4f 62 6a 20 26 26 0a 09 20 20 20 20 54 63 ngObj &&.. Tc
7170: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
7180: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
7190: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 0a 09 09 "-encoding",...
71a0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e Tcl_GetStrin
71b0: 67 28 65 6e 63 6f 64 69 6e 67 4f 62 6a 29 29 20 g(encodingObj))
71c0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f != TCL_OK) {..go
71d0: 74 6f 20 65 72 72 6f 72 57 69 74 68 4f 70 65 6e to errorWithOpen
71e0: 43 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 7d 0a 0a Channel;. }..
71f0: 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a 28 72 65 TclNewObj(re
7200: 73 75 6c 74 50 74 72 29 3b 0a 20 20 20 20 69 66 sultPtr);. if
7210: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
7220: 48 61 6e 64 6c 65 28 63 68 61 6e 2c 20 54 43 4c Handle(chan, TCL
7230: 5f 52 45 41 44 41 42 4c 45 2c 20 4e 55 4c 4c 29 _READABLE, NULL)
7240: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69 == TCL_OK) {..i
7250: 66 20 28 54 63 6c 5f 52 65 61 64 43 68 61 72 73 f (Tcl_ReadChars
7260: 28 63 68 61 6e 2c 20 72 65 73 75 6c 74 50 74 72 (chan, resultPtr
7270: 2c 20 2d 31 2c 20 30 29 20 3d 3d 20 54 43 4c 5f , -1, 0) == TCL_
7280: 49 4f 5f 46 41 49 4c 55 52 45 29 20 7b 0a 09 20 IO_FAILURE) {..
7290: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 49 /*.. * TI
72a0: 50 20 23 32 31 39 2e 0a 09 20 20 20 20 20 2a 20 P #219... *
72b0: 43 61 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 Capture error me
72c0: 73 73 61 67 65 73 20 70 75 74 20 62 79 20 74 68 ssages put by th
72d0: 65 20 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 e driver into th
72e0: 65 20 62 79 70 61 73 73 20 61 72 65 61 0a 09 20 e bypass area..
72f0: 20 20 20 20 2a 20 61 6e 64 20 70 75 74 20 74 68 * and put th
7300: 65 6d 20 69 6e 74 6f 20 74 68 65 20 72 65 67 75 em into the regu
7310: 6c 61 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 lar interpreter
7320: 72 65 73 75 6c 74 2e 20 46 61 6c 6c 20 62 61 63 result. Fall bac
7330: 6b 20 74 6f 0a 09 20 20 20 20 20 2a 20 74 68 65 k to.. * the
7340: 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 65 regular message
7350: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 if nothing was
7360: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 70 found in the byp
7370: 61 73 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ass... */...
7380: 20 20 20 20 69 66 20 28 21 54 63 6c 43 68 61 6e if (!TclChan
7390: 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 CaughtErrorBypas
73a0: 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 s(interp, chan))
73b0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
73c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
73d0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 l_ObjPrintf(....
73e0: 22 65 72 72 6f 72 20 72 65 61 64 69 6e 67 20 6f "error reading o
73f0: 75 74 70 75 74 20 66 72 6f 6d 20 63 6f 6d 6d 61 utput from comma
7400: 6e 64 3a 20 25 73 22 2c 0a 09 09 09 54 63 6c 5f nd: %s",....Tcl_
7410: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
7420: 70 29 29 29 3b 0a 09 09 54 63 6c 5f 44 65 63 72 p)));...Tcl_Decr
7430: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 50 RefCount(resultP
7440: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 tr);.. }..
7450: 20 67 6f 74 6f 20 65 72 72 6f 72 57 69 74 68 4f goto errorWithO
7460: 70 65 6e 43 68 61 6e 6e 65 6c 3b 0a 09 7d 0a 20 penChannel;..}.
7470: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
7480: 20 20 2a 20 49 66 20 74 68 65 20 70 72 6f 63 65 * If the proce
7490: 73 73 20 70 72 6f 64 75 63 65 64 20 61 6e 79 74 ss produced anyt
74a0: 68 69 6e 67 20 6f 6e 20 73 74 64 65 72 72 2c 20 hing on stderr,
74b0: 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 it will have bee
74c0: 6e 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20 n returned.
74d0: 2a 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 * in the interpr
74e0: 65 74 65 72 20 72 65 73 75 6c 74 2e 20 49 74 20 eter result. It
74f0: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 70 70 65 needs to be appe
7500: 6e 64 65 64 20 74 6f 20 74 68 65 20 72 65 73 75 nded to the resu
7510: 6c 74 0a 20 20 20 20 20 2a 20 73 74 72 69 6e 67 lt. * string
7520: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 .. */.. r
7530: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 43 6c 6f 73 esult = Tcl_Clos
7540: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e eEx(interp, chan
7550: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 , 0);. Tcl_Ap
7560: 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 72 65 73 pendObjToObj(res
7570: 75 6c 74 50 74 72 2c 20 54 63 6c 5f 47 65 74 4f ultPtr, Tcl_GetO
7580: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
7590: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
75a0: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 68 * If the last ch
75b0: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 72 aracter of the r
75c0: 65 73 75 6c 74 20 69 73 20 61 20 6e 65 77 6c 69 esult is a newli
75d0: 6e 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 ne, then remove
75e0: 74 68 65 0a 20 20 20 20 20 2a 20 6e 65 77 6c 69 the. * newli
75f0: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 ne character..
7600: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6b */.. if (k
7610: 65 65 70 4e 65 77 6c 69 6e 65 20 3d 3d 20 30 29 eepNewline == 0)
7620: 20 7b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c {..string = Tcl
7630: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7640: 28 72 65 73 75 6c 74 50 74 72 2c 20 26 6c 65 6e (resultPtr, &len
7650: 67 74 68 29 3b 0a 09 69 66 20 28 28 6c 65 6e 67 gth);..if ((leng
7660: 74 68 20 3e 20 30 29 20 26 26 20 28 73 74 72 69 th > 0) && (stri
7670: 6e 67 5b 6c 65 6e 67 74 68 20 2d 20 31 5d 20 3d ng[length - 1] =
7680: 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 20 20 20 20 = '\n')) {..
7690: 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 6e 67 74 68 Tcl_SetObjLength
76a0: 28 72 65 73 75 6c 74 50 74 72 2c 20 6c 65 6e 67 (resultPtr, leng
76b0: 74 68 20 2d 20 31 29 3b 0a 09 7d 0a 20 20 20 20 th - 1);..}.
76c0: 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a }. Tcl_SetObj
76d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 Result(interp, r
76e0: 65 73 75 6c 74 50 74 72 29 3b 0a 0a 20 20 20 20 esultPtr);..
76f0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 0a return result;..
7700: 65 72 72 6f 72 57 69 74 68 4f 70 65 6e 43 68 61 errorWithOpenCha
7710: 6e 6e 65 6c 3a 0a 20 20 20 20 2f 2a 20 49 6e 74 nnel:. /* Int
7720: 65 72 70 72 65 74 65 72 20 73 68 6f 75 6c 64 20 erpreter should
7730: 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 20 already contain
7740: 65 72 72 6f 72 2e 20 50 61 73 73 20 4e 55 4c 4c error. Pass NULL
7750: 20 74 6f 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 to not overwrit
7760: 65 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 54 e */. (void)T
7770: 63 6c 5f 43 6c 6f 73 65 45 78 28 4e 55 4c 4c 2c cl_CloseEx(NULL,
7780: 20 63 68 61 6e 2c 20 30 29 3b 0a 20 20 20 20 72 chan, 0);. r
7790: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
77a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f -----. *. * Tcl_
7800: 46 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64 20 2d FblockedObjCmd -
7810: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
7820: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 ction is invoked
7830: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 to process the
7840: 54 63 6c 20 22 66 62 6c 6f 63 6b 65 64 22 20 63 Tcl "fblocked" c
7850: 6f 6d 6d 61 6e 64 2e 20 53 65 65 0a 20 2a 09 74 ommand. See. *.t
7860: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 he user document
7870: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
7880: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
7890: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
78a0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
78b0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
78c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
78d0: 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73 *.Sets interp's
78e0: 20 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65 result to boole
78f0: 61 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 an true or false
7900: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 depending on wh
7910: 65 74 68 65 72 20 74 68 65 0a 20 2a 09 70 72 65 ether the. *.pre
7920: 63 65 64 69 6e 67 20 69 6e 70 75 74 20 6f 70 65 ceding input ope
7930: 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 68 ration on the ch
7940: 61 6e 6e 65 6c 20 77 6f 75 6c 64 20 68 61 76 65 annel would have
7950: 20 62 6c 6f 63 6b 65 64 2e 0a 20 2a 0a 20 2a 2d blocked.. *. *-
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
79b0: 69 6e 74 0a 54 63 6c 5f 46 62 6c 6f 63 6b 65 64 int.Tcl_Fblocked
79c0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f ObjCmd(. TCL_
79d0: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a UNUSED(void *),.
79e0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
79f0: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 interp,../* Curr
7a00: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e ent interpreter.
7a10: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 */. Tcl_Size
7a20: 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 objc,../* Numbe
7a30: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 r of arguments.
7a40: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
7a50: 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 const *objv)./*
7a60: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 Argument objects
7a70: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
7a80: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
7a90: 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 int mode;..
7aa0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b if (objc != 2) {
7ab0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
7ac0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
7ad0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a jv, "channel");.
7ae0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7af0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
7b00: 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 (TclGetChannelF
7b10: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
7b20: 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 26 bjv[1], &chan, &
7b30: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f mode, 0) != TCL_
7b40: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
7b50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7b60: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 if (!(mode &
7b70: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b TCL_READABLE)) {
7b80: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
7b90: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
7ba0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 bjPrintf(..."cha
7bb0: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e nnel \"%s\" wasn
7bc0: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 't opened for re
7bd0: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 ading",...TclGet
7be0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 String(objv[1]))
7bf0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7c00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7c10: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
7c20: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
7c30: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 54 63 6c 5f wBooleanObj(Tcl_
7c40: 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 61 InputBlocked(cha
7c50: 6e 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e n)));. return
7c60: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
7c70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
7cc0: 63 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 20 2d 2d cl_OpenObjCmd --
7cd0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
7ce0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
7cf0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
7d00: 6f 70 65 6e 22 20 54 63 6c 20 63 6f 6d 6d 61 6e open" Tcl comman
7d10: 64 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 d. See the. *.us
7d20: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e er documentation
7d30: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 for details on
7d40: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a what it does.. *
7d50: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
7d60: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
7d70: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
7d80: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
7d90: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
7da0: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d entation.. *. *-
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7df0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
7e00: 63 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 28 0a 20 cl_OpenObjCmd(.
7e10: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
7e20: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
7e30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
7e40: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
7e50: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 preter. */. T
7e60: 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f cl_Size objc,../
7e70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
7e80: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
7e90: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 l_Obj *const *ob
7ea0: 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 jv)./* Argument
7eb0: 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 objects. */.{.
7ec0: 20 20 69 6e 74 20 70 69 70 65 6c 69 6e 65 2c 20 int pipeline,
7ed0: 70 72 6f 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 prot;. const
7ee0: 63 68 61 72 20 2a 6d 6f 64 65 53 74 72 69 6e 67 char *modeString
7ef0: 2c 20 2a 77 68 61 74 3b 0a 20 20 20 20 54 63 6c , *what;. Tcl
7f00: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 0a _Channel chan;..
7f10: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 if ((objc <
7f20: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 2) || (objc > 4)
7f30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
7f40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
7f50: 20 6f 62 6a 76 2c 20 22 66 69 6c 65 4e 61 6d 65 objv, "fileName
7f60: 20 3f 61 63 63 65 73 73 3f 20 3f 70 65 72 6d 69 ?access? ?permi
7f70: 73 73 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 ssions?");..retu
7f80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7f90: 20 20 7d 0a 20 20 20 20 70 72 6f 74 20 3d 20 30 }. prot = 0
7fa0: 36 36 36 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 666;. if (obj
7fb0: 63 20 3d 3d 20 32 29 20 7b 0a 09 6d 6f 64 65 53 c == 2) {..modeS
7fc0: 74 72 69 6e 67 20 3d 20 22 72 22 3b 0a 20 20 20 tring = "r";.
7fd0: 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 6f 64 65 53 } else {..modeS
7fe0: 74 72 69 6e 67 20 3d 20 54 63 6c 47 65 74 53 74 tring = TclGetSt
7ff0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09 ring(objv[2]);..
8000: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 34 29 20 7b if (objc == 4) {
8010: 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 .. const char
8020: 20 2a 70 65 72 6d 53 74 72 69 6e 67 20 3d 20 54 *permString = T
8030: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
8040: 5b 33 5d 29 3b 0a 09 20 20 20 20 69 6e 74 20 63 [3]);.. int c
8050: 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b ode = TCL_ERROR;
8060: 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 .. Tcl_Size s
8070: 63 61 6e 6e 65 64 20 3d 20 54 63 6c 50 61 72 73 canned = TclPars
8080: 65 41 6c 6c 57 68 69 74 65 53 70 61 63 65 28 70 eAllWhiteSpace(p
8090: 65 72 6d 53 74 72 69 6e 67 2c 20 2d 31 29 3b 0a ermString, -1);.
80a0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
80b0: 20 53 75 70 70 6f 72 74 20 6c 65 67 61 63 79 20 Support legacy
80c0: 6f 63 74 61 6c 20 6e 75 6d 62 65 72 73 2e 0a 09 octal numbers...
80d0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
80e0: 20 28 28 70 65 72 6d 53 74 72 69 6e 67 5b 73 63 ((permString[sc
80f0: 61 6e 6e 65 64 5d 20 3d 3d 20 27 30 27 29 0a 09 anned] == '0')..
8100: 09 20 20 20 20 26 26 20 28 70 65 72 6d 53 74 72 . && (permStr
8110: 69 6e 67 5b 73 63 61 6e 6e 65 64 2b 31 5d 20 3e ing[scanned+1] >
8120: 3d 20 27 30 27 29 0a 09 09 20 20 20 20 26 26 20 = '0')... &&
8130: 28 70 65 72 6d 53 74 72 69 6e 67 5b 73 63 61 6e (permString[scan
8140: 6e 65 64 2b 31 5d 20 3c 3d 20 27 37 27 29 29 20 ned+1] <= '7'))
8150: 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20 2a 70 65 72 {...Tcl_Obj *per
8160: 6d 4f 62 6a 3b 0a 0a 09 09 54 63 6c 4e 65 77 4c mObj;....TclNewL
8170: 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28 iteralStringObj(
8180: 70 65 72 6d 4f 62 6a 2c 20 22 30 6f 22 29 3b 0a permObj, "0o");.
8190: 09 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 ..Tcl_AppendToOb
81a0: 6a 28 70 65 72 6d 4f 62 6a 2c 20 70 65 72 6d 53 j(permObj, permS
81b0: 74 72 69 6e 67 2b 73 63 61 6e 6e 65 64 2b 31 2c tring+scanned+1,
81c0: 20 2d 31 29 3b 0a 09 09 63 6f 64 65 20 3d 20 54 -1);...code = T
81d0: 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 clGetIntFromObj(
81e0: 4e 55 4c 4c 2c 20 70 65 72 6d 4f 62 6a 2c 20 26 NULL, permObj, &
81f0: 70 72 6f 74 29 3b 0a 09 09 54 63 6c 5f 44 65 63 prot);...Tcl_Dec
8200: 72 52 65 66 43 6f 75 6e 74 28 70 65 72 6d 4f 62 rRefCount(permOb
8210: 6a 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 j);.. }...
8220: 20 69 66 20 28 28 63 6f 64 65 20 3d 3d 20 54 43 if ((code == TC
8230: 4c 5f 45 52 52 4f 52 29 0a 09 09 20 20 20 20 26 L_ERROR)... &
8240: 26 20 54 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f & TclGetIntFromO
8250: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
8260: 33 5d 2c 20 26 70 72 6f 74 29 20 21 3d 20 54 43 3], &prot) != TC
8270: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e L_OK) {...return
8280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
8290: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }..}. }..
82a0: 20 70 69 70 65 6c 69 6e 65 20 3d 20 30 3b 0a 20 pipeline = 0;.
82b0: 20 20 20 77 68 61 74 20 3d 20 54 63 6c 47 65 74 what = TclGet
82c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b String(objv[1]);
82d0: 0a 20 20 20 20 69 66 20 28 77 68 61 74 5b 30 5d . if (what[0]
82e0: 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 70 69 70 65 == '|') {..pipe
82f0: 6c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a line = 1;. }.
8300: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f . /*. * O
8310: 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6f 72 20 pen the file or
8320: 63 72 65 61 74 65 20 61 20 70 72 6f 63 65 73 73 create a process
8330: 20 70 69 70 65 6c 69 6e 65 2e 0a 20 20 20 20 20 pipeline..
8340: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 70 69 70 */.. if (!pip
8350: 65 6c 69 6e 65 29 20 7b 0a 09 63 68 61 6e 20 3d eline) {..chan =
8360: 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 Tcl_FSOpenFileC
8370: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6f hannel(interp, o
8380: 62 6a 76 5b 31 5d 2c 20 6d 6f 64 65 53 74 72 69 bjv[1], modeStri
8390: 6e 67 2c 20 70 72 6f 74 29 3b 0a 20 20 20 20 7d ng, prot);. }
83a0: 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 6d 6f 64 else {..int mod
83b0: 65 2c 20 6d 6f 64 65 46 6c 61 67 73 3b 0a 09 54 e, modeFlags;..T
83c0: 63 6c 5f 53 69 7a 65 20 63 6d 64 4f 62 6a 63 3b cl_Size cmdObjc;
83d0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 63 ..const char **c
83e0: 6d 64 41 72 67 76 3b 0a 0a 09 69 66 20 28 54 63 mdArgv;...if (Tc
83f0: 6c 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 l_SplitList(inte
8400: 72 70 2c 20 77 68 61 74 2b 31 2c 20 26 63 6d 64 rp, what+1, &cmd
8410: 4f 62 6a 63 2c 20 26 63 6d 64 41 72 67 76 29 20 Objc, &cmdArgv)
8420: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
8430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
8440: 4f 52 3b 0a 09 7d 0a 0a 09 6d 6f 64 65 20 3d 20 OR;..}...mode =
8450: 54 63 6c 47 65 74 4f 70 65 6e 4d 6f 64 65 28 69 TclGetOpenMode(i
8460: 6e 74 65 72 70 2c 20 6d 6f 64 65 53 74 72 69 6e nterp, modeStrin
8470: 67 2c 20 26 6d 6f 64 65 46 6c 61 67 73 29 3b 0a g, &modeFlags);.
8480: 09 69 66 20 28 6d 6f 64 65 20 3d 3d 20 2d 31 29 .if (mode == -1)
8490: 20 7b 0a 09 20 20 20 20 63 68 61 6e 20 3d 20 4e {.. chan = N
84a0: 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ULL;..} else {..
84b0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 int flags =
84c0: 54 43 4c 5f 53 54 44 45 52 52 20 7c 20 54 43 4c TCL_STDERR | TCL
84d0: 5f 45 4e 46 4f 52 43 45 5f 4d 4f 44 45 3b 0a 0a _ENFORCE_MODE;..
84e0: 09 20 20 20 20 73 77 69 74 63 68 20 28 6d 6f 64 . switch (mod
84f0: 65 20 26 20 4f 5f 41 43 43 4d 4f 44 45 29 20 7b e & O_ACCMODE) {
8500: 0a 09 20 20 20 20 63 61 73 65 20 4f 5f 52 44 4f .. case O_RDO
8510: 4e 4c 59 3a 0a 09 09 66 6c 61 67 73 20 7c 3d 20 NLY:...flags |=
8520: 54 43 4c 5f 53 54 44 4f 55 54 3b 0a 09 09 62 72 TCL_STDOUT;...br
8530: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 4f eak;.. case O
8540: 5f 57 52 4f 4e 4c 59 3a 0a 09 09 66 6c 61 67 73 _WRONLY:...flags
8550: 20 7c 3d 20 54 43 4c 5f 53 54 44 49 4e 3b 0a 09 |= TCL_STDIN;..
8560: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 .break;.. cas
8570: 65 20 4f 5f 52 44 57 52 3a 0a 09 09 66 6c 61 67 e O_RDWR:...flag
8580: 73 20 7c 3d 20 28 54 43 4c 5f 53 54 44 49 4e 20 s |= (TCL_STDIN
8590: 7c 20 54 43 4c 5f 53 54 44 4f 55 54 29 3b 0a 09 | TCL_STDOUT);..
85a0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 .break;.. def
85b0: 61 75 6c 74 3a 0a 09 09 54 63 6c 5f 50 61 6e 69 ault:...Tcl_Pani
85c0: 63 28 22 54 63 6c 5f 4f 70 65 6e 43 6d 64 3a 20 c("Tcl_OpenCmd:
85d0: 69 6e 76 61 6c 69 64 20 6d 6f 64 65 20 76 61 6c invalid mode val
85e0: 75 65 22 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 ue");...break;..
85f0: 20 20 20 20 7d 0a 09 20 20 20 20 63 68 61 6e 20 }.. chan
8600: 3d 20 54 63 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e = Tcl_OpenComman
8610: 64 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c dChannel(interp,
8620: 20 63 6d 64 4f 62 6a 63 2c 20 63 6d 64 41 72 67 cmdObjc, cmdArg
8630: 76 2c 20 66 6c 61 67 73 29 3b 0a 09 20 20 20 20 v, flags);..
8640: 69 66 20 28 28 6d 6f 64 65 46 6c 61 67 73 20 26 if ((modeFlags &
8650: 20 43 48 41 4e 4e 45 4c 5f 52 41 57 5f 4d 4f 44 CHANNEL_RAW_MOD
8660: 45 29 20 26 26 20 63 68 61 6e 29 20 7b 0a 09 09 E) && chan) {...
8670: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
8680: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
8690: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
86a0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 09 20 ", "binary");..
86b0: 20 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 46 72 65 }..}..Tcl_Fre
86c0: 65 28 28 76 6f 69 64 20 2a 29 63 6d 64 41 72 67 e((void *)cmdArg
86d0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 v);. }. if
86e0: 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 (chan == NULL)
86f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8700: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
8710: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e cl_RegisterChann
8720: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
8730: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
8740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
8750: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
8760: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
8770: 6d 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a me(chan), -1));.
8780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8790: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
87e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 41 63 63 65 --. *. * TcpAcce
87f0: 70 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 74 ptCallbacksDelet
8800: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 41 eProc --. *. *.A
8810: 73 73 6f 63 64 61 74 61 20 63 6c 65 61 6e 75 70 ssocdata cleanup
8820: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 routine called
8830: 77 68 65 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 when an interpre
8840: 74 65 72 20 69 73 20 62 65 69 6e 67 20 64 65 6c ter is being del
8850: 65 74 65 64 0a 20 2a 09 74 6f 20 73 65 74 20 74 eted. *.to set t
8860: 68 65 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 he interp field
8870: 6f 66 20 61 6c 6c 20 74 68 65 20 61 63 63 65 70 of all the accep
8880: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 t callback recor
8890: 64 73 20 72 65 67 69 73 74 65 72 65 64 0a 20 2a ds registered. *
88a0: 09 77 69 74 68 20 74 68 65 20 69 6e 74 65 72 70 .with the interp
88b0: 72 65 74 65 72 20 74 6f 20 4e 55 4c 4c 2e 20 54 reter to NULL. T
88c0: 68 69 73 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 his will prevent
88d0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
88e0: 20 66 72 6f 6d 0a 20 2a 09 62 65 69 6e 67 20 75 from. *.being u
88f0: 73 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 sed in the futur
8900: 65 20 74 6f 20 65 76 61 6c 20 61 63 63 65 70 74 e to eval accept
8910: 20 73 63 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 20 scripts.. *. *
8920: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
8930: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8940: 65 63 74 73 3a 0a 20 2a 09 44 65 61 6c 6c 6f 63 ects:. *.Dealloc
8950: 61 74 65 73 20 6d 65 6d 6f 72 79 20 61 6e 64 20 ates memory and
8960: 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 70 20 sets the interp
8970: 66 69 65 6c 64 20 6f 66 20 61 6c 6c 20 74 68 65 field of all the
8980: 20 61 63 63 65 70 74 0a 20 2a 09 63 61 6c 6c 62 accept. *.callb
8990: 61 63 6b 20 72 65 63 6f 72 64 73 20 74 6f 20 4e ack records to N
89a0: 55 4c 4c 20 74 6f 20 70 72 65 76 65 6e 74 20 74 ULL to prevent t
89b0: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 his interpreter
89c0: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 0a from being used.
89d0: 20 2a 09 73 75 62 73 65 71 75 65 6e 74 6c 79 20 *.subsequently
89e0: 74 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20 73 to eval accept s
89f0: 63 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d cripts.. *. *---
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a40: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
8a50: 76 6f 69 64 0a 54 63 70 41 63 63 65 70 74 43 61 void.TcpAcceptCa
8a60: 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65 50 72 6f llbacksDeletePro
8a70: 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 c(. void *cli
8a80: 65 6e 74 44 61 74 61 2c 09 09 2f 2a 20 44 61 74 entData,../* Dat
8a90: 61 20 77 68 69 63 68 20 77 61 73 20 70 61 73 73 a which was pass
8aa0: 65 64 20 77 68 65 6e 20 74 68 65 20 61 73 73 6f ed when the asso
8ab0: 63 64 61 74 61 0a 09 09 09 09 20 2a 20 77 61 73 cdata..... * was
8ac0: 20 72 65 67 69 73 74 65 72 65 64 2e 20 2a 2f 0a registered. */.
8ad0: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 TCL_UNUSED(T
8ae0: 63 6c 5f 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a cl_Interp *)).{.
8af0: 20 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c Tcl_HashTabl
8b00: 65 20 2a 68 54 62 6c 50 74 72 20 3d 20 28 54 63 e *hTblPtr = (Tc
8b10: 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a 29 63 6c l_HashTable *)cl
8b20: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 ientData;. Tc
8b30: 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 l_HashEntry *hPt
8b40: 72 3b 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 53 r;. Tcl_HashS
8b50: 65 61 72 63 68 20 68 53 65 61 72 63 68 3b 0a 0a earch hSearch;..
8b60: 20 20 20 20 66 6f 72 20 28 68 50 74 72 20 3d 20 for (hPtr =
8b70: 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74 Tcl_FirstHashEnt
8b80: 72 79 28 68 54 62 6c 50 74 72 2c 20 26 68 53 65 ry(hTblPtr, &hSe
8b90: 61 72 63 68 29 3b 0a 09 20 20 20 20 68 50 74 72 arch);.. hPtr
8ba0: 20 21 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20 3d != NULL; hPtr =
8bb0: 20 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74 Tcl_NextHashEnt
8bc0: 72 79 28 26 68 53 65 61 72 63 68 29 29 20 7b 0a ry(&hSearch)) {.
8bd0: 09 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 .AcceptCallback
8be0: 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 *acceptCallbackP
8bf0: 74 72 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c tr = (AcceptCall
8c00: 62 61 63 6b 20 2a 29 54 63 6c 5f 47 65 74 48 61 back *)Tcl_GetHa
8c10: 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 0a shValue(hPtr);..
8c20: 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 .acceptCallbackP
8c30: 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 4e 55 4c tr->interp = NUL
8c40: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c L;. }. Tcl
8c50: 5f 44 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 _DeleteHashTable
8c60: 28 68 54 62 6c 50 74 72 29 3b 0a 20 20 20 20 54 (hTblPtr);. T
8c70: 63 6c 5f 46 72 65 65 28 68 54 62 6c 50 74 72 29 cl_Free(hTblPtr)
8c80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cd0: 2d 0a 20 2a 0a 20 2a 20 52 65 67 69 73 74 65 72 -. *. * Register
8ce0: 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 TcpServerInterpC
8cf0: 6c 65 61 6e 75 70 20 2d 2d 0a 20 2a 0a 20 2a 09 leanup --. *. *.
8d00: 52 65 67 69 73 74 65 72 73 20 61 6e 20 61 63 63 Registers an acc
8d10: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 ept callback rec
8d20: 6f 72 64 20 74 6f 20 68 61 76 65 20 69 74 73 20 ord to have its
8d30: 69 6e 74 65 72 70 20 66 69 65 6c 64 20 73 65 74 interp field set
8d40: 20 74 6f 0a 20 2a 09 4e 55 4c 4c 20 77 68 65 6e to. *.NULL when
8d50: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
8d60: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a is deleted.. *.
8d70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
8d80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 one.. *. * Side
8d90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 68 65 6e effects:. *.When
8da0: 2c 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c , in the future,
8db0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
8dc0: 20 69 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 is deleted, the
8dd0: 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 6f 66 interp field of
8de0: 0a 20 2a 09 74 68 65 20 61 63 63 65 70 74 20 63 . *.the accept c
8df0: 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 73 74 72 allback data str
8e00: 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20 73 ucture will be s
8e10: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 54 68 69 73 et to NULL. This
8e20: 20 77 69 6c 6c 0a 20 2a 09 70 72 65 76 65 6e 74 will. *.prevent
8e30: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 76 61 attempts to eva
8e40: 6c 20 74 68 65 20 61 63 63 65 70 74 20 73 63 72 l the accept scr
8e50: 69 70 74 20 69 6e 20 61 20 64 65 6c 65 74 65 64 ipt in a deleted
8e60: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a interpreter.. *
8e70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
8ec0: 74 61 74 69 63 20 76 6f 69 64 0a 52 65 67 69 73 tatic void.Regis
8ed0: 74 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 terTcpServerInte
8ee0: 72 70 43 6c 65 61 6e 75 70 28 0a 20 20 20 20 54 rpCleanup(. T
8ef0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
8f00: 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 p,../* Interpret
8f10: 65 72 20 66 6f 72 20 77 68 69 63 68 20 77 65 20 er for which we
8f20: 77 61 6e 74 20 74 6f 20 62 65 0a 09 09 09 09 20 want to be.....
8f30: 2a 20 69 6e 66 6f 72 6d 65 64 20 6f 66 20 64 65 * informed of de
8f40: 6c 65 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 41 letion. */. A
8f50: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 cceptCallback *a
8f60: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
8f70: 29 0a 09 09 09 09 2f 2a 20 54 68 65 20 61 63 63 )...../* The acc
8f80: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 ept callback rec
8f90: 6f 72 64 20 77 68 6f 73 65 20 69 6e 74 65 72 70 ord whose interp
8fa0: 0a 09 09 09 09 20 2a 20 66 69 65 6c 64 20 77 65 ..... * field we
8fb0: 20 77 61 6e 74 20 73 65 74 20 74 6f 20 4e 55 4c want set to NUL
8fc0: 4c 20 77 68 65 6e 20 74 68 65 0a 09 09 09 09 20 L when the.....
8fd0: 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 * interpreter is
8fe0: 20 64 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20 deleted. */.{.
8ff0: 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 Tcl_HashTable
9000: 20 2a 68 54 62 6c 50 74 72 3b 09 2f 2a 20 48 61 *hTblPtr;./* Ha
9010: 73 68 20 74 61 62 6c 65 20 66 6f 72 20 61 63 63 sh table for acc
9020: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 ept callback rec
9030: 6f 72 64 73 20 74 6f 0a 09 09 09 09 20 2a 20 73 ords to..... * s
9040: 6d 61 73 68 20 77 68 65 6e 20 74 68 65 20 69 6e mash when the in
9050: 74 65 72 70 72 65 74 65 72 20 77 69 6c 6c 20 62 terpreter will b
9060: 65 0a 09 09 09 09 20 2a 20 64 65 6c 65 74 65 64 e..... * deleted
9070: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73 . */. Tcl_Has
9080: 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 09 2f 2a hEntry *hPtr;./*
9090: 20 45 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 Entry for this
90a0: 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 69 record. */. i
90b0: 6e 74 20 69 73 4e 65 77 3b 09 09 09 2f 2a 20 49 nt isNew;.../* I
90c0: 73 20 74 68 65 20 65 6e 74 72 79 20 6e 65 77 3f s the entry new?
90d0: 20 2a 2f 0a 0a 20 20 20 20 68 54 62 6c 50 74 72 */.. hTblPtr
90e0: 20 3d 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c = (Tcl_HashTabl
90f0: 65 20 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63 e *)Tcl_GetAssoc
9100: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 41 53 53 Data(interp, ASS
9110: 4f 43 5f 4b 45 59 2c 20 4e 55 4c 4c 29 3b 0a 0a OC_KEY, NULL);..
9120: 20 20 20 20 69 66 20 28 68 54 62 6c 50 74 72 20 if (hTblPtr
9130: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 68 54 62 6c == NULL) {..hTbl
9140: 50 74 72 20 3d 20 28 54 63 6c 5f 48 61 73 68 54 Ptr = (Tcl_HashT
9150: 61 62 6c 65 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 able *)Tcl_Alloc
9160: 28 73 69 7a 65 6f 66 28 54 63 6c 5f 48 61 73 68 (sizeof(Tcl_Hash
9170: 54 61 62 6c 65 29 29 3b 0a 09 54 63 6c 5f 49 6e Table));..Tcl_In
9180: 69 74 48 61 73 68 54 61 62 6c 65 28 68 54 62 6c itHashTable(hTbl
9190: 50 74 72 2c 20 54 43 4c 5f 4f 4e 45 5f 57 4f 52 Ptr, TCL_ONE_WOR
91a0: 44 5f 4b 45 59 53 29 3b 0a 09 54 63 6c 5f 53 65 D_KEYS);..Tcl_Se
91b0: 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65 72 tAssocData(inter
91c0: 70 2c 20 41 53 53 4f 43 5f 4b 45 59 2c 0a 09 09 p, ASSOC_KEY,...
91d0: 54 63 70 41 63 63 65 70 74 43 61 6c 6c 62 61 63 TcpAcceptCallbac
91e0: 6b 73 44 65 6c 65 74 65 50 72 6f 63 2c 20 68 54 ksDeleteProc, hT
91f0: 62 6c 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 blPtr);. }..
9200: 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 43 72 hPtr = Tcl_Cr
9210: 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 68 54 eateHashEntry(hT
9220: 62 6c 50 74 72 2c 20 61 63 63 65 70 74 43 61 6c blPtr, acceptCal
9230: 6c 62 61 63 6b 50 74 72 2c 20 26 69 73 4e 65 77 lbackPtr, &isNew
9240: 29 3b 0a 20 20 20 20 69 66 20 28 21 69 73 4e 65 );. if (!isNe
9250: 77 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 28 w) {..Tcl_Panic(
9260: 22 52 65 67 69 73 74 65 72 54 63 70 53 65 72 76 "RegisterTcpServ
9270: 65 72 43 6c 65 61 6e 75 70 3a 20 64 61 6d 61 67 erCleanup: damag
9280: 65 64 20 61 63 63 65 70 74 20 72 65 63 6f 72 64 ed accept record
9290: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 0a table");. }.
92a0: 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73 68 56 Tcl_SetHashV
92b0: 61 6c 75 65 28 68 50 74 72 2c 20 61 63 63 65 70 alue(hPtr, accep
92c0: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 7d tCallbackPtr);.}
92d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9320: 2a 0a 20 2a 20 55 6e 72 65 67 69 73 74 65 72 54 *. * UnregisterT
9330: 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 6c cpServerInterpCl
9340: 65 61 6e 75 70 50 72 6f 63 20 2d 2d 0a 20 2a 0a eanupProc --. *.
9350: 20 2a 09 55 6e 72 65 67 69 73 74 65 72 20 61 20 *.Unregister a
9360: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 previously regis
9370: 74 65 72 65 64 20 61 63 63 65 70 74 20 63 61 6c tered accept cal
9380: 6c 62 61 63 6b 20 72 65 63 6f 72 64 2e 20 54 68 lback record. Th
9390: 65 20 69 6e 74 65 72 70 0a 20 2a 09 66 69 65 6c e interp. *.fiel
93a0: 64 20 6f 66 20 74 68 69 73 20 72 65 63 6f 72 64 d of this record
93b0: 20 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67 65 72 20 will no longer
93c0: 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 be set to NULL i
93d0: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 n the future whe
93e0: 6e 0a 20 2a 09 74 68 65 20 69 6e 74 65 72 70 72 n. *.the interpr
93f0: 65 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2e eter is deleted.
9400: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
9410: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 *.None.. *. * S
9420: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9430: 50 72 65 76 65 6e 74 73 20 74 68 65 20 69 6e 74 Prevents the int
9440: 65 72 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 erp field of the
9450: 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b accept callback
9460: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 62 65 69 record from bei
9470: 6e 67 20 73 65 74 0a 20 2a 09 74 6f 20 4e 55 4c ng set. *.to NUL
9480: 4c 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 L in the future
9490: 77 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72 when the interpr
94a0: 65 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2e eter is deleted.
94b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
9500: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 55 6e ..static void.Un
9510: 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76 65 registerTcpServe
9520: 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 72 rInterpCleanupPr
9530: 6f 63 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 oc(. Tcl_Inte
9540: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
9550: 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 Interpreter in w
9560: 68 69 63 68 20 74 68 65 20 61 63 63 65 70 74 20 hich the accept
9570: 63 61 6c 6c 62 61 63 6b 0a 09 09 09 09 20 2a 20 callback..... *
9580: 72 65 63 6f 72 64 20 77 61 73 20 72 65 67 69 73 record was regis
9590: 74 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 41 63 tered. */. Ac
95a0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 ceptCallback *ac
95b0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 ceptCallbackPtr)
95c0: 0a 09 09 09 09 2f 2a 20 54 68 65 20 72 65 63 6f ...../* The reco
95d0: 72 64 20 66 6f 72 20 77 68 69 63 68 20 74 6f 20 rd for which to
95e0: 64 65 6c 65 74 65 20 74 68 65 0a 09 09 09 09 20 delete the.....
95f0: 2a 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20 * registration.
9600: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 48 61 73 */.{. Tcl_Has
9610: 68 54 61 62 6c 65 20 2a 68 54 62 6c 50 74 72 3b hTable *hTblPtr;
9620: 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 . Tcl_HashEnt
9630: 72 79 20 2a 68 50 74 72 3b 0a 0a 20 20 20 20 68 ry *hPtr;.. h
9640: 54 62 6c 50 74 72 20 3d 20 28 54 63 6c 5f 48 61 TblPtr = (Tcl_Ha
9650: 73 68 54 61 62 6c 65 20 2a 29 54 63 6c 5f 47 65 shTable *)Tcl_Ge
9660: 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65 72 tAssocData(inter
9670: 70 2c 20 41 53 53 4f 43 5f 4b 45 59 2c 20 4e 55 p, ASSOC_KEY, NU
9680: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 68 54 62 LL);. if (hTb
9690: 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a lPtr == NULL) {.
96a0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a .return;. }..
96b0: 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 46 hPtr = Tcl_F
96c0: 69 6e 64 48 61 73 68 45 6e 74 72 79 28 68 54 62 indHashEntry(hTb
96d0: 6c 50 74 72 2c 20 61 63 63 65 70 74 43 61 6c 6c lPtr, acceptCall
96e0: 62 61 63 6b 50 74 72 29 3b 0a 20 20 20 20 69 66 backPtr);. if
96f0: 20 28 68 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 (hPtr != NULL)
9700: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 {..Tcl_DeleteHas
9710: 68 45 6e 74 72 79 28 68 50 74 72 29 3b 0a 20 20 hEntry(hPtr);.
9720: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d }.}.../*. *---
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9770: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 63 63 65 70 74 ---. *. * Accept
9780: 43 61 6c 6c 62 61 63 6b 50 72 6f 63 20 2d 2d 0a CallbackProc --.
9790: 20 2a 0a 20 2a 09 54 68 69 73 20 63 61 6c 6c 62 *. *.This callb
97a0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ack is invoked b
97b0: 79 20 74 68 65 20 54 43 50 20 63 68 61 6e 6e 65 y the TCP channe
97c0: 6c 20 64 72 69 76 65 72 20 77 68 65 6e 20 69 74 l driver when it
97d0: 20 61 63 63 65 70 74 73 20 61 0a 20 2a 09 6e 65 accepts a. *.ne
97e0: 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f w connection fro
97f0: 6d 20 61 20 63 6c 69 65 6e 74 20 6f 6e 20 61 20 m a client on a
9800: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 2e 0a 20 server socket..
9810: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
9820: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
9830: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 68 e effects:. *.Wh
9840: 61 74 65 76 65 72 20 74 68 65 20 73 63 72 69 70 atever the scrip
9850: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d t does.. *. *---
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98a0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
98b0: 76 6f 69 64 0a 41 63 63 65 70 74 43 61 6c 6c 62 void.AcceptCallb
98c0: 61 63 6b 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 ackProc(. voi
98d0: 64 20 2a 63 61 6c 6c 62 61 63 6b 44 61 74 61 2c d *callbackData,
98e0: 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 ../* The data st
98f0: 6f 72 65 64 20 77 68 65 6e 20 74 68 65 20 63 61 ored when the ca
9900: 6c 6c 62 61 63 6b 20 77 61 73 0a 09 09 09 09 20 llback was.....
9910: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 * created in the
9920: 20 63 61 6c 6c 20 74 6f 0a 09 09 09 09 20 2a 20 call to..... *
9930: 54 63 6c 5f 4f 70 65 6e 54 63 70 53 65 72 76 65 Tcl_OpenTcpServe
9940: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 r. */. Tcl_Ch
9950: 61 6e 6e 65 6c 20 63 68 61 6e 2c 09 09 2f 2a 20 annel chan,../*
9960: 43 68 61 6e 6e 65 6c 20 66 6f 72 20 74 68 65 20 Channel for the
9970: 6e 65 77 6c 79 20 61 63 63 65 70 74 65 64 0a 09 newly accepted..
9980: 09 09 09 20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e ... * connection
9990: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 61 . */. char *a
99a0: 64 64 72 65 73 73 2c 09 09 2f 2a 20 41 64 64 72 ddress,../* Addr
99b0: 65 73 73 20 6f 66 20 63 6c 69 65 6e 74 20 74 68 ess of client th
99c0: 61 74 20 77 61 73 20 61 63 63 65 70 74 65 64 2e at was accepted.
99d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f 72 74 */. int port
99e0: 29 09 09 09 2f 2a 20 50 6f 72 74 20 6f 66 20 63 ).../* Port of c
99f0: 6c 69 65 6e 74 20 74 68 61 74 20 77 61 73 20 61 lient that was a
9a00: 63 63 65 70 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 ccepted. */.{.
9a10: 20 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b AcceptCallback
9a20: 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b *acceptCallback
9a30: 50 74 72 20 3d 20 28 41 63 63 65 70 74 43 61 6c Ptr = (AcceptCal
9a40: 6c 62 61 63 6b 20 2a 29 63 61 6c 6c 62 61 63 6b lback *)callback
9a50: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 Data;.. /*.
9a60: 20 20 20 2a 20 43 68 65 63 6b 20 69 66 20 74 68 * Check if th
9a70: 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 e callback is st
9a80: 69 6c 6c 20 76 61 6c 69 64 3b 20 74 68 65 20 69 ill valid; the i
9a90: 6e 74 65 72 70 72 65 74 65 72 20 6d 61 79 20 68 nterpreter may h
9aa0: 61 76 65 20 67 6f 6e 65 0a 20 20 20 20 20 2a 20 ave gone. *
9ab0: 61 77 61 79 2c 20 74 68 69 73 20 69 73 20 73 69 away, this is si
9ac0: 67 6e 61 6c 6c 65 64 20 62 79 20 73 65 74 74 69 gnalled by setti
9ad0: 6e 67 20 74 68 65 20 69 6e 74 65 72 70 20 66 69 ng the interp fi
9ae0: 65 6c 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62 eld of the callb
9af0: 61 63 6b 0a 20 20 20 20 20 2a 20 64 61 74 61 20 ack. * data
9b00: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 2a 2f to NULL.. */
9b10: 0a 0a 20 20 20 20 69 66 20 28 61 63 63 65 70 74 .. if (accept
9b20: 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74 CallbackPtr->int
9b30: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 erp != NULL) {..
9b40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
9b50: 72 70 20 3d 20 61 63 63 65 70 74 43 61 6c 6c 62 rp = acceptCallb
9b60: 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a ackPtr->interp;.
9b70: 09 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 .Tcl_Obj *script
9b80: 2c 20 2a 6f 62 6a 76 5b 32 5d 3b 0a 09 69 6e 74 , *objv[2];..int
9b90: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b result = TCL_OK
9ba0: 3b 0a 0a 09 6f 62 6a 76 5b 30 5d 20 3d 20 61 63 ;...objv[0] = ac
9bb0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d ceptCallbackPtr-
9bc0: 3e 73 63 72 69 70 74 3b 0a 09 6f 62 6a 76 5b 31 >script;..objv[1
9bd0: 5d 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f ] = Tcl_NewListO
9be0: 62 6a 28 33 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 bj(3, NULL);..Tc
9bf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
9c00: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a lement(NULL, obj
9c10: 76 5b 31 5d 2c 20 54 63 6c 5f 4e 65 77 53 74 72 v[1], Tcl_NewStr
9c20: 69 6e 67 4f 62 6a 28 0a 09 09 54 63 6c 5f 47 65 ingObj(...Tcl_Ge
9c30: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
9c40: 6e 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c n), -1));..Tcl_L
9c50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
9c60: 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31 ent(NULL, objv[1
9c70: 5d 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 ], Tcl_NewString
9c80: 4f 62 6a 28 61 64 64 72 65 73 73 2c 20 2d 31 29 Obj(address, -1)
9c90: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 );..Tcl_ListObjA
9ca0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c ppendElement(NUL
9cb0: 4c 2c 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c 5f L, objv[1], Tcl_
9cc0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 70 6f NewWideIntObj(po
9cd0: 72 74 29 29 3b 0a 0a 09 73 63 72 69 70 74 20 3d rt));...script =
9ce0: 20 54 63 6c 5f 43 6f 6e 63 61 74 4f 62 6a 28 32 Tcl_ConcatObj(2
9cf0: 2c 20 6f 62 6a 76 29 3b 0a 09 54 63 6c 5f 49 6e , objv);..Tcl_In
9d00: 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 crRefCount(scrip
9d10: 74 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 t);..Tcl_DecrRef
9d20: 43 6f 75 6e 74 28 6f 62 6a 76 5b 31 5d 29 3b 0a Count(objv[1]);.
9d30: 0a 09 54 63 6c 5f 50 72 65 73 65 72 76 65 28 69 ..Tcl_Preserve(i
9d40: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 52 65 67 nterp);..Tcl_Reg
9d50: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 isterChannel(int
9d60: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 0a 09 2f 2a erp, chan);.../*
9d70: 0a 09 20 2a 20 41 72 74 69 66 69 63 69 61 6c 6c .. * Artificiall
9d80: 79 20 62 75 6d 70 20 74 68 65 20 72 65 66 63 6f y bump the refco
9d90: 75 6e 74 20 74 6f 20 70 72 6f 74 65 63 74 20 74 unt to protect t
9da0: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 he channel from
9db0: 62 65 69 6e 67 0a 09 20 2a 20 64 65 6c 65 74 65 being.. * delete
9dc0: 64 20 77 68 69 6c 65 20 74 68 65 20 73 63 72 69 d while the scri
9dd0: 70 74 20 69 73 20 62 65 69 6e 67 20 65 76 61 6c pt is being eval
9de0: 75 61 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 uated... */...Tc
9df0: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 l_RegisterChanne
9e00: 6c 28 4e 55 4c 4c 2c 20 63 68 61 6e 29 3b 0a 0a l(NULL, chan);..
9e10: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 45 76 .result = Tcl_Ev
9e20: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 alObjEx(interp,
9e30: 73 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c script, TCL_EVAL
9e40: 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c _DIRECT|TCL_EVAL
9e50: 5f 47 4c 4f 42 41 4c 29 3b 0a 09 54 63 6c 5f 44 _GLOBAL);..Tcl_D
9e60: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 ecrRefCount(scri
9e70: 70 74 29 3b 0a 0a 09 69 66 20 28 72 65 73 75 6c pt);...if (resul
9e80: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 t != TCL_OK) {..
9e90: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 Tcl_Backgrou
9ea0: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 ndException(inte
9eb0: 72 70 2c 20 72 65 73 75 6c 74 29 3b 0a 09 20 20 rp, result);..
9ec0: 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 Tcl_Unregister
9ed0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
9ee0: 63 68 61 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 chan);..}.../*..
9ef0: 20 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 * Decrement the
9f00: 20 61 72 74 69 66 69 63 69 61 6c 6c 79 20 62 75 artificially bu
9f10: 6d 70 65 64 20 72 65 66 63 6f 75 6e 74 2e 20 41 mped refcount. A
9f20: 66 74 65 72 20 74 68 69 73 20 69 74 20 69 73 20 fter this it is
9f30: 6e 6f 74 0a 09 20 2a 20 73 61 66 65 20 61 6e 79 not.. * safe any
9f40: 6d 6f 72 65 20 74 6f 20 75 73 65 20 22 63 68 61 more to use "cha
9f50: 6e 22 2c 20 62 65 63 61 75 73 65 20 69 74 20 6d n", because it m
9f60: 61 79 20 6e 6f 77 20 62 65 20 64 65 6c 65 74 65 ay now be delete
9f70: 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 55 6e d... */...Tcl_Un
9f80: 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 registerChannel(
9f90: 4e 55 4c 4c 2c 20 63 68 61 6e 29 3b 0a 0a 09 54 NULL, chan);...T
9fa0: 63 6c 5f 52 65 6c 65 61 73 65 28 69 6e 74 65 72 cl_Release(inter
9fb0: 70 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b p);. } else {
9fc0: 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 69 6e 74 ../*.. * The int
9fd0: 65 72 70 72 65 74 65 72 20 68 61 73 20 62 65 65 erpreter has bee
9fe0: 6e 20 64 65 6c 65 74 65 64 2c 20 73 6f 20 74 68 n deleted, so th
9ff0: 65 72 65 20 69 73 20 6e 6f 20 75 73 65 66 75 6c ere is no useful
a000: 20 77 61 79 20 74 6f 20 75 73 65 0a 09 20 2a 20 way to use.. *
a010: 74 68 65 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65 the client socke
a020: 74 20 2d 20 6a 75 73 74 20 63 6c 6f 73 65 20 69 t - just close i
a030: 74 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 6c t... */...Tcl_Cl
a040: 6f 73 65 45 78 28 4e 55 4c 4c 2c 20 63 68 61 6e oseEx(NULL, chan
a050: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a , 0);. }.}...
a060: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
a070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
a0b0: 2a 20 54 63 70 53 65 72 76 65 72 43 6c 6f 73 65 * TcpServerClose
a0c0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Proc --. *. *.Th
a0d0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 63 is callback is c
a0e0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 54 alled when the T
a0f0: 43 50 20 73 65 72 76 65 72 20 63 68 61 6e 6e 65 CP server channe
a100: 6c 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 77 l for which it w
a110: 61 73 0a 20 2a 09 72 65 67 69 73 74 65 72 65 64 as. *.registered
a120: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 is being closed
a130: 2e 20 49 74 20 69 6e 66 6f 72 6d 73 20 74 68 65 . It informs the
a140: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 interpreter in
a150: 77 68 69 63 68 20 74 68 65 0a 20 2a 09 61 63 63 which the. *.acc
a160: 65 70 74 20 73 63 72 69 70 74 20 69 73 20 65 76 ept script is ev
a170: 61 6c 75 61 74 65 64 20 28 69 66 20 74 68 61 74 aluated (if that
a180: 20 69 6e 74 65 72 70 72 65 74 65 72 20 73 74 69 interpreter sti
a190: 6c 6c 20 65 78 69 73 74 73 29 20 74 68 61 74 0a ll exists) that.
a1a0: 20 2a 09 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 *.this channel
a1b0: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 73 20 no longer needs
a1c0: 74 6f 20 62 65 20 69 6e 66 6f 72 6d 65 64 20 69 to be informed i
a1d0: 66 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 f the interprete
a1e0: 72 20 69 73 0a 20 2a 09 64 65 6c 65 74 65 64 2e r is. *.deleted.
a1f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
a200: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 *.None.. *. * S
a210: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
a220: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 69 In the future, i
a230: 66 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 f the interprete
a240: 72 20 69 73 20 64 65 6c 65 74 65 64 20 74 68 69 r is deleted thi
a250: 73 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 6e s channel will n
a260: 6f 0a 20 2a 09 6c 6f 6e 67 65 72 20 62 65 20 69 o. *.longer be i
a270: 6e 66 6f 72 6d 65 64 2e 0a 20 2a 0a 20 2a 2d 2d nformed.. *. *--
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a2c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
a2d0: 20 76 6f 69 64 0a 54 63 70 53 65 72 76 65 72 43 void.TcpServerC
a2e0: 6c 6f 73 65 50 72 6f 63 28 0a 20 20 20 20 76 6f loseProc(. vo
a2f0: 69 64 20 2a 63 61 6c 6c 62 61 63 6b 44 61 74 61 id *callbackData
a300: 29 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 70 )../* The data p
a310: 61 73 73 65 64 20 69 6e 20 74 68 65 20 63 61 6c assed in the cal
a320: 6c 20 74 6f 0a 09 09 09 09 20 2a 20 54 63 6c 5f l to..... * Tcl_
a330: 43 72 65 61 74 65 43 6c 6f 73 65 48 61 6e 64 6c CreateCloseHandl
a340: 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 41 63 63 er. */.{. Acc
a350: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 eptCallback *acc
a360: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 20 3d eptCallbackPtr =
a370: 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b (AcceptCallback
a380: 20 2a 29 63 61 6c 6c 62 61 63 6b 44 61 74 61 3b *)callbackData;
a390: 0a 09 09 09 09 2f 2a 20 54 68 65 20 61 63 74 75 ...../* The actu
a3a0: 61 6c 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 al data. */..
a3b0: 20 69 66 20 28 61 63 63 65 70 74 43 61 6c 6c 62 if (acceptCallb
a3c0: 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 20 21 ackPtr->interp !
a3d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 55 6e 72 65 67 = NULL) {..Unreg
a3e0: 69 73 74 65 72 54 63 70 53 65 72 76 65 72 49 6e isterTcpServerIn
a3f0: 74 65 72 70 43 6c 65 61 6e 75 70 50 72 6f 63 28 terpCleanupProc(
a400: 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 acceptCallbackPt
a410: 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 09 61 63 63 r->interp,...acc
a420: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b eptCallbackPtr);
a430: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
a440: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 63 63 65 ecrRefCount(acce
a450: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 73 ptCallbackPtr->s
a460: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f cript);. Tcl_
a470: 46 72 65 65 28 61 63 63 65 70 74 43 61 6c 6c 62 Free(acceptCallb
a480: 61 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a ackPtr);.}.../*.
a490: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
a4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
a4e0: 63 6c 5f 53 6f 63 6b 65 74 4f 62 6a 43 6d 64 20 cl_SocketObjCmd
a4f0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
a500: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 nction is invoke
a510: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
a520: 20 22 73 6f 63 6b 65 74 22 20 54 63 6c 20 63 6f "socket" Tcl co
a530: 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 mmand. See the.
a540: 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 *.user documenta
a550: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 tion for details
a560: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 on what it does
a570: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
a580: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
a590: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
a5a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
a5b0: 2a 09 43 72 65 61 74 65 73 20 61 20 73 6f 63 6b *.Creates a sock
a5c0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c et based channel
a5d0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
a620: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 6f 63 6b 65 /..int.Tcl_Socke
a630: 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c tObjCmd(. TCL
a640: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c _UNUSED(void *),
a650: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
a660: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 *interp,../* Cur
a670: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 rent interpreter
a680: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a . */. Tcl_Siz
a690: 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 e objc,../* Numb
a6a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e er of arguments.
a6b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
a6c0: 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a *const *objv)./*
a6d0: 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 Argument object
a6e0: 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 73 74 61 74 s. */.{. stat
a6f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 ic const char *c
a700: 6f 6e 73 74 20 73 6f 63 6b 65 74 4f 70 74 69 6f onst socketOptio
a710: 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 61 73 79 6e ns[] = {.."-asyn
a720: 63 22 2c 20 22 2d 62 61 63 6b 6c 6f 67 22 2c 20 c", "-backlog",
a730: 22 2d 6d 79 61 64 64 72 22 2c 20 22 2d 6d 79 70 "-myaddr", "-myp
a740: 6f 72 74 22 2c 20 22 2d 72 65 75 73 65 61 64 64 ort", "-reuseadd
a750: 72 22 2c 0a 09 22 2d 72 65 75 73 65 70 6f 72 74 r",.."-reuseport
a760: 22 2c 20 22 2d 73 65 72 76 65 72 22 2c 20 4e 55 ", "-server", NU
a770: 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e LL. };. en
a780: 75 6d 20 73 6f 63 6b 65 74 4f 70 74 69 6f 6e 73 um socketOptions
a790: 45 6e 75 6d 20 7b 0a 09 53 4b 54 5f 41 53 59 4e Enum {..SKT_ASYN
a7a0: 43 2c 20 53 4b 54 5f 42 41 43 4b 4c 4f 47 2c 20 C, SKT_BACKLOG,
a7b0: 53 4b 54 5f 4d 59 41 44 44 52 2c 20 53 4b 54 5f SKT_MYADDR, SKT_
a7c0: 4d 59 50 4f 52 54 2c 20 53 4b 54 5f 52 45 55 53 MYPORT, SKT_REUS
a7d0: 45 41 44 44 52 2c 0a 09 53 4b 54 5f 52 45 55 53 EADDR,..SKT_REUS
a7e0: 45 50 4f 52 54 2c 20 53 4b 54 5f 53 45 52 56 45 EPORT, SKT_SERVE
a7f0: 52 0a 20 20 20 20 7d 20 6f 70 74 69 6f 6e 49 6e R. } optionIn
a800: 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 dex;. int ser
a810: 76 65 72 20 3d 20 30 2c 20 6d 79 70 6f 72 74 20 ver = 0, myport
a820: 3d 20 30 2c 20 61 73 79 6e 63 20 3d 20 30 2c 20 = 0, async = 0,
a830: 72 65 75 73 65 70 20 3d 20 2d 31 2c 20 72 65 75 reusep = -1, reu
a840: 73 65 61 20 3d 20 2d 31 2c 20 62 61 63 6b 6c 6f sea = -1, backlo
a850: 67 20 3d 20 2d 31 3b 0a 09 54 63 6c 5f 53 69 7a g = -1;..Tcl_Siz
a860: 65 20 61 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 e a;. unsigne
a870: 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b d int flags = 0;
a880: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
a890: 2a 68 6f 73 74 2c 20 2a 70 6f 72 74 2c 20 2a 6d *host, *port, *m
a8a0: 79 61 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 yaddr = NULL;.
a8b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 Tcl_Obj *scrip
a8c0: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 t = NULL;. Tc
a8d0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
a8e0: 0a 20 20 20 20 54 63 6c 49 6e 69 74 53 6f 63 6b . TclInitSock
a8f0: 65 74 73 28 29 3b 0a 0a 20 20 20 20 66 6f 72 20 ets();.. for
a900: 28 61 20 3d 20 31 3b 20 61 20 3c 20 6f 62 6a 63 (a = 1; a < objc
a910: 3b 20 61 2b 2b 29 20 7b 0a 09 63 6f 6e 73 74 20 ; a++) {..const
a920: 63 68 61 72 20 2a 61 72 67 20 3d 20 54 63 6c 47 char *arg = TclG
a930: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d etString(objv[a]
a940: 29 3b 0a 0a 09 69 66 20 28 61 72 67 5b 30 5d 20 );...if (arg[0]
a950: 21 3d 20 27 2d 27 29 20 7b 0a 09 20 20 20 20 62 != '-') {.. b
a960: 72 65 61 6b 3b 0a 09 7d 0a 09 69 66 20 28 54 63 reak;..}..if (Tc
a970: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
a980: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61 j(interp, objv[a
a990: 5d 2c 20 73 6f 63 6b 65 74 4f 70 74 69 6f 6e 73 ], socketOptions
a9a0: 2c 20 22 6f 70 74 69 6f 6e 22 2c 0a 09 09 54 43 , "option",...TC
a9b0: 4c 5f 45 58 41 43 54 2c 20 26 6f 70 74 69 6f 6e L_EXACT, &option
a9c0: 49 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b Index) != TCL_OK
a9d0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
a9e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73 TCL_ERROR;..}..s
a9f0: 77 69 74 63 68 20 28 6f 70 74 69 6f 6e 49 6e 64 witch (optionInd
aa00: 65 78 29 20 7b 0a 09 63 61 73 65 20 53 4b 54 5f ex) {..case SKT_
aa10: 41 53 59 4e 43 3a 0a 09 20 20 20 20 69 66 20 28 ASYNC:.. if (
aa20: 73 65 72 76 65 72 20 3d 3d 20 31 29 20 7b 0a 09 server == 1) {..
aa30: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
aa40: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
aa50: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 wStringObj(...."
aa60: 63 61 6e 6e 6f 74 20 73 65 74 20 2d 61 73 79 6e cannot set -asyn
aa70: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 73 65 72 c option for ser
aa80: 76 65 72 20 73 6f 63 6b 65 74 73 22 2c 20 2d 31 ver sockets", -1
aa90: 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ));...return TCL
aaa0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
aab0: 20 20 20 20 61 73 79 6e 63 20 3d 20 31 3b 0a 09 async = 1;..
aac0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
aad0: 20 53 4b 54 5f 4d 59 41 44 44 52 3a 0a 09 20 20 SKT_MYADDR:..
aae0: 20 20 61 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28 a++;.. if (
aaf0: 61 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 09 54 a >= objc) {...T
ab00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
ab10: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
ab20: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 6e 6f tringObj(...."no
ab30: 20 61 72 67 75 6d 65 6e 74 20 67 69 76 65 6e 20 argument given
ab40: 66 6f 72 20 2d 6d 79 61 64 64 72 20 6f 70 74 69 for -myaddr opti
ab50: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74 on", -1));...ret
ab60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
ab70: 20 20 20 20 7d 0a 09 20 20 20 20 6d 79 61 64 64 }.. myadd
ab80: 72 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 r = TclGetString
ab90: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 09 20 20 20 20 (objv[a]);..
aba0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 4b 54 break;..case SKT
abb0: 5f 4d 59 50 4f 52 54 3a 20 7b 0a 09 20 20 20 20 _MYPORT: {..
abc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 79 50 6f const char *myPo
abd0: 72 74 4e 61 6d 65 3b 0a 0a 09 20 20 20 20 61 2b rtName;... a+
abe0: 2b 3b 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d +;.. if (a >=
abf0: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 objc) {...Tcl_S
ac00: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
ac10: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
ac20: 67 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 gObj(...."no arg
ac30: 75 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 ument given for
ac40: 2d 6d 79 70 6f 72 74 20 6f 70 74 69 6f 6e 22 2c -myport option",
ac50: 20 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 -1));...return
ac60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
ac70: 7d 0a 09 20 20 20 20 6d 79 50 6f 72 74 4e 61 6d }.. myPortNam
ac80: 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 e = TclGetString
ac90: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 09 20 20 20 20 (objv[a]);..
aca0: 69 66 20 28 54 63 6c 53 6f 63 6b 47 65 74 50 6f if (TclSockGetPo
acb0: 72 74 28 69 6e 74 65 72 70 2c 20 6d 79 50 6f 72 rt(interp, myPor
acc0: 74 4e 61 6d 65 2c 20 22 74 63 70 22 2c 20 26 6d tName, "tcp", &m
acd0: 79 70 6f 72 74 29 20 21 3d 20 54 43 4c 5f 4f 4b yport) != TCL_OK
ace0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ) {...return TCL
acf0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
ad00: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 63 break;..}..c
ad10: 61 73 65 20 53 4b 54 5f 53 45 52 56 45 52 3a 0a ase SKT_SERVER:.
ad20: 09 20 20 20 20 69 66 20 28 61 73 79 6e 63 20 3d . if (async =
ad30: 3d 20 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 = 1) {...Tcl_Set
ad40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
ad50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
ad60: 62 6a 28 0a 09 09 09 22 63 61 6e 6e 6f 74 20 73 bj(...."cannot s
ad70: 65 74 20 2d 61 73 79 6e 63 20 6f 70 74 69 6f 6e et -async option
ad80: 20 66 6f 72 20 73 65 72 76 65 72 20 73 6f 63 6b for server sock
ad90: 65 74 73 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 ets", -1));...re
ada0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
adb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 72 76 . }.. serv
adc0: 65 72 20 3d 20 31 3b 0a 09 20 20 20 20 61 2b 2b er = 1;.. a++
add0: 3b 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d 20 ;.. if (a >=
ade0: 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65 objc) {...Tcl_Se
adf0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
ae00: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
ae10: 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 75 Obj(...."no argu
ae20: 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 2d ment given for -
ae30: 73 65 72 76 65 72 20 6f 70 74 69 6f 6e 22 2c 20 server option",
ae40: 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 -1));...return T
ae50: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
ae60: 0a 09 20 20 20 20 73 63 72 69 70 74 20 3d 20 6f .. script = o
ae70: 62 6a 76 5b 61 5d 3b 0a 09 20 20 20 20 62 72 65 bjv[a];.. bre
ae80: 61 6b 3b 0a 09 63 61 73 65 20 53 4b 54 5f 52 45 ak;..case SKT_RE
ae90: 55 53 45 41 44 44 52 3a 0a 09 20 20 20 20 61 2b USEADDR:.. a+
aea0: 2b 3b 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d +;.. if (a >=
aeb0: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 objc) {...Tcl_S
aec0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
aed0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
aee0: 67 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 gObj(...."no arg
aef0: 75 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 ument given for
af00: 2d 72 65 75 73 65 61 64 64 72 20 6f 70 74 69 6f -reuseaddr optio
af10: 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74 75 n", -1));...retu
af20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
af30: 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
af40: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d l_GetBooleanFrom
af50: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
af60: 5b 61 5d 2c 20 26 72 65 75 73 65 61 29 20 21 3d [a], &reusea) !=
af70: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
af80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
af90: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
afa0: 3b 0a 09 63 61 73 65 20 53 4b 54 5f 52 45 55 53 ;..case SKT_REUS
afb0: 45 50 4f 52 54 3a 0a 09 20 20 20 20 61 2b 2b 3b EPORT:.. a++;
afc0: 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d 20 6f .. if (a >= o
afd0: 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 bjc) {...Tcl_Set
afe0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
aff0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
b000: 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 75 6d bj(...."no argum
b010: 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 2d 72 ent given for -r
b020: 65 75 73 65 70 6f 72 74 20 6f 70 74 69 6f 6e 22 euseport option"
b030: 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e , -1));...return
b040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
b050: 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f }.. if (Tcl_
b060: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 GetBooleanFromOb
b070: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61 j(interp, objv[a
b080: 5d 2c 20 26 72 65 75 73 65 70 29 20 21 3d 20 54 ], &reusep) != T
b090: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 CL_OK) {...retur
b0a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
b0b0: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a }.. break;.
b0c0: 09 63 61 73 65 20 53 4b 54 5f 42 41 43 4b 4c 4f .case SKT_BACKLO
b0d0: 47 3a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 G:.. a++;..
b0e0: 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 if (a >= objc)
b0f0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
b100: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
b110: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a l_NewStringObj(.
b120: 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 ..."no argument
b130: 67 69 76 65 6e 20 66 6f 72 20 2d 62 61 63 6b 6c given for -backl
b140: 6f 67 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 og option", -1))
b150: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
b160: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
b170: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 if (Tcl_GetInt
b180: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
b190: 6f 62 6a 76 5b 61 5d 2c 20 26 62 61 63 6b 6c 6f objv[a], &backlo
b1a0: 67 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a g) != TCL_OK) {.
b1b0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b1c0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
b1d0: 62 72 65 61 6b 3b 0a 09 64 65 66 61 75 6c 74 3a break;..default:
b1e0: 0a 09 20 20 20 20 54 43 4c 5f 55 4e 52 45 41 43 .. TCL_UNREAC
b1f0: 48 41 42 4c 45 28 29 3b 0a 09 7d 0a 20 20 20 20 HABLE();..}.
b200: 7d 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 }. if (server
b210: 29 20 7b 0a 09 68 6f 73 74 20 3d 20 6d 79 61 64 ) {..host = myad
b220: 64 72 3b 09 09 2f 2a 20 4e 55 4c 4c 20 69 6d 70 dr;../* NULL imp
b230: 6c 69 65 73 20 49 4e 41 44 44 52 5f 41 4e 59 20 lies INADDR_ANY
b240: 2a 2f 0a 09 69 66 20 28 6d 79 70 6f 72 74 20 21 */..if (myport !
b250: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f = 0) {.. Tcl_
b260: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
b270: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 erp, Tcl_NewStri
b280: 6e 67 4f 62 6a 28 0a 09 09 20 20 20 20 22 6f 70 ngObj(... "op
b290: 74 69 6f 6e 20 2d 6d 79 70 6f 72 74 20 69 73 20 tion -myport is
b2a0: 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 73 65 not valid for se
b2b0: 72 76 65 72 73 22 2c 20 2d 31 29 29 3b 0a 09 20 rvers", -1));..
b2c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
b2d0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ROR;..}. } el
b2e0: 73 65 20 69 66 20 28 61 20 3c 20 6f 62 6a 63 29 se if (a < objc)
b2f0: 20 7b 0a 09 68 6f 73 74 20 3d 20 54 63 6c 47 65 {..host = TclGe
b300: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d 29 tString(objv[a])
b310: 3b 0a 09 61 2b 2b 3b 0a 20 20 20 20 7d 20 65 6c ;..a++;. } el
b320: 73 65 20 7b 0a 09 49 6e 74 65 72 70 20 2a 69 50 se {..Interp *iP
b330: 74 72 3b 0a 0a 20 20 20 20 77 72 6f 6e 67 4e 75 tr;.. wrongNu
b340: 6d 41 72 67 73 3a 0a 09 69 50 74 72 20 3d 20 28 mArgs:..iPtr = (
b350: 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 Interp *) interp
b360: 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ;..Tcl_WrongNumA
b370: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
b380: 62 6a 76 2c 0a 09 09 22 3f 2d 61 73 79 6e 63 3f bjv,..."?-async?
b390: 20 3f 2d 6d 79 61 64 64 72 20 61 64 64 72 3f 20 ?-myaddr addr?
b3a0: 3f 2d 6d 79 70 6f 72 74 20 6d 79 70 6f 72 74 3f ?-myport myport?
b3b0: 20 68 6f 73 74 20 70 6f 72 74 22 29 3b 0a 09 69 host port");..i
b3c0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 49 4e Ptr->flags |= IN
b3d0: 54 45 52 50 5f 41 4c 54 45 52 4e 41 54 45 5f 57 TERP_ALTERNATE_W
b3e0: 52 4f 4e 47 5f 41 52 47 53 3b 0a 09 54 63 6c 5f RONG_ARGS;..Tcl_
b3f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
b400: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 09 09 erp, 1, objv,...
b410: 22 2d 73 65 72 76 65 72 20 63 6f 6d 6d 61 6e 64 "-server command
b420: 20 3f 2d 62 61 63 6b 6c 6f 67 20 63 6f 75 6e 74 ?-backlog count
b430: 3f 20 3f 2d 6d 79 61 64 64 72 20 61 64 64 72 3f ? ?-myaddr addr?
b440: 20 22 0a 09 09 22 3f 2d 72 65 75 73 65 61 64 64 "..."?-reuseadd
b450: 72 20 62 6f 6f 6c 65 61 6e 3f 20 3f 2d 72 65 75 r boolean? ?-reu
b460: 73 65 70 6f 72 74 20 62 6f 6f 6c 65 61 6e 3f 20 seport boolean?
b470: 70 6f 72 74 22 29 3b 0a 09 72 65 74 75 72 6e 20 port");..return
b480: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
b490: 0a 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65 .. if (!serve
b4a0: 72 20 26 26 20 28 72 65 75 73 65 61 20 21 3d 20 r && (reusea !=
b4b0: 2d 31 20 7c 7c 20 72 65 75 73 65 70 20 21 3d 20 -1 || reusep !=
b4c0: 2d 31 20 7c 7c 20 62 61 63 6b 6c 6f 67 20 21 3d -1 || backlog !=
b4d0: 20 2d 31 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 -1)) {..Tcl_Set
b4e0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
b4f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
b500: 62 6a 28 0a 09 09 22 6f 70 74 69 6f 6e 73 20 2d bj(..."options -
b510: 62 61 63 6b 6c 6f 67 2c 20 2d 72 65 75 73 65 61 backlog, -reusea
b520: 64 64 72 2c 20 61 6e 64 20 2d 72 65 75 73 65 70 ddr, and -reusep
b530: 6f 72 74 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c ort are only val
b540: 69 64 20 22 0a 09 09 22 66 6f 72 20 73 65 72 76 id "..."for serv
b550: 65 72 73 22 2c 20 2d 31 29 29 3b 0a 09 72 65 74 ers", -1));..ret
b560: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b570: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
b580: 20 20 2a 20 53 65 74 20 74 68 65 20 6f 70 74 69 * Set the opti
b590: 6f 6e 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 ons to their def
b5a0: 61 75 6c 74 20 76 61 6c 75 65 20 69 66 20 74 68 ault value if th
b5b0: 65 20 75 73 65 72 20 64 69 64 6e 27 74 20 6f 76 e user didn't ov
b5c0: 65 72 72 69 64 65 0a 20 20 20 20 20 2a 20 74 68 erride. * th
b5d0: 65 69 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 eir value..
b5e0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 75 73 */.. if (reus
b5f0: 65 70 20 3d 3d 20 2d 31 29 20 7b 0a 09 72 65 75 ep == -1) {..reu
b600: 73 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 sep = 0;. }.
b610: 20 20 20 69 66 20 28 72 65 75 73 65 61 20 3d 3d if (reusea ==
b620: 20 2d 31 29 20 7b 0a 09 72 65 75 73 65 61 20 3d -1) {..reusea =
b630: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 1;. }.. /
b640: 2a 0a 20 20 20 20 20 2a 20 42 75 69 6c 64 20 74 *. * Build t
b650: 68 65 20 62 69 74 73 65 74 20 77 69 74 68 20 74 he bitset with t
b660: 68 65 20 66 6c 61 67 73 20 76 61 6c 75 65 73 2e he flags values.
b670: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
b680: 20 28 72 65 75 73 65 61 29 20 7b 0a 09 66 6c 61 (reusea) {..fla
b690: 67 73 20 7c 3d 20 54 43 4c 5f 54 43 50 53 45 52 gs |= TCL_TCPSER
b6a0: 56 45 52 5f 52 45 55 53 45 41 44 44 52 3b 0a 20 VER_REUSEADDR;.
b6b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 75 }. if (reu
b6c0: 73 65 70 29 20 7b 0a 09 66 6c 61 67 73 20 7c 3d sep) {..flags |=
b6d0: 20 54 43 4c 5f 54 43 50 53 45 52 56 45 52 5f 52 TCL_TCPSERVER_R
b6e0: 45 55 53 45 50 4f 52 54 3b 0a 20 20 20 20 7d 0a EUSEPORT;. }.
b6f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 . /*. * A
b700: 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 ll the arguments
b710: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 should have bee
b720: 6e 20 70 61 72 73 65 64 20 62 79 20 6e 6f 77 2c n parsed by now,
b730: 20 27 61 27 20 70 6f 69 6e 74 73 20 74 6f 20 74 'a' points to t
b740: 68 65 0a 20 20 20 20 20 2a 20 6c 61 73 74 20 6f he. * last o
b750: 6e 65 2c 20 74 68 65 20 70 6f 72 74 20 6e 75 6d ne, the port num
b760: 62 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ber.. */..
b770: 20 20 69 66 20 28 61 20 21 3d 20 6f 62 6a 63 2d if (a != objc-
b780: 31 29 20 7b 0a 09 67 6f 74 6f 20 77 72 6f 6e 67 1) {..goto wrong
b790: 4e 75 6d 41 72 67 73 3b 0a 20 20 20 20 7d 0a 0a NumArgs;. }..
b7a0: 20 20 20 20 70 6f 72 74 20 3d 20 54 63 6c 47 65 port = TclGe
b7b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d 29 tString(objv[a])
b7c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 ;.. if (serve
b7d0: 72 29 20 7b 0a 09 41 63 63 65 70 74 43 61 6c 6c r) {..AcceptCall
b7e0: 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c back *acceptCall
b7f0: 62 61 63 6b 50 74 72 20 3d 20 28 41 63 63 65 70 backPtr = (Accep
b800: 74 43 61 6c 6c 62 61 63 6b 20 2a 29 54 63 6c 5f tCallback *)Tcl_
b810: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 41 63 63 Alloc(sizeof(Acc
b820: 65 70 74 43 61 6c 6c 62 61 63 6b 29 29 3b 0a 0a eptCallback));..
b830: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e .Tcl_IncrRefCoun
b840: 74 28 73 63 72 69 70 74 29 3b 0a 09 61 63 63 65 t(script);..acce
b850: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 73 ptCallbackPtr->s
b860: 63 72 69 70 74 20 3d 20 73 63 72 69 70 74 3b 0a cript = script;.
b870: 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 .acceptCallbackP
b880: 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 tr->interp = int
b890: 65 72 70 3b 0a 0a 09 63 68 61 6e 20 3d 20 54 63 erp;...chan = Tc
b8a0: 6c 5f 4f 70 65 6e 54 63 70 53 65 72 76 65 72 45 l_OpenTcpServerE
b8b0: 78 28 69 6e 74 65 72 70 2c 20 70 6f 72 74 2c 20 x(interp, port,
b8c0: 68 6f 73 74 2c 20 66 6c 61 67 73 2c 20 62 61 63 host, flags, bac
b8d0: 6b 6c 6f 67 2c 0a 09 09 41 63 63 65 70 74 43 61 klog,...AcceptCa
b8e0: 6c 6c 62 61 63 6b 50 72 6f 63 2c 20 61 63 63 65 llbackProc, acce
b8f0: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a ptCallbackPtr);.
b900: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c .if (chan == NUL
b910: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 L) {.. Tcl_De
b920: 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 crRefCount(scrip
b930: 74 29 3b 0a 09 20 20 20 20 54 63 6c 5f 46 72 65 t);.. Tcl_Fre
b940: 65 28 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b e(acceptCallback
b950: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 Ptr);.. retur
b960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
b970: 0a 09 2f 2a 0a 09 20 2a 20 52 65 67 69 73 74 65 ../*.. * Registe
b980: 72 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 72 r with the inter
b990: 70 72 65 74 65 72 20 74 6f 20 6c 65 74 20 75 73 preter to let us
b9a0: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 68 65 20 69 know when the i
b9b0: 6e 74 65 72 70 72 65 74 65 72 0a 09 20 2a 20 69 nterpreter.. * i
b9c0: 73 20 64 65 6c 65 74 65 64 20 28 62 79 20 68 61 s deleted (by ha
b9d0: 76 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 ving the callbac
b9e0: 6b 20 73 65 74 20 74 68 65 20 69 6e 74 65 72 70 k set the interp
b9f0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 09 20 field of the..
ba00: 2a 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b * acceptCallback
ba10: 50 74 72 27 73 20 73 74 72 75 63 74 75 72 65 20 Ptr's structure
ba20: 74 6f 20 4e 55 4c 4c 29 2e 20 54 68 69 73 20 69 to NULL). This i
ba30: 73 20 74 6f 20 61 76 6f 69 64 20 74 72 79 69 6e s to avoid tryin
ba40: 67 20 74 6f 0a 09 20 2a 20 65 76 61 6c 20 74 68 g to.. * eval th
ba50: 65 20 73 63 72 69 70 74 20 69 6e 20 61 20 64 65 e script in a de
ba60: 6c 65 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 leted interprete
ba70: 72 2e 0a 09 20 2a 2f 0a 0a 09 52 65 67 69 73 74 r... */...Regist
ba80: 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 erTcpServerInter
ba90: 70 43 6c 65 61 6e 75 70 28 69 6e 74 65 72 70 2c pCleanup(interp,
baa0: 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 acceptCallbackP
bab0: 74 72 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65 tr);.../*.. * Re
bac0: 67 69 73 74 65 72 20 61 20 63 6c 6f 73 65 20 63 gister a close c
bad0: 61 6c 6c 62 61 63 6b 2e 20 54 68 69 73 20 63 61 allback. This ca
bae0: 6c 6c 62 61 63 6b 20 77 69 6c 6c 20 69 6e 66 6f llback will info
baf0: 72 6d 20 74 68 65 0a 09 20 2a 20 69 6e 74 65 72 rm the.. * inter
bb00: 70 72 65 74 65 72 20 28 69 66 20 69 74 20 73 74 preter (if it st
bb10: 69 6c 6c 20 65 78 69 73 74 73 29 20 74 68 61 74 ill exists) that
bb20: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 64 6f this channel do
bb30: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 09 es not need to..
bb40: 20 2a 20 62 65 20 69 6e 66 6f 72 6d 65 64 20 77 * be informed w
bb50: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 hen the interpre
bb60: 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2e 0a ter is deleted..
bb70: 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 72 65 61 74 . */...Tcl_Creat
bb80: 65 43 6c 6f 73 65 48 61 6e 64 6c 65 72 28 63 68 eCloseHandler(ch
bb90: 61 6e 2c 20 54 63 70 53 65 72 76 65 72 43 6c 6f an, TcpServerClo
bba0: 73 65 50 72 6f 63 2c 20 61 63 63 65 70 74 43 61 seProc, acceptCa
bbb0: 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 20 20 20 20 llbackPtr);.
bbc0: 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 70 6f } else {..int po
bbd0: 72 74 4e 75 6d 3b 0a 0a 09 69 66 20 28 54 63 6c rtNum;...if (Tcl
bbe0: 53 6f 63 6b 47 65 74 50 6f 72 74 28 69 6e 74 65 SockGetPort(inte
bbf0: 72 70 2c 20 70 6f 72 74 2c 20 22 74 63 70 22 2c rp, port, "tcp",
bc00: 20 26 70 6f 72 74 4e 75 6d 29 20 21 3d 20 54 43 &portNum) != TC
bc10: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 L_OK) {.. ret
bc20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
bc30: 7d 0a 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 4f }...chan = Tcl_O
bc40: 70 65 6e 54 63 70 43 6c 69 65 6e 74 28 69 6e 74 penTcpClient(int
bc50: 65 72 70 2c 20 70 6f 72 74 4e 75 6d 2c 20 68 6f erp, portNum, ho
bc60: 73 74 2c 20 6d 79 61 64 64 72 2c 20 6d 79 70 6f st, myaddr, mypo
bc70: 72 74 2c 20 61 73 79 6e 63 29 3b 0a 09 69 66 20 rt, async);..if
bc80: 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b (chan == NULL) {
bc90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
bca0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
bcb0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 67 69 73 74 .. Tcl_Regist
bcc0: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 erChannel(interp
bcd0: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 54 63 6c , chan);. Tcl
bce0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
bcf0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
bd00: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 ingObj(Tcl_GetCh
bd10: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c annelName(chan),
bd20: 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 -1));. retur
bd30: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
bd40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
bd90: 54 63 6c 5f 46 63 6f 70 79 4f 62 6a 43 6d 64 20 Tcl_FcopyObjCmd
bda0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
bdb0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 nction is invoke
bdc0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
bdd0: 20 22 66 63 6f 70 79 22 20 54 63 6c 20 63 6f 6d "fcopy" Tcl com
bde0: 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 2a mand. See the. *
bdf0: 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 .user documentat
be00: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
be10: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
be20: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
be30: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
be40: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
be50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
be60: 09 4d 6f 76 65 73 20 64 61 74 61 20 62 65 74 77 .Moves data betw
be70: 65 65 6e 20 74 77 6f 20 63 68 61 6e 6e 65 6c 73 een two channels
be80: 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 73 65 and possibly se
be90: 74 73 20 75 70 20 61 20 62 61 63 6b 67 72 6f 75 ts up a backgrou
bea0: 6e 64 20 63 6f 70 79 0a 20 2a 09 68 61 6e 64 6c nd copy. *.handl
beb0: 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d er.. *. *-------
bec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
bf00: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 46 63 6f */..int.Tcl_Fco
bf10: 70 79 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 pyObjCmd(. TC
bf20: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 L_UNUSED(void *)
bf30: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ,. Tcl_Interp
bf40: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 *interp,../* Cu
bf50: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 rrent interprete
bf60: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 r. */. Tcl_Si
bf70: 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d ze objc,../* Num
bf80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
bf90: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
bfa0: 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f *const *objv)./
bfb0: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 * Argument objec
bfc0: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c ts. */.{. Tcl
bfd0: 5f 43 68 61 6e 6e 65 6c 20 69 6e 43 68 61 6e 2c _Channel inChan,
bfe0: 20 6f 75 74 43 68 61 6e 3b 0a 20 20 20 20 69 6e outChan;. in
bff0: 74 20 6d 6f 64 65 2c 20 69 6e 64 65 78 3b 0a 20 t mode, index;.
c000: 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 3b 0a 20 Tcl_Size i;.
c010: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 74 Tcl_WideInt t
c020: 6f 52 65 61 64 3b 0a 20 20 20 20 54 63 6c 5f 4f oRead;. Tcl_O
c030: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 bj *cmdPtr;.
c040: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
c050: 72 20 2a 63 6f 6e 73 74 20 73 77 69 74 63 68 65 r *const switche
c060: 73 5b 5d 20 3d 20 7b 20 22 2d 73 69 7a 65 22 2c s[] = { "-size",
c070: 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 4e 55 4c "-command", NUL
c080: 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 7b 20 L };. enum {
c090: 46 63 6f 70 79 53 69 7a 65 2c 20 46 63 6f 70 79 FcopySize, Fcopy
c0a0: 43 6f 6d 6d 61 6e 64 20 7d 3b 0a 0a 20 20 20 20 Command };..
c0b0: 69 66 20 28 28 6f 62 6a 63 20 3c 20 33 29 20 7c if ((objc < 3) |
c0c0: 7c 20 28 6f 62 6a 63 20 3e 20 37 29 20 7c 7c 20 | (objc > 7) ||
c0d0: 28 6f 62 6a 63 20 3d 3d 20 34 29 20 7c 7c 20 28 (objc == 4) || (
c0e0: 6f 62 6a 63 20 3d 3d 20 36 29 29 20 7b 0a 09 54 objc == 6)) {..T
c0f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
c100: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
c110: 0a 09 09 22 69 6e 70 75 74 20 6f 75 74 70 75 74 ..."input output
c120: 20 3f 2d 73 69 7a 65 20 73 69 7a 65 3f 20 3f 2d ?-size size? ?-
c130: 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 62 61 63 6b command callback
c140: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
c150: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
c160: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 61 72 /*. * Par
c170: 73 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 se the channel a
c180: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 76 65 72 rguments and ver
c190: 69 66 79 20 74 68 61 74 20 74 68 65 79 20 61 72 ify that they ar
c1a0: 65 20 72 65 61 64 61 62 6c 65 20 6f 72 0a 20 20 e readable or.
c1b0: 20 20 20 2a 20 77 72 69 74 61 62 6c 65 2c 20 61 * writable, a
c1c0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 s appropriate..
c1d0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
c1e0: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f TclGetChannelFro
c1f0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
c200: 76 5b 31 5d 2c 20 26 69 6e 43 68 61 6e 2c 20 26 v[1], &inChan, &
c210: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f mode, 0) != TCL_
c220: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
c230: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
c240: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 if (!(mode &
c250: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b TCL_READABLE)) {
c260: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
c270: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
c280: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 bjPrintf(..."cha
c290: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e nnel \"%s\" wasn
c2a0: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 't opened for re
c2b0: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 ading",...TclGet
c2c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 String(objv[1]))
c2d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
c2e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
c2f0: 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 if (TclGetChanne
c300: 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c lFromObj(interp,
c310: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 75 74 43 68 objv[2], &outCh
c320: 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d an, &mode, 0) !=
c330: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
c340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
c350: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f }. if (!(mo
c360: 64 65 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c de & TCL_WRITABL
c370: 45 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 E)) {..Tcl_SetOb
c380: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
c390: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 Tcl_ObjPrintf(..
c3a0: 09 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 ."channel \"%s\"
c3b0: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 wasn't opened f
c3c0: 6f 72 20 77 72 69 74 69 6e 67 22 2c 0a 09 09 54 or writing",...T
c3d0: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
c3e0: 5b 32 5d 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 [2])));..return
c3f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
c400: 0a 0a 20 20 20 20 74 6f 52 65 61 64 20 3d 20 2d .. toRead = -
c410: 31 3b 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 1;. cmdPtr =
c420: 4e 55 4c 4c 3b 0a 20 20 20 20 66 6f 72 20 28 69 NULL;. for (i
c430: 20 3d 20 33 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 = 3; i < objc;
c440: 69 20 2b 3d 20 32 29 20 7b 0a 09 69 66 20 28 54 i += 2) {..if (T
c450: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f cl_GetIndexFromO
c460: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
c470: 69 5d 2c 20 73 77 69 74 63 68 65 73 2c 20 22 6f i], switches, "o
c480: 70 74 69 6f 6e 22 2c 20 30 2c 0a 09 09 26 69 6e ption", 0,...&in
c490: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 dex) != TCL_OK)
c4a0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
c4b0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73 77 69 L_ERROR;..}..swi
c4c0: 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 09 63 tch (index) {..c
c4d0: 61 73 65 20 46 63 6f 70 79 53 69 7a 65 3a 0a 09 ase FcopySize:..
c4e0: 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 57 69 if (TclGetWi
c4f0: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 deIntFromObj(int
c500: 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 erp, objv[i+1],
c510: 26 74 6f 52 65 61 64 29 20 21 3d 20 54 43 4c 5f &toRead) != TCL_
c520: 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 OK) {...return T
c530: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
c540: 0a 09 20 20 20 20 69 66 20 28 74 6f 52 65 61 64 .. if (toRead
c550: 20 3c 20 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 < 0) {.../*...
c560: 2a 20 48 61 6e 64 6c 65 20 61 6c 6c 20 6e 65 67 * Handle all neg
c570: 61 74 69 76 65 20 73 69 7a 65 73 20 6c 69 6b 65 ative sizes like
c580: 20 2d 31 2c 20 6d 65 61 6e 69 6e 67 20 27 63 6f -1, meaning 'co
c590: 70 79 20 61 6c 6c 27 2e 20 42 79 0a 09 09 20 2a py all'. By... *
c5a0: 20 72 65 73 65 74 74 69 6e 67 20 74 6f 52 65 61 resetting toRea
c5b0: 64 20 77 65 20 61 76 6f 69 64 20 63 68 61 6e 67 d we avoid chang
c5c0: 65 73 20 69 6e 20 74 68 65 20 63 6f 72 65 20 63 es in the core c
c5d0: 6f 70 79 69 6e 67 0a 09 09 20 2a 20 66 75 6e 63 opying... * func
c5e0: 74 69 6f 6e 73 20 28 77 68 69 63 68 20 65 78 70 tions (which exp
c5f0: 6c 69 63 69 74 6c 79 20 63 68 65 63 6b 20 66 6f licitly check fo
c600: 72 20 2d 31 20 61 6e 64 20 63 72 61 73 68 20 6f r -1 and crash o
c610: 6e 20 61 6e 79 0a 09 09 20 2a 20 6f 74 68 65 72 n any... * other
c620: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 29 negative value)
c630: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 74 6f 52 65 61 .... */....toRea
c640: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 d = -1;.. }..
c650: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
c660: 20 46 63 6f 70 79 43 6f 6d 6d 61 6e 64 3a 0a 09 FcopyCommand:..
c670: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 6f 62 6a cmdPtr = obj
c680: 76 5b 69 2b 31 5d 3b 0a 09 20 20 20 20 62 72 65 v[i+1];.. bre
c690: 61 6b 3b 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 ak;..default:..
c6a0: 20 20 20 54 43 4c 5f 55 4e 52 45 41 43 48 41 42 TCL_UNREACHAB
c6b0: 4c 45 28 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a LE();..}. }..
c6c0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 43 6f return TclCo
c6d0: 70 79 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 pyChannel(interp
c6e0: 2c 20 69 6e 43 68 61 6e 2c 20 6f 75 74 43 68 61 , inChan, outCha
c6f0: 6e 2c 20 74 6f 52 65 61 64 2c 20 63 6d 64 50 74 n, toRead, cmdPt
c700: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d r);.}.../*. *---
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
c760: 68 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 hanPendingObjCmd
c770: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
c780: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b unction is invok
c790: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
c7a0: 65 20 54 63 6c 20 22 63 68 61 6e 20 70 65 6e 64 e Tcl "chan pend
c7b0: 69 6e 67 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 ing" command. *.
c7c0: 28 54 49 50 20 23 32 38 37 29 2e 20 53 65 65 20 (TIP #287). See
c7d0: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
c7e0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 tation for detai
c7f0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f ls on what it do
c800: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 es.. *. * Result
c810: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
c820: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
c830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
c840: 0a 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 . *.Sets interp'
c850: 73 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 s result to the
c860: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
c870: 6f 66 20 62 75 66 66 65 72 65 64 20 69 6e 70 75 of buffered inpu
c880: 74 20 6f 72 0a 20 2a 09 6f 75 74 70 75 74 20 28 t or. *.output (
c890: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 depending on whe
c8a0: 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 61 ther the first a
c8b0: 72 67 75 6d 65 6e 74 20 69 73 20 22 69 6e 70 75 rgument is "inpu
c8c0: 74 22 20 6f 72 0a 20 2a 09 22 6f 75 74 70 75 74 t" or. *."output
c8d0: 22 29 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 "), or -1 if the
c8e0: 20 63 68 61 6e 6e 65 6c 20 77 61 73 6e 27 74 20 channel wasn't
c8f0: 6f 70 65 6e 65 64 20 66 6f 72 20 74 68 61 74 20 opened for that
c900: 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mode.. *. *-----
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c950: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
c960: 69 63 20 69 6e 74 0a 43 68 61 6e 50 65 6e 64 69 ic int.ChanPendi
c970: 6e 67 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 ngObjCmd(. TC
c980: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 L_UNUSED(void *)
c990: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ,. Tcl_Interp
c9a0: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 *interp,../* Cu
c9b0: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 rrent interprete
c9c0: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 r. */. Tcl_Si
c9d0: 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d ze objc,../* Num
c9e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
c9f0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
ca00: 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f *const *objv)./
ca10: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 * Argument objec
ca20: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c ts. */.{. Tcl
ca30: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
ca40: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
ca50: 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f 70 74 69 char *const opti
ca60: 6f 6e 73 5b 5d 20 3d 20 7b 22 69 6e 70 75 74 22 ons[] = {"input"
ca70: 2c 20 22 6f 75 74 70 75 74 22 2c 20 4e 55 4c 4c , "output", NULL
ca80: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 65 6e 64 };. enum pend
ca90: 69 6e 67 4f 70 74 69 6f 6e 73 45 6e 75 6d 20 7b ingOptionsEnum {
caa0: 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 2c 20 50 PENDING_INPUT, P
cab0: 45 4e 44 49 4e 47 5f 4f 55 54 50 55 54 7d 20 69 ENDING_OUTPUT} i
cac0: 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 6d 6f ndex;. int mo
cad0: 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a de;.. if (obj
cae0: 63 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c 5f 57 c != 3) {..Tcl_W
caf0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
cb00: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6d 6f rp, 1, objv, "mo
cb10: 64 65 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 de channel");..r
cb20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
cb30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
cb40: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
cb50: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
cb60: 5b 31 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 22 6d [1], options, "m
cb70: 6f 64 65 22 2c 20 30 2c 0a 09 20 20 20 20 26 69 ode", 0,.. &i
cb80: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ndex) != TCL_OK)
cb90: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
cba0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
cbb0: 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e if (TclGetChann
cbc0: 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 elFromObj(interp
cbd0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 68 61 6e , objv[2], &chan
cbe0: 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 , &mode, 0) != T
cbf0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
cc00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
cc10: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 69 }.. switch (i
cc20: 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65 ndex) {. case
cc30: 20 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 3a 0a PENDING_INPUT:.
cc40: 09 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 .if (!(mode & TC
cc50: 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b 0a 09 L_READABLE)) {..
cc60: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
cc70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
cc80: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 2d _NewWideIntObj(-
cc90: 31 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 1));..} else {..
cca0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
ccb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
ccc0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 54 _NewWideIntObj(T
ccd0: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 cl_InputBuffered
cce0: 28 63 68 61 6e 29 29 29 3b 0a 09 7d 0a 09 62 72 (chan)));..}..br
ccf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 45 eak;. case PE
cd00: 4e 44 49 4e 47 5f 4f 55 54 50 55 54 3a 0a 09 69 NDING_OUTPUT:..i
cd10: 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f f (!(mode & TCL_
cd20: 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09 20 20 WRITABLE)) {..
cd30: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
cd40: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
cd50: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 2d 31 29 ewWideIntObj(-1)
cd60: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
cd70: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
cd80: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
cd90: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 54 63 6c ewWideIntObj(Tcl
cda0: 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28 _OutputBuffered(
cdb0: 63 68 61 6e 29 29 29 3b 0a 09 7d 0a 09 62 72 65 chan)));..}..bre
cdc0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
cdd0: 0a 09 54 43 4c 5f 55 4e 52 45 41 43 48 41 42 4c ..TCL_UNREACHABL
cde0: 45 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 E();. }. r
cdf0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
ce00: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
ce50: 0a 20 2a 20 43 68 61 6e 54 72 75 6e 63 61 74 65 . * ChanTruncate
ce60: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
ce70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
ce80: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
ce90: 65 73 73 20 74 68 65 20 22 63 68 61 6e 20 74 72 ess the "chan tr
cea0: 75 6e 63 61 74 65 22 20 54 63 6c 20 63 6f 6d 6d uncate" Tcl comm
ceb0: 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 20 and.. *.See the
cec0: 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 user documentati
ced0: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f on for details o
cee0: 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a n what it does..
cef0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
cf00: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c *.A standard Tcl
cf10: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 result.. *. * S
cf20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
cf30: 54 72 75 6e 63 61 74 65 73 20 61 20 63 68 61 6e Truncates a chan
cf40: 6e 65 6c 20 28 6f 72 20 72 61 74 68 65 72 20 61 nel (or rather a
cf50: 20 66 69 6c 65 20 75 6e 64 65 72 6c 79 69 6e 67 file underlying
cf60: 20 61 20 63 68 61 6e 6e 65 6c 29 2e 0a 20 2a 0a a channel).. *.
cf70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
cfc0: 61 74 69 63 20 69 6e 74 0a 43 68 61 6e 54 72 75 atic int.ChanTru
cfd0: 6e 63 61 74 65 4f 62 6a 43 6d 64 28 0a 20 20 20 ncateObjCmd(.
cfe0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
cff0: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
d000: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
d010: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 Current interpr
d020: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c eter. */. Tcl
d030: 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 _Size objc,../*
d040: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 Number of argume
d050: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nts. */. Tcl_
d060: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
d070: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 )./* Argument ob
d080: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 jects. */.{.
d090: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
d0a0: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e ;. Tcl_WideIn
d0b0: 74 20 6c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 69 t length;.. i
d0c0: 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c f ((objc < 2) ||
d0d0: 20 28 6f 62 6a 63 20 3e 20 33 29 29 20 7b 0a 09 (objc > 3)) {..
d0e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
d0f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
d100: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6c 65 6e 67 , "channel ?leng
d110: 74 68 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 th?");..return T
d120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
d130: 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 if (TclGetCh
d140: 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 annelFromObj(int
d150: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 erp, objv[1], &c
d160: 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d han, NULL, 0) !=
d170: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
d180: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d190: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a }.. if (obj
d1a0: 63 20 3d 3d 20 33 29 20 7b 0a 09 2f 2a 0a 09 20 c == 3) {../*..
d1b0: 2a 20 55 73 65 72 20 69 73 20 73 75 70 70 6c 79 * User is supply
d1c0: 69 6e 67 20 61 6e 20 65 78 70 6c 69 63 69 74 20 ing an explicit
d1d0: 6c 65 6e 67 74 68 2e 0a 09 20 2a 2f 0a 0a 09 69 length... */...i
d1e0: 66 20 28 54 63 6c 47 65 74 57 69 64 65 49 6e 74 f (TclGetWideInt
d1f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
d200: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 67 74 68 objv[2], &length
d210: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
d220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
d230: 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 6c 65 RROR;..}..if (le
d240: 6e 67 74 68 20 3c 20 30 29 20 7b 0a 09 20 20 20 ngth < 0) {..
d250: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
d260: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
d270: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 20 20 wStringObj(...
d280: 20 20 22 63 61 6e 6e 6f 74 20 74 72 75 6e 63 61 "cannot trunca
d290: 74 65 20 74 6f 20 6e 65 67 61 74 69 76 65 20 6c te to negative l
d2a0: 65 6e 67 74 68 20 6f 66 20 66 69 6c 65 22 2c 20 ength of file",
d2b0: 2d 31 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 -1));.. retur
d2c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
d2d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a } else {../*
d2e0: 0a 09 20 2a 20 55 73 65 72 20 77 61 6e 74 73 20 .. * User wants
d2f0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 6f 20 74 to truncate to t
d300: 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 he current file
d310: 70 6f 73 69 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a position... */..
d320: 09 6c 65 6e 67 74 68 20 3d 20 54 63 6c 5f 54 65 .length = Tcl_Te
d330: 6c 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 6c ll(chan);..if (l
d340: 65 6e 67 74 68 20 3d 3d 20 2d 31 29 20 7b 0a 09 ength == -1) {..
d350: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
d360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
d370: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 _ObjPrintf(...
d380: 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 64 65 74 "could not det
d390: 65 72 6d 69 6e 65 20 63 75 72 72 65 6e 74 20 6c ermine current l
d3a0: 6f 63 61 74 69 6f 6e 20 69 6e 20 5c 22 25 73 5c ocation in \"%s\
d3b0: 22 3a 20 25 73 22 2c 0a 09 09 20 20 20 20 54 63 ": %s",... Tc
d3c0: 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b lGetString(objv[
d3d0: 31 5d 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 1]), Tcl_PosixEr
d3e0: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 ror(interp)));..
d3f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
d400: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
d410: 20 20 20 20 69 66 20 28 54 63 6c 5f 54 72 75 6e if (Tcl_Trun
d420: 63 61 74 65 43 68 61 6e 6e 65 6c 28 63 68 61 6e cateChannel(chan
d430: 2c 20 6c 65 6e 67 74 68 29 20 21 3d 20 54 43 4c , length) != TCL
d440: 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f _OK) {..Tcl_SetO
d450: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
d460: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a Tcl_ObjPrintf(.
d470: 09 09 22 65 72 72 6f 72 20 64 75 72 69 6e 67 20 .."error during
d480: 74 72 75 6e 63 61 74 65 20 6f 6e 20 5c 22 25 73 truncate on \"%s
d490: 5c 22 3a 20 25 73 22 2c 0a 09 09 54 63 6c 47 65 \": %s",...TclGe
d4a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 tString(objv[1])
d4b0: 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 , Tcl_PosixError
d4c0: 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 72 65 74 (interp)));..ret
d4d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
d4e0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e }.. return
d4f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
d500: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 --------. *. * C
d550: 68 61 6e 50 69 70 65 4f 62 6a 43 6d 64 20 2d 2d hanPipeObjCmd --
d560: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
d570: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
d580: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
d590: 63 68 61 6e 20 70 69 70 65 22 20 54 63 6c 20 63 chan pipe" Tcl c
d5a0: 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 ommand.. *.See t
d5b0: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 he user document
d5c0: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
d5d0: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
d5e0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
d5f0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
d600: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
d610: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
d620: 20 2a 09 43 72 65 61 74 65 73 20 61 20 70 61 69 *.Creates a pai
d630: 72 20 6f 66 20 54 63 6c 20 63 68 61 6e 6e 65 6c r of Tcl channel
d640: 73 20 77 72 61 70 70 69 6e 67 20 62 6f 74 68 20 s wrapping both
d650: 65 6e 64 73 20 6f 66 20 61 20 6e 65 77 0a 20 2a ends of a new. *
d660: 09 61 6e 6f 6e 79 6d 6f 75 73 20 70 69 70 65 2e .anonymous pipe.
d670: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
d680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
d6c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 68 61 ..static int.Cha
d6d0: 6e 50 69 70 65 4f 62 6a 43 6d 64 28 0a 20 20 20 nPipeObjCmd(.
d6e0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
d6f0: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
d700: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
d710: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 Current interpr
d720: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c eter. */. Tcl
d730: 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 _Size objc,../*
d740: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 Number of argume
d750: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nts. */. Tcl_
d760: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
d770: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 )./* Argument ob
d780: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 jects. */.{.
d790: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72 63 68 61 Tcl_Channel rcha
d7a0: 6e 2c 20 77 63 68 61 6e 3b 0a 20 20 20 20 63 6f n, wchan;. co
d7b0: 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 nst char *channe
d7c0: 6c 4e 61 6d 65 73 5b 32 5d 3b 0a 20 20 20 20 54 lNames[2];. T
d7d0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 cl_Obj *resultPt
d7e0: 72 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 r;.. if (objc
d7f0: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 != 1) {..Tcl_Wr
d800: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
d810: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b p, 1, objv, "");
d820: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d830: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
d840: 66 20 28 54 63 6c 5f 43 72 65 61 74 65 50 69 70 f (Tcl_CreatePip
d850: 65 28 69 6e 74 65 72 70 2c 20 26 72 63 68 61 6e e(interp, &rchan
d860: 2c 20 26 77 63 68 61 6e 2c 20 30 29 20 21 3d 20 , &wchan, 0) !=
d870: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
d880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
d890: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e }.. channelN
d8a0: 61 6d 65 73 5b 30 5d 20 3d 20 54 63 6c 5f 47 65 ames[0] = Tcl_Ge
d8b0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 72 63 68 tChannelName(rch
d8c0: 61 6e 29 3b 0a 20 20 20 20 63 68 61 6e 6e 65 6c an);. channel
d8d0: 4e 61 6d 65 73 5b 31 5d 20 3d 20 54 63 6c 5f 47 Names[1] = Tcl_G
d8e0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 77 63 etChannelName(wc
d8f0: 68 61 6e 29 3b 0a 0a 20 20 20 20 54 63 6c 4e 65 han);.. TclNe
d900: 77 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 29 3b wObj(resultPtr);
d910: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
d920: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 AppendElement(NU
d930: 4c 4c 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a 09 LL, resultPtr,..
d940: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
d950: 67 4f 62 6a 28 63 68 61 6e 6e 65 6c 4e 61 6d 65 gObj(channelName
d960: 73 5b 30 5d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 s[0], -1));.
d970: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
d980: 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 72 dElement(NULL, r
d990: 65 73 75 6c 74 50 74 72 2c 0a 09 20 20 20 20 54 esultPtr,.. T
d9a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
d9b0: 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 5b 31 5d 2c channelNames[1],
d9c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 -1));. Tcl_S
d9d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
d9e0: 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0a rp, resultPtr);.
d9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
da00: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 43 68 61 ---. *. * TclCha
da60: 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 20 2d 2d 0a nnelNamesCmd --.
da70: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
da80: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ion is invoked t
da90: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 63 o process the "c
daa0: 68 61 6e 20 6e 61 6d 65 73 22 20 61 6e 64 20 22 han names" and "
dab0: 66 69 6c 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 73 file. *.channels
dac0: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 2e 20 " Tcl commands.
dad0: 20 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f See the user do
dae0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 cumentation for
daf0: 64 65 74 61 69 6c 73 20 6f 6e 0a 20 2a 09 77 68 details on. *.wh
db00: 61 74 20 74 68 65 79 20 64 6f 2e 0a 20 2a 0a 20 at they do.. *.
db10: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
db20: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
db30: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
db40: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
db50: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
db60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
dba0: 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68 61 6e 6e 65 /..int.TclChanne
dbb0: 6c 4e 61 6d 65 73 43 6d 64 28 0a 20 20 20 20 54 lNamesCmd(. T
dbc0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
dbd0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
dbe0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 p *interp,. T
dbf0: 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 0a 20 20 cl_Size objc,.
dc00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
dc10: 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 69 66 *objv).{. if
dc20: 20 28 6f 62 6a 63 20 3c 20 31 20 7c 7c 20 6f 62 (objc < 1 || ob
dc30: 6a 63 20 3e 20 32 29 20 7b 0a 09 54 63 6c 5f 57 jc > 2) {..Tcl_W
dc40: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
dc50: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70 rp, 1, objv, "?p
dc60: 61 74 74 65 72 6e 3f 22 29 3b 0a 09 72 65 74 75 attern?");..retu
dc70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
dc80: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
dc90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
dca0: 65 73 45 78 28 69 6e 74 65 72 70 2c 0a 09 20 20 esEx(interp,..
dcb0: 20 20 28 28 6f 62 6a 63 20 3d 3d 20 31 29 20 3f ((objc == 1) ?
dcc0: 20 4e 55 4c 4c 20 3a 20 54 63 6c 47 65 74 53 74 NULL : TclGetSt
dcd0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29 3b ring(objv[1])));
dce0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
dcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd30: 0a 20 2a 0a 20 2a 20 54 63 6c 53 65 74 55 70 43 . *. * TclSetUpC
dd40: 68 61 6e 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 hanCmd --. *. *.
dd50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
dd60: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 invoked to set
dd70: 75 70 20 74 68 65 20 22 63 68 61 6e 22 20 54 63 up the "chan" Tc
dd80: 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 l command. See t
dd90: 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d he. *.user docum
dda0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
ddb0: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
ddc0: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 does.. *. * Resu
ddd0: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 72 65 73 75 lts:. *.Tcl resu
dde0: 6c 74 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 53 lt code.. *. * S
ddf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
de00: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
de10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
de50: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 53 65 -. */..int.TclSe
de60: 74 55 70 43 68 61 6e 43 6d 64 28 0a 20 20 20 20 tUpChanCmd(.
de70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
de80: 72 70 2c 0a 20 20 20 20 54 63 6c 5f 43 6f 6d 6d rp,. Tcl_Comm
de90: 61 6e 64 20 65 6e 73 65 6d 62 6c 65 29 0a 7b 0a and ensemble).{.
dea0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 6f /*. * Mo
deb0: 73 74 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65 20 st commands are
dec0: 70 6c 75 67 67 65 64 20 64 69 72 65 63 74 6c 79 plugged directly
ded0: 20 74 6f 67 65 74 68 65 72 2c 20 62 75 74 20 73 together, but s
dee0: 6f 6d 65 20 61 72 65 20 64 6f 6e 65 20 76 69 61 ome are done via
def0: 0a 20 20 20 20 20 2a 20 61 6c 69 61 73 2d 6c 69 . * alias-li
df00: 6b 65 20 72 65 77 72 69 74 69 6e 67 3b 20 5b 63 ke rewriting; [c
df10: 68 61 6e 20 63 6f 6e 66 69 67 75 72 65 5d 20 69 han configure] i
df20: 73 20 74 68 69 73 20 77 61 79 20 66 6f 72 20 73 s this way for s
df30: 65 63 75 72 69 74 79 20 72 65 61 73 6f 6e 73 0a ecurity reasons.
df40: 20 20 20 20 20 2a 20 28 77 61 6e 74 20 6f 76 65 * (want ove
df50: 72 77 72 69 74 69 6e 67 20 6f 66 20 5b 66 63 6f rwriting of [fco
df60: 6e 66 69 67 75 72 65 5d 20 74 6f 20 63 6f 6e 74 nfigure] to cont
df70: 72 6f 6c 20 74 68 61 74 20 6e 69 63 65 6c 79 29 rol that nicely)
df80: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 .. */.. T
df90: 63 6c 5f 4f 62 6a 20 2a 6d 61 70 4f 62 6a 3b 0a cl_Obj *mapObj;.
dfa0: 20 20 20 20 54 63 6c 5f 47 65 74 45 6e 73 65 6d Tcl_GetEnsem
dfb0: 62 6c 65 4d 61 70 70 69 6e 67 44 69 63 74 28 4e bleMappingDict(N
dfc0: 55 4c 4c 2c 20 65 6e 73 65 6d 62 6c 65 2c 20 26 ULL, ensemble, &
dfd0: 6d 61 70 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c mapObj);. Tcl
dfe0: 44 69 63 74 50 75 74 53 74 72 69 6e 67 28 4e 55 DictPutString(NU
dff0: 4c 4c 2c 20 6d 61 70 4f 62 6a 2c 20 22 63 6f 6e LL, mapObj, "con
e000: 66 69 67 75 72 65 22 2c 20 22 3a 3a 66 63 6f 6e figure", "::fcon
e010: 66 69 67 75 72 65 22 29 3b 0a 20 20 20 20 72 65 figure");. re
e020: 74 75 72 6e 20 54 63 6c 5f 53 65 74 45 6e 73 65 turn Tcl_SetEnse
e030: 6d 62 6c 65 4d 61 70 70 69 6e 67 44 69 63 74 28 mbleMappingDict(
e040: 69 6e 74 65 72 70 2c 20 65 6e 73 65 6d 62 6c 65 interp, ensemble
e050: 2c 20 6d 61 70 4f 62 6a 29 3b 0a 7d 0a 0c 0a 2f , mapObj);.}.../
e060: 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 *. * Local Varia
e070: 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 bles:. * mode: c
e080: 0a 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 . * c-basic-offs
e090: 65 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f et: 4. * fill-co
e0a0: 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a lumn: 78. * End:
e0b0: 0a 20 2a 2f 0a . */.