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 0a 2f 2a 0a 20 2a 20 43 61 6c 6c 62 .h"../*. * Callb
0140: 61 63 6b 20 73 74 72 75 63 74 75 72 65 20 66 6f ack structure fo
0150: 72 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 r accept callbac
0160: 6b 20 69 6e 20 61 20 54 43 50 20 73 65 72 76 65 k in a TCP serve
0170: 72 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 r.. */..typedef
0180: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 54 63 6c struct {. Tcl
0190: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 3b 09 09 2f _Obj *script;../
01a0: 2a 20 53 63 72 69 70 74 20 74 6f 20 69 6e 76 6f * Script to invo
01b0: 6b 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 ke. */. Tcl_I
01c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 nterp *interp;..
01d0: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 69 /* Interpreter i
01e0: 6e 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20 69 n which to run i
01f0: 74 2e 20 2a 2f 0a 7d 20 41 63 63 65 70 74 43 61 t. */.} AcceptCa
0200: 6c 6c 62 61 63 6b 3b 0a 0a 2f 2a 0a 20 2a 20 54 llback;../*. * T
0210: 68 72 65 61 64 20 6c 6f 63 61 6c 20 73 74 6f 72 hread local stor
0220: 61 67 65 20 75 73 65 64 20 74 6f 20 6d 61 69 6e age used to main
0230: 74 61 69 6e 20 61 20 70 65 72 2d 74 68 72 65 61 tain a per-threa
0240: 64 20 73 74 64 6f 75 74 20 63 68 61 6e 6e 65 6c d stdout channel
0250: 20 6f 62 6a 2e 0a 20 2a 20 49 74 20 6d 75 73 74 obj.. * It must
0260: 20 62 65 20 70 65 72 2d 74 68 72 65 61 64 20 62 be per-thread b
0270: 65 63 61 75 73 65 20 6f 66 20 73 74 64 20 63 68 ecause of std ch
0280: 61 6e 6e 65 6c 20 6c 69 6d 69 74 61 74 69 6f 6e annel limitation
0290: 73 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 s.. */..typedef
02a0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74 struct {. int
02b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 3b 09 09 2f initialized;../
02c0: 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 * Set to 1 when
02d0: 74 68 65 20 6d 6f 64 75 6c 65 20 69 73 20 69 6e the module is in
02e0: 69 74 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 itialized. */.
02f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 74 64 6f 75 Tcl_Obj *stdou
0300: 74 4f 62 6a 50 74 72 3b 09 2f 2a 20 43 61 63 68 tObjPtr;./* Cach
0310: 65 64 20 73 74 64 6f 75 74 20 63 68 61 6e 6e 65 ed stdout channe
0320: 6c 20 54 63 6c 5f 4f 62 6a 20 2a 2f 0a 7d 20 54 l Tcl_Obj */.} T
0330: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 hreadSpecificDat
0340: 61 3b 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 54 a;..static Tcl_T
0350: 68 72 65 61 64 44 61 74 61 4b 65 79 20 64 61 74 hreadDataKey dat
0360: 61 4b 65 79 3b 0a 0a 2f 2a 0a 20 2a 20 53 74 61 aKey;../*. * Sta
0370: 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f tic functions fo
0380: 72 20 74 68 69 73 20 66 69 6c 65 3a 0a 20 2a 2f r this file:. */
0390: 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 45 78 69 ..static Tcl_Exi
03a0: 74 50 72 6f 63 09 09 46 69 6e 61 6c 69 7a 65 49 tProc..FinalizeI
03b0: 4f 43 6d 64 54 53 44 3b 0a 73 74 61 74 69 63 20 OCmdTSD;.static
03c0: 54 63 6c 5f 54 63 70 41 63 63 65 70 74 50 72 6f Tcl_TcpAcceptPro
03d0: 63 20 09 41 63 63 65 70 74 43 61 6c 6c 62 61 63 c .AcceptCallbac
03e0: 6b 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63 kProc;.static Tc
03f0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 09 09 43 68 l_ObjCmdProc..Ch
0400: 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 3b anPendingObjCmd;
0410: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 .static Tcl_ObjC
0420: 6d 64 50 72 6f 63 09 09 43 68 61 6e 54 72 75 6e mdProc..ChanTrun
0430: 63 61 74 65 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 cateObjCmd;.stat
0440: 69 63 20 76 6f 69 64 09 09 09 52 65 67 69 73 74 ic void...Regist
0450: 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 erTcpServerInter
0460: 70 43 6c 65 61 6e 75 70 28 0a 09 09 09 09 20 20 pCleanup(.....
0470: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
0480: 74 65 72 70 2c 0a 09 09 09 09 20 20 20 20 41 63 terp,..... Ac
0490: 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 ceptCallback *ac
04a0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 ceptCallbackPtr)
04b0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 ;.static Tcl_Int
04c0: 65 72 70 44 65 6c 65 74 65 50 72 6f 63 09 54 63 erpDeleteProc.Tc
04d0: 70 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 73 pAcceptCallbacks
04e0: 44 65 6c 65 74 65 50 72 6f 63 3b 0a 73 74 61 74 DeleteProc;.stat
04f0: 69 63 20 76 6f 69 64 09 09 54 63 70 53 65 72 76 ic void..TcpServ
0500: 65 72 43 6c 6f 73 65 50 72 6f 63 28 76 6f 69 64 erCloseProc(void
0510: 20 2a 63 61 6c 6c 62 61 63 6b 44 61 74 61 29 3b *callbackData);
0520: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 55 6e .static void..Un
0530: 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76 65 registerTcpServe
0540: 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 72 rInterpCleanupPr
0550: 6f 63 28 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 oc(.... Tcl_I
0560: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 nterp *interp,..
0570: 09 09 20 20 20 20 41 63 63 65 70 74 43 61 6c 6c .. AcceptCall
0580: 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c back *acceptCall
0590: 62 61 63 6b 50 74 72 29 3b 0a 0c 0a 2f 2a 0a 20 backPtr);.../*.
05a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 69 -------. *. * Fi
05f0: 6e 61 6c 69 7a 65 49 4f 43 6d 64 54 53 44 20 2d nalizeIOCmdTSD -
0600: 2d 0a 20 2a 0a 20 2a 09 52 65 6c 65 61 73 65 20 -. *. *.Release
0610: 74 68 65 20 73 74 6f 72 61 67 65 20 61 73 73 6f the storage asso
0620: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 ciated with the
0630: 70 65 72 2d 74 68 72 65 61 64 20 63 61 63 68 65 per-thread cache
0640: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
0650: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 . *.None.. *. *
0660: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
0670: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06c0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 --. */..static v
06d0: 6f 69 64 0a 46 69 6e 61 6c 69 7a 65 49 4f 43 6d oid.FinalizeIOCm
06e0: 64 54 53 44 28 0a 20 20 20 20 54 43 4c 5f 55 4e dTSD(. TCL_UN
06f0: 55 53 45 44 28 76 6f 69 64 20 2a 29 29 0a 7b 0a USED(void *)).{.
0700: 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 ThreadSpecif
0710: 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d icData *tsdPtr =
0720: 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 TCL_TSD_INIT(&d
0730: 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 69 66 ataKey);.. if
0740: 20 28 74 73 64 50 74 72 2d 3e 73 74 64 6f 75 74 (tsdPtr->stdout
0750: 4f 62 6a 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 ObjPtr != NULL)
0760: 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f {..Tcl_DecrRefCo
0770: 75 6e 74 28 74 73 64 50 74 72 2d 3e 73 74 64 6f unt(tsdPtr->stdo
0780: 75 74 4f 62 6a 50 74 72 29 3b 0a 09 74 73 64 50 utObjPtr);..tsdP
0790: 74 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 tr->stdoutObjPtr
07a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 = NULL;. }.
07b0: 20 20 20 74 73 64 50 74 72 2d 3e 69 6e 69 74 69 tsdPtr->initi
07c0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 7d 0a 0c 0a alized = 0;.}...
07d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0820: 2a 20 54 63 6c 5f 50 75 74 73 4f 62 6a 43 6d 64 * Tcl_PutsObjCmd
0830: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
0840: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b unction is invok
0850: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
0860: 65 20 22 70 75 74 73 22 20 54 63 6c 20 63 6f 6d e "puts" Tcl com
0870: 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 2a mand. See the. *
0880: 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 .user documentat
0890: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
08a0: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
08b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
08c0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
08d0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
08e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
08f0: 09 50 72 6f 64 75 63 65 73 20 6f 75 74 70 75 74 .Produces output
0900: 20 6f 6e 20 61 20 63 68 61 6e 6e 65 6c 2e 0a 20 on a channel..
0910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
0960: 69 6e 74 0a 54 63 6c 5f 50 75 74 73 4f 62 6a 43 int.Tcl_PutsObjC
0970: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
0980: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
0990: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
09a0: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 rp,../* Current
09b0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a interpreter. */.
09c0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 int objc,...
09d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 /* Number of arg
09e0: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 uments. */. T
09f0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
0a00: 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e jv[])./* Argumen
0a10: 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a t objects. */.{.
0a20: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
0a30: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
0a40: 61 6e 6e 65 6c 20 74 6f 20 70 75 74 73 20 6f 6e annel to puts on
0a50: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
0a60: 20 2a 73 74 72 69 6e 67 3b 09 09 2f 2a 20 53 74 *string;../* St
0a70: 72 69 6e 67 20 74 6f 20 77 72 69 74 65 2e 20 2a ring to write. *
0a80: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 /. Tcl_Obj *c
0a90: 68 61 6e 4f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c hanObjPtr = NULL
0aa0: 3b 09 2f 2a 20 63 68 61 6e 6e 65 6c 20 6f 62 6a ;./* channel obj
0ab0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ect. */. int
0ac0: 6e 65 77 6c 69 6e 65 3b 09 09 2f 2a 20 41 64 64 newline;../* Add
0ad0: 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 65 6e a newline at en
0ae0: 64 3f 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74 d? */. size_t
0af0: 20 72 65 73 75 6c 74 3b 09 09 2f 2a 20 52 65 73 result;../* Res
0b00: 75 6c 74 20 6f 66 20 70 75 74 73 20 6f 70 65 72 ult of puts oper
0b10: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e ation. */. in
0b20: 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64 t mode;.../* Mod
0b30: 65 20 69 6e 20 77 68 69 63 68 20 63 68 61 6e 6e e in which chann
0b40: 65 6c 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f el is opened. */
0b50: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 .. switch (ob
0b60: 6a 63 29 20 7b 0a 20 20 20 20 63 61 73 65 20 32 jc) {. case 2
0b70: 3a 09 09 09 2f 2a 20 5b 70 75 74 73 20 24 78 5d :.../* [puts $x]
0b80: 20 2a 2f 0a 09 73 74 72 69 6e 67 20 3d 20 6f 62 */..string = ob
0b90: 6a 76 5b 31 5d 3b 0a 09 6e 65 77 6c 69 6e 65 20 jv[1];..newline
0ba0: 3d 20 31 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 = 1;..break;..
0bb0: 20 20 63 61 73 65 20 33 3a 09 09 09 2f 2a 20 5b case 3:.../* [
0bc0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 puts -nonewline
0bd0: 24 78 5d 20 6f 72 20 5b 70 75 74 73 20 24 63 68 $x] or [puts $ch
0be0: 61 6e 20 24 78 5d 20 2a 2f 0a 09 69 66 20 28 73 an $x] */..if (s
0bf0: 74 72 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69 trcmp(TclGetStri
0c00: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e ng(objv[1]), "-n
0c10: 6f 6e 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29 onewline") == 0)
0c20: 20 7b 0a 09 20 20 20 20 6e 65 77 6c 69 6e 65 20 {.. newline
0c30: 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 = 0;..} else {..
0c40: 20 20 20 20 6e 65 77 6c 69 6e 65 20 3d 20 31 3b newline = 1;
0c50: 0a 09 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 .. chanObjPtr
0c60: 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 09 7d 0a 09 = objv[1];..}..
0c70: 73 74 72 69 6e 67 20 3d 20 6f 62 6a 76 5b 32 5d string = objv[2]
0c80: 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 ;..break;.. c
0c90: 61 73 65 20 34 3a 09 09 09 2f 2a 20 5b 70 75 74 ase 4:.../* [put
0ca0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 63 68 s -nonewline $ch
0cb0: 61 6e 20 24 78 5d 20 6f 72 0a 09 09 09 09 20 2a an $x] or..... *
0cc0: 20 5b 70 75 74 73 20 24 63 68 61 6e 20 24 78 20 [puts $chan $x
0cd0: 6e 6f 6e 65 77 6c 69 6e 65 5d 20 2a 2f 0a 09 6e nonewline] */..n
0ce0: 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 09 69 66 20 ewline = 0;..if
0cf0: 28 73 74 72 63 6d 70 28 54 63 6c 47 65 74 53 74 (strcmp(TclGetSt
0d00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 ring(objv[1]), "
0d10: 2d 6e 6f 6e 65 77 6c 69 6e 65 22 29 20 3d 3d 20 -nonewline") ==
0d20: 30 29 20 7b 0a 09 20 20 20 20 63 68 61 6e 4f 62 0) {.. chanOb
0d30: 6a 50 74 72 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a jPtr = objv[2];.
0d40: 09 20 20 20 20 73 74 72 69 6e 67 20 3d 20 6f 62 . string = ob
0d50: 6a 76 5b 33 5d 3b 0a 09 20 20 20 20 62 72 65 61 jv[3];.. brea
0d60: 6b 3b 0a 09 7d 0a 09 2f 2a 20 46 61 6c 6c 20 74 k;..}../* Fall t
0d70: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 hrough */. de
0d80: 66 61 75 6c 74 3a 09 09 09 2f 2a 20 5b 70 75 74 fault:.../* [put
0d90: 73 5d 20 6f 72 0a 09 09 09 09 20 2a 20 5b 70 75 s] or..... * [pu
0da0: 74 73 20 73 6f 6d 65 20 62 61 64 20 6e 75 6d 62 ts some bad numb
0db0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e er of arguments.
0dc0: 2e 2e 5d 20 2a 2f 0a 09 54 63 6c 5f 57 72 6f 6e ..] */..Tcl_Wron
0dd0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
0de0: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6e 6f 6e 1, objv, "?-non
0df0: 65 77 6c 69 6e 65 3f 20 3f 63 68 61 6e 6e 65 6c ewline? ?channel
0e00: 49 64 3f 20 73 74 72 69 6e 67 22 29 3b 0a 09 72 Id? string");..r
0e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
0e20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
0e30: 63 68 61 6e 4f 62 6a 50 74 72 20 3d 3d 20 4e 55 chanObjPtr == NU
0e40: 4c 4c 29 20 7b 0a 09 54 68 72 65 61 64 53 70 65 LL) {..ThreadSpe
0e50: 63 69 66 69 63 44 61 74 61 20 2a 74 73 64 50 74 cificData *tsdPt
0e60: 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 r = TCL_TSD_INIT
0e70: 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 09 69 66 (&dataKey);...if
0e80: 20 28 21 74 73 64 50 74 72 2d 3e 69 6e 69 74 69 (!tsdPtr->initi
0e90: 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 74 alized) {.. t
0ea0: 73 64 50 74 72 2d 3e 69 6e 69 74 69 61 6c 69 7a sdPtr->initializ
0eb0: 65 64 20 3d 20 31 3b 0a 09 20 20 20 20 54 63 6c ed = 1;.. Tcl
0ec0: 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 NewLiteralString
0ed0: 4f 62 6a 28 74 73 64 50 74 72 2d 3e 73 74 64 6f Obj(tsdPtr->stdo
0ee0: 75 74 4f 62 6a 50 74 72 2c 20 22 73 74 64 6f 75 utObjPtr, "stdou
0ef0: 74 22 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e t");.. Tcl_In
0f00: 63 72 52 65 66 43 6f 75 6e 74 28 74 73 64 50 74 crRefCount(tsdPt
0f10: 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 29 r->stdoutObjPtr)
0f20: 3b 0a 09 20 20 20 20 54 63 6c 5f 43 72 65 61 74 ;.. Tcl_Creat
0f30: 65 54 68 72 65 61 64 45 78 69 74 48 61 6e 64 6c eThreadExitHandl
0f40: 65 72 28 46 69 6e 61 6c 69 7a 65 49 4f 43 6d 64 er(FinalizeIOCmd
0f50: 54 53 44 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 TSD, NULL);..}..
0f60: 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 74 73 64 chanObjPtr = tsd
0f70: 50 74 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 Ptr->stdoutObjPt
0f80: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 r;. }. if
0f90: 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 (TclGetChannelFr
0fa0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 omObj(interp, ch
0fb0: 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c anObjPtr, &chan,
0fc0: 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 &mode, 0) != TC
0fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
0fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
0ff0: 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 . if (!(mode
1000: 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 & TCL_WRITABLE))
1010: 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {..Tcl_SetObjRe
1020: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
1030: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 _ObjPrintf(..."c
1040: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 hannel \"%s\" wa
1050: 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 sn't opened for
1060: 77 72 69 74 69 6e 67 22 2c 0a 09 09 54 63 6c 47 writing",...TclG
1070: 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a etString(chanObj
1080: 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 Ptr)));..return
1090: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
10a0: 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c .. TclChannel
10b0: 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a Preserve(chan);.
10c0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c result = Tcl
10d0: 5f 57 72 69 74 65 4f 62 6a 28 63 68 61 6e 2c 20 _WriteObj(chan,
10e0: 73 74 72 69 6e 67 29 3b 0a 20 20 20 20 69 66 20 string);. if
10f0: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 49 (result == TCL_I
1100: 4e 44 45 58 5f 4e 4f 4e 45 29 20 7b 0a 09 67 6f NDEX_NONE) {..go
1110: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
1120: 20 20 20 20 69 66 20 28 6e 65 77 6c 69 6e 65 20 if (newline
1130: 21 3d 20 30 29 20 7b 0a 09 72 65 73 75 6c 74 20 != 0) {..result
1140: 3d 20 54 63 6c 5f 57 72 69 74 65 43 68 61 72 73 = Tcl_WriteChars
1150: 28 63 68 61 6e 2c 20 22 5c 6e 22 2c 20 31 29 3b (chan, "\n", 1);
1160: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 ..if (result ==
1170: 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 20 TCL_INDEX_NONE)
1180: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f {.. goto erro
1190: 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 r;..}. }.
11a0: 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 TclChannelReleas
11b0: 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 65 74 e(chan);. ret
11c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 urn TCL_OK;..
11d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20 23 /*. * TIP #
11e0: 32 31 39 2e 0a 20 20 20 20 20 2a 20 43 61 70 74 219.. * Capt
11f0: 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 ure error messag
1200: 65 73 20 70 75 74 20 62 79 20 74 68 65 20 64 72 es put by the dr
1210: 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 iver into the by
1220: 70 61 73 73 20 61 72 65 61 20 61 6e 64 20 70 75 pass area and pu
1230: 74 0a 20 20 20 20 20 2a 20 74 68 65 6d 20 69 6e t. * them in
1240: 74 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 to the regular i
1250: 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c nterpreter resul
1260: 74 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 t. Fall back to
1270: 74 68 65 20 72 65 67 75 6c 61 72 0a 20 20 20 20 the regular.
1280: 20 2a 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f * message if no
1290: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20 thing was found
12a0: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 20 in the bypass..
12b0: 20 20 20 20 2a 2f 0a 0a 20 20 65 72 72 6f 72 3a */.. error:
12c0: 0a 20 20 20 20 69 66 20 28 21 54 63 6c 43 68 61 . if (!TclCha
12d0: 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 nCaughtErrorBypa
12e0: 73 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 ss(interp, chan)
12f0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 ) {..Tcl_SetObjR
1300: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
1310: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 65 72 72 l_ObjPrintf("err
1320: 6f 72 20 77 72 69 74 69 6e 67 20 5c 22 25 73 5c or writing \"%s\
1330: 22 3a 20 25 73 22 2c 0a 09 09 54 63 6c 47 65 74 ": %s",...TclGet
1340: 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 String(chanObjPt
1350: 72 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 r), Tcl_PosixErr
1360: 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 20 20 or(interp)));.
1370: 20 20 7d 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e }. TclChann
1380: 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b elRelease(chan);
1390: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
13a0: 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a ERROR;.}.../*. *
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
1400: 5f 46 6c 75 73 68 4f 62 6a 43 6d 64 20 2d 2d 0a _FlushObjCmd --.
1410: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
1420: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ion is called to
1430: 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c process the Tcl
1440: 20 22 66 6c 75 73 68 22 20 63 6f 6d 6d 61 6e 64 "flush" command
1450: 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 . See the. *.use
1460: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
1470: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 for details on w
1480: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a hat it does.. *.
1490: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
14a0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
14b0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
14c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
14d0: 20 63 61 75 73 65 20 6f 75 74 70 75 74 20 74 6f cause output to
14e0: 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 73 appear on the s
14f0: 70 65 63 69 66 69 65 64 20 63 68 61 6e 6e 65 6c pecified channel
1500: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1550: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 46 6c 75 73 68 /..int.Tcl_Flush
1560: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f ObjCmd(. TCL_
1570: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a UNUSED(void *),.
1580: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
1590: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 interp,../* Curr
15a0: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e ent interpreter.
15b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 */. int objc
15c0: 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 ,.../* Number of
15d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 arguments. */.
15e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
15f0: 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 t objv[])./* Arg
1600: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a ument objects. *
1610: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 /.{. Tcl_Obj
1620: 2a 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20 *chanObjPtr;.
1630: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
1640: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
1650: 65 6c 20 74 6f 20 66 6c 75 73 68 20 6f 6e 2e 20 el to flush on.
1660: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b */. int mode;
1670: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
1680: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
1690: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
16a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
16b0: 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 elId");..return
16c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
16d0: 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 . chanObjPtr
16e0: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 = objv[1];. i
16f0: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c f (TclGetChannel
1700: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
1710: 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 chanObjPtr, &cha
1720: 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 n, &mode, 0) !=
1730: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
1740: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
1750: 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64 }. if (!(mod
1760: 65 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 e & TCL_WRITABLE
1770: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a )) {..Tcl_SetObj
1780: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
1790: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
17a0: 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 "channel \"%s\"
17b0: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f wasn't opened fo
17c0: 72 20 77 72 69 74 69 6e 67 22 2c 0a 09 09 54 63 r writing",...Tc
17d0: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f lGetString(chanO
17e0: 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72 bjPtr)));..retur
17f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
1800: 20 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e }.. TclChann
1810: 65 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 elPreserve(chan)
1820: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46 6c ;. if (Tcl_Fl
1830: 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 4c ush(chan) != TCL
1840: 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 _OK) {../*.. * T
1850: 49 50 20 23 32 31 39 2e 0a 09 20 2a 20 43 61 70 IP #219... * Cap
1860: 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61 ture error messa
1870: 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20 64 ges put by the d
1880: 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62 river into the b
1890: 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 0a 09 ypass area and..
18a0: 20 2a 20 70 75 74 20 74 68 65 6d 20 69 6e 74 6f * put them into
18b0: 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74 the regular int
18c0: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e erpreter result.
18d0: 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 Fall back to th
18e0: 65 0a 09 20 2a 20 72 65 67 75 6c 61 72 20 6d 65 e.. * regular me
18f0: 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e 67 ssage if nothing
1900: 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 was found in th
1910: 65 20 62 79 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a e bypass... */..
1920: 09 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61 75 .if (!TclChanCau
1930: 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 69 ghtErrorBypass(i
1940: 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a nterp, chan)) {.
1950: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
1960: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
1970: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 l_ObjPrintf(...
1980: 20 20 20 22 65 72 72 6f 72 20 66 6c 75 73 68 69 "error flushi
1990: 6e 67 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a ng \"%s\": %s",.
19a0: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 .. TclGetStri
19b0: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20 ng(chanObjPtr),
19c0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
19d0: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 nterp)));..}..Tc
19e0: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 lChannelRelease(
19f0: 63 68 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 chan);..return T
1a00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
1a10: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 TclChannelRe
1a20: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 lease(chan);.
1a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
1a40: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1a90: 20 2a 0a 20 2a 20 54 63 6c 5f 47 65 74 73 4f 62 *. * Tcl_GetsOb
1aa0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
1ab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
1ac0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 alled to process
1ad0: 20 74 68 65 20 54 63 6c 20 22 67 65 74 73 22 20 the Tcl "gets"
1ae0: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 command. See the
1af0: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e . *.user documen
1b00: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 tation for detai
1b10: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f ls on what it do
1b20: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 es.. *. * Result
1b30: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
1b40: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
1b50: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
1b60: 0a 20 2a 09 4d 61 79 20 63 6f 6e 73 75 6d 65 20 . *.May consume
1b70: 69 6e 70 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e input from chann
1b80: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1bd0: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 47 65 74 */..int.Tcl_Get
1be0: 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c sObjCmd(. TCL
1bf0: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c _UNUSED(void *),
1c00: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
1c10: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 *interp,../* Cur
1c20: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 rent interpreter
1c30: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a . */. int obj
1c40: 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f c,.../* Number o
1c50: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a f arguments. */.
1c60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
1c70: 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 st objv[])./* Ar
1c80: 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 gument objects.
1c90: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 */.{. Tcl_Cha
1ca0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
1cb0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 72 65 he channel to re
1cc0: 61 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 ad from. */.
1cd0: 73 69 7a 65 5f 74 20 6c 69 6e 65 4c 65 6e 3b 09 size_t lineLen;.
1ce0: 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6c 69 ./* Length of li
1cf0: 6e 65 20 6a 75 73 74 20 72 65 61 64 2e 20 2a 2f ne just read. */
1d00: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 09 09 . int mode;..
1d10: 09 2f 2a 20 4d 6f 64 65 20 69 6e 20 77 68 69 63 ./* Mode in whic
1d20: 68 20 63 68 61 6e 6e 65 6c 20 69 73 20 6f 70 65 h channel is ope
1d30: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ned. */. Tcl_
1d40: 4f 62 6a 20 2a 6c 69 6e 65 50 74 72 2c 20 2a 63 Obj *linePtr, *c
1d50: 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20 20 69 hanObjPtr;. i
1d60: 6e 74 20 63 6f 64 65 20 3d 20 54 43 4c 5f 4f 4b nt code = TCL_OK
1d70: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
1d80: 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a 63 20 != 2) && (objc
1d90: 21 3d 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57 72 != 3)) {..Tcl_Wr
1da0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
1db0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
1dc0: 6e 6e 65 6c 49 64 20 3f 76 61 72 4e 61 6d 65 3f nnelId ?varName?
1dd0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
1de0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
1df0: 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f 62 chanObjPtr = ob
1e00: 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28 54 jv[1];. if (T
1e10: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d clGetChannelFrom
1e20: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 6e Obj(interp, chan
1e30: 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 26 ObjPtr, &chan, &
1e40: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f mode, 0) != TCL_
1e50: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
1e60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
1e70: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 if (!(mode &
1e80: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b TCL_READABLE)) {
1e90: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
1ea0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
1eb0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 bjPrintf(..."cha
1ec0: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e nnel \"%s\" wasn
1ed0: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 't opened for re
1ee0: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 ading",...TclGet
1ef0: 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 String(chanObjPt
1f00: 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 r)));..return TC
1f10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
1f20: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 TclChannelPr
1f30: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 eserve(chan);.
1f40: 20 20 54 63 6c 4e 65 77 4f 62 6a 28 6c 69 6e 65 TclNewObj(line
1f50: 50 74 72 29 3b 0a 20 20 20 20 6c 69 6e 65 4c 65 Ptr);. lineLe
1f60: 6e 20 3d 20 54 63 6c 5f 47 65 74 73 4f 62 6a 28 n = Tcl_GetsObj(
1f70: 63 68 61 6e 2c 20 6c 69 6e 65 50 74 72 29 3b 0a chan, linePtr);.
1f80: 20 20 20 20 69 66 20 28 6c 69 6e 65 4c 65 6e 20 if (lineLen
1f90: 3d 3d 20 54 43 4c 5f 49 4f 5f 46 41 49 4c 55 52 == TCL_IO_FAILUR
1fa0: 45 29 20 7b 0a 09 69 66 20 28 21 54 63 6c 5f 45 E) {..if (!Tcl_E
1fb0: 6f 66 28 63 68 61 6e 29 20 26 26 20 21 54 63 6c of(chan) && !Tcl
1fc0: 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 _InputBlocked(ch
1fd0: 61 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f an)) {.. Tcl_
1fe0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 6e DecrRefCount(lin
1ff0: 65 50 74 72 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a ePtr);... /*.
2000: 09 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 . * TIP #219
2010: 2e 0a 09 20 20 20 20 20 2a 20 43 61 70 74 75 72 ... * Captur
2020: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 e error messages
2030: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 put by the driv
2040: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 er into the bypa
2050: 73 73 20 61 72 65 61 0a 09 20 20 20 20 20 2a 20 ss area.. *
2060: 61 6e 64 20 70 75 74 20 74 68 65 6d 20 69 6e 74 and put them int
2070: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e o the regular in
2080: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 terpreter result
2090: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 09 . Fall back to..
20a0: 20 20 20 20 20 2a 20 74 68 65 20 72 65 67 75 6c * the regul
20b0: 61 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f ar message if no
20c0: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20 thing was found
20d0: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09 in the bypass...
20e0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
20f0: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 (!TclChanCaught
2100: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 ErrorBypass(inte
2110: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 09 54 rp, chan)) {...T
2120: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
2130: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 interp, Tcl_ObjP
2140: 72 69 6e 74 66 28 0a 09 09 09 22 65 72 72 6f 72 rintf(...."error
2150: 20 72 65 61 64 69 6e 67 20 5c 22 25 73 5c 22 3a reading \"%s\":
2160: 20 25 73 22 2c 0a 09 09 09 54 63 6c 47 65 74 53 %s",....TclGetS
2170: 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 tring(chanObjPtr
2180: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f ), Tcl_PosixErro
2190: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 r(interp)));..
21a0: 20 20 7d 0a 09 20 20 20 20 63 6f 64 65 20 3d 20 }.. code =
21b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 TCL_ERROR;..
21c0: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 6c goto done;..}..l
21d0: 69 6e 65 4c 65 6e 20 3d 20 54 43 4c 5f 49 4f 5f ineLen = TCL_IO_
21e0: 46 41 49 4c 55 52 45 3b 0a 20 20 20 20 7d 0a 20 FAILURE;. }.
21f0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 if (objc == 3
2200: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 4f 62 6a ) {..if (Tcl_Obj
2210: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 SetVar2(interp,
2220: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 6c objv[2], NULL, l
2230: 69 6e 65 50 74 72 2c 0a 09 09 54 43 4c 5f 4c 45 inePtr,...TCL_LE
2240: 41 56 45 5f 45 52 52 5f 4d 53 47 29 20 3d 3d 20 AVE_ERR_MSG) ==
2250: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 64 NULL) {.. cod
2260: 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 e = TCL_ERROR;..
2270: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 goto done;..
2280: 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 }..Tcl_SetObjRes
2290: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
22a0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 NewWideIntObj((T
22b0: 63 6c 5f 57 69 64 65 49 6e 74 29 28 28 54 63 6c cl_WideInt)((Tcl
22c0: 5f 57 69 64 65 55 49 6e 74 29 28 6c 69 6e 65 4c _WideUInt)(lineL
22d0: 65 6e 20 2b 20 31 55 29 29 20 2d 20 31 29 29 3b en + 1U)) - 1));
22e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
22f0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
2300: 69 6e 74 65 72 70 2c 20 6c 69 6e 65 50 74 72 29 interp, linePtr)
2310: 3b 0a 20 20 20 20 7d 0a 20 20 64 6f 6e 65 3a 0a ;. }. done:.
2320: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 TclChannelRe
2330: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 lease(chan);.
2340: 20 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 7d 0a return code;.}.
2350: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
23a0: 0a 20 2a 20 54 63 6c 5f 52 65 61 64 4f 62 6a 43 . * Tcl_ReadObjC
23b0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
23c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 function is inv
23d0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
23e0: 74 68 65 20 54 63 6c 20 22 72 65 61 64 22 20 63 the Tcl "read" c
23f0: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a ommand. See the.
2400: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 *.user document
2410: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
2420: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
2430: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
2440: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
2450: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
2460: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2470: 20 2a 09 4d 61 79 20 63 6f 6e 73 75 6d 65 20 69 *.May consume i
2480: 6e 70 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e 65 nput from channe
2490: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
24e0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 52 65 61 64 */..int.Tcl_Read
24f0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f ObjCmd(. TCL_
2500: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a UNUSED(void *),.
2510: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
2520: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 interp,../* Curr
2530: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e ent interpreter.
2540: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 */. int objc
2550: 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 ,.../* Number of
2560: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 arguments. */.
2570: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
2580: 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 t objv[])./* Arg
2590: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a ument objects. *
25a0: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e /.{. Tcl_Chan
25b0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
25c0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 72 65 61 e channel to rea
25d0: 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 69 d from. */. i
25e0: 6e 74 20 6e 65 77 6c 69 6e 65 2c 20 69 3b 09 09 nt newline, i;..
25f0: 2f 2a 20 44 69 73 63 61 72 64 20 6e 65 77 6c 69 /* Discard newli
2600: 6e 65 20 61 74 20 65 6e 64 3f 20 2a 2f 0a 20 20 ne at end? */.
2610: 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 74 6f Tcl_WideInt to
2620: 52 65 61 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d Read;.../* How m
2630: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 72 65 61 any bytes to rea
2640: 64 3f 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74 d? */. size_t
2650: 20 63 68 61 72 61 63 74 65 72 73 52 65 61 64 3b charactersRead;
2660: 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 63 68 ../* How many ch
2670: 61 72 61 63 74 65 72 73 20 77 65 72 65 20 72 65 aracters were re
2680: 61 64 3f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d ad? */. int m
2690: 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64 65 20 69 ode;.../* Mode i
26a0: 6e 20 77 68 69 63 68 20 63 68 61 6e 6e 65 6c 20 n which channel
26b0: 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 is opened. */.
26c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
26d0: 74 50 74 72 2c 20 2a 63 68 61 6e 4f 62 6a 50 74 tPtr, *chanObjPt
26e0: 72 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a r;.. if ((obj
26f0: 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a 63 c != 2) && (objc
2700: 20 21 3d 20 33 29 29 20 7b 0a 09 49 6e 74 65 72 != 3)) {..Inter
2710: 70 20 2a 69 50 74 72 3b 0a 0a 20 20 20 20 61 72 p *iPtr;.. ar
2720: 67 65 72 72 6f 72 3a 0a 09 69 50 74 72 20 3d 20 gerror:..iPtr =
2730: 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 (Interp *) inter
2740: 70 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d p;..Tcl_WrongNum
2750: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
2760: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64 objv, "channelId
2770: 20 3f 6e 75 6d 43 68 61 72 73 3f 22 29 3b 0a 0a ?numChars?");..
2780: 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e 6f 74 20 61 ./*.. * Do not a
2790: 70 70 65 6e 64 20 64 69 72 65 63 74 6c 79 3b 20 ppend directly;
27a0: 74 68 61 74 20 6d 61 6b 65 73 20 65 6e 73 65 6d that makes ensem
27b0: 62 6c 65 73 20 75 73 69 6e 67 20 74 68 69 73 20 bles using this
27c0: 63 6f 6d 6d 61 6e 64 20 61 73 0a 09 20 2a 20 61 command as.. * a
27d0: 20 73 75 62 63 6f 6d 6d 61 6e 64 20 70 72 6f 64 subcommand prod
27e0: 75 63 65 20 74 68 65 20 77 72 6f 6e 67 20 6d 65 uce the wrong me
27f0: 73 73 61 67 65 2e 0a 09 20 2a 2f 0a 0a 09 69 50 ssage... */...iP
2800: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 49 4e 54 tr->flags |= INT
2810: 45 52 50 5f 41 4c 54 45 52 4e 41 54 45 5f 57 52 ERP_ALTERNATE_WR
2820: 4f 4e 47 5f 41 52 47 53 3b 0a 09 54 63 6c 5f 57 ONG_ARGS;..Tcl_W
2830: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
2840: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
2850: 6e 6f 6e 65 77 6c 69 6e 65 3f 20 63 68 61 6e 6e nonewline? chann
2860: 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 elId");..return
2870: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
2880: 0a 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 .. i = 1;.
2890: 20 6e 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 20 20 newline = 0;.
28a0: 20 20 69 66 20 28 73 74 72 63 6d 70 28 54 63 6c if (strcmp(Tcl
28b0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
28c0: 5d 29 2c 20 22 2d 6e 6f 6e 65 77 6c 69 6e 65 22 ]), "-nonewline"
28d0: 29 20 3d 3d 20 30 29 20 7b 0a 09 6e 65 77 6c 69 ) == 0) {..newli
28e0: 6e 65 20 3d 20 31 3b 0a 09 69 2b 2b 3b 0a 20 20 ne = 1;..i++;.
28f0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 20 3d }.. if (i =
2900: 3d 20 6f 62 6a 63 29 20 7b 0a 09 67 6f 74 6f 20 = objc) {..goto
2910: 61 72 67 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a argerror;. }.
2920: 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 . chanObjPtr
2930: 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 20 20 20 20 69 = objv[i];. i
2940: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c f (TclGetChannel
2950: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
2960: 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 chanObjPtr, &cha
2970: 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 n, &mode, 0) !=
2980: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
2990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
29a0: 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64 }. if (!(mod
29b0: 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 e & TCL_READABLE
29c0: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a )) {..Tcl_SetObj
29d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
29e0: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
29f0: 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 "channel \"%s\"
2a00: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f wasn't opened fo
2a10: 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 09 54 63 r reading",...Tc
2a20: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f lGetString(chanO
2a30: 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72 bjPtr)));..retur
2a40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
2a50: 20 7d 0a 20 20 20 20 69 2b 2b 3b 09 09 09 2f 2a }. i++;.../*
2a60: 20 43 6f 6e 73 75 6d 65 64 20 63 68 61 6e 6e 65 Consumed channe
2a70: 6c 20 6e 61 6d 65 2e 20 2a 2f 0a 0a 20 20 20 20 l name. */..
2a80: 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6d 70 75 74 /*. * Comput
2a90: 65 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 e how many bytes
2aa0: 20 74 6f 20 72 65 61 64 2e 0a 20 20 20 20 20 2a to read.. *
2ab0: 2f 0a 0a 20 20 20 20 74 6f 52 65 61 64 20 3d 20 /.. toRead =
2ac0: 2d 31 3b 0a 20 20 20 20 69 66 20 28 69 20 3c 20 -1;. if (i <
2ad0: 6f 62 6a 63 29 20 7b 0a 09 69 66 20 28 28 54 63 objc) {..if ((Tc
2ae0: 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f lGetWideIntFromO
2af0: 62 6a 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 69 5d bj(NULL, objv[i]
2b00: 2c 20 26 74 6f 52 65 61 64 29 20 21 3d 20 54 43 , &toRead) != TC
2b10: 4c 5f 4f 4b 29 0a 09 09 7c 7c 20 28 74 6f 52 65 L_OK)...|| (toRe
2b20: 61 64 20 3c 20 30 29 29 20 7b 0a 09 09 54 63 6c ad < 0)) {...Tcl
2b30: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
2b40: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
2b50: 6e 74 66 28 0a 09 09 09 22 65 78 70 65 63 74 65 ntf(...."expecte
2b60: 64 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 d non-negative i
2b70: 6e 74 65 67 65 72 20 62 75 74 20 67 6f 74 20 5c nteger but got \
2b80: 22 25 73 5c 22 22 2c 0a 09 09 09 54 63 6c 47 65 "%s\"",....TclGe
2b90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 tString(objv[i])
2ba0: 29 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 ));...Tcl_SetErr
2bb0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
2bc0: 54 43 4c 22 2c 20 22 56 41 4c 55 45 22 2c 20 22 TCL", "VALUE", "
2bd0: 4e 55 4d 42 45 52 22 2c 20 4e 55 4c 4c 29 3b 0a NUMBER", NULL);.
2be0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
2bf0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
2c00: 20 20 54 63 6c 4e 65 77 4f 62 6a 28 72 65 73 75 TclNewObj(resu
2c10: 6c 74 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f ltPtr);. Tcl_
2c20: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 IncrRefCount(res
2c30: 75 6c 74 50 74 72 29 3b 0a 20 20 20 20 54 63 6c ultPtr);. Tcl
2c40: 43 68 61 6e 6e 65 6c 50 72 65 73 65 72 76 65 28 ChannelPreserve(
2c50: 63 68 61 6e 29 3b 0a 20 20 20 20 63 68 61 72 61 chan);. chara
2c60: 63 74 65 72 73 52 65 61 64 20 3d 20 54 63 6c 5f ctersRead = Tcl_
2c70: 52 65 61 64 43 68 61 72 73 28 63 68 61 6e 2c 20 ReadChars(chan,
2c80: 72 65 73 75 6c 74 50 74 72 2c 20 74 6f 52 65 61 resultPtr, toRea
2c90: 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 63 d, 0);. if (c
2ca0: 68 61 72 61 63 74 65 72 73 52 65 61 64 20 3d 3d haractersRead ==
2cb0: 20 54 43 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 29 TCL_IO_FAILURE)
2cc0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 23 {../*.. * TIP #
2cd0: 32 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 65 219... * Capture
2ce0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
2cf0: 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 put by the drive
2d00: 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 r into the bypas
2d10: 73 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 70 s area and.. * p
2d20: 75 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 ut them into the
2d30: 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72 regular interpr
2d40: 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61 6c eter result. Fal
2d50: 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 20 l back to the..
2d60: 2a 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 * regular messag
2d70: 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 e if nothing was
2d80: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 found in the by
2d90: 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 pass... */...if
2da0: 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 (!TclChanCaughtE
2db0: 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72 rrorBypass(inter
2dc0: 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 20 p, chan)) {..
2dd0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
2de0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
2df0: 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 jPrintf(... "
2e00: 65 72 72 6f 72 20 72 65 61 64 69 6e 67 20 5c 22 error reading \"
2e10: 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 20 20 20 %s\": %s",...
2e20: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 63 68 TclGetString(ch
2e30: 61 6e 4f 62 6a 50 74 72 29 2c 20 54 63 6c 5f 50 anObjPtr), Tcl_P
2e40: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 osixError(interp
2e50: 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43 68 61 6e )));..}..TclChan
2e60: 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 nelRelease(chan)
2e70: 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f ;..Tcl_DecrRefCo
2e80: 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a unt(resultPtr);.
2e90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
2ea0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
2eb0: 0a 20 20 20 20 20 2a 20 49 66 20 72 65 71 75 65 . * If reque
2ec0: 73 74 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 sted, remove the
2ed0: 20 6c 61 73 74 20 6e 65 77 6c 69 6e 65 20 69 6e last newline in
2ee0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 66 20 the channel if
2ef0: 61 74 20 45 4f 46 2e 0a 20 20 20 20 20 2a 2f 0a at EOF.. */.
2f00: 0a 20 20 20 20 69 66 20 28 28 63 68 61 72 61 63 . if ((charac
2f10: 74 65 72 73 52 65 61 64 20 3e 20 30 29 20 26 26 tersRead > 0) &&
2f20: 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30 29 29 (newline != 0))
2f30: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
2f40: 72 65 73 75 6c 74 3b 0a 09 73 69 7a 65 5f 74 20 result;..size_t
2f50: 6c 65 6e 67 74 68 3b 0a 0a 09 72 65 73 75 6c 74 length;...result
2f60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
2f70: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 50 74 FromObj(resultPt
2f80: 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 69 66 r, &length);..if
2f90: 20 28 72 65 73 75 6c 74 5b 6c 65 6e 67 74 68 20 (result[length
2fa0: 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a - 1] == '\n') {.
2fb0: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 4c . Tcl_SetObjL
2fc0: 65 6e 67 74 68 28 72 65 73 75 6c 74 50 74 72 2c ength(resultPtr,
2fd0: 20 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a 09 7d length - 1);..}
2fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 . }. Tcl_S
2ff0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3000: 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0a rp, resultPtr);.
3010: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 TclChannelRe
3020: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 lease(chan);.
3030: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
3040: 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 20 20 t(resultPtr);.
3050: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
3060: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 53 65 65 6b 4f . *. * Tcl_SeekO
30c0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
30d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
30e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
30f0: 73 73 20 74 68 65 20 54 63 6c 20 22 73 65 65 6b ss the Tcl "seek
3100: 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 " command. See t
3110: 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d he. *.user docum
3120: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
3130: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
3140: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 does.. *. * Resu
3150: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
3160: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
3170: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
3180: 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 74 68 65 20 s:. *.Moves the
3190: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 position of the
31a0: 61 63 63 65 73 73 20 70 6f 69 6e 74 20 6f 6e 20 access point on
31b0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 68 the specified ch
31c0: 61 6e 6e 65 6c 2e 20 20 4d 61 79 0a 20 2a 09 66 annel. May. *.f
31d0: 6c 75 73 68 20 71 75 65 75 65 64 20 6f 75 74 70 lush queued outp
31e0: 75 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ut.. *. *-------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3230: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 65 65 */..int.Tcl_See
3240: 6b 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c kObjCmd(. TCL
3250: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c _UNUSED(void *),
3260: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
3270: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 *interp,../* Cur
3280: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 rent interpreter
3290: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a . */. int obj
32a0: 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f c,.../* Number o
32b0: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a f arguments. */.
32c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
32d0: 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 st objv[])./* Ar
32e0: 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 gument objects.
32f0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 */.{. Tcl_Cha
3300: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 nnel chan;../* T
3310: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 74 65 he channel to te
3320: 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 54 63 ll on. */. Tc
3330: 6c 5f 57 69 64 65 49 6e 74 20 6f 66 66 73 65 74 l_WideInt offset
3340: 3b 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 ;../* Where to s
3350: 65 65 6b 3f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 eek? */. int
3360: 6d 6f 64 65 3b 09 09 09 2f 2a 20 48 6f 77 20 74 mode;.../* How t
3370: 6f 20 73 65 65 6b 3f 20 2a 2f 0a 20 20 20 20 54 o seek? */. T
3380: 63 6c 5f 57 69 64 65 49 6e 74 20 72 65 73 75 6c cl_WideInt resul
3390: 74 3b 09 09 2f 2a 20 4f 66 20 63 61 6c 6c 69 6e t;../* Of callin
33a0: 67 20 54 63 6c 5f 53 65 65 6b 2e 20 2a 2f 0a 20 g Tcl_Seek. */.
33b0: 20 20 20 69 6e 74 20 6f 70 74 69 6f 6e 49 6e 64 int optionInd
33c0: 65 78 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 ex;. static c
33d0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 onst char *const
33e0: 20 6f 72 69 67 69 6e 4f 70 74 69 6f 6e 73 5b 5d originOptions[]
33f0: 20 3d 20 7b 0a 09 22 73 74 61 72 74 22 2c 20 22 = {.."start", "
3400: 63 75 72 72 65 6e 74 22 2c 20 22 65 6e 64 22 2c current", "end",
3410: 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 NULL. };.
3420: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e static const in
3430: 74 20 6d 6f 64 65 41 72 72 61 79 5b 5d 20 3d 20 t modeArray[] =
3440: 7b 53 45 45 4b 5f 53 45 54 2c 20 53 45 45 4b 5f {SEEK_SET, SEEK_
3450: 43 55 52 2c 20 53 45 45 4b 5f 45 4e 44 7d 3b 0a CUR, SEEK_END};.
3460: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 21 . if ((objc !
3470: 3d 20 33 29 20 26 26 20 28 6f 62 6a 63 20 21 3d = 3) && (objc !=
3480: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 4)) {..Tcl_Wron
3490: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
34a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 1, objv, "chann
34b0: 65 6c 49 64 20 6f 66 66 73 65 74 20 3f 6f 72 69 elId offset ?ori
34c0: 67 69 6e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 gin?");..return
34d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
34e0: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 . if (TclGetC
34f0: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e hannelFromObj(in
3500: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 terp, objv[1], &
3510: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 chan, NULL, 0) !
3520: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
3530: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3540: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
3550: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f _GetWideIntFromO
3560: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b bj(interp, objv[
3570: 32 5d 2c 20 26 6f 66 66 73 65 74 29 20 21 3d 20 2], &offset) !=
3580: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
3590: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
35a0: 20 7d 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 45 }. mode = SE
35b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 69 66 20 28 EK_SET;. if (
35c0: 6f 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09 69 66 objc == 4) {..if
35d0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
35e0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
35f0: 6a 76 5b 33 5d 2c 20 6f 72 69 67 69 6e 4f 70 74 jv[3], originOpt
3600: 69 6f 6e 73 2c 20 22 6f 72 69 67 69 6e 22 2c 20 ions, "origin",
3610: 30 2c 0a 09 09 26 6f 70 74 69 6f 6e 49 6e 64 65 0,...&optionInde
3620: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a x) != TCL_OK) {.
3630: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3640: 45 52 52 4f 52 3b 0a 09 7d 0a 09 6d 6f 64 65 20 ERROR;..}..mode
3650: 3d 20 6d 6f 64 65 41 72 72 61 79 5b 6f 70 74 69 = modeArray[opti
3660: 6f 6e 49 6e 64 65 78 5d 3b 0a 20 20 20 20 7d 0a onIndex];. }.
3670: 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 . TclChannelP
3680: 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 reserve(chan);.
3690: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f result = Tcl_
36a0: 53 65 65 6b 28 63 68 61 6e 2c 20 6f 66 66 73 65 Seek(chan, offse
36b0: 74 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 t, mode);. if
36c0: 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31 29 20 (result == -1)
36d0: 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 23 32 {../*.. * TIP #2
36e0: 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 65 20 19... * Capture
36f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 70 error messages p
3700: 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 72 ut by the driver
3710: 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 73 into the bypass
3720: 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 70 75 area and.. * pu
3730: 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 t them into the
3740: 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72 65 regular interpre
3750: 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61 6c 6c ter result. Fall
3760: 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 20 2a back to the.. *
3770: 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 65 regular message
3780: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 if nothing was
3790: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 70 found in the byp
37a0: 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 ass... */...if (
37b0: 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 72 !TclChanCaughtEr
37c0: 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72 70 rorBypass(interp
37d0: 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 20 20 , chan)) {..
37e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
37f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
3800: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 65 Printf(... "e
3810: 72 72 6f 72 20 64 75 72 69 6e 67 20 73 65 65 6b rror during seek
3820: 20 6f 6e 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c on \"%s\": %s",
3830: 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 ... TclGetStr
3840: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 54 63 ing(objv[1]), Tc
3850: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
3860: 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43 erp)));..}..TclC
3870: 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 hannelRelease(ch
3880: 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c an);..return TCL
3890: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
38a0: 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 TclChannelRele
38b0: 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 ase(chan);. r
38c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
38d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3920: 0a 20 2a 20 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 . * Tcl_TellObjC
3930: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
3940: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 function is inv
3950: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
3960: 74 68 65 20 54 63 6c 20 22 74 65 6c 6c 22 20 63 the Tcl "tell" c
3970: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a ommand. See the.
3980: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 *.user document
3990: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
39a0: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
39b0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
39c0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
39d0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
39e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
39f0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
3a50: 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 28 0a 20 20 l_TellObjCmd(.
3a60: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
3a70: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
3a80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
3a90: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 * Current interp
3aa0: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e reter. */. in
3ab0: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d t objc,.../* Num
3ac0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
3ad0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
3ae0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 *const objv[]).
3af0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
3b00: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 cts. */.{. Tc
3b10: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
3b20: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
3b30: 74 6f 20 74 65 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20 to tell on. */.
3b40: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e Tcl_WideInt n
3b50: 65 77 4c 6f 63 3b 0a 20 20 20 20 69 6e 74 20 63 ewLoc;. int c
3b60: 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 ode;.. if (ob
3b70: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc != 2) {..Tcl_
3b80: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
3b90: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 erp, 1, objv, "c
3ba0: 68 61 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 hannelId");..ret
3bb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3bc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
3bd0: 20 20 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 * Try to find
3be0: 61 20 63 68 61 6e 6e 65 6c 20 77 69 74 68 20 74 a channel with t
3bf0: 68 65 20 72 69 67 68 74 20 6e 61 6d 65 20 61 6e he right name an
3c00: 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 69 6e d permissions in
3c10: 20 74 68 65 20 49 4f 0a 20 20 20 20 20 2a 20 63 the IO. * c
3c20: 68 61 6e 6e 65 6c 20 74 61 62 6c 65 20 6f 66 20 hannel table of
3c30: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 this interpreter
3c40: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
3c50: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c f (TclGetChannel
3c60: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
3c70: 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 objv[1], &chan,
3c80: 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f NULL, 0) != TCL_
3c90: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
3ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
3cb0: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 TclChannelPr
3cc0: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 eserve(chan);.
3cd0: 20 20 6e 65 77 4c 6f 63 20 3d 20 54 63 6c 5f 54 newLoc = Tcl_T
3ce0: 65 6c 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ell(chan);..
3cf0: 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20 23 32 /*. * TIP #2
3d00: 31 39 2e 0a 20 20 20 20 20 2a 20 43 61 70 74 75 19.. * Captu
3d10: 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 re error message
3d20: 73 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 s put by the dri
3d30: 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 ver into the byp
3d40: 61 73 73 20 61 72 65 61 20 61 6e 64 20 70 75 74 ass area and put
3d50: 0a 20 20 20 20 20 2a 20 74 68 65 6d 20 69 6e 74 . * them int
3d60: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e o the regular in
3d70: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 terpreter result
3d80: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 0a 20 20 20 20 .. */...
3d90: 63 6f 64 65 20 20 3d 20 54 63 6c 43 68 61 6e 43 code = TclChanC
3da0: 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 aughtErrorBypass
3db0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a (interp, chan);.
3dc0: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 TclChannelRe
3dd0: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 lease(chan);.
3de0: 20 69 66 20 28 63 6f 64 65 29 20 7b 0a 09 72 65 if (code) {..re
3df0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3e00: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 }.. Tcl_S
3e10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
3e20: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 rp, Tcl_NewWideI
3e30: 6e 74 4f 62 6a 28 6e 65 77 4c 6f 63 29 29 3b 0a ntObj(newLoc));.
3e40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
3e50: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 43 6c 6f --. *. * Tcl_Clo
3eb0: 73 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 seObjCmd --. *.
3ec0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
3ed0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
3ee0: 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 63 ocess the Tcl "c
3ef0: 6c 6f 73 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 lose" command. S
3f00: 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 ee the. *.user d
3f10: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
3f20: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
3f30: 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 it does.. *. *
3f40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
3f50: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
3f60: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
3f70: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 64 69 fects:. *.May di
3f80: 73 63 61 72 64 20 71 75 65 75 65 64 20 69 6e 70 scard queued inp
3f90: 75 74 3b 20 6d 61 79 20 66 6c 75 73 68 20 71 75 ut; may flush qu
3fa0: 65 75 65 64 20 6f 75 74 70 75 74 2e 0a 20 2a 0a eued output.. *.
3fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
4000: 74 0a 54 63 6c 5f 43 6c 6f 73 65 4f 62 6a 43 6d t.Tcl_CloseObjCm
4010: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
4020: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
4030: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4040: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 p,../* Current i
4050: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 nterpreter. */.
4060: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f int objc,.../
4070: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
4080: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
4090: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
40a0: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 v[])./* Argument
40b0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 objects. */.{.
40c0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
40d0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 han;../* The cha
40e0: 6e 6e 65 6c 20 74 6f 20 63 6c 6f 73 65 2e 20 2a nnel to close. *
40f0: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e /. static con
4100: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 64 st char *const d
4110: 69 72 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a irOptions[] = {.
4120: 09 22 72 65 61 64 22 2c 20 22 77 72 69 74 65 22 ."read", "write"
4130: 2c 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 , NULL. };.
4140: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 static const i
4150: 6e 74 20 64 69 72 41 72 72 61 79 5b 5d 20 3d 20 nt dirArray[] =
4160: 7b 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 2c {TCL_CLOSE_READ,
4170: 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 TCL_CLOSE_WRITE
4180: 7d 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a };.. if ((obj
4190: 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a 63 c != 2) && (objc
41a0: 20 21 3d 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57 != 3)) {..Tcl_W
41b0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
41c0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
41d0: 61 6e 6e 65 6c 49 64 20 3f 64 69 72 65 63 74 69 annelId ?directi
41e0: 6f 6e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 on?");..return T
41f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4200: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 . if (TclGetC
4210: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e hannelFromObj(in
4220: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 terp, objv[1], &
4230: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 chan, NULL, 0) !
4240: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
4250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
4260: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 62 }.. if (ob
4270: 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 69 6e 74 20 jc == 3) {..int
4280: 69 6e 64 65 78 2c 20 64 69 72 3b 0a 0a 09 2f 2a index, dir;.../*
4290: 0a 09 20 2a 20 47 65 74 20 64 69 72 65 63 74 69 .. * Get directi
42a0: 6f 6e 20 72 65 71 75 65 73 74 65 64 20 74 6f 20 on requested to
42b0: 63 6c 6f 73 65 2c 20 61 6e 64 20 63 68 65 63 6b close, and check
42c0: 20 73 79 6e 74 61 78 2e 0a 09 20 2a 2f 0a 0a 09 syntax... */...
42d0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
42e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
42f0: 6f 62 6a 76 5b 32 5d 2c 20 64 69 72 4f 70 74 69 objv[2], dirOpti
4300: 6f 6e 73 2c 20 22 64 69 72 65 63 74 69 6f 6e 22 ons, "direction"
4310: 2c 20 30 2c 0a 09 09 26 69 6e 64 65 78 29 20 21 , 0,...&index) !
4320: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
4330: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
4340: 52 3b 0a 09 7d 0a 09 64 69 72 20 3d 20 64 69 72 R;..}..dir = dir
4350: 41 72 72 61 79 5b 69 6e 64 65 78 5d 3b 0a 0a 09 Array[index];...
4360: 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 64 69 72 /*.. * Check dir
4370: 65 63 74 69 6f 6e 20 61 67 61 69 6e 73 74 20 63 ection against c
4380: 68 61 6e 6e 65 6c 20 6d 6f 64 65 2e 20 49 74 20 hannel mode. It
4390: 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77 is an error if w
43a0: 65 20 74 72 79 20 74 6f 0a 09 20 2a 20 63 6c 6f e try to.. * clo
43b0: 73 65 20 61 20 64 69 72 65 63 74 69 6f 6e 20 6e se a direction n
43c0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 ot supported by
43d0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 28 61 6c 72 the channel (alr
43e0: 65 61 64 79 20 63 6c 6f 73 65 64 2c 20 6f 72 0a eady closed, or.
43f0: 09 20 2a 20 6e 65 76 65 72 20 6f 70 65 6e 65 64 . * never opened
4400: 20 66 6f 72 20 74 68 61 74 20 64 69 72 65 63 74 for that direct
4410: 69 6f 6e 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 ion)... */...if
4420: 28 21 28 64 69 72 20 26 20 54 63 6c 5f 47 65 74 (!(dir & Tcl_Get
4430: 43 68 61 6e 6e 65 6c 4d 6f 64 65 28 63 68 61 6e ChannelMode(chan
4440: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 ))) {.. Tcl_S
4450: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
4460: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
4470: 66 28 0a 09 09 20 20 20 20 22 48 61 6c 66 2d 63 f(... "Half-c
4480: 6c 6f 73 65 20 6f 66 20 25 73 2d 73 69 64 65 20 lose of %s-side
4490: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 69 not possible, si
44a0: 64 65 20 6e 6f 74 20 6f 70 65 6e 65 64 22 0a 09 de not opened"..
44b0: 09 20 20 20 20 22 20 6f 72 20 61 6c 72 65 61 64 . " or alread
44c0: 79 20 63 6c 6f 73 65 64 22 2c 20 64 69 72 4f 70 y closed", dirOp
44d0: 74 69 6f 6e 73 5b 69 6e 64 65 78 5d 29 29 3b 0a tions[index]));.
44e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
44f0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 ERROR;..}.../*..
4500: 20 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c * Special handl
4510: 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20 69 66 ing is needed if
4520: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 and only if the
4530: 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65 20 73 75 channel mode su
4540: 70 70 6f 72 74 73 0a 09 20 2a 20 6d 6f 72 65 20 pports.. * more
4550: 74 68 61 6e 20 74 68 65 20 64 69 72 65 63 74 69 than the directi
4560: 6f 6e 20 74 6f 20 63 6c 6f 73 65 2e 20 42 65 63 on to close. Bec
4570: 61 75 73 65 20 69 66 20 74 68 65 20 63 6c 6f 73 ause if the clos
4580: 65 20 74 68 65 20 6c 61 73 74 0a 09 20 2a 20 64 e the last.. * d
4590: 69 72 65 63 74 69 6f 6e 20 73 75 70 70 6f 72 74 irection support
45a0: 65 64 20 77 65 20 63 61 6e 20 61 6e 64 20 77 69 ed we can and wi
45b0: 6c 6c 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 ll go through th
45c0: 65 20 72 65 67 75 6c 61 72 0a 09 20 2a 20 70 72 e regular.. * pr
45d0: 6f 63 65 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 ocess... */...if
45e0: 20 28 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ((Tcl_GetChanne
45f0: 6c 4d 6f 64 65 28 63 68 61 6e 29 20 26 0a 09 09 lMode(chan) &...
4600: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 7c (TCL_CLOSE_READ|
4610: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 TCL_CLOSE_WRITE)
4620: 29 20 21 3d 20 64 69 72 29 20 7b 0a 09 20 20 20 ) != dir) {..
4630: 20 72 65 74 75 72 6e 20 54 63 6c 5f 43 6c 6f 73 return Tcl_Clos
4640: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e eEx(interp, chan
4650: 2c 20 64 69 72 29 3b 0a 09 7d 0a 20 20 20 20 7d , dir);..}. }
4660: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e .. if (Tcl_Un
4670: 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 registerChannel(
4680: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 21 3d interp, chan) !=
4690: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a 09 TCL_OK) {../*..
46a0: 20 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 * If there is a
46b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 n error message
46c0: 61 6e 64 20 69 74 20 65 6e 64 73 20 77 69 74 68 and it ends with
46d0: 20 61 20 6e 65 77 6c 69 6e 65 2c 20 72 65 6d 6f a newline, remo
46e0: 76 65 20 74 68 65 0a 09 20 2a 20 6e 65 77 6c 69 ve the.. * newli
46f0: 6e 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 ne. This is done
4700: 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 20 70 69 70 for command pip
4710: 65 6c 69 6e 65 20 63 68 61 6e 6e 65 6c 73 20 77 eline channels w
4720: 68 65 72 65 20 74 68 65 20 65 72 72 6f 72 0a 09 here the error..
4730: 20 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 * output from t
4740: 68 65 20 73 75 62 70 72 6f 63 65 73 73 65 73 20 he subprocesses
4750: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 69 6e 74 is stored in int
4760: 65 72 70 27 73 20 72 65 73 75 6c 74 2e 0a 09 20 erp's result...
4770: 2a 0a 09 20 2a 20 4e 4f 54 45 3a 20 54 68 69 73 *.. * NOTE: This
4780: 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 6e 6f is likely to no
4790: 74 20 68 61 76 65 20 61 6e 79 20 65 66 66 65 63 t have any effec
47a0: 74 20 6f 6e 20 72 65 67 75 6c 61 72 20 65 72 72 t on regular err
47b0: 6f 72 0a 09 20 2a 20 6d 65 73 73 61 67 65 73 20 or.. * messages
47c0: 70 72 6f 64 75 63 65 64 20 62 79 20 64 72 69 76 produced by driv
47d0: 65 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 63 ers during the c
47e0: 6c 6f 73 69 6e 67 20 6f 66 20 61 20 63 68 61 6e losing of a chan
47f0: 6e 65 6c 2c 0a 09 20 2a 20 62 65 63 61 75 73 65 nel,.. * because
4800: 20 74 68 65 20 54 63 6c 20 63 6f 6e 76 65 6e 74 the Tcl convent
4810: 69 6f 6e 20 69 73 20 74 68 61 74 20 73 75 63 68 ion is that such
4820: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
4830: 64 6f 20 6e 6f 74 20 68 61 76 65 0a 09 20 2a 20 do not have.. *
4840: 61 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 65 a terminating ne
4850: 77 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 wline... */...Tc
4860: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 l_Obj *resultPtr
4870: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 = Tcl_GetObjRes
4880: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 63 6f ult(interp);..co
4890: 6e 73 74 20 63 68 61 72 20 2a 73 74 72 69 6e 67 nst char *string
48a0: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 0a ;..size_t len;..
48b0: 09 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 .if (Tcl_IsShare
48c0: 64 28 72 65 73 75 6c 74 50 74 72 29 29 20 7b 0a d(resultPtr)) {.
48d0: 09 20 20 20 20 72 65 73 75 6c 74 50 74 72 20 3d . resultPtr =
48e0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
48f0: 6a 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 09 20 j(resultPtr);..
4900: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
4910: 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ult(interp, resu
4920: 6c 74 50 74 72 29 3b 0a 09 7d 0a 09 73 74 72 69 ltPtr);..}..stri
4930: 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 ng = Tcl_GetStri
4940: 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 ngFromObj(result
4950: 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 Ptr, &len);..if
4960: 28 28 6c 65 6e 20 3e 20 30 29 20 26 26 20 28 73 ((len > 0) && (s
4970: 74 72 69 6e 67 5b 6c 65 6e 20 2d 20 31 5d 20 3d tring[len - 1] =
4980: 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 20 20 20 20 = '\n')) {..
4990: 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 6e 67 74 68 Tcl_SetObjLength
49a0: 28 72 65 73 75 6c 74 50 74 72 2c 20 6c 65 6e 20 (resultPtr, len
49b0: 2d 20 31 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e - 1);..}..return
49c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
49d0: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }.. return TC
49e0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f -----. *. * Tcl_
4a40: 46 63 6f 6e 66 69 67 75 72 65 4f 62 6a 43 6d 64 FconfigureObjCmd
4a50: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
4a60: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b unction is invok
4a70: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
4a80: 65 20 54 63 6c 20 22 66 63 6f 6e 66 69 67 75 72 e Tcl "fconfigur
4a90: 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 0a e" command. See.
4aa0: 20 2a 09 74 68 65 20 75 73 65 72 20 64 6f 63 75 *.the user docu
4ab0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 mentation for de
4ac0: 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 tails on what it
4ad0: 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 does.. *. * Res
4ae0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
4af0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
4b00: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4b10: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 ts:. *.May modif
4b20: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f y the behavior o
4b30: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e f an IO channel.
4b40: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4b90: 0a 0a 69 6e 74 0a 54 63 6c 5f 46 63 6f 6e 66 69 ..int.Tcl_Fconfi
4ba0: 67 75 72 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20 gureObjCmd(.
4bb0: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
4bc0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
4bd0: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
4be0: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
4bf0: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ter. */. int
4c00: 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 objc,.../* Numbe
4c10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 r of arguments.
4c20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
4c30: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a const objv[])./*
4c40: 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 Argument object
4c50: 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73 s. */.{. cons
4c60: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 t char *optionNa
4c70: 6d 65 2c 20 2a 76 61 6c 75 65 4e 61 6d 65 3b 0a me, *valueName;.
4c80: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
4c90: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 chan;../* The ch
4ca0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d annel to set a m
4cb0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 ode on. */. i
4cc0: 6e 74 20 69 3b 09 09 09 2f 2a 20 49 74 65 72 61 nt i;.../* Itera
4cd0: 74 65 20 6f 76 65 72 20 61 72 67 2d 76 61 6c 75 te over arg-valu
4ce0: 65 20 70 61 69 72 73 2e 20 2a 2f 0a 0a 20 20 20 e pairs. */..
4cf0: 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 if ((objc < 2)
4d00: 7c 7c 20 28 28 28 6f 62 6a 63 20 25 20 32 29 20 || (((objc % 2)
4d10: 3d 3d 20 31 29 20 26 26 20 28 6f 62 6a 63 20 21 == 1) && (objc !
4d20: 3d 20 33 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 = 3))) {..Tcl_Wr
4d30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
4d40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
4d50: 6e 6e 65 6c 49 64 20 3f 2d 6f 70 74 69 6f 6e 20 nnelId ?-option
4d60: 76 61 6c 75 65 20 2e 2e 2e 3f 22 29 3b 0a 09 72 value ...?");..r
4d70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4d80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
4d90: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f TclGetChannelFro
4da0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
4db0: 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c v[1], &chan, NUL
4dc0: 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 L, 0) != TCL_OK)
4dd0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
4de0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
4df0: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 if (objc == 2)
4e00: 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 {..Tcl_DString d
4e10: 73 3b 09 09 2f 2a 20 44 53 74 72 69 6e 67 20 74 s;../* DString t
4e20: 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 20 6f 66 o hold result of
4e30: 20 63 61 6c 6c 69 6e 67 0a 09 09 09 09 20 2a 20 calling..... *
4e40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_GetChannelOp
4e50: 74 69 6f 6e 2e 20 2a 2f 0a 0a 09 54 63 6c 5f 44 tion. */...Tcl_D
4e60: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
4e70: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 ..if (Tcl_GetCha
4e80: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 nnelOption(inter
4e90: 70 2c 20 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 26 p, chan, NULL, &
4ea0: 64 73 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ds) != TCL_OK) {
4eb0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
4ec0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 gFree(&ds);..
4ed0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
4ee0: 52 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 R;..}..Tcl_DStri
4ef0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ngResult(interp,
4f00: 20 26 64 73 29 3b 0a 09 72 65 74 75 72 6e 20 54 &ds);..return T
4f10: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 CL_OK;. } els
4f20: 65 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 e if (objc == 3)
4f30: 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 {..Tcl_DString
4f40: 64 73 3b 09 09 2f 2a 20 44 53 74 72 69 6e 67 20 ds;../* DString
4f50: 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 20 6f to hold result o
4f60: 66 20 63 61 6c 6c 69 6e 67 0a 09 09 09 09 20 2a f calling..... *
4f70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f Tcl_GetChannelO
4f80: 70 74 69 6f 6e 2e 20 2a 2f 0a 0a 09 54 63 6c 5f ption. */...Tcl_
4f90: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 DStringInit(&ds)
4fa0: 3b 0a 09 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 20 ;..optionName =
4fb0: 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a TclGetString(obj
4fc0: 76 5b 32 5d 29 3b 0a 09 69 66 20 28 54 63 6c 5f v[2]);..if (Tcl_
4fd0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
4fe0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 6f (interp, chan, o
4ff0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 26 64 73 29 20 ptionName, &ds)
5000: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
5010: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
5020: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 72 65 74 e(&ds);.. ret
5030: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
5040: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 52 65 }..Tcl_DStringRe
5050: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26 64 73 sult(interp, &ds
5060: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f );..return TCL_O
5070: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f K;. }.. fo
5080: 72 20 28 69 20 3d 20 33 3b 20 69 20 3c 20 6f 62 r (i = 3; i < ob
5090: 6a 63 3b 20 69 20 2b 3d 20 32 29 20 7b 0a 09 6f jc; i += 2) {..o
50a0: 70 74 69 6f 6e 4e 61 6d 65 20 3d 20 54 63 6c 47 ptionName = TclG
50b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2d etString(objv[i-
50c0: 31 5d 29 3b 0a 09 76 61 6c 75 65 4e 61 6d 65 20 1]);..valueName
50d0: 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f = TclGetString(o
50e0: 62 6a 76 5b 69 5d 29 3b 0a 09 69 66 20 28 54 63 bjv[i]);..if (Tc
50f0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
5100: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
5110: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 76 61 6c optionName, val
5120: 75 65 4e 61 6d 65 29 0a 09 09 21 3d 20 54 43 4c ueName)...!= TCL
5130: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 _OK) {.. retu
5140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
5150: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
5160: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
5170: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
51c0: 20 2a 0a 20 2a 20 54 63 6c 5f 45 6f 66 4f 62 6a *. * Tcl_EofObj
51d0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
51e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
51f0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
5200: 20 74 68 65 20 54 63 6c 20 22 65 6f 66 22 20 63 the Tcl "eof" c
5210: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a ommand. See the.
5220: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 *.user document
5230: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
5240: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
5250: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
5260: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
5270: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
5280: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5290: 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73 *.Sets interp's
52a0: 20 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65 result to boole
52b0: 61 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 an true or false
52c0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 depending on wh
52d0: 65 74 68 65 72 20 74 68 65 0a 20 2a 09 73 70 65 ether the. *.spe
52e0: 63 69 66 69 65 64 20 63 68 61 6e 6e 65 6c 20 68 cified channel h
52f0: 61 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74 as an EOF condit
5300: 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ion.. *. *------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
5360: 63 6c 5f 45 6f 66 4f 62 6a 43 6d 64 28 0a 20 20 cl_EofObjCmd(.
5370: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
5380: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
5390: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
53a0: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 * Current interp
53b0: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e reter. */. in
53c0: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d t objc,.../* Num
53d0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
53e0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
53f0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 *const objv[]).
5400: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
5410: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 cts. */.{. Tc
5420: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
5430: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
5440: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
5450: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
5460: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
5470: 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 lId");..return T
5480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5490: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 . if (TclGetC
54a0: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e hannelFromObj(in
54b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 terp, objv[1], &
54c0: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 chan, NULL, 0) !
54d0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
54e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
54f0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 }.. Tcl_Se
5500: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
5510: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 p, Tcl_NewBoolea
5520: 6e 4f 62 6a 28 54 63 6c 5f 45 6f 66 28 63 68 61 nObj(Tcl_Eof(cha
5530: 6e 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e n)));. return
5540: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
5550: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
55a0: 63 6c 5f 45 78 65 63 4f 62 6a 43 6d 64 20 2d 2d cl_ExecObjCmd --
55b0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
55c0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
55d0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
55e0: 65 78 65 63 22 20 54 63 6c 20 63 6f 6d 6d 61 6e exec" Tcl comman
55f0: 64 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 d. See the. *.us
5600: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e er documentation
5610: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 for details on
5620: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a what it does.. *
5630: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
5640: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 A standard Tcl r
5650: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
5660: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
5670: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
5680: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d entation.. *. *-
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
56e0: 63 6c 5f 45 78 65 63 4f 62 6a 43 6d 64 28 0a 20 cl_ExecObjCmd(.
56f0: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
5700: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
5710: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
5720: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
5730: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 preter. */. i
5740: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 nt objc,.../* Nu
5750: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
5760: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
5770: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
5780: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
5790: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 ects. */.{. T
57a0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 cl_Obj *resultPt
57b0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 r;. const cha
57c0: 72 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 6e r **argv;../* An
57d0: 20 61 72 72 61 79 20 66 6f 72 20 74 68 65 20 73 array for the s
57e0: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 2e tring arguments.
57f0: 20 53 74 6f 72 65 64 0a 09 09 09 09 20 2a 20 6f Stored..... * o
5800: 6e 20 74 68 65 20 5f 54 63 6c 5f 20 73 74 61 63 n the _Tcl_ stac
5810: 6b 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 k. */. const
5820: 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20 char *string;.
5830: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
5840: 61 6e 3b 0a 20 20 20 20 69 6e 74 20 61 72 67 63 an;. int argc
5850: 2c 20 62 61 63 6b 67 72 6f 75 6e 64 2c 20 69 2c , background, i,
5860: 20 69 6e 64 65 78 2c 20 6b 65 65 70 4e 65 77 6c index, keepNewl
5870: 69 6e 65 2c 20 72 65 73 75 6c 74 2c 20 73 6b 69 ine, result, ski
5880: 70 2c 20 69 67 6e 6f 72 65 53 74 64 65 72 72 3b p, ignoreStderr;
5890: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 67 . size_t leng
58a0: 74 68 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 th;. static c
58b0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 onst char *const
58c0: 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 options[] = {..
58d0: 22 2d 69 67 6e 6f 72 65 73 74 64 65 72 72 22 2c "-ignorestderr",
58e0: 20 22 2d 6b 65 65 70 6e 65 77 6c 69 6e 65 22 2c "-keepnewline",
58f0: 20 22 2d 2d 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 "--", NULL.
5900: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 65 78 65 63 };. enum exec
5910: 4f 70 74 69 6f 6e 73 45 6e 75 6d 20 7b 0a 09 45 OptionsEnum {..E
5920: 58 45 43 5f 49 47 4e 4f 52 45 53 54 44 45 52 52 XEC_IGNORESTDERR
5930: 2c 20 45 58 45 43 5f 4b 45 45 50 4e 45 57 4c 49 , EXEC_KEEPNEWLI
5940: 4e 45 2c 20 45 58 45 43 5f 4c 41 53 54 0a 20 20 NE, EXEC_LAST.
5950: 20 20 7d 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 };.. /*.
5960: 20 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e * Check for an
5970: 79 20 6c 65 61 64 69 6e 67 20 6f 70 74 69 6f 6e y leading option
5980: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20 arguments..
5990: 20 2a 2f 0a 0a 20 20 20 20 6b 65 65 70 4e 65 77 */.. keepNew
59a0: 6c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 69 67 line = 0;. ig
59b0: 6e 6f 72 65 53 74 64 65 72 72 20 3d 20 30 3b 0a noreStderr = 0;.
59c0: 20 20 20 20 66 6f 72 20 28 73 6b 69 70 20 3d 20 for (skip =
59d0: 31 3b 20 73 6b 69 70 20 3c 20 6f 62 6a 63 3b 20 1; skip < objc;
59e0: 73 6b 69 70 2b 2b 29 20 7b 0a 09 73 74 72 69 6e skip++) {..strin
59f0: 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 g = TclGetString
5a00: 28 6f 62 6a 76 5b 73 6b 69 70 5d 29 3b 0a 09 69 (objv[skip]);..i
5a10: 66 20 28 73 74 72 69 6e 67 5b 30 5d 20 21 3d 20 f (string[0] !=
5a20: 27 2d 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 '-') {.. brea
5a30: 6b 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 k;..}..if (Tcl_G
5a40: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
5a50: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 73 6b 69 70 nterp, objv[skip
5a60: 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 22 6f 70 74 ], options, "opt
5a70: 69 6f 6e 22 2c 0a 09 09 54 43 4c 5f 45 58 41 43 ion",...TCL_EXAC
5a80: 54 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 T, &index) != TC
5a90: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 L_OK) {.. ret
5aa0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
5ab0: 7d 0a 09 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 }..if (index ==
5ac0: 45 58 45 43 5f 4b 45 45 50 4e 45 57 4c 49 4e 45 EXEC_KEEPNEWLINE
5ad0: 29 20 7b 0a 09 20 20 20 20 6b 65 65 70 4e 65 77 ) {.. keepNew
5ae0: 6c 69 6e 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 line = 1;..} els
5af0: 65 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 45 e if (index == E
5b00: 58 45 43 5f 49 47 4e 4f 52 45 53 54 44 45 52 52 XEC_IGNORESTDERR
5b10: 29 20 7b 0a 09 20 20 20 20 69 67 6e 6f 72 65 53 ) {.. ignoreS
5b20: 74 64 65 72 72 20 3d 20 31 3b 0a 09 7d 20 65 6c tderr = 1;..} el
5b30: 73 65 20 7b 0a 09 20 20 20 20 73 6b 69 70 2b 2b se {.. skip++
5b40: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d ;.. break;..}
5b50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f . }. if (o
5b60: 62 6a 63 20 3c 3d 20 73 6b 69 70 29 20 7b 0a 09 bjc <= skip) {..
5b70: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
5b80: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
5b90: 2c 20 22 3f 2d 6f 70 74 69 6f 6e 20 2e 2e 2e 3f , "?-option ...?
5ba0: 20 61 72 67 20 3f 61 72 67 20 2e 2e 2e 3f 22 29 arg ?arg ...?")
5bb0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5bc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5bd0: 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 20 69 66 /*. * See if
5be0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 the command is
5bf0: 74 6f 20 62 65 20 72 75 6e 20 69 6e 20 62 61 63 to be run in bac
5c00: 6b 67 72 6f 75 6e 64 2e 0a 20 20 20 20 20 2a 2f kground.. */
5c10: 0a 0a 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 .. background
5c20: 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 69 6e 67 = 0;. string
5c30: 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 = TclGetString(
5c40: 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d 29 3b objv[objc - 1]);
5c50: 0a 20 20 20 20 69 66 20 28 28 73 74 72 69 6e 67 . if ((string
5c60: 5b 30 5d 20 3d 3d 20 27 26 27 29 20 26 26 20 28 [0] == '&') && (
5c70: 73 74 72 69 6e 67 5b 31 5d 20 3d 3d 20 27 5c 30 string[1] == '\0
5c80: 27 29 29 20 7b 0a 09 6f 62 6a 63 2d 2d 3b 0a 09 ')) {..objc--;..
5c90: 62 61 63 6b 67 72 6f 75 6e 64 20 3d 20 31 3b 0a background = 1;.
5ca0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
5cb0: 20 20 20 2a 20 43 72 65 61 74 65 20 74 68 65 20 * Create the
5cc0: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 string argument
5cd0: 61 72 72 61 79 20 22 61 72 67 76 22 2e 20 4d 61 array "argv". Ma
5ce0: 6b 65 20 73 75 72 65 20 61 72 67 76 20 69 73 20 ke sure argv is
5cf0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 0a 20 20 20 large enough.
5d00: 20 20 2a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 * to hold the
5d10: 61 72 67 63 20 61 72 67 75 6d 65 6e 74 73 20 70 argc arguments p
5d20: 6c 75 73 20 31 20 65 78 74 72 61 20 66 6f 72 20 lus 1 extra for
5d30: 74 68 65 20 7a 65 72 6f 20 65 6e 64 2d 6f 66 2d the zero end-of-
5d40: 61 72 67 76 20 77 6f 72 64 2e 0a 20 20 20 20 20 argv word..
5d50: 2a 2f 0a 0a 20 20 20 20 61 72 67 63 20 3d 20 6f */.. argc = o
5d60: 62 6a 63 20 2d 20 73 6b 69 70 3b 0a 20 20 20 20 bjc - skip;.
5d70: 61 72 67 76 20 3d 20 28 63 6f 6e 73 74 20 63 68 argv = (const ch
5d80: 61 72 20 2a 2a 29 54 63 6c 53 74 61 63 6b 41 6c ar **)TclStackAl
5d90: 6c 6f 63 28 69 6e 74 65 72 70 2c 20 28 61 72 67 loc(interp, (arg
5da0: 63 20 2b 20 31 29 20 2a 20 73 69 7a 65 6f 66 28 c + 1) * sizeof(
5db0: 63 68 61 72 20 2a 29 29 3b 0a 0a 20 20 20 20 2f char *));.. /
5dc0: 2a 0a 20 20 20 20 20 2a 20 43 6f 70 79 20 74 68 *. * Copy th
5dd0: 65 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73 e string convers
5de0: 69 6f 6e 73 20 6f 66 20 65 61 63 68 20 28 70 6f ions of each (po
5df0: 73 74 20 6f 70 74 69 6f 6e 29 20 6f 62 6a 65 63 st option) objec
5e00: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 t into the.
5e10: 2a 20 61 72 67 75 6d 65 6e 74 20 76 65 63 74 6f * argument vecto
5e20: 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 r.. */..
5e30: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
5e40: 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 09 61 72 argc; i++) {..ar
5e50: 67 76 5b 69 5d 20 3d 20 54 63 6c 47 65 74 53 74 gv[i] = TclGetSt
5e60: 72 69 6e 67 28 6f 62 6a 76 5b 69 20 2b 20 73 6b ring(objv[i + sk
5e70: 69 70 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ip]);. }.
5e80: 61 72 67 76 5b 61 72 67 63 5d 20 3d 20 4e 55 4c argv[argc] = NUL
5e90: 4c 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 L;. chan = Tc
5ea0: 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 43 68 61 l_OpenCommandCha
5eb0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 61 72 67 nnel(interp, arg
5ec0: 63 2c 20 61 72 67 76 2c 20 28 62 61 63 6b 67 72 c, argv, (backgr
5ed0: 6f 75 6e 64 20 3f 20 30 20 3a 0a 09 20 20 20 20 ound ? 0 :..
5ee0: 69 67 6e 6f 72 65 53 74 64 65 72 72 20 3f 20 54 ignoreStderr ? T
5ef0: 43 4c 5f 53 54 44 4f 55 54 20 3a 20 54 43 4c 5f CL_STDOUT : TCL_
5f00: 53 54 44 4f 55 54 7c 54 43 4c 5f 53 54 44 45 52 STDOUT|TCL_STDER
5f10: 52 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 R));.. /*.
5f20: 20 20 2a 20 46 72 65 65 20 74 68 65 20 61 72 67 * Free the arg
5f30: 76 20 61 72 72 61 79 2e 0a 20 20 20 20 20 2a 2f v array.. */
5f40: 0a 0a 20 20 20 20 54 63 6c 53 74 61 63 6b 46 72 .. TclStackFr
5f50: 65 65 28 69 6e 74 65 72 70 2c 20 28 76 6f 69 64 ee(interp, (void
5f60: 20 2a 29 20 61 72 67 76 29 3b 0a 0a 20 20 20 20 *) argv);..
5f70: 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c if (chan == NULL
5f80: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
5f90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
5fa0: 20 20 69 66 20 28 62 61 63 6b 67 72 6f 75 6e 64 if (background
5fb0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74 6f 72 ) {../*.. * Stor
5fc0: 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 50 49 e the list of PI
5fd0: 44 73 20 66 72 6f 6d 20 74 68 65 20 70 69 70 65 Ds from the pipe
5fe0: 6c 69 6e 65 20 69 6e 20 69 6e 74 65 72 70 27 73 line in interp's
5ff0: 20 72 65 73 75 6c 74 20 61 6e 64 0a 09 20 2a 20 result and.. *
6000: 64 65 74 61 63 68 20 74 68 65 20 50 49 44 73 20 detach the PIDs
6010: 28 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 (instead of wait
6020: 69 6e 67 20 66 6f 72 20 74 68 65 6d 29 2e 0a 09 ing for them)...
6030: 20 2a 2f 0a 0a 09 54 63 6c 47 65 74 41 6e 64 44 */...TclGetAndD
6040: 65 74 61 63 68 50 69 64 73 28 69 6e 74 65 72 70 etachPids(interp
6050: 2c 20 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 , chan);..if (Tc
6060: 6c 5f 43 6c 6f 73 65 45 78 28 69 6e 74 65 72 70 l_CloseEx(interp
6070: 2c 20 63 68 61 6e 2c 20 30 29 20 21 3d 20 54 43 , chan, 0) != TC
6080: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 L_OK) {.. ret
6090: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
60a0: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b }..return TCL_OK
60b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
60c0: 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 NewObj(resultPtr
60d0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 );. if (Tcl_G
60e0: 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 etChannelHandle(
60f0: 63 68 61 6e 2c 20 54 43 4c 5f 52 45 41 44 41 42 chan, TCL_READAB
6100: 4c 45 2c 20 4e 55 4c 4c 29 20 3d 3d 20 54 43 4c LE, NULL) == TCL
6110: 5f 4f 4b 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f _OK) {..if (Tcl_
6120: 52 65 61 64 43 68 61 72 73 28 63 68 61 6e 2c 20 ReadChars(chan,
6130: 72 65 73 75 6c 74 50 74 72 2c 20 2d 31 2c 20 30 resultPtr, -1, 0
6140: 29 20 3d 3d 20 54 43 4c 5f 49 4f 5f 46 41 49 4c ) == TCL_IO_FAIL
6150: 55 52 45 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 URE) {.. /*..
6160: 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 2e * TIP #219.
6170: 0a 09 20 20 20 20 20 2a 20 43 61 70 74 75 72 65 .. * Capture
6180: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
6190: 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 put by the drive
61a0: 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 r into the bypas
61b0: 73 20 61 72 65 61 0a 09 20 20 20 20 20 2a 20 61 s area.. * a
61c0: 6e 64 20 70 75 74 20 74 68 65 6d 20 69 6e 74 6f nd put them into
61d0: 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74 the regular int
61e0: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e erpreter result.
61f0: 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 09 20 Fall back to..
6200: 20 20 20 20 2a 20 74 68 65 20 72 65 67 75 6c 61 * the regula
6210: 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f 74 r message if not
6220: 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20 69 hing was found i
6230: 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09 20 n the bypass...
6240: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 */... if
6250: 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 (!TclChanCaughtE
6260: 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72 rrorBypass(inter
6270: 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 09 54 63 p, chan)) {...Tc
6280: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
6290: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
62a0: 69 6e 74 66 28 0a 09 09 09 22 65 72 72 6f 72 20 intf(...."error
62b0: 72 65 61 64 69 6e 67 20 6f 75 74 70 75 74 20 66 reading output f
62c0: 72 6f 6d 20 63 6f 6d 6d 61 6e 64 3a 20 25 73 22 rom command: %s"
62d0: 2c 0a 09 09 09 54 63 6c 5f 50 6f 73 69 78 45 72 ,....Tcl_PosixEr
62e0: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 ror(interp)));..
62f0: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
6300: 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 09 20 t(resultPtr);..
6310: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e }.. return
6320: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
6330: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
6340: 20 20 2a 20 49 66 20 74 68 65 20 70 72 6f 63 65 * If the proce
6350: 73 73 20 70 72 6f 64 75 63 65 64 20 61 6e 79 74 ss produced anyt
6360: 68 69 6e 67 20 6f 6e 20 73 74 64 65 72 72 2c 20 hing on stderr,
6370: 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 it will have bee
6380: 6e 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20 n returned.
6390: 2a 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 * in the interpr
63a0: 65 74 65 72 20 72 65 73 75 6c 74 2e 20 49 74 20 eter result. It
63b0: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 70 70 65 needs to be appe
63c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 72 65 73 75 nded to the resu
63d0: 6c 74 0a 20 20 20 20 20 2a 20 73 74 72 69 6e 67 lt. * string
63e0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 .. */.. r
63f0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 43 6c 6f 73 esult = Tcl_Clos
6400: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e eEx(interp, chan
6410: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 , 0);. Tcl_Ap
6420: 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 72 65 73 pendObjToObj(res
6430: 75 6c 74 50 74 72 2c 20 54 63 6c 5f 47 65 74 4f ultPtr, Tcl_GetO
6440: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
6450: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
6460: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 68 * If the last ch
6470: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 72 aracter of the r
6480: 65 73 75 6c 74 20 69 73 20 61 20 6e 65 77 6c 69 esult is a newli
6490: 6e 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 ne, then remove
64a0: 74 68 65 0a 20 20 20 20 20 2a 20 6e 65 77 6c 69 the. * newli
64b0: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20 ne character..
64c0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6b */.. if (k
64d0: 65 65 70 4e 65 77 6c 69 6e 65 20 3d 3d 20 30 29 eepNewline == 0)
64e0: 20 7b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c {..string = Tcl
64f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
6500: 6a 28 72 65 73 75 6c 74 50 74 72 2c 20 26 6c 65 j(resultPtr, &le
6510: 6e 67 74 68 29 3b 0a 09 69 66 20 28 28 6c 65 6e ngth);..if ((len
6520: 67 74 68 20 3e 20 30 29 20 26 26 20 28 73 74 72 gth > 0) && (str
6530: 69 6e 67 5b 6c 65 6e 67 74 68 20 2d 20 31 5d 20 ing[length - 1]
6540: 3d 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 20 20 20 == '\n')) {..
6550: 20 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 6e 67 74 Tcl_SetObjLengt
6560: 68 28 72 65 73 75 6c 74 50 74 72 2c 20 6c 65 6e h(resultPtr, len
6570: 67 74 68 20 2d 20 31 29 3b 0a 09 7d 0a 20 20 20 gth - 1);..}.
6580: 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 }. Tcl_SetOb
6590: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
65a0: 72 65 73 75 6c 74 50 74 72 29 3b 0a 0a 20 20 20 resultPtr);..
65b0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a return result;.
65c0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6610: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 ----. *. * Tcl_F
6620: 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64 20 2d 2d blockedObjCmd --
6630: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
6640: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
6650: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 to process the T
6660: 63 6c 20 22 66 62 6c 6f 63 6b 65 64 22 20 63 6f cl "fblocked" co
6670: 6d 6d 61 6e 64 2e 20 53 65 65 0a 20 2a 09 74 68 mmand. See. *.th
6680: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
6690: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 tion for details
66a0: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 on what it does
66b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
66c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
66d0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
66e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
66f0: 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73 20 *.Sets interp's
6700: 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65 61 result to boolea
6710: 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 n true or false
6720: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 depending on whe
6730: 74 68 65 72 20 74 68 65 0a 20 2a 09 70 72 65 63 ther the. *.prec
6740: 65 65 64 69 6e 67 20 69 6e 70 75 74 20 6f 70 65 eeding input ope
6750: 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 68 ration on the ch
6760: 61 6e 6e 65 6c 20 77 6f 75 6c 64 20 68 61 76 65 annel would have
6770: 20 62 6c 6f 63 6b 65 64 2e 0a 20 2a 0a 20 2a 2d blocked.. *. *-
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
67d0: 69 6e 74 0a 54 63 6c 5f 46 62 6c 6f 63 6b 65 64 int.Tcl_Fblocked
67e0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f ObjCmd(. TCL_
67f0: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a UNUSED(void *),.
6800: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
6810: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 interp,../* Curr
6820: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e ent interpreter.
6830: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 */. int objc
6840: 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 ,.../* Number of
6850: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 arguments. */.
6860: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
6870: 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 t objv[])./* Arg
6880: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a ument objects. *
6890: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e /.{. Tcl_Chan
68a0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e nel chan;. in
68b0: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 t mode;.. if
68c0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
68d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
68e0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
68f0: 20 22 63 68 61 6e 6e 65 6c 49 64 22 29 3b 0a 09 "channelId");..
6900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
6920: 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 (TclGetChannelFr
6930: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
6940: 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 26 6d jv[1], &chan, &m
6950: 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f ode, 0) != TCL_O
6960: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
6970: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
6980: 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 if (!(mode & T
6990: 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b 0a CL_READABLE)) {.
69a0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
69b0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
69c0: 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 6e jPrintf(..."chan
69d0: 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e 27 nel \"%s\" wasn'
69e0: 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 t opened for rea
69f0: 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 53 ding",...TclGetS
6a00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29 tring(objv[1])))
6a10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
6a20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
6a30: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
6a40: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
6a50: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 54 63 6c 5f 49 BooleanObj(Tcl_I
6a60: 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 61 6e nputBlocked(chan
6a70: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 )));. return
6a80: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
6a90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
6ae0: 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 20 2d 2d 0a l_OpenObjCmd --.
6af0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
6b00: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ion is invoked t
6b10: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 6f o process the "o
6b20: 70 65 6e 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 pen" Tcl command
6b30: 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 . See the. *.use
6b40: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
6b50: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 for details on w
6b60: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a hat it does.. *.
6b70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
6b80: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
6b90: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sult.. *. * Side
6ba0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 effects:. *.See
6bb0: 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 the user docume
6bc0: 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d ntation.. *. *--
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c10: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
6c20: 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 28 0a 20 20 l_OpenObjCmd(.
6c30: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
6c40: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
6c50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
6c60: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 * Current interp
6c70: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e reter. */. in
6c80: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d t objc,.../* Num
6c90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
6ca0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
6cb0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 *const objv[]).
6cc0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
6cd0: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e cts. */.{. in
6ce0: 74 20 70 69 70 65 6c 69 6e 65 2c 20 70 72 6f 74 t pipeline, prot
6cf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
6d00: 20 2a 6d 6f 64 65 53 74 72 69 6e 67 2c 20 2a 77 *modeString, *w
6d10: 68 61 74 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 hat;. Tcl_Cha
6d20: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20 nnel chan;..
6d30: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c if ((objc < 2) |
6d40: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a | (objc > 4)) {.
6d50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
6d60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
6d70: 76 2c 20 22 66 69 6c 65 4e 61 6d 65 20 3f 61 63 v, "fileName ?ac
6d80: 63 65 73 73 3f 20 3f 70 65 72 6d 69 73 73 69 6f cess? ?permissio
6d90: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ns?");..return T
6da0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
6db0: 20 20 20 20 70 72 6f 74 20 3d 20 30 36 36 36 3b prot = 0666;
6dc0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d . if (objc ==
6dd0: 20 32 29 20 7b 0a 09 6d 6f 64 65 53 74 72 69 6e 2) {..modeStrin
6de0: 67 20 3d 20 22 72 22 3b 0a 20 20 20 20 7d 20 65 g = "r";. } e
6df0: 6c 73 65 20 7b 0a 09 6d 6f 64 65 53 74 72 69 6e lse {..modeStrin
6e00: 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 g = TclGetString
6e10: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09 69 66 20 28 (objv[2]);..if (
6e20: 6f 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09 20 20 objc == 4) {..
6e30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 65 const char *pe
6e40: 72 6d 53 74 72 69 6e 67 20 3d 20 54 63 6c 47 65 rmString = TclGe
6e50: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 tString(objv[3])
6e60: 3b 0a 09 20 20 20 20 69 6e 74 20 63 6f 64 65 20 ;.. int code
6e70: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 = TCL_ERROR;..
6e80: 20 20 69 6e 74 20 73 63 61 6e 6e 65 64 20 3d 20 int scanned =
6e90: 54 63 6c 50 61 72 73 65 41 6c 6c 57 68 69 74 65 TclParseAllWhite
6ea0: 53 70 61 63 65 28 70 65 72 6d 53 74 72 69 6e 67 Space(permString
6eb0: 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 , TCL_INDEX_NONE
6ec0: 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 );... /*..
6ed0: 20 20 2a 20 53 75 70 70 6f 72 74 20 6c 65 67 61 * Support lega
6ee0: 63 79 20 6f 63 74 61 6c 20 6e 75 6d 62 65 72 73 cy octal numbers
6ef0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
6f00: 20 69 66 20 28 28 70 65 72 6d 53 74 72 69 6e 67 if ((permString
6f10: 5b 73 63 61 6e 6e 65 64 5d 20 3d 3d 20 27 30 27 [scanned] == '0'
6f20: 29 0a 09 09 20 20 20 20 26 26 20 28 70 65 72 6d )... && (perm
6f30: 53 74 72 69 6e 67 5b 73 63 61 6e 6e 65 64 2b 31 String[scanned+1
6f40: 5d 20 3e 3d 20 27 30 27 29 0a 09 09 20 20 20 20 ] >= '0')...
6f50: 26 26 20 28 70 65 72 6d 53 74 72 69 6e 67 5b 73 && (permString[s
6f60: 63 61 6e 6e 65 64 2b 31 5d 20 3c 3d 20 27 37 27 canned+1] <= '7'
6f70: 29 29 20 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20 2a )) {...Tcl_Obj *
6f80: 70 65 72 6d 4f 62 6a 3b 0a 0a 09 09 54 63 6c 4e permObj;....TclN
6f90: 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f ewLiteralStringO
6fa0: 62 6a 28 70 65 72 6d 4f 62 6a 2c 20 22 30 6f 22 bj(permObj, "0o"
6fb0: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 54 );...Tcl_AppendT
6fc0: 6f 4f 62 6a 28 70 65 72 6d 4f 62 6a 2c 20 70 65 oObj(permObj, pe
6fd0: 72 6d 53 74 72 69 6e 67 2b 73 63 61 6e 6e 65 64 rmString+scanned
6fe0: 2b 31 2c 20 2d 31 29 3b 0a 09 09 63 6f 64 65 20 +1, -1);...code
6ff0: 3d 20 54 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f = TclGetIntFromO
7000: 62 6a 28 4e 55 4c 4c 2c 20 70 65 72 6d 4f 62 6a bj(NULL, permObj
7010: 2c 20 26 70 72 6f 74 29 3b 0a 09 09 54 63 6c 5f , &prot);...Tcl_
7020: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 65 72 DecrRefCount(per
7030: 6d 4f 62 6a 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 mObj);.. }...
7040: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 3d if ((code ==
7050: 20 54 43 4c 5f 45 52 52 4f 52 29 0a 09 09 20 20 TCL_ERROR)...
7060: 20 20 26 26 20 54 63 6c 47 65 74 49 6e 74 46 72 && TclGetIntFr
7070: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
7080: 6a 76 5b 33 5d 2c 20 26 70 72 6f 74 29 20 21 3d jv[3], &prot) !=
7090: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 TCL_OK) {...ret
70a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
70b0: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a }..}. }..
70c0: 20 20 20 20 70 69 70 65 6c 69 6e 65 20 3d 20 30 pipeline = 0
70d0: 3b 0a 20 20 20 20 77 68 61 74 20 3d 20 54 63 6c ;. what = Tcl
70e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 GetString(objv[1
70f0: 5d 29 3b 0a 20 20 20 20 69 66 20 28 77 68 61 74 ]);. if (what
7100: 5b 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 70 [0] == '|') {..p
7110: 69 70 65 6c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 ipeline = 1;.
7120: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
7130: 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 * Open the file
7140: 6f 72 20 63 72 65 61 74 65 20 61 20 70 72 6f 63 or create a proc
7150: 65 73 73 20 70 69 70 65 6c 69 6e 65 2e 0a 20 20 ess pipeline..
7160: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 */.. if (!
7170: 70 69 70 65 6c 69 6e 65 29 20 7b 0a 09 63 68 61 pipeline) {..cha
7180: 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 n = Tcl_FSOpenFi
7190: 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 leChannel(interp
71a0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 6d 6f 64 65 53 , objv[1], modeS
71b0: 74 72 69 6e 67 2c 20 70 72 6f 74 29 3b 0a 20 20 tring, prot);.
71c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 } else {..int
71d0: 6d 6f 64 65 2c 20 73 65 65 6b 46 6c 61 67 2c 20 mode, seekFlag,
71e0: 62 69 6e 61 72 79 3b 0a 09 73 69 7a 65 5f 74 20 binary;..size_t
71f0: 63 6d 64 4f 62 6a 63 3b 0a 09 63 6f 6e 73 74 20 cmdObjc;..const
7200: 63 68 61 72 20 2a 2a 63 6d 64 41 72 67 76 3b 0a char **cmdArgv;.
7210: 0a 09 69 66 20 28 54 63 6c 5f 53 70 6c 69 74 4c ..if (Tcl_SplitL
7220: 69 73 74 28 69 6e 74 65 72 70 2c 20 77 68 61 74 ist(interp, what
7230: 2b 31 2c 20 26 63 6d 64 4f 62 6a 63 2c 20 26 63 +1, &cmdObjc, &c
7240: 6d 64 41 72 67 76 29 20 21 3d 20 54 43 4c 5f 4f mdArgv) != TCL_O
7250: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e K) {.. return
7260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
7270: 09 6d 6f 64 65 20 3d 20 54 63 6c 47 65 74 4f 70 .mode = TclGetOp
7280: 65 6e 4d 6f 64 65 45 78 28 69 6e 74 65 72 70 2c enModeEx(interp,
7290: 20 6d 6f 64 65 53 74 72 69 6e 67 2c 20 26 73 65 modeString, &se
72a0: 65 6b 46 6c 61 67 2c 20 26 62 69 6e 61 72 79 29 ekFlag, &binary)
72b0: 3b 0a 09 69 66 20 28 6d 6f 64 65 20 3d 3d 20 2d ;..if (mode == -
72c0: 31 29 20 7b 0a 09 20 20 20 20 63 68 61 6e 20 3d 1) {.. chan =
72d0: 20 4e 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20 7b NULL;..} else {
72e0: 0a 09 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 .. int flags
72f0: 3d 20 54 43 4c 5f 53 54 44 45 52 52 20 7c 20 54 = TCL_STDERR | T
7300: 43 4c 5f 45 4e 46 4f 52 43 45 5f 4d 4f 44 45 3b CL_ENFORCE_MODE;
7310: 0a 0a 09 20 20 20 20 73 77 69 74 63 68 20 28 6d ... switch (m
7320: 6f 64 65 20 26 20 28 4f 5f 52 44 4f 4e 4c 59 20 ode & (O_RDONLY
7330: 7c 20 4f 5f 57 52 4f 4e 4c 59 20 7c 20 4f 5f 52 | O_WRONLY | O_R
7340: 44 57 52 29 29 20 7b 0a 09 20 20 20 20 63 61 73 DWR)) {.. cas
7350: 65 20 4f 5f 52 44 4f 4e 4c 59 3a 0a 09 09 66 6c e O_RDONLY:...fl
7360: 61 67 73 20 7c 3d 20 54 43 4c 5f 53 54 44 4f 55 ags |= TCL_STDOU
7370: 54 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 T;...break;..
7380: 20 63 61 73 65 20 4f 5f 57 52 4f 4e 4c 59 3a 0a case O_WRONLY:.
7390: 09 09 66 6c 61 67 73 20 7c 3d 20 54 43 4c 5f 53 ..flags |= TCL_S
73a0: 54 44 49 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 TDIN;...break;..
73b0: 20 20 20 20 63 61 73 65 20 4f 5f 52 44 57 52 3a case O_RDWR:
73c0: 0a 09 09 66 6c 61 67 73 20 7c 3d 20 28 54 43 4c ...flags |= (TCL
73d0: 5f 53 54 44 49 4e 20 7c 20 54 43 4c 5f 53 54 44 _STDIN | TCL_STD
73e0: 4f 55 54 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 OUT);...break;..
73f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 54 default:...T
7400: 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c 5f 4f 70 cl_Panic("Tcl_Op
7410: 65 6e 43 6d 64 3a 20 69 6e 76 61 6c 69 64 20 6d enCmd: invalid m
7420: 6f 64 65 20 76 61 6c 75 65 22 29 3b 0a 09 09 62 ode value");...b
7430: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 reak;.. }..
7440: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 4f 70 65 chan = Tcl_Ope
7450: 6e 43 6f 6d 6d 61 6e 64 43 68 61 6e 6e 65 6c 28 nCommandChannel(
7460: 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a 63 2c interp, cmdObjc,
7470: 20 63 6d 64 41 72 67 76 2c 20 66 6c 61 67 73 29 cmdArgv, flags)
7480: 3b 0a 09 20 20 20 20 69 66 20 28 62 69 6e 61 72 ;.. if (binar
7490: 79 20 26 26 20 63 68 61 6e 29 20 7b 0a 09 09 54 y && chan) {...T
74a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
74b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
74c0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
74d0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 09 20 20 , "binary");..
74e0: 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 46 72 65 65 }..}..Tcl_Free
74f0: 28 28 76 6f 69 64 20 2a 29 63 6d 64 41 72 67 76 ((void *)cmdArgv
7500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
7510: 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b (chan == NULL) {
7520: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7530: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 OR;. }. Tc
7540: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 l_RegisterChanne
7550: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b l(interp, chan);
7560: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
7570: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
7580: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 l_NewStringObj(T
7590: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
75a0: 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a 20 e(chan), -1));.
75b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
75c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7610: 2d 0a 20 2a 0a 20 2a 20 54 63 70 41 63 63 65 70 -. *. * TcpAccep
7620: 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65 tCallbacksDelete
7630: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 41 73 Proc --. *. *.As
7640: 73 6f 63 64 61 74 61 20 63 6c 65 61 6e 75 70 20 socdata cleanup
7650: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 77 routine called w
7660: 68 65 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74 hen an interpret
7670: 65 72 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 er is being dele
7680: 74 65 64 0a 20 2a 09 74 6f 20 73 65 74 20 74 68 ted. *.to set th
7690: 65 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 6f e interp field o
76a0: 66 20 61 6c 6c 20 74 68 65 20 61 63 63 65 70 74 f all the accept
76b0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64 callback record
76c0: 73 20 72 65 67 69 73 74 65 72 65 64 0a 20 2a 09 s registered. *.
76d0: 77 69 74 68 20 74 68 65 20 69 6e 74 65 72 70 72 with the interpr
76e0: 65 74 65 72 20 74 6f 20 4e 55 4c 4c 2e 20 54 68 eter to NULL. Th
76f0: 69 73 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 is will prevent
7700: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
7710: 66 72 6f 6d 0a 20 2a 09 62 65 69 6e 67 20 75 73 from. *.being us
7720: 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 ed in the future
7730: 20 74 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20 to eval accept
7740: 73 63 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 20 52 scripts.. *. * R
7750: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
7760: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
7770: 63 74 73 3a 0a 20 2a 09 44 65 61 6c 6c 6f 63 61 cts:. *.Dealloca
7780: 74 65 73 20 6d 65 6d 6f 72 79 20 61 6e 64 20 73 tes memory and s
7790: 65 74 73 20 74 68 65 20 69 6e 74 65 72 70 20 66 ets the interp f
77a0: 69 65 6c 64 20 6f 66 20 61 6c 6c 20 74 68 65 20 ield of all the
77b0: 61 63 63 65 70 74 0a 20 2a 09 63 61 6c 6c 62 61 accept. *.callba
77c0: 63 6b 20 72 65 63 6f 72 64 73 20 74 6f 20 4e 55 ck records to NU
77d0: 4c 4c 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 LL to prevent th
77e0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 66 is interpreter f
77f0: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 0a 20 rom being used.
7800: 2a 09 73 75 62 73 65 71 75 65 6e 74 6c 79 20 74 *.subsequently t
7810: 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20 73 63 o eval accept sc
7820: 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d ripts.. *. *----
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7870: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 --. */..static v
7880: 6f 69 64 0a 54 63 70 41 63 63 65 70 74 43 61 6c oid.TcpAcceptCal
7890: 6c 62 61 63 6b 73 44 65 6c 65 74 65 50 72 6f 63 lbacksDeleteProc
78a0: 28 0a 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 (. void *clie
78b0: 6e 74 44 61 74 61 2c 09 2f 2a 20 44 61 74 61 20 ntData,./* Data
78c0: 77 68 69 63 68 20 77 61 73 20 70 61 73 73 65 64 which was passed
78d0: 20 77 68 65 6e 20 74 68 65 20 61 73 73 6f 63 64 when the assocd
78e0: 61 74 61 0a 09 09 09 09 20 2a 20 77 61 73 20 72 ata..... * was r
78f0: 65 67 69 73 74 65 72 65 64 2e 20 2a 2f 0a 20 20 egistered. */.
7900: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c TCL_UNUSED(Tcl
7910: 5f 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20 _Interp *)).{.
7920: 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 Tcl_HashTable
7930: 2a 68 54 62 6c 50 74 72 20 3d 20 28 54 63 6c 5f *hTblPtr = (Tcl_
7940: 48 61 73 68 54 61 62 6c 65 20 2a 29 63 6c 69 65 HashTable *)clie
7950: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ntData;. Tcl_
7960: 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b HashEntry *hPtr;
7970: 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 53 65 61 . Tcl_HashSea
7980: 72 63 68 20 68 53 65 61 72 63 68 3b 0a 0a 20 20 rch hSearch;..
7990: 20 20 66 6f 72 20 28 68 50 74 72 20 3d 20 54 63 for (hPtr = Tc
79a0: 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74 72 79 l_FirstHashEntry
79b0: 28 68 54 62 6c 50 74 72 2c 20 26 68 53 65 61 72 (hTblPtr, &hSear
79c0: 63 68 29 3b 0a 09 20 20 20 20 68 50 74 72 20 21 ch);.. hPtr !
79d0: 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20 3d 20 54 = NULL; hPtr = T
79e0: 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79 cl_NextHashEntry
79f0: 28 26 68 53 65 61 72 63 68 29 29 20 7b 0a 09 41 (&hSearch)) {..A
7a00: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 cceptCallback *a
7a10: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
7a20: 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61 = (AcceptCallba
7a30: 63 6b 20 2a 29 54 63 6c 5f 47 65 74 48 61 73 68 ck *)Tcl_GetHash
7a40: 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 0a 09 61 Value(hPtr);...a
7a50: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
7a60: 2d 3e 69 6e 74 65 72 70 20 3d 20 4e 55 4c 4c 3b ->interp = NULL;
7a70: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
7a80: 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28 68 eleteHashTable(h
7a90: 54 62 6c 50 74 72 29 3b 0a 20 20 20 20 54 63 6c TblPtr);. Tcl
7aa0: 5f 46 72 65 65 28 68 54 62 6c 50 74 72 29 3b 0a _Free(hTblPtr);.
7ab0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7b00: 20 2a 0a 20 2a 20 52 65 67 69 73 74 65 72 54 63 *. * RegisterTc
7b10: 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 6c 65 pServerInterpCle
7b20: 61 6e 75 70 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 anup --. *. *.Re
7b30: 67 69 73 74 65 72 73 20 61 6e 20 61 63 63 65 70 gisters an accep
7b40: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 t callback recor
7b50: 64 20 74 6f 20 68 61 76 65 20 69 74 73 20 69 6e d to have its in
7b60: 74 65 72 70 20 66 69 65 6c 64 20 73 65 74 20 74 terp field set t
7b70: 6f 0a 20 2a 09 4e 55 4c 4c 20 77 68 65 6e 20 74 o. *.NULL when t
7b80: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 he interpreter i
7b90: 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a s deleted.. *. *
7ba0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
7bb0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
7bc0: 66 65 63 74 73 3a 0a 20 2a 09 57 68 65 6e 2c 20 fects:. *.When,
7bd0: 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 in the future, t
7be0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 he interpreter i
7bf0: 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 69 s deleted, the i
7c00: 6e 74 65 72 70 20 66 69 65 6c 64 20 6f 66 0a 20 nterp field of.
7c10: 2a 09 74 68 65 20 61 63 63 65 70 74 20 63 61 6c *.the accept cal
7c20: 6c 62 61 63 6b 20 64 61 74 61 20 73 74 72 75 63 lback data struc
7c30: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 73 65 74 ture will be set
7c40: 20 74 6f 20 4e 55 4c 4c 2e 20 54 68 69 73 20 77 to NULL. This w
7c50: 69 6c 6c 0a 20 2a 09 70 72 65 76 65 6e 74 20 61 ill. *.prevent a
7c60: 74 74 65 6d 70 74 73 20 74 6f 20 65 76 61 6c 20 ttempts to eval
7c70: 74 68 65 20 61 63 63 65 70 74 20 73 63 72 69 70 the accept scrip
7c80: 74 20 69 6e 20 61 20 64 65 6c 65 74 65 64 20 69 t in a deleted i
7c90: 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 nterpreter.. *.
7ca0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
7cf0: 74 69 63 20 76 6f 69 64 0a 52 65 67 69 73 74 65 tic void.Registe
7d00: 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 rTcpServerInterp
7d10: 43 6c 65 61 6e 75 70 28 0a 20 20 20 20 54 63 6c Cleanup(. Tcl
7d20: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7d30: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 ../* Interpreter
7d40: 20 66 6f 72 20 77 68 69 63 68 20 77 65 20 77 61 for which we wa
7d50: 6e 74 20 74 6f 20 62 65 0a 09 09 09 09 20 2a 20 nt to be..... *
7d60: 69 6e 66 6f 72 6d 65 64 20 6f 66 20 64 65 6c 65 informed of dele
7d70: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 41 63 63 tion. */. Acc
7d80: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 eptCallback *acc
7d90: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 0a eptCallbackPtr).
7da0: 09 09 09 09 2f 2a 20 54 68 65 20 61 63 63 65 70 ..../* The accep
7db0: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 t callback recor
7dc0: 64 20 77 68 6f 73 65 20 69 6e 74 65 72 70 0a 09 d whose interp..
7dd0: 09 09 09 20 2a 20 66 69 65 6c 64 20 77 65 20 77 ... * field we w
7de0: 61 6e 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 ant set to NULL
7df0: 77 68 65 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 when the..... *
7e00: 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 64 interpreter is d
7e10: 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 eleted. */.{.
7e20: 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a Tcl_HashTable *
7e30: 68 54 62 6c 50 74 72 3b 09 2f 2a 20 48 61 73 68 hTblPtr;./* Hash
7e40: 20 74 61 62 6c 65 20 66 6f 72 20 61 63 63 65 70 table for accep
7e50: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 t callback recor
7e60: 64 73 20 74 6f 0a 09 09 09 09 20 2a 20 73 6d 61 ds to..... * sma
7e70: 73 68 20 77 68 65 6e 20 74 68 65 20 69 6e 74 65 sh when the inte
7e80: 72 70 72 65 74 65 72 20 77 69 6c 6c 20 62 65 0a rpreter will be.
7e90: 09 09 09 09 20 2a 20 64 65 6c 65 74 65 64 2e 20 .... * deleted.
7ea0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 */. Tcl_HashE
7eb0: 6e 74 72 79 20 2a 68 50 74 72 3b 09 2f 2a 20 45 ntry *hPtr;./* E
7ec0: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 72 65 ntry for this re
7ed0: 63 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 cord. */. int
7ee0: 20 69 73 4e 65 77 3b 09 09 09 2f 2a 20 49 73 20 isNew;.../* Is
7ef0: 74 68 65 20 65 6e 74 72 79 20 6e 65 77 3f 20 2a the entry new? *
7f00: 2f 0a 0a 20 20 20 20 68 54 62 6c 50 74 72 20 3d /.. hTblPtr =
7f10: 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 (Tcl_HashTable
7f20: 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63 44 61 *)Tcl_GetAssocDa
7f30: 74 61 28 69 6e 74 65 72 70 2c 20 22 74 63 6c 54 ta(interp, "tclT
7f40: 43 50 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b CPAcceptCallback
7f50: 73 22 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 s", NULL);..
7f60: 69 66 20 28 68 54 62 6c 50 74 72 20 3d 3d 20 4e if (hTblPtr == N
7f70: 55 4c 4c 29 20 7b 0a 09 68 54 62 6c 50 74 72 20 ULL) {..hTblPtr
7f80: 3d 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 = (Tcl_HashTable
7f90: 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a *)Tcl_Alloc(siz
7fa0: 65 6f 66 28 54 63 6c 5f 48 61 73 68 54 61 62 6c eof(Tcl_HashTabl
7fb0: 65 29 29 3b 0a 09 54 63 6c 5f 49 6e 69 74 48 61 e));..Tcl_InitHa
7fc0: 73 68 54 61 62 6c 65 28 68 54 62 6c 50 74 72 2c shTable(hTblPtr,
7fd0: 20 54 43 4c 5f 4f 4e 45 5f 57 4f 52 44 5f 4b 45 TCL_ONE_WORD_KE
7fe0: 59 53 29 3b 0a 09 54 63 6c 5f 53 65 74 41 73 73 YS);..Tcl_SetAss
7ff0: 6f 63 44 61 74 61 28 69 6e 74 65 72 70 2c 20 22 ocData(interp, "
8000: 74 63 6c 54 43 50 41 63 63 65 70 74 43 61 6c 6c tclTCPAcceptCall
8010: 62 61 63 6b 73 22 2c 0a 09 09 54 63 70 41 63 63 backs",...TcpAcc
8020: 65 70 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 eptCallbacksDele
8030: 74 65 50 72 6f 63 2c 20 68 54 62 6c 50 74 72 29 teProc, hTblPtr)
8040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 68 50 74 ;. }.. hPt
8050: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 r = Tcl_CreateHa
8060: 73 68 45 6e 74 72 79 28 68 54 62 6c 50 74 72 2c shEntry(hTblPtr,
8070: 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 acceptCallbackP
8080: 74 72 2c 20 26 69 73 4e 65 77 29 3b 0a 20 20 20 tr, &isNew);.
8090: 20 69 66 20 28 21 69 73 4e 65 77 29 20 7b 0a 09 if (!isNew) {..
80a0: 54 63 6c 5f 50 61 6e 69 63 28 22 52 65 67 69 73 Tcl_Panic("Regis
80b0: 74 65 72 54 63 70 53 65 72 76 65 72 43 6c 65 61 terTcpServerClea
80c0: 6e 75 70 3a 20 64 61 6d 61 67 65 64 20 61 63 63 nup: damaged acc
80d0: 65 70 74 20 72 65 63 6f 72 64 20 74 61 62 6c 65 ept record table
80e0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ");. }. Tc
80f0: 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 l_SetHashValue(h
8100: 50 74 72 2c 20 61 63 63 65 70 74 43 61 6c 6c 62 Ptr, acceptCallb
8110: 61 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a ackPtr);.}.../*.
8120: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
8170: 6e 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76 nregisterTcpServ
8180: 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 erInterpCleanupP
8190: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 55 6e 72 roc --. *. *.Unr
81a0: 65 67 69 73 74 65 72 20 61 20 70 72 65 76 69 6f egister a previo
81b0: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 usly registered
81c0: 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 accept callback
81d0: 72 65 63 6f 72 64 2e 20 54 68 65 20 69 6e 74 65 record. The inte
81e0: 72 70 0a 20 2a 09 66 69 65 6c 64 20 6f 66 20 74 rp. *.field of t
81f0: 68 69 73 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 his record will
8200: 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 73 65 74 no longer be set
8210: 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 to NULL in the
8220: 66 75 74 75 72 65 20 77 68 65 6e 0a 20 2a 09 74 future when. *.t
8230: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 he interpreter i
8240: 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a s deleted.. *. *
8250: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
8260: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
8270: 66 65 63 74 73 3a 0a 20 2a 09 50 72 65 76 65 6e fects:. *.Preven
8280: 74 73 20 74 68 65 20 69 6e 74 65 72 70 20 66 69 ts the interp fi
8290: 65 6c 64 20 6f 66 20 74 68 65 20 61 63 63 65 70 eld of the accep
82a0: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 t callback recor
82b0: 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 73 65 74 d from being set
82c0: 0a 20 2a 09 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 . *.to NULL in t
82d0: 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 74 he future when t
82e0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 he interpreter i
82f0: 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a s deleted.. *. *
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8340: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
8350: 69 63 20 76 6f 69 64 0a 55 6e 72 65 67 69 73 74 ic void.Unregist
8360: 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 erTcpServerInter
8370: 70 43 6c 65 61 6e 75 70 50 72 6f 63 28 0a 20 20 pCleanupProc(.
8380: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
8390: 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 terp,../* Interp
83a0: 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 reter in which t
83b0: 68 65 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 he accept callba
83c0: 63 6b 0a 09 09 09 09 20 2a 20 72 65 63 6f 72 64 ck..... * record
83d0: 20 77 61 73 20 72 65 67 69 73 74 65 72 65 64 2e was registered.
83e0: 20 2a 2f 0a 20 20 20 20 41 63 63 65 70 74 43 61 */. AcceptCa
83f0: 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 llback *acceptCa
8400: 6c 6c 62 61 63 6b 50 74 72 29 0a 09 09 09 09 2f llbackPtr)...../
8410: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6f 72 * The record for
8420: 20 77 68 69 63 68 20 74 6f 20 64 65 6c 65 74 65 which to delete
8430: 20 74 68 65 0a 09 09 09 09 20 2a 20 72 65 67 69 the..... * regi
8440: 73 74 72 61 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 stration. */.{.
8450: 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 Tcl_HashTable
8460: 20 2a 68 54 62 6c 50 74 72 3b 0a 20 20 20 20 54 *hTblPtr;. T
8470: 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 cl_HashEntry *hP
8480: 74 72 3b 0a 0a 20 20 20 20 68 54 62 6c 50 74 72 tr;.. hTblPtr
8490: 20 3d 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c = (Tcl_HashTabl
84a0: 65 20 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63 e *)Tcl_GetAssoc
84b0: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 22 74 63 Data(interp, "tc
84c0: 6c 54 43 50 41 63 63 65 70 74 43 61 6c 6c 62 61 lTCPAcceptCallba
84d0: 63 6b 73 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 cks", NULL);.
84e0: 20 69 66 20 28 68 54 62 6c 50 74 72 20 3d 3d 20 if (hTblPtr ==
84f0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b NULL) {..return;
8500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 68 50 74 72 . }.. hPtr
8510: 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 = Tcl_FindHashE
8520: 6e 74 72 79 28 68 54 62 6c 50 74 72 2c 20 61 63 ntry(hTblPtr, ac
8530: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 ceptCallbackPtr)
8540: 3b 0a 20 20 20 20 69 66 20 28 68 50 74 72 20 21 ;. if (hPtr !
8550: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 = NULL) {..Tcl_D
8560: 65 6c 65 74 65 48 61 73 68 45 6e 74 72 79 28 68 eleteHashEntry(h
8570: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a Ptr);. }.}...
8580: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
85d0: 2a 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b * AcceptCallback
85e0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Proc --. *. *.Th
85f0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 is callback is i
8600: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 54 43 nvoked by the TC
8610: 50 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 P channel driver
8620: 20 77 68 65 6e 20 69 74 20 61 63 63 65 70 74 73 when it accepts
8630: 20 61 0a 20 2a 09 6e 65 77 20 63 6f 6e 6e 65 63 a. *.new connec
8640: 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6c 69 65 tion from a clie
8650: 6e 74 20 6f 6e 20 61 20 73 65 72 76 65 72 20 73 nt on a server s
8660: 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 ocket.. *. * Res
8670: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ults:. *.None..
8680: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8690: 73 3a 0a 20 2a 09 57 68 61 74 65 76 65 72 20 74 s:. *.Whatever t
86a0: 68 65 20 73 63 72 69 70 74 20 64 6f 65 73 2e 0a he script does..
86b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
8700: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 41 63 63 .static void.Acc
8710: 65 70 74 43 61 6c 6c 62 61 63 6b 50 72 6f 63 28 eptCallbackProc(
8720: 0a 20 20 20 20 76 6f 69 64 20 2a 63 61 6c 6c 62 . void *callb
8730: 61 63 6b 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 ackData,./* The
8740: 64 61 74 61 20 73 74 6f 72 65 64 20 77 68 65 6e data stored when
8750: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 77 61 the callback wa
8760: 73 0a 09 09 09 09 20 2a 20 63 72 65 61 74 65 64 s..... * created
8770: 20 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a in the call to.
8780: 09 09 09 09 20 2a 20 54 63 6c 5f 4f 70 65 6e 54 .... * Tcl_OpenT
8790: 63 70 53 65 72 76 65 72 2e 20 2a 2f 0a 20 20 20 cpServer. */.
87a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
87b0: 6e 2c 09 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 66 n,../* Channel f
87c0: 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 61 63 63 or the newly acc
87d0: 65 70 74 65 64 0a 09 09 09 09 20 2a 20 63 6f 6e epted..... * con
87e0: 6e 65 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 nection. */.
87f0: 63 68 61 72 20 2a 61 64 64 72 65 73 73 2c 09 09 char *address,..
8800: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 63 6c /* Address of cl
8810: 69 65 6e 74 20 74 68 61 74 20 77 61 73 20 61 63 ient that was ac
8820: 63 65 70 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 cepted. */. i
8830: 6e 74 20 70 6f 72 74 29 09 09 09 2f 2a 20 50 6f nt port).../* Po
8840: 72 74 20 6f 66 20 63 6c 69 65 6e 74 20 74 68 61 rt of client tha
8850: 74 20 77 61 73 20 61 63 63 65 70 74 65 64 2e 20 t was accepted.
8860: 2a 2f 0a 7b 0a 20 20 20 20 41 63 63 65 70 74 43 */.{. AcceptC
8870: 61 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 74 43 allback *acceptC
8880: 61 6c 6c 62 61 63 6b 50 74 72 20 3d 20 28 41 63 allbackPtr = (Ac
8890: 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 29 63 ceptCallback *)c
88a0: 61 6c 6c 62 61 63 6b 44 61 74 61 3b 0a 0a 20 20 allbackData;..
88b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 /*. * Chec
88c0: 6b 20 69 66 20 74 68 65 20 63 61 6c 6c 62 61 63 k if the callbac
88d0: 6b 20 69 73 20 73 74 69 6c 6c 20 76 61 6c 69 64 k is still valid
88e0: 3b 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 ; the interprete
88f0: 72 20 6d 61 79 20 68 61 76 65 20 67 6f 6e 65 0a r may have gone.
8900: 20 20 20 20 20 2a 20 61 77 61 79 2c 20 74 68 69 * away, thi
8910: 73 20 69 73 20 73 69 67 6e 61 6c 6c 65 64 20 62 s is signalled b
8920: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 69 6e y setting the in
8930: 74 65 72 70 20 66 69 65 6c 64 20 6f 66 20 74 68 terp field of th
8940: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 20 20 20 e callback.
8950: 2a 20 64 61 74 61 20 74 6f 20 4e 55 4c 4c 2e 0a * data to NULL..
8960: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 */.. if
8970: 28 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 (acceptCallbackP
8980: 74 72 2d 3e 69 6e 74 65 72 70 20 21 3d 20 4e 55 tr->interp != NU
8990: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 LL) {..Tcl_Inter
89a0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 61 63 63 65 p *interp = acce
89b0: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 ptCallbackPtr->i
89c0: 6e 74 65 72 70 3b 0a 09 54 63 6c 5f 4f 62 6a 20 nterp;..Tcl_Obj
89d0: 2a 73 63 72 69 70 74 2c 20 2a 6f 62 6a 76 5b 32 *script, *objv[2
89e0: 5d 3b 0a 09 69 6e 74 20 72 65 73 75 6c 74 20 3d ];..int result =
89f0: 20 54 43 4c 5f 4f 4b 3b 0a 0a 09 6f 62 6a 76 5b TCL_OK;...objv[
8a00: 30 5d 20 3d 20 61 63 63 65 70 74 43 61 6c 6c 62 0] = acceptCallb
8a10: 61 63 6b 50 74 72 2d 3e 73 63 72 69 70 74 3b 0a ackPtr->script;.
8a20: 09 6f 62 6a 76 5b 31 5d 20 3d 20 54 63 6c 5f 4e .objv[1] = Tcl_N
8a30: 65 77 4c 69 73 74 4f 62 6a 28 33 2c 20 4e 55 4c ewListObj(3, NUL
8a40: 4c 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a L);..Tcl_ListObj
8a50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 AppendElement(NU
8a60: 4c 4c 2c 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c LL, objv[1], Tcl
8a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 _NewStringObj(..
8a80: 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e .Tcl_GetChannelN
8a90: 61 6d 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b ame(chan), -1));
8aa0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 ..Tcl_ListObjApp
8ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c endElement(NULL,
8ac0: 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c 5f 4e 65 objv[1], Tcl_Ne
8ad0: 77 53 74 72 69 6e 67 4f 62 6a 28 61 64 64 72 65 wStringObj(addre
8ae0: 73 73 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c ss, -1));..Tcl_L
8af0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
8b00: 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31 ent(NULL, objv[1
8b10: 5d 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e ], Tcl_NewWideIn
8b20: 74 4f 62 6a 28 70 6f 72 74 29 29 3b 0a 0a 09 73 tObj(port));...s
8b30: 63 72 69 70 74 20 3d 20 54 63 6c 5f 43 6f 6e 63 cript = Tcl_Conc
8b40: 61 74 4f 62 6a 28 32 2c 20 6f 62 6a 76 29 3b 0a atObj(2, objv);.
8b50: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e .Tcl_IncrRefCoun
8b60: 74 28 73 63 72 69 70 74 29 3b 0a 09 54 63 6c 5f t(script);..Tcl_
8b70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a DecrRefCount(obj
8b80: 76 5b 31 5d 29 3b 0a 0a 09 54 63 6c 5f 50 72 65 v[1]);...Tcl_Pre
8b90: 73 65 72 76 65 28 69 6e 74 65 72 70 29 3b 0a 09 serve(interp);..
8ba0: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e Tcl_RegisterChan
8bb0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
8bc0: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41 72 74 69 );.../*.. * Arti
8bd0: 66 69 63 69 61 6c 6c 79 20 62 75 6d 70 20 74 68 ficially bump th
8be0: 65 20 72 65 66 63 6f 75 6e 74 20 74 6f 20 70 72 e refcount to pr
8bf0: 6f 74 65 63 74 20 74 68 65 20 63 68 61 6e 6e 65 otect the channe
8c00: 6c 20 66 72 6f 6d 20 62 65 69 6e 67 0a 09 20 2a l from being.. *
8c10: 20 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 74 deleted while t
8c20: 68 65 20 73 63 72 69 70 74 20 69 73 20 62 65 69 he script is bei
8c30: 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 0a 09 20 ng evaluated...
8c40: 2a 2f 0a 0a 09 54 63 6c 5f 52 65 67 69 73 74 65 */...Tcl_Registe
8c50: 72 43 68 61 6e 6e 65 6c 28 4e 55 4c 4c 2c 20 63 rChannel(NULL, c
8c60: 68 61 6e 29 3b 0a 0a 09 72 65 73 75 6c 74 20 3d han);...result =
8c70: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 Tcl_EvalObjEx(i
8c80: 6e 74 65 72 70 2c 20 73 63 72 69 70 74 2c 20 54 nterp, script, T
8c90: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 CL_EVAL_DIRECT|T
8ca0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b CL_EVAL_GLOBAL);
8cb0: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
8cc0: 6e 74 28 73 63 72 69 70 74 29 3b 0a 0a 09 69 66 nt(script);...if
8cd0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
8ce0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42 OK) {.. Tcl_B
8cf0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 ackgroundExcepti
8d00: 6f 6e 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c on(interp, resul
8d10: 74 29 3b 0a 09 20 20 20 20 54 63 6c 5f 55 6e 72 t);.. Tcl_Unr
8d20: 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 egisterChannel(i
8d30: 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 09 7d nterp, chan);..}
8d40: 0a 0a 09 2f 2a 0a 09 20 2a 20 44 65 63 72 65 6d .../*.. * Decrem
8d50: 65 6e 74 20 74 68 65 20 61 72 74 69 66 69 63 69 ent the artifici
8d60: 61 6c 6c 79 20 62 75 6d 70 65 64 20 72 65 66 63 ally bumped refc
8d70: 6f 75 6e 74 2e 20 41 66 74 65 72 20 74 68 69 73 ount. After this
8d80: 20 69 74 20 69 73 20 6e 6f 74 0a 09 20 2a 20 73 it is not.. * s
8d90: 61 66 65 20 61 6e 79 6d 6f 72 65 20 74 6f 20 75 afe anymore to u
8da0: 73 65 20 22 63 68 61 6e 22 2c 20 62 65 63 61 75 se "chan", becau
8db0: 73 65 20 69 74 20 6d 61 79 20 6e 6f 77 20 62 65 se it may now be
8dc0: 20 64 65 6c 65 74 65 64 2e 0a 09 20 2a 2f 0a 0a deleted... */..
8dd0: 09 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 .Tcl_UnregisterC
8de0: 68 61 6e 6e 65 6c 28 4e 55 4c 4c 2c 20 63 68 61 hannel(NULL, cha
8df0: 6e 29 3b 0a 0a 09 54 63 6c 5f 52 65 6c 65 61 73 n);...Tcl_Releas
8e00: 65 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d e(interp);. }
8e10: 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 else {../*.. *
8e20: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 The interpreter
8e30: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 has been deleted
8e40: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f , so there is no
8e50: 20 75 73 65 66 75 6c 20 77 61 79 20 74 6f 20 75 useful way to u
8e60: 73 65 0a 09 20 2a 20 74 68 65 20 63 6c 69 65 6e se.. * the clien
8e70: 74 20 73 6f 63 6b 65 74 20 2d 20 6a 75 73 74 20 t socket - just
8e80: 63 6c 6f 73 65 20 69 74 2e 0a 09 20 2a 2f 0a 0a close it... */..
8e90: 09 54 63 6c 5f 43 6c 6f 73 65 45 78 28 4e 55 4c .Tcl_CloseEx(NUL
8ea0: 4c 2c 20 63 68 61 6e 2c 20 30 29 3b 0a 20 20 20 L, chan, 0);.
8eb0: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d }.}.../*. *----
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f00: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 53 65 72 76 --. *. * TcpServ
8f10: 65 72 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 erCloseProc --.
8f20: 2a 0a 20 2a 09 54 68 69 73 20 63 61 6c 6c 62 61 *. *.This callba
8f30: 63 6b 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 ck is called whe
8f40: 6e 20 74 68 65 20 54 43 50 20 73 65 72 76 65 72 n the TCP server
8f50: 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 77 68 69 channel for whi
8f60: 63 68 20 69 74 20 77 61 73 0a 20 2a 09 72 65 67 ch it was. *.reg
8f70: 69 73 74 65 72 65 64 20 69 73 20 62 65 69 6e 67 istered is being
8f80: 20 63 6c 6f 73 65 64 2e 20 49 74 20 69 6e 66 6f closed. It info
8f90: 72 6d 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 rms the interpre
8fa0: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 ter in which the
8fb0: 0a 20 2a 09 61 63 63 65 70 74 20 73 63 72 69 70 . *.accept scrip
8fc0: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 28 t is evaluated (
8fd0: 69 66 20 74 68 61 74 20 69 6e 74 65 72 70 72 65 if that interpre
8fe0: 74 65 72 20 73 74 69 6c 6c 20 65 78 69 73 74 73 ter still exists
8ff0: 29 20 74 68 61 74 0a 20 2a 09 74 68 69 73 20 63 ) that. *.this c
9000: 68 61 6e 6e 65 6c 20 6e 6f 20 6c 6f 6e 67 65 72 hannel no longer
9010: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 66 needs to be inf
9020: 6f 72 6d 65 64 20 69 66 20 74 68 65 20 69 6e 74 ormed if the int
9030: 65 72 70 72 65 74 65 72 20 69 73 0a 20 2a 09 64 erpreter is. *.d
9040: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 eleted.. *. * Re
9050: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a sults:. *.None..
9060: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
9070: 74 73 3a 0a 20 2a 09 49 6e 20 74 68 65 20 66 75 ts:. *.In the fu
9080: 74 75 72 65 2c 20 69 66 20 74 68 65 20 69 6e 74 ture, if the int
9090: 65 72 70 72 65 74 65 72 20 69 73 20 64 65 6c 65 erpreter is dele
90a0: 74 65 64 20 74 68 69 73 20 63 68 61 6e 6e 65 6c ted this channel
90b0: 20 77 69 6c 6c 20 6e 6f 0a 20 2a 09 6c 6f 6e 67 will no. *.long
90c0: 65 72 20 62 65 20 69 6e 66 6f 72 6d 65 64 2e 0a er be informed..
90d0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
9120: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 63 70 .static void.Tcp
9130: 53 65 72 76 65 72 43 6c 6f 73 65 50 72 6f 63 28 ServerCloseProc(
9140: 0a 20 20 20 20 76 6f 69 64 20 2a 63 61 6c 6c 62 . void *callb
9150: 61 63 6b 44 61 74 61 29 09 2f 2a 20 54 68 65 20 ackData)./* The
9160: 64 61 74 61 20 70 61 73 73 65 64 20 69 6e 20 74 data passed in t
9170: 68 65 20 63 61 6c 6c 20 74 6f 0a 09 09 09 09 20 he call to.....
9180: 2a 20 54 63 6c 5f 43 72 65 61 74 65 43 6c 6f 73 * Tcl_CreateClos
9190: 65 48 61 6e 64 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 eHandler. */.{.
91a0: 20 20 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 AcceptCallbac
91b0: 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 k *acceptCallbac
91c0: 6b 50 74 72 20 3d 20 28 41 63 63 65 70 74 43 61 kPtr = (AcceptCa
91d0: 6c 6c 62 61 63 6b 20 2a 29 63 61 6c 6c 62 61 63 llback *)callbac
91e0: 6b 44 61 74 61 3b 0a 09 09 09 09 2f 2a 20 54 68 kData;...../* Th
91f0: 65 20 61 63 74 75 61 6c 20 64 61 74 61 2e 20 2a e actual data. *
9200: 2f 0a 0a 20 20 20 20 69 66 20 28 61 63 63 65 70 /.. if (accep
9210: 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e tCallbackPtr->in
9220: 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a terp != NULL) {.
9230: 09 55 6e 72 65 67 69 73 74 65 72 54 63 70 53 65 .UnregisterTcpSe
9240: 72 76 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 rverInterpCleanu
9250: 70 50 72 6f 63 28 61 63 63 65 70 74 43 61 6c 6c pProc(acceptCall
9260: 62 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 2c backPtr->interp,
9270: 0a 09 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 ...acceptCallbac
9280: 6b 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 kPtr);. }.
9290: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
92a0: 74 28 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b t(acceptCallback
92b0: 50 74 72 2d 3e 73 63 72 69 70 74 29 3b 0a 20 20 Ptr->script);.
92c0: 20 20 54 63 6c 5f 46 72 65 65 28 61 63 63 65 70 Tcl_Free(accep
92d0: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 7d tCallbackPtr);.}
92e0: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9330: 2a 0a 20 2a 20 54 63 6c 5f 53 6f 63 6b 65 74 4f *. * Tcl_SocketO
9340: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
9350: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
9360: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
9370: 73 73 20 74 68 65 20 22 73 6f 63 6b 65 74 22 20 ss the "socket"
9380: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 Tcl command. See
9390: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 the. *.user doc
93a0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
93b0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
93c0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
93d0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
93e0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
93f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9400: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 cts:. *.Creates
9410: 61 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 a socket based c
9420: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9470: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
9480: 5f 53 6f 63 6b 65 74 4f 62 6a 43 6d 64 28 0a 20 _SocketObjCmd(.
9490: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
94a0: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
94b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
94c0: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
94d0: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 preter. */. i
94e0: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 nt objc,.../* Nu
94f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
9500: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
9510: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
9520: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
9530: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 73 ects. */.{. s
9540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
9550: 20 2a 63 6f 6e 73 74 20 73 6f 63 6b 65 74 4f 70 *const socketOp
9560: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 61 tions[] = {.."-a
9570: 73 79 6e 63 22 2c 20 22 2d 62 61 63 6b 6c 6f 67 sync", "-backlog
9580: 22 2c 20 22 2d 6d 79 61 64 64 72 22 2c 20 22 2d ", "-myaddr", "-
9590: 6d 79 70 6f 72 74 22 2c 20 22 2d 72 65 75 73 65 myport", "-reuse
95a0: 61 64 64 72 22 2c 0a 09 22 2d 72 65 75 73 65 70 addr",.."-reusep
95b0: 6f 72 74 22 2c 20 22 2d 73 65 72 76 65 72 22 2c ort", "-server",
95c0: 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 NULL. };.
95d0: 20 65 6e 75 6d 20 73 6f 63 6b 65 74 4f 70 74 69 enum socketOpti
95e0: 6f 6e 73 45 6e 75 6d 20 7b 0a 09 53 4b 54 5f 41 onsEnum {..SKT_A
95f0: 53 59 4e 43 2c 20 53 4b 54 5f 42 41 43 4b 4c 4f SYNC, SKT_BACKLO
9600: 47 2c 20 53 4b 54 5f 4d 59 41 44 44 52 2c 20 53 G, SKT_MYADDR, S
9610: 4b 54 5f 4d 59 50 4f 52 54 2c 20 53 4b 54 5f 52 KT_MYPORT, SKT_R
9620: 45 55 53 45 41 44 44 52 2c 0a 09 53 4b 54 5f 52 EUSEADDR,..SKT_R
9630: 45 55 53 45 50 4f 52 54 2c 20 53 4b 54 5f 53 45 EUSEPORT, SKT_SE
9640: 52 56 45 52 0a 20 20 20 20 7d 20 6f 70 74 69 6f RVER. } optio
9650: 6e 49 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 nIndex;. int
9660: 61 2c 20 73 65 72 76 65 72 20 3d 20 30 2c 20 6d a, server = 0, m
9670: 79 70 6f 72 74 20 3d 20 30 2c 20 61 73 79 6e 63 yport = 0, async
9680: 20 3d 20 30 2c 20 72 65 75 73 65 70 20 3d 20 2d = 0, reusep = -
9690: 31 2c 0a 09 72 65 75 73 65 61 20 3d 20 2d 31 2c 1,..reusea = -1,
96a0: 20 62 61 63 6b 6c 6f 67 20 3d 20 2d 31 3b 0a 20 backlog = -1;.
96b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
96c0: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 63 flags = 0;. c
96d0: 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74 2c onst char *host,
96e0: 20 2a 70 6f 72 74 2c 20 2a 6d 79 61 64 64 72 20 *port, *myaddr
96f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f = NULL;. Tcl_
9700: 4f 62 6a 20 2a 73 63 72 69 70 74 20 3d 20 4e 55 Obj *script = NU
9710: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e LL;. Tcl_Chan
9720: 6e 65 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20 54 nel chan;.. T
9730: 63 6c 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 3b clInitSockets();
9740: 0a 0a 20 20 20 20 66 6f 72 20 28 61 20 3d 20 31 .. for (a = 1
9750: 3b 20 61 20 3c 20 6f 62 6a 63 3b 20 61 2b 2b 29 ; a < objc; a++)
9760: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
9770: 61 72 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 arg = TclGetStri
9780: 6e 67 28 6f 62 6a 76 5b 61 5d 29 3b 0a 0a 09 69 ng(objv[a]);...i
9790: 66 20 28 61 72 67 5b 30 5d 20 21 3d 20 27 2d 27 f (arg[0] != '-'
97a0: 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ) {.. break;.
97b0: 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 .}..if (Tcl_GetI
97c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 ndexFromObj(inte
97d0: 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 73 6f 63 rp, objv[a], soc
97e0: 6b 65 74 4f 70 74 69 6f 6e 73 2c 20 22 6f 70 74 ketOptions, "opt
97f0: 69 6f 6e 22 2c 0a 09 09 54 43 4c 5f 45 58 41 43 ion",...TCL_EXAC
9800: 54 2c 20 26 6f 70 74 69 6f 6e 49 6e 64 65 78 29 T, &optionIndex)
9810: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
9820: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
9830: 52 4f 52 3b 0a 09 7d 0a 09 73 77 69 74 63 68 20 ROR;..}..switch
9840: 28 6f 70 74 69 6f 6e 49 6e 64 65 78 29 20 7b 0a (optionIndex) {.
9850: 09 63 61 73 65 20 53 4b 54 5f 41 53 59 4e 43 3a .case SKT_ASYNC:
9860: 0a 09 20 20 20 20 69 66 20 28 73 65 72 76 65 72 .. if (server
9870: 20 3d 3d 20 31 29 20 7b 0a 09 09 54 63 6c 5f 53 == 1) {...Tcl_S
9880: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
9890: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e rp, Tcl_NewStrin
98a0: 67 4f 62 6a 28 0a 09 09 09 22 63 61 6e 6e 6f 74 gObj(...."cannot
98b0: 20 73 65 74 20 2d 61 73 79 6e 63 20 6f 70 74 69 set -async opti
98c0: 6f 6e 20 66 6f 72 20 73 65 72 76 65 72 20 73 6f on for server so
98d0: 63 6b 65 74 73 22 2c 20 2d 31 29 29 3b 0a 09 09 ckets", -1));...
98e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
98f0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 61 73 ;.. }.. as
9900: 79 6e 63 20 3d 20 31 3b 0a 09 20 20 20 20 62 72 ync = 1;.. br
9910: 65 61 6b 3b 0a 09 63 61 73 65 20 53 4b 54 5f 4d eak;..case SKT_M
9920: 59 41 44 44 52 3a 0a 09 20 20 20 20 61 2b 2b 3b YADDR:.. a++;
9930: 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d 20 6f .. if (a >= o
9940: 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 bjc) {...Tcl_Set
9950: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
9960: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
9970: 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 75 6d bj(...."no argum
9980: 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 2d 6d ent given for -m
9990: 79 61 64 64 72 20 6f 70 74 69 6f 6e 22 2c 20 2d yaddr option", -
99a0: 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 1));...return TC
99b0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
99c0: 09 20 20 20 20 6d 79 61 64 64 72 20 3d 20 54 63 . myaddr = Tc
99d0: 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b lGetString(objv[
99e0: 61 5d 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b a]);.. break;
99f0: 0a 09 63 61 73 65 20 53 4b 54 5f 4d 59 50 4f 52 ..case SKT_MYPOR
9a00: 54 3a 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 T: {.. const
9a10: 63 68 61 72 20 2a 6d 79 50 6f 72 74 4e 61 6d 65 char *myPortName
9a20: 3b 0a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 ;... a++;..
9a30: 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 if (a >= objc)
9a40: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
9a50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
9a60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a l_NewStringObj(.
9a70: 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 ..."no argument
9a80: 67 69 76 65 6e 20 66 6f 72 20 2d 6d 79 70 6f 72 given for -mypor
9a90: 74 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b t option", -1));
9aa0: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
9ab0: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
9ac0: 20 6d 79 50 6f 72 74 4e 61 6d 65 20 3d 20 54 63 myPortName = Tc
9ad0: 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b lGetString(objv[
9ae0: 61 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 54 63 a]);.. if (Tc
9af0: 6c 53 6f 63 6b 47 65 74 50 6f 72 74 28 69 6e 74 lSockGetPort(int
9b00: 65 72 70 2c 20 6d 79 50 6f 72 74 4e 61 6d 65 2c erp, myPortName,
9b10: 20 22 74 63 70 22 2c 20 26 6d 79 70 6f 72 74 29 "tcp", &myport)
9b20: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 != TCL_OK) {...
9b30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
9b40: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 ;.. }.. br
9b50: 65 61 6b 3b 0a 09 7d 0a 09 63 61 73 65 20 53 4b eak;..}..case SK
9b60: 54 5f 53 45 52 56 45 52 3a 0a 09 20 20 20 20 69 T_SERVER:.. i
9b70: 66 20 28 61 73 79 6e 63 20 3d 3d 20 31 29 20 7b f (async == 1) {
9b80: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
9b90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
9ba0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 NewStringObj(...
9bb0: 09 22 63 61 6e 6e 6f 74 20 73 65 74 20 2d 61 73 ."cannot set -as
9bc0: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 73 ync option for s
9bd0: 65 72 76 65 72 20 73 6f 63 6b 65 74 73 22 2c 20 erver sockets",
9be0: 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 -1));...return T
9bf0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
9c00: 0a 09 20 20 20 20 73 65 72 76 65 72 20 3d 20 31 .. server = 1
9c10: 3b 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 ;.. a++;..
9c20: 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 if (a >= objc)
9c30: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {...Tcl_SetObjRe
9c40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
9c50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 _NewStringObj(..
9c60: 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 .."no argument g
9c70: 69 76 65 6e 20 66 6f 72 20 2d 73 65 72 76 65 72 iven for -server
9c80: 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a option", -1));.
9c90: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9ca0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
9cb0: 73 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 61 5d script = objv[a]
9cc0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
9cd0: 61 73 65 20 53 4b 54 5f 52 45 55 53 45 41 44 44 ase SKT_REUSEADD
9ce0: 52 3a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 R:.. a++;..
9cf0: 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 if (a >= objc)
9d00: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 {...Tcl_SetObjR
9d10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
9d20: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a l_NewStringObj(.
9d30: 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 ..."no argument
9d40: 67 69 76 65 6e 20 66 6f 72 20 2d 72 65 75 73 65 given for -reuse
9d50: 61 64 64 72 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 addr option", -1
9d60: 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ));...return TCL
9d70: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
9d80: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 42 if (Tcl_GetB
9d90: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e ooleanFromObj(in
9da0: 74 65 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 26 terp, objv[a], &
9db0: 72 65 75 73 65 61 29 20 21 3d 20 54 43 4c 5f 4f reusea) != TCL_O
9dc0: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
9dd0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
9de0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
9df0: 65 20 53 4b 54 5f 52 45 55 53 45 50 4f 52 54 3a e SKT_REUSEPORT:
9e00: 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 20 .. a++;..
9e10: 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 7b if (a >= objc) {
9e20: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
9e30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
9e40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 NewStringObj(...
9e50: 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 69 ."no argument gi
9e60: 76 65 6e 20 66 6f 72 20 2d 72 65 75 73 65 70 6f ven for -reusepo
9e70: 72 74 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 rt option", -1))
9e80: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
9e90: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
9ea0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 42 6f 6f if (Tcl_GetBoo
9eb0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
9ec0: 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 26 72 65 rp, objv[a], &re
9ed0: 75 73 65 70 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 usep) != TCL_OK)
9ee0: 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
9ef0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
9f00: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
9f10: 53 4b 54 5f 42 41 43 4b 4c 4f 47 3a 0a 09 20 20 SKT_BACKLOG:..
9f20: 20 20 61 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28 a++;.. if (
9f30: 61 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 09 54 a >= objc) {...T
9f40: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
9f50: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
9f60: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 6e 6f tringObj(...."no
9f70: 20 61 72 67 75 6d 65 6e 74 20 67 69 76 65 6e 20 argument given
9f80: 66 6f 72 20 2d 62 61 63 6b 6c 6f 67 20 6f 70 74 for -backlog opt
9f90: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 ion", -1));...re
9fa0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9fb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 . }.. if (
9fc0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 Tcl_GetIntFromOb
9fd0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61 j(interp, objv[a
9fe0: 5d 2c 20 26 62 61 63 6b 6c 6f 67 29 20 21 3d 20 ], &backlog) !=
9ff0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 TCL_OK) {...retu
a000: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
a010: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b }.. break;
a020: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
a030: 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c 5f 53 Tcl_Panic("Tcl_S
a040: 6f 63 6b 65 74 4f 62 6a 43 6d 64 3a 20 62 61 64 ocketObjCmd: bad
a050: 20 6f 70 74 69 6f 6e 20 69 6e 64 65 78 20 74 6f option index to
a060: 20 53 6f 63 6b 65 74 4f 70 74 69 6f 6e 73 22 29 SocketOptions")
a070: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 ;..}. }. i
a080: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 68 6f f (server) {..ho
a090: 73 74 20 3d 20 6d 79 61 64 64 72 3b 09 09 2f 2a st = myaddr;../*
a0a0: 20 4e 55 4c 4c 20 69 6d 70 6c 69 65 73 20 49 4e NULL implies IN
a0b0: 41 44 44 52 5f 41 4e 59 20 2a 2f 0a 09 69 66 20 ADDR_ANY */..if
a0c0: 28 6d 79 70 6f 72 74 20 21 3d 20 30 29 20 7b 0a (myport != 0) {.
a0d0: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
a0e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
a0f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a l_NewStringObj(.
a100: 09 09 20 20 20 20 22 6f 70 74 69 6f 6e 20 2d 6d .. "option -m
a110: 79 70 6f 72 74 20 69 73 20 6e 6f 74 20 76 61 6c yport is not val
a120: 69 64 20 66 6f 72 20 73 65 72 76 65 72 73 22 2c id for servers",
a130: 20 2d 31 29 29 3b 0a 09 20 20 20 20 72 65 74 75 -1));.. retu
a140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a150: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
a160: 61 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 68 6f 73 a < objc) {..hos
a170: 74 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 t = TclGetString
a180: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 09 61 2b 2b 3b (objv[a]);..a++;
a190: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 49 . } else {..I
a1a0: 6e 74 65 72 70 20 2a 69 50 74 72 3b 0a 0a 20 20 nterp *iPtr;..
a1b0: 20 20 77 72 6f 6e 67 4e 75 6d 41 72 67 73 3a 0a wrongNumArgs:.
a1c0: 09 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 .iPtr = (Interp
a1d0: 2a 29 20 69 6e 74 65 72 70 3b 0a 09 54 63 6c 5f *) interp;..Tcl_
a1e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
a1f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 09 09 erp, 1, objv,...
a200: 22 3f 2d 61 73 79 6e 63 3f 20 3f 2d 6d 79 61 64 "?-async? ?-myad
a210: 64 72 20 61 64 64 72 3f 20 3f 2d 6d 79 70 6f 72 dr addr? ?-mypor
a220: 74 20 6d 79 70 6f 72 74 3f 20 68 6f 73 74 20 70 t myport? host p
a230: 6f 72 74 22 29 3b 0a 09 69 50 74 72 2d 3e 66 6c ort");..iPtr->fl
a240: 61 67 73 20 7c 3d 20 49 4e 54 45 52 50 5f 41 4c ags |= INTERP_AL
a250: 54 45 52 4e 41 54 45 5f 57 52 4f 4e 47 5f 41 52 TERNATE_WRONG_AR
a260: 47 53 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 GS;..Tcl_WrongNu
a270: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
a280: 20 6f 62 6a 76 2c 0a 09 09 22 2d 73 65 72 76 65 objv,..."-serve
a290: 72 20 63 6f 6d 6d 61 6e 64 20 3f 2d 62 61 63 6b r command ?-back
a2a0: 6c 6f 67 20 63 6f 75 6e 74 3f 20 3f 2d 6d 79 61 log count? ?-mya
a2b0: 64 64 72 20 61 64 64 72 3f 20 22 0a 09 09 22 3f ddr addr? "..."?
a2c0: 2d 72 65 75 73 65 61 64 64 72 20 62 6f 6f 6c 65 -reuseaddr boole
a2d0: 61 6e 3f 20 3f 2d 72 65 75 73 65 70 6f 72 74 20 an? ?-reuseport
a2e0: 62 6f 6f 6c 65 61 6e 3f 20 70 6f 72 74 22 29 3b boolean? port");
a2f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a300: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
a310: 66 20 28 21 73 65 72 76 65 72 20 26 26 20 28 72 f (!server && (r
a320: 65 75 73 65 61 20 21 3d 20 2d 31 20 7c 7c 20 72 eusea != -1 || r
a330: 65 75 73 65 70 20 21 3d 20 2d 31 20 7c 7c 20 62 eusep != -1 || b
a340: 61 63 6b 6c 6f 67 20 21 3d 20 2d 31 29 29 20 7b acklog != -1)) {
a350: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
a360: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
a370: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 ewStringObj(..."
a380: 6f 70 74 69 6f 6e 73 20 2d 62 61 63 6b 6c 6f 67 options -backlog
a390: 2c 20 2d 72 65 75 73 65 61 64 64 72 2c 20 61 6e , -reuseaddr, an
a3a0: 64 20 2d 72 65 75 73 65 70 6f 72 74 20 61 72 65 d -reuseport are
a3b0: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 22 0a 09 09 only valid "...
a3c0: 22 66 6f 72 20 73 65 72 76 65 72 73 22 2c 20 2d "for servers", -
a3d0: 31 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 1));..return TCL
a3e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
a3f0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74 /*. * Set
a400: 20 74 68 65 20 6f 70 74 69 6f 6e 73 20 74 6f 20 the options to
a410: 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 their default va
a420: 6c 75 65 20 69 66 20 74 68 65 20 75 73 65 72 20 lue if the user
a430: 64 69 64 6e 27 74 20 6f 76 65 72 72 69 64 65 0a didn't override.
a440: 20 20 20 20 20 2a 20 74 68 65 69 72 20 76 61 6c * their val
a450: 75 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ue.. */..
a460: 20 69 66 20 28 72 65 75 73 65 70 20 3d 3d 20 2d if (reusep == -
a470: 31 29 20 7b 0a 09 72 65 75 73 65 70 20 3d 20 30 1) {..reusep = 0
a480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
a490: 72 65 75 73 65 61 20 3d 3d 20 2d 31 29 20 7b 0a reusea == -1) {.
a4a0: 09 72 65 75 73 65 61 20 3d 20 31 3b 0a 20 20 20 .reusea = 1;.
a4b0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
a4c0: 2a 20 42 75 69 6c 64 20 74 68 65 20 62 69 74 73 * Build the bits
a4d0: 65 74 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 et with the flag
a4e0: 73 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a s values.. *
a4f0: 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 75 73 65 /.. if (reuse
a500: 61 29 20 7b 0a 09 66 6c 61 67 73 20 7c 3d 20 54 a) {..flags |= T
a510: 43 4c 5f 54 43 50 53 45 52 56 45 52 5f 52 45 55 CL_TCPSERVER_REU
a520: 53 45 41 44 44 52 3b 0a 20 20 20 20 7d 0a 20 20 SEADDR;. }.
a530: 20 20 69 66 20 28 72 65 75 73 65 70 29 20 7b 0a if (reusep) {.
a540: 09 66 6c 61 67 73 20 7c 3d 20 54 43 4c 5f 54 43 .flags |= TCL_TC
a550: 50 53 45 52 56 45 52 5f 52 45 55 53 45 50 4f 52 PSERVER_REUSEPOR
a560: 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a T;. }.. /*
a570: 0a 20 20 20 20 20 2a 20 41 6c 6c 20 74 68 65 20 . * All the
a580: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 arguments should
a590: 20 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 have been parse
a5a0: 64 20 62 79 20 6e 6f 77 2c 20 27 61 27 20 70 6f d by now, 'a' po
a5b0: 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 20 20 ints to the.
a5c0: 20 2a 20 6c 61 73 74 20 6f 6e 65 2c 20 74 68 65 * last one, the
a5d0: 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 port number..
a5e0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61 */.. if (a
a5f0: 20 21 3d 20 6f 62 6a 63 2d 31 29 20 7b 0a 09 67 != objc-1) {..g
a600: 6f 74 6f 20 77 72 6f 6e 67 4e 75 6d 41 72 67 73 oto wrongNumArgs
a610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 6f 72 ;. }.. por
a620: 74 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 t = TclGetString
a630: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 0a 20 20 20 20 (objv[a]);..
a640: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 41 if (server) {..A
a650: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 cceptCallback *a
a660: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
a670: 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61 = (AcceptCallba
a680: 63 6b 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 ck *)Tcl_Alloc(s
a690: 69 7a 65 6f 66 28 41 63 63 65 70 74 43 61 6c 6c izeof(AcceptCall
a6a0: 62 61 63 6b 29 29 3b 0a 0a 09 54 63 6c 5f 49 6e back));...Tcl_In
a6b0: 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 crRefCount(scrip
a6c0: 74 29 3b 0a 09 61 63 63 65 70 74 43 61 6c 6c 62 t);..acceptCallb
a6d0: 61 63 6b 50 74 72 2d 3e 73 63 72 69 70 74 20 3d ackPtr->script =
a6e0: 20 73 63 72 69 70 74 3b 0a 09 61 63 63 65 70 74 script;..accept
a6f0: 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74 CallbackPtr->int
a700: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 09 erp = interp;...
a710: 63 68 61 6e 20 3d 20 54 63 6c 5f 4f 70 65 6e 54 chan = Tcl_OpenT
a720: 63 70 53 65 72 76 65 72 45 78 28 69 6e 74 65 72 cpServerEx(inter
a730: 70 2c 20 70 6f 72 74 2c 20 68 6f 73 74 2c 20 66 p, port, host, f
a740: 6c 61 67 73 2c 20 62 61 63 6b 6c 6f 67 2c 0a 09 lags, backlog,..
a750: 09 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 .AcceptCallbackP
a760: 72 6f 63 2c 20 61 63 63 65 70 74 43 61 6c 6c 62 roc, acceptCallb
a770: 61 63 6b 50 74 72 29 3b 0a 09 69 66 20 28 63 68 ackPtr);..if (ch
a780: 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 an == NULL) {..
a790: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
a7a0: 75 6e 74 28 73 63 72 69 70 74 29 3b 0a 09 20 20 unt(script);..
a7b0: 20 20 54 63 6c 5f 46 72 65 65 28 61 63 63 65 70 Tcl_Free(accep
a7c0: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 09 tCallbackPtr);..
a7d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
a7e0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 RROR;..}.../*..
a7f0: 2a 20 52 65 67 69 73 74 65 72 20 77 69 74 68 20 * Register with
a800: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
a810: 74 6f 20 6c 65 74 20 75 73 20 6b 6e 6f 77 20 77 to let us know w
a820: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 hen the interpre
a830: 74 65 72 0a 09 20 2a 20 69 73 20 64 65 6c 65 74 ter.. * is delet
a840: 65 64 20 28 62 79 20 68 61 76 69 6e 67 20 74 68 ed (by having th
a850: 65 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 74 e callback set t
a860: 68 65 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 he interp field
a870: 6f 66 20 74 68 65 0a 09 20 2a 20 61 63 63 65 70 of the.. * accep
a880: 74 43 61 6c 6c 62 61 63 6b 50 74 72 27 73 20 73 tCallbackPtr's s
a890: 74 72 75 63 74 75 72 65 20 74 6f 20 4e 55 4c 4c tructure to NULL
a8a0: 29 2e 20 54 68 69 73 20 69 73 20 74 6f 20 61 76 ). This is to av
a8b0: 6f 69 64 20 74 72 79 69 6e 67 20 74 6f 0a 09 20 oid trying to..
a8c0: 2a 20 65 76 61 6c 20 74 68 65 20 73 63 72 69 70 * eval the scrip
a8d0: 74 20 69 6e 20 61 20 64 65 6c 65 74 65 64 20 69 t in a deleted i
a8e0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 09 20 2a 2f nterpreter... */
a8f0: 0a 0a 09 52 65 67 69 73 74 65 72 54 63 70 53 65 ...RegisterTcpSe
a900: 72 76 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 rverInterpCleanu
a910: 70 28 69 6e 74 65 72 70 2c 20 61 63 63 65 70 74 p(interp, accept
a920: 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 0a 09 CallbackPtr);...
a930: 2f 2a 0a 09 20 2a 20 52 65 67 69 73 74 65 72 20 /*.. * Register
a940: 61 20 63 6c 6f 73 65 20 63 61 6c 6c 62 61 63 6b a close callback
a950: 2e 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 . This callback
a960: 77 69 6c 6c 20 69 6e 66 6f 72 6d 20 74 68 65 0a will inform the.
a970: 09 20 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20 . * interpreter
a980: 28 69 66 20 69 74 20 73 74 69 6c 6c 20 65 78 69 (if it still exi
a990: 73 74 73 29 20 74 68 61 74 20 74 68 69 73 20 63 sts) that this c
a9a0: 68 61 6e 6e 65 6c 20 64 6f 65 73 20 6e 6f 74 20 hannel does not
a9b0: 6e 65 65 64 20 74 6f 0a 09 20 2a 20 62 65 20 69 need to.. * be i
a9c0: 6e 66 6f 72 6d 65 64 20 77 68 65 6e 20 74 68 65 nformed when the
a9d0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 interpreter is
a9e0: 64 65 6c 65 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 deleted... */...
a9f0: 54 63 6c 5f 43 72 65 61 74 65 43 6c 6f 73 65 48 Tcl_CreateCloseH
aa00: 61 6e 64 6c 65 72 28 63 68 61 6e 2c 20 54 63 70 andler(chan, Tcp
aa10: 53 65 72 76 65 72 43 6c 6f 73 65 50 72 6f 63 2c ServerCloseProc,
aa20: 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 acceptCallbackP
aa30: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 tr);. } else
aa40: 7b 0a 09 69 6e 74 20 70 6f 72 74 4e 75 6d 3b 0a {..int portNum;.
aa50: 0a 09 69 66 20 28 54 63 6c 53 6f 63 6b 47 65 74 ..if (TclSockGet
aa60: 50 6f 72 74 28 69 6e 74 65 72 70 2c 20 70 6f 72 Port(interp, por
aa70: 74 2c 20 22 74 63 70 22 2c 20 26 70 6f 72 74 4e t, "tcp", &portN
aa80: 75 6d 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b um) != TCL_OK) {
aa90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
aaa0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 63 68 61 _ERROR;..}...cha
aab0: 6e 20 3d 20 54 63 6c 5f 4f 70 65 6e 54 63 70 43 n = Tcl_OpenTcpC
aac0: 6c 69 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 6f lient(interp, po
aad0: 72 74 4e 75 6d 2c 20 68 6f 73 74 2c 20 6d 79 61 rtNum, host, mya
aae0: 64 64 72 2c 20 6d 79 70 6f 72 74 2c 20 61 73 79 ddr, myport, asy
aaf0: 6e 63 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d nc);..if (chan =
ab00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 = NULL) {.. r
ab10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
ab20: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 ..}. }.. T
ab30: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e cl_RegisterChann
ab40: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 el(interp, chan)
ab50: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
ab60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
ab70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
ab80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 Tcl_GetChannelNa
ab90: 6d 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a me(chan), -1));.
aba0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
abb0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac00: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 63 6f --. *. * Tcl_Fco
ac10: 70 79 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 pyObjCmd --. *.
ac20: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
ac30: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
ac40: 6f 63 65 73 73 20 74 68 65 20 22 66 63 6f 70 79 ocess the "fcopy
ac50: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 " Tcl command. S
ac60: 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 ee the. *.user d
ac70: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 ocumentation for
ac80: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 details on what
ac90: 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 it does.. *. *
aca0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
acb0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
acc0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
acd0: 66 65 63 74 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 fects:. *.Moves
ace0: 64 61 74 61 20 62 65 74 77 65 65 6e 20 74 77 6f data between two
acf0: 20 63 68 61 6e 6e 65 6c 73 20 61 6e 64 20 70 6f channels and po
ad00: 73 73 69 62 6c 79 20 73 65 74 73 20 75 70 20 61 ssibly sets up a
ad10: 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 70 79 background copy
ad20: 0a 20 2a 09 68 61 6e 64 6c 65 72 2e 0a 20 2a 0a . *.handler.. *.
ad30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
ad80: 74 0a 54 63 6c 5f 46 63 6f 70 79 4f 62 6a 43 6d t.Tcl_FcopyObjCm
ad90: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
ada0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
adb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
adc0: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 p,../* Current i
add0: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 nterpreter. */.
ade0: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f int objc,.../
adf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
ae00: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
ae10: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
ae20: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 v[])./* Argument
ae30: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 objects. */.{.
ae40: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 69 Tcl_Channel i
ae50: 6e 43 68 61 6e 2c 20 6f 75 74 43 68 61 6e 3b 0a nChan, outChan;.
ae60: 20 20 20 20 69 6e 74 20 6d 6f 64 65 2c 20 69 2c int mode, i,
ae70: 20 69 6e 64 65 78 3b 0a 20 20 20 20 54 63 6c 5f index;. Tcl_
ae80: 57 69 64 65 49 6e 74 20 74 6f 52 65 61 64 3b 0a WideInt toRead;.
ae90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 Tcl_Obj *cmd
aea0: 50 74 72 3b 0a 20 20 20 20 73 74 61 74 69 63 20 Ptr;. static
aeb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 const char *cons
aec0: 74 20 73 77 69 74 63 68 65 73 5b 5d 20 3d 20 7b t switches[] = {
aed0: 20 22 2d 73 69 7a 65 22 2c 20 22 2d 63 6f 6d 6d "-size", "-comm
aee0: 61 6e 64 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 and", NULL };.
aef0: 20 20 65 6e 75 6d 20 7b 20 46 63 6f 70 79 53 69 enum { FcopySi
af00: 7a 65 2c 20 46 63 6f 70 79 43 6f 6d 6d 61 6e 64 ze, FcopyCommand
af10: 20 7d 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 };.. if ((ob
af20: 6a 63 20 3c 20 33 29 20 7c 7c 20 28 6f 62 6a 63 jc < 3) || (objc
af30: 20 3e 20 37 29 20 7c 7c 20 28 6f 62 6a 63 20 3d > 7) || (objc =
af40: 3d 20 34 29 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d = 4) || (objc ==
af50: 20 36 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 6)) {..Tcl_Wron
af60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
af70: 20 31 2c 20 6f 62 6a 76 2c 0a 09 09 22 69 6e 70 1, objv,..."inp
af80: 75 74 20 6f 75 74 70 75 74 20 3f 2d 73 69 7a 65 ut output ?-size
af90: 20 73 69 7a 65 3f 20 3f 2d 63 6f 6d 6d 61 6e 64 size? ?-command
afa0: 20 63 61 6c 6c 62 61 63 6b 3f 22 29 3b 0a 09 72 callback?");..r
afb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
afc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
afd0: 20 20 20 20 2a 20 50 61 72 73 65 20 74 68 65 20 * Parse the
afe0: 63 68 61 6e 6e 65 6c 20 61 72 67 75 6d 65 6e 74 channel argument
aff0: 73 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 61 s and verify tha
b000: 74 20 74 68 65 79 20 61 72 65 20 72 65 61 64 61 t they are reada
b010: 62 6c 65 20 6f 72 0a 20 20 20 20 20 2a 20 77 72 ble or. * wr
b020: 69 74 61 62 6c 65 2c 20 61 73 20 61 70 70 72 6f itable, as appro
b030: 70 72 69 61 74 65 2e 0a 20 20 20 20 20 2a 2f 0a priate.. */.
b040: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 . if (TclGetC
b050: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e hannelFromObj(in
b060: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 terp, objv[1], &
b070: 69 6e 43 68 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 inChan, &mode, 0
b080: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
b090: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b0a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
b0b0: 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f 52 45 41 !(mode & TCL_REA
b0c0: 44 41 42 4c 45 29 29 20 7b 0a 09 54 63 6c 5f 53 DABLE)) {..Tcl_S
b0d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
b0e0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
b0f0: 66 28 0a 09 09 22 63 68 61 6e 6e 65 6c 20 5c 22 f(..."channel \"
b100: 25 73 5c 22 20 77 61 73 6e 27 74 20 6f 70 65 6e %s\" wasn't open
b110: 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c ed for reading",
b120: 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 ...TclGetString(
b130: 6f 62 6a 76 5b 31 5d 29 29 29 3b 0a 09 72 65 74 objv[1])));..ret
b140: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b150: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
b160: 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 GetChannelFromOb
b170: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
b180: 5d 2c 20 26 6f 75 74 43 68 61 6e 2c 20 26 6d 6f ], &outChan, &mo
b190: 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b de, 0) != TCL_OK
b1a0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
b1b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
b1c0: 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 if (!(mode & TC
b1d0: 4c 5f 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09 L_WRITABLE)) {..
b1e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
b1f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
b200: 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 6e 6e Printf(..."chann
b210: 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e 27 74 el \"%s\" wasn't
b220: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 opened for writ
b230: 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 ing",...TclGetSt
b240: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 29 3b ring(objv[2])));
b250: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b260: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 OR;. }.. t
b270: 6f 52 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 oRead = -1;.
b280: 63 6d 64 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 cmdPtr = NULL;.
b290: 20 20 20 66 6f 72 20 28 69 20 3d 20 33 3b 20 69 for (i = 3; i
b2a0: 20 3c 20 6f 62 6a 63 3b 20 69 20 2b 3d 20 32 29 < objc; i += 2)
b2b0: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 {..if (Tcl_GetI
b2c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 ndexFromObj(inte
b2d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 73 77 69 rp, objv[i], swi
b2e0: 74 63 68 65 73 2c 20 22 6f 70 74 69 6f 6e 22 2c tches, "option",
b2f0: 20 30 2c 0a 09 09 26 69 6e 64 65 78 29 20 21 3d 0,...&index) !=
b300: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
b310: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b320: 3b 0a 09 7d 0a 09 73 77 69 74 63 68 20 28 69 6e ;..}..switch (in
b330: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 46 63 6f dex) {..case Fco
b340: 70 79 53 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 pySize:.. if
b350: 28 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 (Tcl_GetWideIntF
b360: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
b370: 62 6a 76 5b 69 2b 31 5d 2c 20 26 74 6f 52 65 61 bjv[i+1], &toRea
b380: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
b390: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b3a0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
b3b0: 69 66 20 28 74 6f 52 65 61 64 20 3c 20 30 29 20 if (toRead < 0)
b3c0: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 48 61 6e 64 {.../*... * Hand
b3d0: 6c 65 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 le all negative
b3e0: 73 69 7a 65 73 20 6c 69 6b 65 20 2d 31 2c 20 6d sizes like -1, m
b3f0: 65 61 6e 69 6e 67 20 27 63 6f 70 79 20 61 6c 6c eaning 'copy all
b400: 27 2e 20 42 79 0a 09 09 20 2a 20 72 65 73 65 74 '. By... * reset
b410: 74 69 6e 67 20 74 6f 52 65 61 64 20 77 65 20 61 ting toRead we a
b420: 76 6f 69 64 20 63 68 61 6e 67 65 73 20 69 6e 20 void changes in
b430: 74 68 65 20 63 6f 72 65 20 63 6f 70 79 69 6e 67 the core copying
b440: 0a 09 09 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 ... * functions
b450: 28 77 68 69 63 68 20 65 78 70 6c 69 63 69 74 6c (which explicitl
b460: 79 20 63 68 65 63 6b 20 66 6f 72 20 2d 31 20 61 y check for -1 a
b470: 6e 64 20 63 72 61 73 68 20 6f 6e 20 61 6e 79 0a nd crash on any.
b480: 09 09 20 2a 20 6f 74 68 65 72 20 6e 65 67 61 74 .. * other negat
b490: 69 76 65 20 76 61 6c 75 65 29 2e 0a 09 09 20 2a ive value).... *
b4a0: 2f 0a 0a 09 09 74 6f 52 65 61 64 20 3d 20 2d 31 /....toRead = -1
b4b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 ;.. }.. br
b4c0: 65 61 6b 3b 0a 09 63 61 73 65 20 46 63 6f 70 79 eak;..case Fcopy
b4d0: 43 6f 6d 6d 61 6e 64 3a 0a 09 20 20 20 20 63 6d Command:.. cm
b4e0: 64 50 74 72 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d dPtr = objv[i+1]
b4f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d ;.. break;..}
b500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
b510: 72 6e 20 54 63 6c 43 6f 70 79 43 68 61 6e 6e 65 rn TclCopyChanne
b520: 6c 28 69 6e 74 65 72 70 2c 20 69 6e 43 68 61 6e l(interp, inChan
b530: 2c 20 6f 75 74 43 68 61 6e 2c 20 74 6f 52 65 61 , outChan, toRea
b540: 64 2c 20 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a d, cmdPtr);.}...
b550: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
b560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5a0: 0a 20 2a 0a 20 2a 20 43 68 61 6e 50 65 6e 64 69 . *. * ChanPendi
b5b0: 6e 67 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 ngObjCmd --. *.
b5c0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
b5d0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 is invoked to pr
b5e0: 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 63 ocess the Tcl "c
b5f0: 68 61 6e 20 70 65 6e 64 69 6e 67 22 20 63 6f 6d han pending" com
b600: 6d 61 6e 64 0a 20 2a 09 28 54 49 50 20 23 32 38 mand. *.(TIP #28
b610: 37 29 2e 20 53 65 65 20 74 68 65 20 75 73 65 72 7). See the user
b620: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
b630: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
b640: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 at it does.. *.
b650: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
b660: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
b670: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
b680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
b690: 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 interp's result
b6a0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f to the number o
b6b0: 66 20 62 79 74 65 73 20 6f 66 20 62 75 66 66 65 f bytes of buffe
b6c0: 72 65 64 20 69 6e 70 75 74 20 6f 72 0a 20 2a 09 red input or. *.
b6d0: 6f 75 74 70 75 74 20 28 64 65 70 65 6e 64 69 6e output (dependin
b6e0: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 g on whether the
b6f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 first argument
b700: 69 73 20 22 69 6e 70 75 74 22 20 6f 72 0a 20 2a is "input" or. *
b710: 09 22 6f 75 74 70 75 74 22 29 2c 20 6f 72 20 2d ."output"), or -
b720: 31 20 69 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 1 if the channel
b730: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 wasn't opened f
b740: 6f 72 20 74 68 61 74 20 6d 6f 64 65 2e 0a 20 2a or that mode.. *
b750: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
b760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b7a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 */..static int.C
b7b0: 68 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 hanPendingObjCmd
b7c0: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 (. TCL_UNUSED
b7d0: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 (void *),. Tc
b7e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
b7f0: 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e ,../* Current in
b800: 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 terpreter. */.
b810: 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a int objc,.../*
b820: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d Number of argum
b830: 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c ents. */. Tcl
b840: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
b850: 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 [])./* Argument
b860: 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 objects. */.{.
b870: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 Tcl_Channel ch
b880: 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 an;. int mode
b890: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e ;. static con
b8a0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f st char *const o
b8b0: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 22 69 6e 70 ptions[] = {"inp
b8c0: 75 74 22 2c 20 22 6f 75 74 70 75 74 22 2c 20 4e ut", "output", N
b8d0: 55 4c 4c 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 ULL};. enum p
b8e0: 65 6e 64 69 6e 67 4f 70 74 69 6f 6e 73 45 6e 75 endingOptionsEnu
b8f0: 6d 20 7b 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 m {PENDING_INPUT
b900: 2c 20 50 45 4e 44 49 4e 47 5f 4f 55 54 50 55 54 , PENDING_OUTPUT
b910: 7d 20 69 6e 64 65 78 3b 0a 0a 20 20 20 20 69 66 } index;.. if
b920: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 (objc != 3) {..
b930: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
b940: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
b950: 2c 20 22 6d 6f 64 65 20 63 68 61 6e 6e 65 6c 49 , "mode channelI
b960: 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c d");..return TCL
b970: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
b980: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
b990: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
b9a0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 6f 70 74 69 p, objv[1], opti
b9b0: 6f 6e 73 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 0a ons, "mode", 0,.
b9c0: 09 20 20 20 20 26 69 6e 64 65 78 29 20 21 3d 20 . &index) !=
b9d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 TCL_OK) {..retur
b9e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b9f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 47 }.. if (TclG
ba00: 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a etChannelFromObj
ba10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
ba20: 2c 20 26 63 68 61 6e 2c 20 26 6d 6f 64 65 2c 20 , &chan, &mode,
ba30: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 0) != TCL_OK) {.
ba40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
ba50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 R;. }.. sw
ba60: 69 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 20 itch (index) {.
ba70: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f case PENDING_
ba80: 49 4e 50 55 54 3a 0a 09 69 66 20 28 21 28 6d 6f INPUT:..if (!(mo
ba90: 64 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c de & TCL_READABL
baa0: 45 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 E)) {.. Tcl_S
bab0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
bac0: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 rp, Tcl_NewWideI
bad0: 6e 74 4f 62 6a 28 2d 31 29 29 3b 0a 09 7d 20 65 ntObj(-1));..} e
bae0: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 lse {.. Tcl_S
baf0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
bb00: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 rp, Tcl_NewWideI
bb10: 6e 74 4f 62 6a 28 54 63 6c 5f 49 6e 70 75 74 42 ntObj(Tcl_InputB
bb20: 75 66 66 65 72 65 64 28 63 68 61 6e 29 29 29 3b uffered(chan)));
bb30: 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ..}..break;.
bb40: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4f 55 54 case PENDING_OUT
bb50: 50 55 54 3a 0a 09 69 66 20 28 21 28 6d 6f 64 65 PUT:..if (!(mode
bb60: 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 & TCL_WRITABLE)
bb70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 ) {.. Tcl_Set
bb80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
bb90: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 , Tcl_NewWideInt
bba0: 4f 62 6a 28 2d 31 29 29 3b 0a 09 7d 20 65 6c 73 Obj(-1));..} els
bbb0: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 e {.. Tcl_Set
bbc0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
bbd0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 , Tcl_NewWideInt
bbe0: 4f 62 6a 28 54 63 6c 5f 4f 75 74 70 75 74 42 75 Obj(Tcl_OutputBu
bbf0: 66 66 65 72 65 64 28 63 68 61 6e 29 29 29 3b 0a ffered(chan)));.
bc00: 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d .}..break;. }
bc10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
bc20: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 68 61 6e 54 72 ---. *. * ChanTr
bc80: 75 6e 63 61 74 65 4f 62 6a 43 6d 64 20 2d 2d 0a uncateObjCmd --.
bc90: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
bca0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ion is invoked t
bcb0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 63 o process the "c
bcc0: 68 61 6e 20 74 72 75 6e 63 61 74 65 22 20 54 63 han truncate" Tc
bcd0: 6c 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 l command.. *.Se
bce0: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d e the user docum
bcf0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
bd00: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
bd10: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 does.. *. * Resu
bd20: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
bd30: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
bd40: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
bd50: 73 3a 0a 20 2a 09 54 72 75 6e 63 61 74 65 73 20 s:. *.Truncates
bd60: 61 20 63 68 61 6e 6e 65 6c 20 28 6f 72 20 72 61 a channel (or ra
bd70: 74 68 65 72 20 61 20 66 69 6c 65 20 75 6e 64 65 ther a file unde
bd80: 72 6c 79 69 6e 67 20 61 20 63 68 61 6e 6e 65 6c rlying a channel
bd90: 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ).. *. *--------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
bde0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 */..static int.C
bdf0: 68 61 6e 54 72 75 6e 63 61 74 65 4f 62 6a 43 6d hanTruncateObjCm
be00: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
be10: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
be20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
be30: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 p,../* Current i
be40: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 nterpreter. */.
be50: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f int objc,.../
be60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
be70: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
be80: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
be90: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 v[])./* Argument
bea0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 objects. */.{.
beb0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
bec0: 68 61 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 han;. Tcl_Wid
bed0: 65 49 6e 74 20 6c 65 6e 67 74 68 3b 0a 0a 20 20 eInt length;..
bee0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 if ((objc < 2)
bef0: 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 33 29 29 20 || (objc > 3))
bf00: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
bf10: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
bf20: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64 20 bjv, "channelId
bf30: 3f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 65 74 ?length?");..ret
bf40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
bf50: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
bf60: 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 GetChannelFromOb
bf70: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 j(interp, objv[1
bf80: 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 ], &chan, NULL,
bf90: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 0) != TCL_OK) {.
bfa0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
bfb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
bfc0: 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 (objc == 3) {..
bfd0: 2f 2a 0a 09 20 2a 20 55 73 65 72 20 69 73 20 73 /*.. * User is s
bfe0: 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 78 70 6c upplying an expl
bff0: 69 63 69 74 20 6c 65 6e 67 74 68 2e 0a 09 20 2a icit length... *
c000: 2f 0a 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 57 /...if (Tcl_GetW
c010: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e ideIntFromObj(in
c020: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 terp, objv[2], &
c030: 6c 65 6e 67 74 68 29 20 21 3d 20 54 43 4c 5f 4f length) != TCL_O
c040: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e K) {.. return
c050: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 TCL_ERROR;..}..
c060: 69 66 20 28 6c 65 6e 67 74 68 20 3c 20 30 29 20 if (length < 0)
c070: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 {.. Tcl_SetOb
c080: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
c090: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
c0a0: 28 0a 09 09 20 20 20 20 22 63 61 6e 6e 6f 74 20 (... "cannot
c0b0: 74 72 75 6e 63 61 74 65 20 74 6f 20 6e 65 67 61 truncate to nega
c0c0: 74 69 76 65 20 6c 65 6e 67 74 68 20 6f 66 20 66 tive length of f
c0d0: 69 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 ile", -1));..
c0e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
c0f0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 R;..}. } else
c100: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 55 73 65 72 20 {../*.. * User
c110: 77 61 6e 74 73 20 74 6f 20 74 72 75 6e 63 61 74 wants to truncat
c120: 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 e to the current
c130: 20 66 69 6c 65 20 70 6f 73 69 74 69 6f 6e 2e 0a file position..
c140: 09 20 2a 2f 0a 0a 09 6c 65 6e 67 74 68 20 3d 20 . */...length =
c150: 54 63 6c 5f 54 65 6c 6c 28 63 68 61 6e 29 3b 0a Tcl_Tell(chan);.
c160: 09 69 66 20 28 6c 65 6e 67 74 68 20 3d 3d 20 2d .if (length == -
c170: 31 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 1) {.. Tcl_Se
c180: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
c190: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
c1a0: 28 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 20 6e (... "could n
c1b0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 63 75 72 ot determine cur
c1c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e rent location in
c1d0: 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 \"%s\": %s",...
c1e0: 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 TclGetString
c1f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 54 63 6c 5f 50 (objv[1]), Tcl_P
c200: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 osixError(interp
c210: 29 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e )));.. return
c220: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
c230: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
c240: 6c 5f 54 72 75 6e 63 61 74 65 43 68 61 6e 6e 65 l_TruncateChanne
c250: 6c 28 63 68 61 6e 2c 20 6c 65 6e 67 74 68 29 20 l(chan, length)
c260: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
c270: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
c280: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
c290: 69 6e 74 66 28 0a 09 09 22 65 72 72 6f 72 20 64 intf(..."error d
c2a0: 75 72 69 6e 67 20 74 72 75 6e 63 61 74 65 20 6f uring truncate o
c2b0: 6e 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 n \"%s\": %s",..
c2c0: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 .TclGetString(ob
c2d0: 6a 76 5b 31 5d 29 2c 20 54 63 6c 5f 50 6f 73 69 jv[1]), Tcl_Posi
c2e0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 29 29 xError(interp)))
c2f0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
c300: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
c310: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
c320: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
c330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c370: 2a 0a 20 2a 20 43 68 61 6e 50 69 70 65 4f 62 6a *. * ChanPipeObj
c380: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
c390: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
c3a0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
c3b0: 20 74 68 65 20 22 63 68 61 6e 20 70 69 70 65 22 the "chan pipe"
c3c0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a Tcl command.. *
c3d0: 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f .See the user do
c3e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 cumentation for
c3f0: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 details on what
c400: 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 it does.. *. * R
c410: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
c420: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
c430: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
c440: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 ects:. *.Creates
c450: 20 61 20 70 61 69 72 20 6f 66 20 54 63 6c 20 63 a pair of Tcl c
c460: 68 61 6e 6e 65 6c 73 20 77 72 61 70 70 69 6e 67 hannels wrapping
c470: 20 62 6f 74 68 20 65 6e 64 73 20 6f 66 20 61 20 both ends of a
c480: 6e 65 77 0a 20 2a 09 61 6e 6f 6e 79 6d 6f 75 73 new. *.anonymous
c490: 20 70 69 70 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d pipe.. *. *----
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c4e0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
c4f0: 6e 74 0a 43 68 61 6e 50 69 70 65 4f 62 6a 43 6d nt.ChanPipeObjCm
c500: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 d(. TCL_UNUSE
c510: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 D(void *),. T
c520: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
c530: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 p,../* Current i
c540: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 nterpreter. */.
c550: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f int objc,.../
c560: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
c570: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
c580: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
c590: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 v[])./* Argument
c5a0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 objects. */.{.
c5b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72 Tcl_Channel r
c5c0: 63 68 61 6e 2c 20 77 63 68 61 6e 3b 0a 20 20 20 chan, wchan;.
c5d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 const char *cha
c5e0: 6e 6e 65 6c 4e 61 6d 65 73 5b 32 5d 3b 0a 20 20 nnelNames[2];.
c5f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
c600: 74 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 6f tPtr;.. if (o
c610: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c bjc != 1) {..Tcl
c620: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
c630: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
c640: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
c650: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
c660: 20 20 69 66 20 28 54 63 6c 5f 43 72 65 61 74 65 if (Tcl_Create
c670: 50 69 70 65 28 69 6e 74 65 72 70 2c 20 26 72 63 Pipe(interp, &rc
c680: 68 61 6e 2c 20 26 77 63 68 61 6e 2c 20 30 29 20 han, &wchan, 0)
c690: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
c6a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
c6b0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 6e }.. chann
c6c0: 65 6c 4e 61 6d 65 73 5b 30 5d 20 3d 20 54 63 6c elNames[0] = Tcl
c6d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
c6e0: 72 63 68 61 6e 29 3b 0a 20 20 20 20 63 68 61 6e rchan);. chan
c6f0: 6e 65 6c 4e 61 6d 65 73 5b 31 5d 20 3d 20 54 63 nelNames[1] = Tc
c700: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
c710: 28 77 63 68 61 6e 29 3b 0a 0a 20 20 20 20 54 63 (wchan);.. Tc
c720: 6c 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74 50 74 lNewObj(resultPt
c730: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 r);. Tcl_List
c740: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 ObjAppendElement
c750: 28 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 50 74 72 (NULL, resultPtr
c760: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 ,.. Tcl_NewSt
c770: 72 69 6e 67 4f 62 6a 28 63 68 61 6e 6e 65 6c 4e ringObj(channelN
c780: 61 6d 65 73 5b 30 5d 2c 20 2d 31 29 29 3b 0a 20 ames[0], -1));.
c790: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 Tcl_ListObjAp
c7a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c pendElement(NULL
c7b0: 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a 09 20 20 , resultPtr,..
c7c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f Tcl_NewStringO
c7d0: 62 6a 28 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 5b bj(channelNames[
c7e0: 31 5d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 1], -1));. Tc
c7f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
c800: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 nterp, resultPtr
c810: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
c820: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c870: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
c880: 43 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 20 ChannelNamesCmd
c890: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
c8a0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 nction is invoke
c8b0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
c8c0: 20 22 63 68 61 6e 20 6e 61 6d 65 73 22 20 61 6e "chan names" an
c8d0: 64 20 22 66 69 6c 65 0a 20 2a 09 63 68 61 6e 6e d "file. *.chann
c8e0: 65 6c 73 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 els" Tcl command
c8f0: 73 2e 20 20 53 65 65 20 74 68 65 20 75 73 65 72 s. See the user
c900: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
c910: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 0a 20 2a or details on. *
c920: 09 77 68 61 74 20 74 68 65 79 20 64 6f 2e 0a 20 .what they do..
c930: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
c940: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 .A standard Tcl
c950: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 result.. *. * Si
c960: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
c970: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c9c0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68 61 . */..int.TclCha
c9d0: 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 28 0a 20 20 nnelNamesCmd(.
c9e0: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
c9f0: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
ca00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
ca10: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 int objc,.
ca20: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
ca30: 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 69 66 20 bjv[]).{. if
ca40: 28 6f 62 6a 63 20 3c 20 31 20 7c 7c 20 6f 62 6a (objc < 1 || obj
ca50: 63 20 3e 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 c > 2) {..Tcl_Wr
ca60: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
ca70: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70 61 p, 1, objv, "?pa
ca80: 74 74 65 72 6e 3f 22 29 3b 0a 09 72 65 74 75 72 ttern?");..retur
ca90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
caa0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 }. return Tc
cab0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
cac0: 73 45 78 28 69 6e 74 65 72 70 2c 0a 09 20 20 20 sEx(interp,..
cad0: 20 28 28 6f 62 6a 63 20 3d 3d 20 31 29 20 3f 20 ((objc == 1) ?
cae0: 4e 55 4c 4c 20 3a 20 54 63 6c 47 65 74 53 74 72 NULL : TclGetStr
caf0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29 3b 0a ing(objv[1])));.
cb00: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
cb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cb50: 20 2a 0a 20 2a 20 54 63 6c 49 6e 69 74 43 68 61 *. * TclInitCha
cb60: 6e 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 nCmd --. *. *.Th
cb70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 is function is i
cb80: 6e 76 6f 6b 65 64 20 74 6f 20 63 72 65 61 74 65 nvoked to create
cb90: 20 74 68 65 20 22 63 68 61 6e 22 20 54 63 6c 20 the "chan" Tcl
cba0: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 command. See the
cbb0: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e . *.user documen
cbc0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 tation for detai
cbd0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f ls on what it do
cbe0: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 es.. *. * Result
cbf0: 73 3a 0a 20 2a 09 41 20 54 63 6c 20 63 6f 6d 6d s:. *.A Tcl comm
cc00: 61 6e 64 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 and handle.. *.
cc10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
cc20: 20 2a 09 4e 6f 6e 65 20 28 73 69 6e 63 65 20 6e *.None (since n
cc30: 6f 74 68 69 6e 67 20 69 73 20 62 79 74 65 2d 63 othing is byte-c
cc40: 6f 6d 70 69 6c 65 64 29 2e 0a 20 2a 0a 20 2a 2d ompiled).. *. *-
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc90: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43 -----. */..Tcl_C
cca0: 6f 6d 6d 61 6e 64 0a 54 63 6c 49 6e 69 74 43 68 ommand.TclInitCh
ccb0: 61 6e 43 6d 64 28 0a 20 20 20 20 54 63 6c 5f 49 anCmd(. Tcl_I
ccc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0a 7b nterp *interp).{
ccd0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d . /*. * M
cce0: 6f 73 74 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65 ost commands are
ccf0: 20 70 6c 75 67 67 65 64 20 64 69 72 65 63 74 6c plugged directl
cd00: 79 20 74 6f 67 65 74 68 65 72 2c 20 62 75 74 20 y together, but
cd10: 73 6f 6d 65 20 61 72 65 20 64 6f 6e 65 20 76 69 some are done vi
cd20: 61 0a 20 20 20 20 20 2a 20 61 6c 69 61 73 2d 6c a. * alias-l
cd30: 69 6b 65 20 72 65 77 72 69 74 69 6e 67 3b 20 5b ike rewriting; [
cd40: 63 68 61 6e 20 63 6f 6e 66 69 67 75 72 65 5d 20 chan configure]
cd50: 69 73 20 74 68 69 73 20 77 61 79 20 66 6f 72 20 is this way for
cd60: 73 65 63 75 72 69 74 79 20 72 65 61 73 6f 6e 73 security reasons
cd70: 0a 20 20 20 20 20 2a 20 28 77 61 6e 74 20 6f 76 . * (want ov
cd80: 65 72 77 72 69 74 69 6e 67 20 6f 66 20 5b 66 63 erwriting of [fc
cd90: 6f 6e 66 69 67 75 72 65 5d 20 74 6f 20 63 6f 6e onfigure] to con
cda0: 74 72 6f 6c 20 74 68 61 74 20 6e 69 63 65 6c 79 trol that nicely
cdb0: 29 2c 20 61 6e 64 20 5b 63 68 61 6e 0a 20 20 20 ), and [chan.
cdc0: 20 20 2a 20 6e 61 6d 65 73 5d 20 62 65 63 61 75 * names] becau
cdd0: 73 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 se the functiona
cde0: 6c 69 74 79 20 69 73 6e 27 74 20 61 76 61 69 6c lity isn't avail
cdf0: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 able as a separa
ce00: 74 65 20 63 6f 6d 6d 61 6e 64 0a 20 20 20 20 20 te command.
ce10: 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 * function at th
ce20: 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 2a e moment.. *
ce30: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e /. static con
ce40: 73 74 20 45 6e 73 65 6d 62 6c 65 49 6d 70 6c 4d st EnsembleImplM
ce50: 61 70 20 69 6e 69 74 4d 61 70 5b 5d 20 3d 20 7b ap initMap[] = {
ce60: 0a 09 7b 22 62 6c 6f 63 6b 65 64 22 2c 09 54 63 ..{"blocked",.Tc
ce70: 6c 5f 46 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64 l_FblockedObjCmd
ce80: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 ,.TclCompileBasi
ce90: 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 c1ArgCmd, NULL,
cea0: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 63 6c 6f NULL, 0},..{"clo
ceb0: 73 65 22 2c 09 54 63 6c 5f 43 6c 6f 73 65 4f 62 se",.Tcl_CloseOb
cec0: 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 jCmd,.TclCompile
ced0: 42 61 73 69 63 31 4f 72 32 41 72 67 43 6d 64 2c Basic1Or2ArgCmd,
cee0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c NULL, NULL, 0},
cef0: 0a 09 7b 22 63 6f 70 79 22 2c 09 54 63 6c 5f 46 ..{"copy",.Tcl_F
cf00: 63 6f 70 79 4f 62 6a 43 6d 64 2c 09 4e 55 4c 4c copyObjCmd,.NULL
cf10: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d , NULL, NULL, 0}
cf20: 2c 0a 09 7b 22 63 72 65 61 74 65 22 2c 09 54 63 ,..{"create",.Tc
cf30: 6c 43 68 61 6e 43 72 65 61 74 65 4f 62 6a 43 6d lChanCreateObjCm
cf40: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 d,.TclCompileBas
cf50: 69 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c ic2ArgCmd, NULL,
cf60: 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54 NULL, 0},../* T
cf70: 49 50 20 23 32 31 39 20 2a 2f 0a 09 7b 22 65 6f IP #219 */..{"eo
cf80: 66 22 2c 09 09 54 63 6c 5f 45 6f 66 4f 62 6a 43 f",..Tcl_EofObjC
cf90: 6d 64 2c 09 09 54 63 6c 43 6f 6d 70 69 6c 65 42 md,..TclCompileB
cfa0: 61 73 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c asic1ArgCmd, NUL
cfb0: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 L, NULL, 0},..{"
cfc0: 65 76 65 6e 74 22 2c 09 54 63 6c 5f 46 69 6c 65 event",.Tcl_File
cfd0: 45 76 65 6e 74 4f 62 6a 43 6d 64 2c 09 54 63 6c EventObjCmd,.Tcl
cfe0: 43 6f 6d 70 69 6c 65 42 61 73 69 63 32 4f 72 33 CompileBasic2Or3
cff0: 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 ArgCmd, NULL, NU
d000: 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 66 6c 75 73 68 LL, 0},..{"flush
d010: 22 2c 09 54 63 6c 5f 46 6c 75 73 68 4f 62 6a 43 ",.Tcl_FlushObjC
d020: 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 md,.TclCompileBa
d030: 73 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c sic1ArgCmd, NULL
d040: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 67 , NULL, 0},..{"g
d050: 65 74 73 22 2c 09 54 63 6c 5f 47 65 74 73 4f 62 ets",.Tcl_GetsOb
d060: 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d 70 69 6c jCmd,..TclCompil
d070: 65 42 61 73 69 63 31 4f 72 32 41 72 67 43 6d 64 eBasic1Or2ArgCmd
d080: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d , NULL, NULL, 0}
d090: 2c 0a 09 7b 22 6e 61 6d 65 73 22 2c 09 54 63 6c ,..{"names",.Tcl
d0a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 2c ChannelNamesCmd,
d0b0: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 .TclCompileBasic
d0c0: 30 4f 72 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 0Or1ArgCmd, NULL
d0d0: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 70 , NULL, 0},..{"p
d0e0: 65 6e 64 69 6e 67 22 2c 09 43 68 61 6e 50 65 6e ending",.ChanPen
d0f0: 64 69 6e 67 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 dingObjCmd,.TclC
d100: 6f 6d 70 69 6c 65 42 61 73 69 63 32 41 72 67 43 ompileBasic2ArgC
d110: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 md, NULL, NULL,
d120: 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32 38 37 0},../* TIP #287
d130: 20 2a 2f 0a 09 7b 22 70 69 70 65 22 2c 09 43 68 */..{"pipe",.Ch
d140: 61 6e 50 69 70 65 4f 62 6a 43 6d 64 2c 09 09 54 anPipeObjCmd,..T
d150: 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 30 41 clCompileBasic0A
d160: 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c rgCmd, NULL, NUL
d170: 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 L, 0},../* TIP #
d180: 33 30 34 20 2a 2f 0a 09 7b 22 70 6f 70 22 2c 09 304 */..{"pop",.
d190: 09 54 63 6c 43 68 61 6e 50 6f 70 4f 62 6a 43 6d .TclChanPopObjCm
d1a0: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 d,.TclCompileBas
d1b0: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c ic1ArgCmd, NULL,
d1c0: 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54 NULL, 0},../* T
d1d0: 49 50 20 23 32 33 30 20 2a 2f 0a 09 7b 22 70 6f IP #230 */..{"po
d1e0: 73 74 65 76 65 6e 74 22 2c 09 54 63 6c 43 68 61 stevent",.TclCha
d1f0: 6e 50 6f 73 74 45 76 65 6e 74 4f 62 6a 43 6d 64 nPostEventObjCmd
d200: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 ,.TclCompileBasi
d210: 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 c2ArgCmd, NULL,
d220: 4e 55 4c 4c 2c 20 30 7d 2c 09 2f 2a 20 54 49 50 NULL, 0},./* TIP
d230: 20 23 32 31 39 20 2a 2f 0a 09 7b 22 70 75 73 68 #219 */..{"push
d240: 22 2c 09 54 63 6c 43 68 61 6e 50 75 73 68 4f 62 ",.TclChanPushOb
d250: 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 jCmd,.TclCompile
d260: 42 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e 55 Basic2ArgCmd, NU
d270: 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f LL, NULL, 0},../
d280: 2a 20 54 49 50 20 23 32 33 30 20 2a 2f 0a 09 7b * TIP #230 */..{
d290: 22 70 75 74 73 22 2c 09 54 63 6c 5f 50 75 74 73 "puts",.Tcl_Puts
d2a0: 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c 20 4e ObjCmd,..NULL, N
d2b0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 ULL, NULL, 0},..
d2c0: 7b 22 72 65 61 64 22 2c 09 54 63 6c 5f 52 65 61 {"read",.Tcl_Rea
d2d0: 64 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c 20 dObjCmd,..NULL,
d2e0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a NULL, NULL, 0},.
d2f0: 09 7b 22 73 65 65 6b 22 2c 09 54 63 6c 5f 53 65 .{"seek",.Tcl_Se
d300: 65 6b 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f ekObjCmd,..TclCo
d310: 6d 70 69 6c 65 42 61 73 69 63 32 4f 72 33 41 72 mpileBasic2Or3Ar
d320: 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c gCmd, NULL, NULL
d330: 2c 20 30 7d 2c 0a 09 7b 22 74 65 6c 6c 22 2c 09 , 0},..{"tell",.
d340: 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 2c 09 Tcl_TellObjCmd,.
d350: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 .TclCompileBasic
d360: 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 1ArgCmd, NULL, N
d370: 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 74 72 75 6e ULL, 0},..{"trun
d380: 63 61 74 65 22 2c 09 43 68 61 6e 54 72 75 6e 63 cate",.ChanTrunc
d390: 61 74 65 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f ateObjCmd,.TclCo
d3a0: 6d 70 69 6c 65 42 61 73 69 63 31 4f 72 32 41 72 mpileBasic1Or2Ar
d3b0: 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c gCmd, NULL, NULL
d3c0: 2c 20 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32 , 0},../* TIP #2
d3d0: 30 38 20 2a 2f 0a 09 7b 4e 55 4c 4c 2c 20 4e 55 08 */..{NULL, NU
d3e0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 LL, NULL, NULL,
d3f0: 4e 55 4c 4c 2c 20 30 7d 0a 20 20 20 20 7d 3b 0a NULL, 0}. };.
d400: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 static const
d410: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 65 78 74 char *const ext
d420: 72 61 73 5b 5d 20 3d 20 7b 0a 09 22 63 6f 6e 66 ras[] = {.."conf
d430: 69 67 75 72 65 22 2c 09 22 3a 3a 66 63 6f 6e 66 igure",."::fconf
d440: 69 67 75 72 65 22 2c 0a 09 4e 55 4c 4c 0a 20 20 igure",..NULL.
d450: 20 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 43 6f 6d };. Tcl_Com
d460: 6d 61 6e 64 20 65 6e 73 65 6d 62 6c 65 3b 0a 20 mand ensemble;.
d470: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 70 4f Tcl_Obj *mapO
d480: 62 6a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a bj;. int i;..
d490: 20 20 20 20 65 6e 73 65 6d 62 6c 65 20 3d 20 54 ensemble = T
d4a0: 63 6c 4d 61 6b 65 45 6e 73 65 6d 62 6c 65 28 69 clMakeEnsemble(i
d4b0: 6e 74 65 72 70 2c 20 22 63 68 61 6e 22 2c 20 69 nterp, "chan", i
d4c0: 6e 69 74 4d 61 70 29 3b 0a 20 20 20 20 54 63 6c nitMap);. Tcl
d4d0: 5f 47 65 74 45 6e 73 65 6d 62 6c 65 4d 61 70 70 _GetEnsembleMapp
d4e0: 69 6e 67 44 69 63 74 28 4e 55 4c 4c 2c 20 65 6e ingDict(NULL, en
d4f0: 73 65 6d 62 6c 65 2c 20 26 6d 61 70 4f 62 6a 29 semble, &mapObj)
d500: 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 20 3b ;. for (i=0 ;
d510: 20 65 78 74 72 61 73 5b 69 5d 20 3b 20 69 2b 3d extras[i] ; i+=
d520: 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 61 6e 2) {../*.. * Can
d530: 20 61 73 73 75 6d 65 20 74 68 61 74 20 72 65 66 assume that ref
d540: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 72 erence counts ar
d550: 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 65 e all incremente
d560: 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 69 d... */...Tcl_Di
d570: 63 74 4f 62 6a 50 75 74 28 4e 55 4c 4c 2c 20 6d ctObjPut(NULL, m
d580: 61 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74 apObj, Tcl_NewSt
d590: 72 69 6e 67 4f 62 6a 28 65 78 74 72 61 73 5b 69 ringObj(extras[i
d5a0: 5d 2c 20 2d 31 29 2c 0a 09 09 54 63 6c 5f 4e 65 ], -1),...Tcl_Ne
d5b0: 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 74 72 61 wStringObj(extra
d5c0: 73 5b 69 2b 31 5d 2c 20 2d 31 29 29 3b 0a 20 20 s[i+1], -1));.
d5d0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 45 }. Tcl_SetE
d5e0: 6e 73 65 6d 62 6c 65 4d 61 70 70 69 6e 67 44 69 nsembleMappingDi
d5f0: 63 74 28 69 6e 74 65 72 70 2c 20 65 6e 73 65 6d ct(interp, ensem
d600: 62 6c 65 2c 20 6d 61 70 4f 62 6a 29 3b 0a 20 20 ble, mapObj);.
d610: 20 20 72 65 74 75 72 6e 20 65 6e 73 65 6d 62 6c return ensembl
d620: 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 e;.}.../*. * Loc
d630: 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a al Variables:. *
d640: 20 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61 mode: c. * c-ba
d650: 73 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a sic-offset: 4. *
d660: 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 fill-column: 78
d670: 0a 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a . * End:. */.