0000: 2f 2a 0a 20 2a 20 74 63 6c 49 4f 43 6d 64 2e 63 /*. * tclIOCmd.c
0010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 74 61 69 --. *. *.Contai
0020: 6e 73 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f ns the definitio
0030: 6e 73 20 6f 66 20 6d 6f 73 74 20 6f 66 20 74 68 ns of most of th
0040: 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 20 72 e Tcl commands r
0050: 65 6c 61 74 69 6e 67 20 74 6f 20 49 4f 2e 0a 20 elating to IO..
0060: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 c2 *. * Copyright �
0070: a9 20 31 39 39 35 2d 31 39 39 37 20 53 75 6e 20 � 1995-1997 Sun
0080: 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e Microsystems, In
0090: 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 c.. *. * See the
00a0: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 file "license.t
00b0: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d erms" for inform
00c0: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 ation on usage a
00d0: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f nd redistributio
00e0: 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c n of. * this fil
00f0: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 e, and for a DIS
0100: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 CLAIMER OF ALL W
0110: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a ARRANTIES.. */..
0120: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 49 6e 74 #include "tclInt
0130: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 .h".#include "tc
0140: 6c 49 4f 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 lIO.h".#include
0150: 22 74 63 6c 54 6f 6d 4d 61 74 68 2e 68 22 0a 0a "tclTomMath.h"..
0160: 2f 2a 0a 20 2a 20 43 61 6c 6c 62 61 63 6b 20 73 /*. * Callback s
0170: 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 63 63 tructure for acc
0180: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 69 6e 20 ept callback in
0190: 61 20 54 43 50 20 73 65 72 76 65 72 2e 0a 20 2a a TCP server.. *
01a0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
01b0: 74 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 t {. Tcl_Obj
01c0: 2a 73 63 72 69 70 74 3b 09 09 2f 2a 20 53 63 72 *script;../* Scr
01d0: 69 70 74 20 74 6f 20 69 6e 76 6f 6b 65 2e 20 2a ipt to invoke. *
01e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
01f0: 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 49 6e *interp;../* In
0200: 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 terpreter in whi
0210: 63 68 20 74 6f 20 72 75 6e 20 69 74 2e 20 2a 2f ch to run it. */
0220: 0a 7d 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 .} AcceptCallbac
0230: 6b 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 k;../*. * Thread
0240: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 75 local storage u
0250: 73 65 64 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 sed to maintain
0260: 61 20 70 65 72 2d 74 68 72 65 61 64 20 73 74 64 a per-thread std
0270: 6f 75 74 20 63 68 61 6e 6e 65 6c 20 6f 62 6a 2e out channel obj.
0280: 0a 20 2a 20 49 74 20 6d 75 73 74 20 62 65 20 70 . * It must be p
0290: 65 72 2d 74 68 72 65 61 64 20 62 65 63 61 75 73 er-thread becaus
02a0: 65 20 6f 66 20 73 74 64 20 63 68 61 6e 6e 65 6c e of std channel
02b0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 0a 20 2a limitations.. *
02c0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
02d0: 74 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 69 74 t {. int init
02e0: 69 61 6c 69 7a 65 64 3b 09 09 2f 2a 20 53 65 74 ialized;../* Set
02f0: 20 74 6f 20 31 20 77 68 65 6e 20 74 68 65 20 6d to 1 when the m
0300: 6f 64 75 6c 65 20 69 73 20 69 6e 69 74 69 61 6c odule is initial
0310: 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c ized. */. Tcl
0320: 5f 4f 62 6a 20 2a 73 74 64 6f 75 74 4f 62 6a 50 _Obj *stdoutObjP
0330: 74 72 3b 09 2f 2a 20 43 61 63 68 65 64 20 73 74 tr;./* Cached st
0340: 64 6f 75 74 20 63 68 61 6e 6e 65 6c 20 54 63 6c dout channel Tcl
0350: 5f 4f 62 6a 20 2a 2f 0a 7d 20 54 68 72 65 61 64 _Obj */.} Thread
0360: 53 70 65 63 69 66 69 63 44 61 74 61 3b 0a 0a 73 SpecificData;..s
0370: 74 61 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64 tatic Tcl_Thread
0380: 44 61 74 61 4b 65 79 20 64 61 74 61 4b 65 79 3b DataKey dataKey;
0390: 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 66 ../*. * Static f
03a0: 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 unctions for thi
03b0: 73 20 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74 61 s file:. */..sta
03c0: 74 69 63 20 54 63 6c 5f 45 78 69 74 50 72 6f 63 tic Tcl_ExitProc
03d0: 09 09 46 69 6e 61 6c 69 7a 65 49 4f 43 6d 64 54 ..FinalizeIOCmdT
03e0: 53 44 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 54 SD;.static Tcl_T
03f0: 63 70 41 63 63 65 70 74 50 72 6f 63 09 41 63 63 cpAcceptProc.Acc
0400: 65 70 74 43 61 6c 6c 62 61 63 6b 50 72 6f 63 3b eptCallbackProc;
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 50 65 6e 64 mdProc..ChanPend
0430: 69 6e 67 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 ingObjCmd;.stati
0440: 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 c Tcl_ObjCmdProc
0450: 09 09 43 68 61 6e 54 72 75 6e 63 61 74 65 4f 62 ..ChanTruncateOb
0460: 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20 76 6f 69 jCmd;.static voi
0470: 64 09 09 52 65 67 69 73 74 65 72 54 63 70 53 65 d..RegisterTcpSe
0480: 72 76 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 rverInterpCleanu
0490: 70 28 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e p(.... Tcl_In
04a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 terp *interp,...
04b0: 09 20 20 20 20 41 63 63 65 70 74 43 61 6c 6c 62 . AcceptCallb
04c0: 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 ack *acceptCallb
04d0: 61 63 6b 50 74 72 29 3b 0a 73 74 61 74 69 63 20 ackPtr);.static
04e0: 54 63 6c 5f 49 6e 74 65 72 70 44 65 6c 65 74 65 Tcl_InterpDelete
04f0: 50 72 6f 63 09 54 63 70 41 63 63 65 70 74 43 61 Proc.TcpAcceptCa
0500: 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65 50 72 6f llbacksDeletePro
0510: 63 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 c;.static void..
0520: 54 63 70 53 65 72 76 65 72 43 6c 6f 73 65 50 72 TcpServerClosePr
0530: 6f 63 28 76 6f 69 64 20 2a 63 61 6c 6c 62 61 63 oc(void *callbac
0540: 6b 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 kData);.static v
0550: 6f 69 64 09 09 55 6e 72 65 67 69 73 74 65 72 54 oid..UnregisterT
0560: 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 6c cpServerInterpCl
0570: 65 61 6e 75 70 50 72 6f 63 28 0a 09 09 09 20 20 eanupProc(....
0580: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
0590: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 41 63 63 terp,.... Acc
05a0: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 eptCallback *acc
05b0: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b eptCallbackPtr);
05c0: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0610: 2a 0a 20 2a 20 46 69 6e 61 6c 69 7a 65 49 4f 43 *. * FinalizeIOC
0620: 6d 64 54 53 44 20 2d 2d 0a 20 2a 0a 20 2a 09 52 mdTSD --. *. *.R
0630: 65 6c 65 61 73 65 20 74 68 65 20 73 74 6f 72 61 elease the stora
0640: 67 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ge associated wi
0650: 74 68 20 74 68 65 20 70 65 72 2d 74 68 72 65 61 th the per-threa
0660: 64 20 63 61 63 68 65 2e 0a 20 2a 0a 20 2a 20 52 d cache.. *. * R
0670: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
0680: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0690: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
06a0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
06f0: 74 61 74 69 63 20 76 6f 69 64 0a 46 69 6e 61 6c tatic void.Final
0700: 69 7a 65 49 4f 43 6d 64 54 53 44 28 0a 20 20 20 izeIOCmdTSD(.
0710: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
0720: 20 2a 29 29 0a 7b 0a 20 20 20 20 54 68 72 65 61 *)).{. Threa
0730: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 dSpecificData *t
0740: 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f sdPtr = TCL_TSD_
0750: 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a INIT(&dataKey);.
0760: 0a 20 20 20 20 69 66 20 28 74 73 64 50 74 72 2d . if (tsdPtr-
0770: 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 20 21 3d >stdoutObjPtr !=
0780: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
0790: 63 72 52 65 66 43 6f 75 6e 74 28 74 73 64 50 74 crRefCount(tsdPt
07a0: 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 29 r->stdoutObjPtr)
07b0: 3b 0a 09 74 73 64 50 74 72 2d 3e 73 74 64 6f 75 ;..tsdPtr->stdou
07c0: 74 4f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a tObjPtr = NULL;.
07d0: 20 20 20 20 7d 0a 20 20 20 20 74 73 64 50 74 72 }. tsdPtr
07e0: 2d 3e 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 ->initialized =
07f0: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0840: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 50 75 74 --. *. * Tcl_Put
0850: 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a sObjCmd --. *. *
0860: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
0870: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
0880: 63 65 73 73 20 74 68 65 20 22 70 75 74 73 22 20 cess the "puts"
0890: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 Tcl command. See
08a0: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 the. *.user doc
08b0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
08c0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
08d0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
08e0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
08f0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
0900: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0910: 63 74 73 3a 0a 20 2a 09 50 72 6f 64 75 63 65 73 cts:. *.Produces
0920: 20 6f 75 74 70 75 74 20 6f 6e 20 61 20 63 68 61 output on a cha
0930: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
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 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 50 -. */..int.Tcl_P
0990: 75 74 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 utsObjCmd(. T
09a0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
09b0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
09c0: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 p *interp,../* C
09d0: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
09e0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f er. */. int o
09f0: 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 bjc,.../* Number
0a00: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a of arguments. *
0a10: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 /. Tcl_Obj *c
0a20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 onst objv[])./*
0a30: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 Argument objects
0a40: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
0a50: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
0a60: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
0a70: 70 75 74 73 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 puts on. */.
0a80: 54 63 6c 5f 4f 62 6a 20 2a 73 74 72 69 6e 67 3b Tcl_Obj *string;
0a90: 09 09 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 77 ../* String to w
0aa0: 72 69 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c rite. */. Tcl
0ab0: 5f 4f 62 6a 20 2a 63 68 61 6e 4f 62 6a 50 74 72 _Obj *chanObjPtr
0ac0: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 63 68 61 6e = NULL;./* chan
0ad0: 6e 65 6c 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 nel object. */.
0ae0: 20 20 20 69 6e 74 20 6e 65 77 6c 69 6e 65 3b 09 int newline;.
0af0: 09 2f 2a 20 41 64 64 20 61 20 6e 65 77 6c 69 6e ./* Add a newlin
0b00: 65 20 61 74 20 65 6e 64 3f 20 2a 2f 0a 20 20 20 e at end? */.
0b10: 20 54 63 6c 5f 53 69 7a 65 20 72 65 73 75 6c 74 Tcl_Size result
0b20: 3b 09 09 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 ;../* Result of
0b30: 70 75 74 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 puts operation.
0b40: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b */. int mode;
0b50: 09 09 09 2f 2a 20 4d 6f 64 65 20 69 6e 20 77 68 .../* Mode in wh
0b60: 69 63 68 20 63 68 61 6e 6e 65 6c 20 69 73 20 6f ich channel is o
0b70: 70 65 6e 65 64 2e 20 2a 2f 0a 0a 20 20 20 20 73 pened. */.. s
0b80: 77 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 20 witch (objc) {.
0b90: 20 20 20 63 61 73 65 20 32 3a 09 09 09 2f 2a 20 case 2:.../*
0ba0: 5b 70 75 74 73 20 24 78 5d 20 2a 2f 0a 09 73 74 [puts $x] */..st
0bb0: 72 69 6e 67 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a ring = objv[1];.
0bc0: 09 6e 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 09 62 .newline = 1;..b
0bd0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 reak;.. case
0be0: 33 3a 09 09 09 2f 2a 20 5b 70 75 74 73 20 2d 6e 3:.../* [puts -n
0bf0: 6f 6e 65 77 6c 69 6e 65 20 24 78 5d 20 6f 72 20 onewline $x] or
0c00: 5b 70 75 74 73 20 24 63 68 61 6e 20 24 78 5d 20 [puts $chan $x]
0c10: 2a 2f 0a 09 69 66 20 28 73 74 72 63 6d 70 28 54 */..if (strcmp(T
0c20: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
0c30: 5b 31 5d 29 2c 20 22 2d 6e 6f 6e 65 77 6c 69 6e [1]), "-nonewlin
0c40: 65 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 e") == 0) {..
0c50: 20 6e 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 09 7d newline = 0;..}
0c60: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6e 65 77 else {.. new
0c70: 6c 69 6e 65 20 3d 20 31 3b 0a 09 20 20 20 20 63 line = 1;.. c
0c80: 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f 62 6a 76 hanObjPtr = objv
0c90: 5b 31 5d 3b 0a 09 7d 0a 09 73 74 72 69 6e 67 20 [1];..}..string
0ca0: 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 62 72 65 61 = objv[2];..brea
0cb0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 34 3a 09 k;.. case 4:.
0cc0: 09 09 2f 2a 20 5b 70 75 74 73 20 2d 6e 6f 6e 65 ../* [puts -none
0cd0: 77 6c 69 6e 65 20 24 63 68 61 6e 20 24 78 5d 20 wline $chan $x]
0ce0: 6f 72 0a 09 09 09 09 20 2a 20 5b 70 75 74 73 20 or..... * [puts
0cf0: 24 63 68 61 6e 20 24 78 20 6e 6f 6e 65 77 6c 69 $chan $x nonewli
0d00: 6e 65 5d 20 2a 2f 0a 09 6e 65 77 6c 69 6e 65 20 ne] */..newline
0d10: 3d 20 30 3b 0a 09 69 66 20 28 73 74 72 63 6d 70 = 0;..if (strcmp
0d20: 28 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 (TclGetString(ob
0d30: 6a 76 5b 31 5d 29 2c 20 22 2d 6e 6f 6e 65 77 6c jv[1]), "-nonewl
0d40: 69 6e 65 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20 ine") == 0) {..
0d50: 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 chanObjPtr =
0d60: 6f 62 6a 76 5b 32 5d 3b 0a 09 20 20 20 20 73 74 objv[2];.. st
0d70: 72 69 6e 67 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a ring = objv[3];.
0d80: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 . break;..}..
0d90: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 /* Fall through
0da0: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 09 */. default:.
0db0: 09 09 2f 2a 20 5b 70 75 74 73 5d 20 6f 72 0a 09 ../* [puts] or..
0dc0: 09 09 09 20 2a 20 5b 70 75 74 73 20 73 6f 6d 65 ... * [puts some
0dd0: 20 62 61 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 bad number of a
0de0: 72 67 75 6d 65 6e 74 73 2e 2e 2e 5d 20 2a 2f 0a rguments...] */.
0df0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
0e00: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
0e10: 76 2c 20 22 3f 2d 6e 6f 6e 65 77 6c 69 6e 65 3f v, "?-nonewline?
0e20: 20 3f 63 68 61 6e 6e 65 6c 3f 20 73 74 72 69 6e ?channel? strin
0e30: 67 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c g");..return TCL
0e40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
0e50: 20 20 20 69 66 20 28 63 68 61 6e 4f 62 6a 50 74 if (chanObjPt
0e60: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 68 r == NULL) {..Th
0e70: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 readSpecificData
0e80: 20 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 *tsdPtr = TCL_T
0e90: 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79 SD_INIT(&dataKey
0ea0: 29 3b 0a 0a 09 69 66 20 28 21 74 73 64 50 74 72 );...if (!tsdPtr
0eb0: 2d 3e 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b ->initialized) {
0ec0: 0a 09 20 20 20 20 74 73 64 50 74 72 2d 3e 69 6e .. tsdPtr->in
0ed0: 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 09 itialized = 1;..
0ee0: 20 20 20 20 54 63 6c 4e 65 77 4c 69 74 65 72 61 TclNewLitera
0ef0: 6c 53 74 72 69 6e 67 4f 62 6a 28 74 73 64 50 74 lStringObj(tsdPt
0f00: 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 2c r->stdoutObjPtr,
0f10: 20 22 73 74 64 6f 75 74 22 29 3b 0a 09 20 20 20 "stdout");..
0f20: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
0f30: 74 28 74 73 64 50 74 72 2d 3e 73 74 64 6f 75 74 t(tsdPtr->stdout
0f40: 4f 62 6a 50 74 72 29 3b 0a 09 20 20 20 20 54 63 ObjPtr);.. Tc
0f50: 6c 5f 43 72 65 61 74 65 54 68 72 65 61 64 45 78 l_CreateThreadEx
0f60: 69 74 48 61 6e 64 6c 65 72 28 46 69 6e 61 6c 69 itHandler(Finali
0f70: 7a 65 49 4f 43 6d 64 54 53 44 2c 20 4e 55 4c 4c zeIOCmdTSD, NULL
0f80: 29 3b 0a 09 7d 0a 09 63 68 61 6e 4f 62 6a 50 74 );..}..chanObjPt
0f90: 72 20 3d 20 74 73 64 50 74 72 2d 3e 73 74 64 6f r = tsdPtr->stdo
0fa0: 75 74 4f 62 6a 50 74 72 3b 0a 20 20 20 20 7d 0a utObjPtr;. }.
0fb0: 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 if (TclGetCh
0fc0: 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 annelFromObj(int
0fd0: 65 72 70 2c 20 63 68 61 6e 4f 62 6a 50 74 72 2c erp, chanObjPtr,
0fe0: 20 26 63 68 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 &chan, &mode, 0
0ff0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
1000: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
1020: 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f 57 52 49 !(mode & TCL_WRI
1030: 54 41 42 4c 45 29 29 20 7b 0a 09 54 63 6c 5f 53 TABLE)) {..Tcl_S
1040: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
1050: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
1060: 66 28 0a 09 09 22 63 68 61 6e 6e 65 6c 20 5c 22 f(..."channel \"
1070: 25 73 5c 22 20 77 61 73 6e 27 74 20 6f 70 65 6e %s\" wasn't open
1080: 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 22 2c ed for writing",
1090: 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 ...TclGetString(
10a0: 63 68 61 6e 4f 62 6a 50 74 72 29 29 29 3b 0a 09 chanObjPtr)));..
10b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
10c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
10d0: 43 68 61 6e 6e 65 6c 50 72 65 73 65 72 76 65 28 ChannelPreserve(
10e0: 63 68 61 6e 29 3b 0a 20 20 20 20 72 65 73 75 6c chan);. resul
10f0: 74 20 3d 20 54 63 6c 5f 57 72 69 74 65 4f 62 6a t = Tcl_WriteObj
1100: 28 63 68 61 6e 2c 20 73 74 72 69 6e 67 29 3b 0a (chan, string);.
1110: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d if (result =
1120: 3d 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 = TCL_INDEX_NONE
1130: 29 20 7b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b ) {..goto error;
1140: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e . }. if (n
1150: 65 77 6c 69 6e 65 20 21 3d 20 30 29 20 7b 0a 09 ewline != 0) {..
1160: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 57 72 69 result = Tcl_Wri
1170: 74 65 43 68 61 72 73 28 63 68 61 6e 2c 20 22 5c teChars(chan, "\
1180: 6e 22 2c 20 31 29 3b 0a 09 69 66 20 28 72 65 73 n", 1);..if (res
1190: 75 6c 74 20 3d 3d 20 54 43 4c 5f 49 4e 44 45 58 ult == TCL_INDEX
11a0: 5f 4e 4f 4e 45 29 20 7b 0a 09 20 20 20 20 67 6f _NONE) {.. go
11b0: 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 20 20 20 to error;..}.
11c0: 20 7d 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 }. TclChanne
11d0: 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a lRelease(chan);.
11e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
11f0: 4b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 K;.. /*.
1200: 2a 20 54 49 50 20 23 32 31 39 2e 0a 20 20 20 20 * TIP #219..
1210: 20 2a 20 43 61 70 74 75 72 65 20 65 72 72 6f 72 * Capture error
1220: 20 6d 65 73 73 61 67 65 73 20 70 75 74 20 62 79 messages put by
1230: 20 74 68 65 20 64 72 69 76 65 72 20 69 6e 74 6f the driver into
1240: 20 74 68 65 20 62 79 70 61 73 73 20 61 72 65 61 the bypass area
1250: 20 61 6e 64 20 70 75 74 0a 20 20 20 20 20 2a 20 and put. *
1260: 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 72 65 them into the re
1270: 67 75 6c 61 72 20 69 6e 74 65 72 70 72 65 74 65 gular interprete
1280: 72 20 72 65 73 75 6c 74 2e 20 46 61 6c 6c 20 62 r result. Fall b
1290: 61 63 6b 20 74 6f 20 74 68 65 20 72 65 67 75 6c ack to the regul
12a0: 61 72 0a 20 20 20 20 20 2a 20 6d 65 73 73 61 67 ar. * messag
12b0: 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 e if nothing was
12c0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 found in the by
12d0: 70 61 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 pass.. */..
12e0: 20 65 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 error:. if (
12f0: 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 72 !TclChanCaughtEr
1300: 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72 70 rorBypass(interp
1310: 2c 20 63 68 61 6e 29 29 20 7b 0a 09 54 63 6c 5f , chan)) {..Tcl_
1320: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
1330: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e erp, Tcl_ObjPrin
1340: 74 66 28 22 65 72 72 6f 72 20 77 72 69 74 69 6e tf("error writin
1350: 67 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 g \"%s\": %s",..
1360: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 63 68 .TclGetString(ch
1370: 61 6e 4f 62 6a 50 74 72 29 2c 20 54 63 6c 5f 50 anObjPtr), Tcl_P
1380: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 osixError(interp
1390: 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 )));. }. T
13a0: 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 clChannelRelease
13b0: 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 65 74 75 (chan);. retu
13c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a rn TCL_ERROR;.}.
13d0: 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1420: 0a 20 2a 20 54 63 6c 5f 46 6c 75 73 68 4f 62 6a . * Tcl_FlushObj
1430: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
1440: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 s function is ca
1450: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 lled to process
1460: 74 68 65 20 54 63 6c 20 22 66 6c 75 73 68 22 20 the Tcl "flush"
1470: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 command. See the
1480: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e . *.user documen
1490: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 tation for detai
14a0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f ls on what it do
14b0: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 es.. *. * Result
14c0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
14d0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
14e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
14f0: 0a 20 2a 09 4d 61 79 20 63 61 75 73 65 20 6f 75 . *.May cause ou
1500: 74 70 75 74 20 74 6f 20 61 70 70 65 61 72 20 6f tput to appear o
1510: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 n the specified
1520: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
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 2d 2d 2d ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1570: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
1580: 6c 5f 46 6c 75 73 68 4f 62 6a 43 6d 64 28 0a 20 l_FlushObjCmd(.
1590: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
15a0: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
15b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
15c0: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
15d0: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 preter. */. i
15e0: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 nt objc,.../* Nu
15f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
1600: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
1610: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
1620: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
1630: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 ects. */.{. T
1640: 63 6c 5f 4f 62 6a 20 2a 63 68 61 6e 4f 62 6a 50 cl_Obj *chanObjP
1650: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
1660: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 nel chan;../* Th
1670: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 66 6c 75 e channel to flu
1680: 73 68 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e sh on. */. in
1690: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 t mode;.. if
16a0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
16b0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
16c0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
16d0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
16e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
16f0: 20 20 20 20 7d 0a 20 20 20 20 63 68 61 6e 4f 62 }. chanOb
1700: 6a 50 74 72 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a jPtr = objv[1];.
1710: 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 if (TclGetCh
1720: 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 annelFromObj(int
1730: 65 72 70 2c 20 63 68 61 6e 4f 62 6a 50 74 72 2c erp, chanObjPtr,
1740: 20 26 63 68 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 &chan, &mode, 0
1750: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
1760: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
1780: 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f 57 52 49 !(mode & TCL_WRI
1790: 54 41 42 4c 45 29 29 20 7b 0a 09 54 63 6c 5f 53 TABLE)) {..Tcl_S
17a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
17b0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
17c0: 66 28 0a 09 09 22 63 68 61 6e 6e 65 6c 20 5c 22 f(..."channel \"
17d0: 25 73 5c 22 20 77 61 73 6e 27 74 20 6f 70 65 6e %s\" wasn't open
17e0: 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 22 2c ed for writing",
17f0: 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 ...TclGetString(
1800: 63 68 61 6e 4f 62 6a 50 74 72 29 29 29 3b 0a 09 chanObjPtr)));..
1810: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1820: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
1830: 43 68 61 6e 6e 65 6c 50 72 65 73 65 72 76 65 28 ChannelPreserve(
1840: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 chan);. if (T
1850: 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20 21 cl_Flush(chan) !
1860: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a = TCL_OK) {../*.
1870: 09 20 2a 20 54 49 50 20 23 32 31 39 2e 0a 09 20 . * TIP #219...
1880: 2a 20 43 61 70 74 75 72 65 20 65 72 72 6f 72 20 * Capture error
1890: 6d 65 73 73 61 67 65 73 20 70 75 74 20 62 79 20 messages put by
18a0: 74 68 65 20 64 72 69 76 65 72 20 69 6e 74 6f 20 the driver into
18b0: 74 68 65 20 62 79 70 61 73 73 20 61 72 65 61 20 the bypass area
18c0: 61 6e 64 0a 09 20 2a 20 70 75 74 20 74 68 65 6d and.. * put them
18d0: 20 69 6e 74 6f 20 74 68 65 20 72 65 67 75 6c 61 into the regula
18e0: 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 r interpreter re
18f0: 73 75 6c 74 2e 20 46 61 6c 6c 20 62 61 63 6b 20 sult. Fall back
1900: 74 6f 20 74 68 65 0a 09 20 2a 20 72 65 67 75 6c to the.. * regul
1910: 61 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f ar message if no
1920: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20 thing was found
1930: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09 in the bypass...
1940: 20 2a 2f 0a 0a 09 69 66 20 28 21 54 63 6c 43 68 */...if (!TclCh
1950: 61 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 anCaughtErrorByp
1960: 61 73 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ass(interp, chan
1970: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 )) {.. Tcl_Se
1980: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
1990: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
19a0: 28 0a 09 09 20 20 20 20 22 65 72 72 6f 72 20 66 (... "error f
19b0: 6c 75 73 68 69 6e 67 20 5c 22 25 73 5c 22 3a 20 lushing \"%s\":
19c0: 25 73 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 %s",... TclGe
19d0: 74 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 tString(chanObjP
19e0: 74 72 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 tr), Tcl_PosixEr
19f0: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 ror(interp)));..
1a00: 7d 0a 09 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c }..TclChannelRel
1a10: 65 61 73 65 28 63 68 61 6e 29 3b 0a 09 72 65 74 ease(chan);..ret
1a20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
1a30: 20 20 20 7d 0a 20 20 20 20 54 63 6c 43 68 61 6e }. TclChan
1a40: 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 nelRelease(chan)
1a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
1a60: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d _OK;.}.../*. *--
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 2d ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ab0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 47 ----. *. * Tcl_G
1ac0: 65 74 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a etsObjCmd --. *.
1ad0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
1ae0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 is called to pr
1af0: 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 67 ocess the Tcl "g
1b00: 65 74 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 ets" command. Se
1b10: 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f e the. *.user do
1b20: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 cumentation for
1b30: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 details on what
1b40: 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 it does.. *. * R
1b50: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
1b60: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
1b70: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
1b80: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 6f 6e ects:. *.May con
1b90: 73 75 6d 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 sume input from
1ba0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d channel.. *. *--
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 2d ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bf0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
1c00: 6c 5f 47 65 74 73 4f 62 6a 43 6d 64 28 0a 20 20 l_GetsObjCmd(.
1c10: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
1c20: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
1c30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
1c40: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 * Current interp
1c50: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e reter. */. in
1c60: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d t objc,.../* Num
1c70: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
1c80: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
1c90: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 *const objv[]).
1ca0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
1cb0: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 cts. */.{. Tc
1cc0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 l_Channel chan;.
1cd0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ./* The channel
1ce0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 2a 2f to read from. */
1cf0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 . Tcl_Size li
1d00: 6e 65 4c 65 6e 3b 09 09 2f 2a 20 4c 65 6e 67 74 neLen;../* Lengt
1d10: 68 20 6f 66 20 6c 69 6e 65 20 6a 75 73 74 20 72 h of line just r
1d20: 65 61 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ead. */. int
1d30: 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64 65 20 mode;.../* Mode
1d40: 69 6e 20 77 68 69 63 68 20 63 68 61 6e 6e 65 6c in which channel
1d50: 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 is opened. */.
1d60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 6e 65 Tcl_Obj *line
1d70: 50 74 72 2c 20 2a 63 68 61 6e 4f 62 6a 50 74 72 Ptr, *chanObjPtr
1d80: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d ;. int code =
1d90: 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 TCL_OK;.. if
1da0: 20 28 28 6f 62 6a 63 20 21 3d 20 32 29 20 26 26 ((objc != 2) &&
1db0: 20 28 6f 62 6a 63 20 21 3d 20 33 29 29 20 7b 0a (objc != 3)) {.
1dc0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
1dd0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
1de0: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 76 61 72 v, "channel ?var
1df0: 4e 61 6d 65 3f 22 29 3b 0a 09 72 65 74 75 72 6e Name?");..return
1e00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
1e10: 7d 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 }. chanObjPtr
1e20: 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 = objv[1];.
1e30: 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 if (TclGetChanne
1e40: 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c lFromObj(interp,
1e50: 20 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 chanObjPtr, &ch
1e60: 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d an, &mode, 0) !=
1e70: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
1e80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
1e90: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f }. if (!(mo
1ea0: 64 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c de & TCL_READABL
1eb0: 45 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 E)) {..Tcl_SetOb
1ec0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
1ed0: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 Tcl_ObjPrintf(..
1ee0: 09 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 ."channel \"%s\"
1ef0: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 wasn't opened f
1f00: 6f 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 09 54 or reading",...T
1f10: 63 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e clGetString(chan
1f20: 4f 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 ObjPtr)));..retu
1f30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
1f40: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e }.. TclChan
1f50: 6e 65 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e nelPreserve(chan
1f60: 29 3b 0a 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a );. TclNewObj
1f70: 28 6c 69 6e 65 50 74 72 29 3b 0a 20 20 20 20 6c (linePtr);. l
1f80: 69 6e 65 4c 65 6e 20 3d 20 54 63 6c 5f 47 65 74 ineLen = Tcl_Get
1f90: 73 4f 62 6a 28 63 68 61 6e 2c 20 6c 69 6e 65 50 sObj(chan, lineP
1fa0: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 6c 69 6e tr);. if (lin
1fb0: 65 4c 65 6e 20 3d 3d 20 54 43 4c 5f 49 4f 5f 46 eLen == TCL_IO_F
1fc0: 41 49 4c 55 52 45 29 20 7b 0a 09 69 66 20 28 21 AILURE) {..if (!
1fd0: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 20 26 26 Tcl_Eof(chan) &&
1fe0: 20 21 54 63 6c 5f 49 6e 70 75 74 42 6c 6f 63 6b !Tcl_InputBlock
1ff0: 65 64 28 63 68 61 6e 29 29 20 7b 0a 09 20 20 20 ed(chan)) {..
2000: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
2010: 74 28 6c 69 6e 65 50 74 72 29 3b 0a 0a 09 20 20 t(linePtr);...
2020: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 49 50 /*.. * TIP
2030: 20 23 32 31 39 2e 0a 09 20 20 20 20 20 2a 20 43 #219... * C
2040: 61 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 apture error mes
2050: 73 61 67 65 73 20 70 75 74 20 62 79 20 74 68 65 sages put by the
2060: 20 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 driver into the
2070: 20 62 79 70 61 73 73 20 61 72 65 61 0a 09 20 20 bypass area..
2080: 20 20 20 2a 20 61 6e 64 20 70 75 74 20 74 68 65 * and put the
2090: 6d 20 69 6e 74 6f 20 74 68 65 20 72 65 67 75 6c m into the regul
20a0: 61 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 ar interpreter r
20b0: 65 73 75 6c 74 2e 20 46 61 6c 6c 20 62 61 63 6b esult. Fall back
20c0: 20 74 6f 0a 09 20 20 20 20 20 2a 20 74 68 65 20 to.. * the
20d0: 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 65 20 regular message
20e0: 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 66 if nothing was f
20f0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 70 61 ound in the bypa
2100: 73 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 ss... */...
2110: 20 20 20 69 66 20 28 21 54 63 6c 43 68 61 6e 43 if (!TclChanC
2120: 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 aughtErrorBypass
2130: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 (interp, chan))
2140: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {...Tcl_SetObjRe
2150: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
2160: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 _ObjPrintf(...."
2170: 65 72 72 6f 72 20 72 65 61 64 69 6e 67 20 5c 22 error reading \"
2180: 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 09 54 63 %s\": %s",....Tc
2190: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f lGetString(chanO
21a0: 62 6a 50 74 72 29 2c 20 54 63 6c 5f 50 6f 73 69 bjPtr), Tcl_Posi
21b0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 29 29 xError(interp)))
21c0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63 6f ;.. }.. co
21d0: 64 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a de = TCL_ERROR;.
21e0: 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a . goto done;.
21f0: 09 7d 0a 09 6c 69 6e 65 4c 65 6e 20 3d 20 54 43 .}..lineLen = TC
2200: 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 3b 0a 20 20 L_IO_FAILURE;.
2210: 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 }. if (objc
2220: 20 3d 3d 20 33 29 20 7b 0a 09 69 66 20 28 54 63 == 3) {..if (Tc
2230: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 l_ObjSetVar2(int
2240: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 4e 55 erp, objv[2], NU
2250: 4c 4c 2c 20 6c 69 6e 65 50 74 72 2c 0a 09 09 54 LL, linePtr,...T
2260: 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 CL_LEAVE_ERR_MSG
2270: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
2280: 20 20 63 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 code = TCL_ERR
2290: 4f 52 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f OR;.. goto do
22a0: 6e 65 3b 0a 09 7d 0a 09 54 63 6c 5f 4f 62 6a 20 ne;..}..Tcl_Obj
22b0: 2a 6c 69 6e 65 4c 65 6e 4f 62 6a 3b 0a 09 54 63 *lineLenObj;..Tc
22c0: 6c 4e 65 77 49 6e 64 65 78 4f 62 6a 28 6c 69 6e lNewIndexObj(lin
22d0: 65 4c 65 6e 4f 62 6a 2c 20 6c 69 6e 65 4c 65 6e eLenObj, lineLen
22e0: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 );..Tcl_SetObjRe
22f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 6e sult(interp, lin
2300: 65 4c 65 6e 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 eLenObj);. }
2310: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 4f else {..Tcl_SetO
2320: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
2330: 20 6c 69 6e 65 50 74 72 29 3b 0a 20 20 20 20 7d linePtr);. }
2340: 0a 20 20 64 6f 6e 65 3a 0a 20 20 20 20 54 63 6c . done:. Tcl
2350: 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 ChannelRelease(c
2360: 68 61 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e han);. return
2370: 20 63 6f 64 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a code;.}.../*. *
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 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
23d0: 5f 52 65 61 64 4f 62 6a 43 6d 64 20 2d 2d 0a 20 _ReadObjCmd --.
23e0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
23f0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f on is invoked to
2400: 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c process the Tcl
2410: 20 22 72 65 61 64 22 20 63 6f 6d 6d 61 6e 64 2e "read" command.
2420: 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 See the. *.user
2430: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
2440: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
2450: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 at it does.. *.
2460: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
2470: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
2480: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
2490: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
24a0: 63 6f 6e 73 75 6d 65 20 69 6e 70 75 74 20 66 72 consume input fr
24b0: 6f 6d 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 om channel.. *.
24c0: 2a 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 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
2510: 0a 54 63 6c 5f 52 65 61 64 4f 62 6a 43 6d 64 28 .Tcl_ReadObjCmd(
2520: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 . TCL_UNUSED(
2530: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c void *),. Tcl
2540: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
2550: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 ../* Current int
2560: 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 erpreter. */.
2570: 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 int objc,.../*
2580: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 Number of argume
2590: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nts. */. Tcl_
25a0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
25b0: 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f ])./* Argument o
25c0: 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 bjects. */.{.
25d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
25e0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e n;../* The chann
25f0: 65 6c 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e el to read from.
2600: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 6c */. int newl
2610: 69 6e 65 2c 20 69 3b 09 09 2f 2a 20 44 69 73 63 ine, i;../* Disc
2620: 61 72 64 20 6e 65 77 6c 69 6e 65 20 61 74 20 65 ard newline at e
2630: 6e 64 3f 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 57 nd? */. Tcl_W
2640: 69 64 65 49 6e 74 20 74 6f 52 65 61 64 3b 09 09 ideInt toRead;..
2650: 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 62 79 74 ./* How many byt
2660: 65 73 20 74 6f 20 72 65 61 64 3f 20 2a 2f 0a 20 es to read? */.
2670: 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 68 61 72 Tcl_Size char
2680: 61 63 74 65 72 73 52 65 61 64 3b 09 09 2f 2a 20 actersRead;../*
2690: 48 6f 77 20 6d 61 6e 79 20 63 68 61 72 61 63 74 How many charact
26a0: 65 72 73 20 77 65 72 65 20 72 65 61 64 3f 20 2a ers were read? *
26b0: 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 09 /. int mode;.
26c0: 09 09 2f 2a 20 4d 6f 64 65 20 69 6e 20 77 68 69 ../* Mode in whi
26d0: 63 68 20 63 68 61 6e 6e 65 6c 20 69 73 20 6f 70 ch channel is op
26e0: 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c ened. */. Tcl
26f0: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 2c _Obj *resultPtr,
2700: 20 2a 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 0a 20 *chanObjPtr;..
2710: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 21 3d 20 if ((objc !=
2720: 32 29 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 2) && (objc != 3
2730: 29 29 20 7b 0a 09 49 6e 74 65 72 70 20 2a 69 50 )) {..Interp *iP
2740: 74 72 3b 0a 0a 20 20 20 20 61 72 67 65 72 72 6f tr;.. argerro
2750: 72 3a 0a 09 69 50 74 72 20 3d 20 28 49 6e 74 65 r:..iPtr = (Inte
2760: 72 70 20 2a 29 20 69 6e 74 65 72 70 3b 0a 09 54 rp *) interp;..T
2770: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
2780: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
2790: 20 22 63 68 61 6e 6e 65 6c 20 3f 6e 75 6d 43 68 "channel ?numCh
27a0: 61 72 73 3f 22 29 3b 0a 0a 09 2f 2a 0a 09 20 2a ars?");.../*.. *
27b0: 20 44 6f 20 6e 6f 74 20 61 70 70 65 6e 64 20 64 Do not append d
27c0: 69 72 65 63 74 6c 79 3b 20 74 68 61 74 20 6d 61 irectly; that ma
27d0: 6b 65 73 20 65 6e 73 65 6d 62 6c 65 73 20 75 73 kes ensembles us
27e0: 69 6e 67 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 ing this command
27f0: 20 61 73 0a 09 20 2a 20 61 20 73 75 62 63 6f 6d as.. * a subcom
2800: 6d 61 6e 64 20 70 72 6f 64 75 63 65 20 74 68 65 mand produce the
2810: 20 77 72 6f 6e 67 20 6d 65 73 73 61 67 65 2e 0a wrong message..
2820: 09 20 2a 2f 0a 0a 09 69 50 74 72 2d 3e 66 6c 61 . */...iPtr->fla
2830: 67 73 20 7c 3d 20 49 4e 54 45 52 50 5f 41 4c 54 gs |= INTERP_ALT
2840: 45 52 4e 41 54 45 5f 57 52 4f 4e 47 5f 41 52 47 ERNATE_WRONG_ARG
2850: 53 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d S;..Tcl_WrongNum
2860: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
2870: 6f 62 6a 76 2c 20 22 3f 2d 6e 6f 6e 65 77 6c 69 objv, "?-nonewli
2880: 6e 65 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 ne? channel");..
2890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
28a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 20 3d ;. }.. i =
28b0: 20 31 3b 0a 20 20 20 20 6e 65 77 6c 69 6e 65 20 1;. newline
28c0: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 73 74 72 = 0;. if (str
28d0: 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69 6e 67 cmp(TclGetString
28e0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e 6f 6e (objv[1]), "-non
28f0: 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29 20 7b ewline") == 0) {
2900: 0a 09 6e 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 09 ..newline = 1;..
2910: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 i++;. }..
2920: 69 66 20 28 69 20 3d 3d 20 6f 62 6a 63 29 20 7b if (i == objc) {
2930: 0a 09 67 6f 74 6f 20 61 72 67 65 72 72 6f 72 3b ..goto argerror;
2940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e . }.. chan
2950: 4f 62 6a 50 74 72 20 3d 20 6f 62 6a 76 5b 69 5d ObjPtr = objv[i]
2960: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 ;. if (TclGet
2970: 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 ChannelFromObj(i
2980: 6e 74 65 72 70 2c 20 63 68 61 6e 4f 62 6a 50 74 nterp, chanObjPt
2990: 72 2c 20 26 63 68 61 6e 2c 20 26 6d 6f 64 65 2c r, &chan, &mode,
29a0: 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0) != TCL_OK) {
29b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
29c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
29d0: 20 28 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f 52 (!(mode & TCL_R
29e0: 45 41 44 41 42 4c 45 29 29 20 7b 0a 09 54 63 6c EADABLE)) {..Tcl
29f0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
2a00: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
2a10: 6e 74 66 28 0a 09 09 22 63 68 61 6e 6e 65 6c 20 ntf(..."channel
2a20: 5c 22 25 73 5c 22 20 77 61 73 6e 27 74 20 6f 70 \"%s\" wasn't op
2a30: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 ened for reading
2a40: 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e ",...TclGetStrin
2a50: 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 29 29 3b g(chanObjPtr)));
2a60: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
2a70: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b OR;. }. i+
2a80: 2b 3b 09 09 09 2f 2a 20 43 6f 6e 73 75 6d 65 64 +;.../* Consumed
2a90: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 2e 20 2a channel name. *
2aa0: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a /.. /*. *
2ab0: 20 43 6f 6d 70 75 74 65 20 68 6f 77 20 6d 61 6e Compute how man
2ac0: 79 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 2e y bytes to read.
2ad0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 74 6f . */.. to
2ae0: 52 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 Read = -1;. i
2af0: 66 20 28 69 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 f (i < objc) {..
2b00: 69 66 20 28 28 54 63 6c 47 65 74 57 69 64 65 49 if ((TclGetWideI
2b10: 6e 74 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 ntFromObj(NULL,
2b20: 6f 62 6a 76 5b 69 5d 2c 20 26 74 6f 52 65 61 64 objv[i], &toRead
2b30: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 0a 09 09 7c ) != TCL_OK)...|
2b40: 7c 20 28 74 6f 52 65 61 64 20 3c 20 30 29 29 20 | (toRead < 0))
2b50: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 {.. Tcl_SetOb
2b60: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
2b70: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 Tcl_ObjPrintf(..
2b80: 09 20 20 20 20 22 65 78 70 65 63 74 65 64 20 6e . "expected n
2b90: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 on-negative inte
2ba0: 67 65 72 20 62 75 74 20 67 6f 74 20 5c 22 25 73 ger but got \"%s
2bb0: 5c 22 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 \"",... TclGe
2bc0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 tString(objv[i])
2bd0: 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 ));.. Tcl_Set
2be0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
2bf0: 2c 20 22 54 43 4c 22 2c 20 22 56 41 4c 55 45 22 , "TCL", "VALUE"
2c00: 2c 20 22 4e 55 4d 42 45 52 22 2c 20 28 63 68 61 , "NUMBER", (cha
2c10: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 r *)NULL);..
2c20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
2c30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
2c40: 54 63 6c 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74 TclNewObj(result
2c50: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 43 68 61 Ptr);. TclCha
2c60: 6e 6e 65 6c 50 72 65 73 65 72 76 65 28 63 68 61 nnelPreserve(cha
2c70: 6e 29 3b 0a 20 20 20 20 63 68 61 72 61 63 74 65 n);. characte
2c80: 72 73 52 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 rsRead = Tcl_Rea
2c90: 64 43 68 61 72 73 28 63 68 61 6e 2c 20 72 65 73 dChars(chan, res
2ca0: 75 6c 74 50 74 72 2c 20 74 6f 52 65 61 64 2c 20 ultPtr, toRead,
2cb0: 30 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 72 0);. if (char
2cc0: 61 63 74 65 72 73 52 65 61 64 20 3d 3d 20 54 43 actersRead == TC
2cd0: 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 29 20 7b 0a L_IO_FAILURE) {.
2ce0: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 75 72 6e .Tcl_Obj *return
2cf0: 4f 70 74 73 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a OptsPtr = NULL;.
2d00: 09 69 66 20 28 54 63 6c 43 68 61 6e 6e 65 6c 47 .if (TclChannelG
2d10: 65 74 42 6c 6f 63 6b 69 6e 67 4d 6f 64 65 28 63 etBlockingMode(c
2d20: 68 61 6e 29 29 20 7b 0a 09 20 20 20 20 72 65 74 han)) {.. ret
2d30: 75 72 6e 4f 70 74 73 50 74 72 20 3d 20 54 63 6c urnOptsPtr = Tcl
2d40: 5f 4e 65 77 44 69 63 74 4f 62 6a 28 29 3b 0a 09 _NewDictObj();..
2d50: 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a 50 Tcl_DictObjP
2d60: 75 74 28 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 4f ut(NULL, returnO
2d70: 70 74 73 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 ptsPtr, Tcl_NewS
2d80: 74 72 69 6e 67 4f 62 6a 28 22 2d 64 61 74 61 22 tringObj("-data"
2d90: 2c 20 2d 31 29 2c 0a 09 09 20 20 20 20 72 65 73 , -1),... res
2da0: 75 6c 74 50 74 72 29 3b 0a 09 7d 20 65 6c 73 65 ultPtr);..} else
2db0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 {.. Tcl_Decr
2dc0: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 50 RefCount(resultP
2dd0: 74 72 29 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a 20 tr);..}../*.. *
2de0: 54 49 50 20 23 32 31 39 2e 0a 09 20 2a 20 43 61 TIP #219... * Ca
2df0: 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 pture error mess
2e00: 61 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20 ages put by the
2e10: 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 driver into the
2e20: 62 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 0a bypass area and.
2e30: 09 20 2a 20 70 75 74 20 74 68 65 6d 20 69 6e 74 . * put them int
2e40: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e o the regular in
2e50: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 terpreter result
2e60: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 . Fall back to t
2e70: 68 65 0a 09 20 2a 20 72 65 67 75 6c 61 72 20 6d he.. * regular m
2e80: 65 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e essage if nothin
2e90: 67 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 g was found in t
2ea0: 68 65 20 62 79 70 61 73 73 2e 0a 09 20 2a 2f 0a he bypass... */.
2eb0: 0a 09 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61 ..if (!TclChanCa
2ec0: 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 ughtErrorBypass(
2ed0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b interp, chan)) {
2ee0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
2ef0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
2f00: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
2f10: 20 20 20 20 22 65 72 72 6f 72 20 72 65 61 64 69 "error readi
2f20: 6e 67 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a ng \"%s\": %s",.
2f30: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 .. TclGetStri
2f40: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20 ng(chanObjPtr),
2f50: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
2f60: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 nterp)));..}..Tc
2f70: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 lChannelRelease(
2f80: 63 68 61 6e 29 3b 0a 09 69 66 20 28 72 65 74 75 chan);..if (retu
2f90: 72 6e 4f 70 74 73 50 74 72 29 20 7b 0a 09 20 20 rnOptsPtr) {..
2fa0: 20 20 54 63 6c 5f 53 65 74 52 65 74 75 72 6e 4f Tcl_SetReturnO
2fb0: 70 74 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 72 ptions(interp, r
2fc0: 65 74 75 72 6e 4f 70 74 73 50 74 72 29 3b 0a 09 eturnOptsPtr);..
2fd0: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 }..return TCL_ER
2fe0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
2ff0: 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 72 65 71 /*. * If req
3000: 75 65 73 74 65 64 2c 20 72 65 6d 6f 76 65 20 74 uested, remove t
3010: 68 65 20 6c 61 73 74 20 6e 65 77 6c 69 6e 65 20 he last newline
3020: 69 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 in the channel i
3030: 66 20 61 74 20 45 4f 46 2e 0a 20 20 20 20 20 2a f at EOF.. *
3040: 2f 0a 0a 20 20 20 20 69 66 20 28 28 63 68 61 72 /.. if ((char
3050: 61 63 74 65 72 73 52 65 61 64 20 3e 20 30 29 20 actersRead > 0)
3060: 26 26 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30 && (newline != 0
3070: 29 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 )) {..const char
3080: 20 2a 72 65 73 75 6c 74 3b 0a 09 54 63 6c 5f 53 *result;..Tcl_S
3090: 69 7a 65 20 6c 65 6e 67 74 68 3b 0a 0a 09 72 65 ize length;...re
30a0: 73 75 6c 74 20 3d 20 54 63 6c 47 65 74 53 74 72 sult = TclGetStr
30b0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c ingFromObj(resul
30c0: 74 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a tPtr, &length);.
30d0: 09 69 66 20 28 72 65 73 75 6c 74 5b 6c 65 6e 67 .if (result[leng
30e0: 74 68 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 th - 1] == '\n')
30f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f {.. Tcl_SetO
3100: 62 6a 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 50 bjLength(resultP
3110: 74 72 2c 20 6c 65 6e 67 74 68 20 2d 20 31 29 3b tr, length - 1);
3120: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ..}. }. Tc
3130: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
3140: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 nterp, resultPtr
3150: 29 3b 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 );. TclChanne
3160: 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a lRelease(chan);.
3170: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
3180: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K;.}.../*. *----
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 53 65 65 --. *. * Tcl_See
31e0: 6b 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a kObjCmd --. *. *
31f0: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
3200: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
3210: 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 73 65 cess the Tcl "se
3220: 65 6b 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 ek" command. See
3230: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 the. *.user doc
3240: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
3250: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
3260: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
3270: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
3280: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
3290: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
32a0: 63 74 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 74 68 cts:. *.Moves th
32b0: 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 e position of th
32c0: 65 20 61 63 63 65 73 73 20 70 6f 69 6e 74 20 6f e access point o
32d0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 n the specified
32e0: 63 68 61 6e 6e 65 6c 2e 20 20 4d 61 79 0a 20 2a channel. May. *
32f0: 09 66 6c 75 73 68 20 71 75 65 75 65 64 20 6f 75 .flush queued ou
3300: 74 70 75 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d tput.. *. *-----
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3350: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 -. */..int.Tcl_S
3360: 65 65 6b 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 eekObjCmd(. T
3370: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
3380: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
3390: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 p *interp,../* C
33a0: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
33b0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f er. */. int o
33c0: 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 bjc,.../* Number
33d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a of arguments. *
33e0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 /. Tcl_Obj *c
33f0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 onst objv[])./*
3400: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 Argument objects
3410: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
3420: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a hannel chan;../*
3430: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 The channel to
3440: 74 65 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 tell on. */.
3450: 54 63 6c 5f 57 69 64 65 49 6e 74 20 6f 66 66 73 Tcl_WideInt offs
3460: 65 74 3b 09 09 2f 2a 20 57 68 65 72 65 20 74 6f et;../* Where to
3470: 20 73 65 65 6b 3f 20 2a 2f 0a 20 20 20 20 69 6e seek? */. in
3480: 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 48 6f 77 t mode;.../* How
3490: 20 74 6f 20 73 65 65 6b 3f 20 2a 2f 0a 20 20 20 to seek? */.
34a0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 65 73 Tcl_WideInt res
34b0: 75 6c 74 3b 09 09 2f 2a 20 4f 66 20 63 61 6c 6c ult;../* Of call
34c0: 69 6e 67 20 54 63 6c 5f 53 65 65 6b 2e 20 2a 2f ing Tcl_Seek. */
34d0: 0a 20 20 20 20 69 6e 74 20 6f 70 74 69 6f 6e 49 . int optionI
34e0: 6e 64 65 78 3b 0a 20 20 20 20 73 74 61 74 69 63 ndex;. static
34f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e const char *con
3500: 73 74 20 6f 72 69 67 69 6e 4f 70 74 69 6f 6e 73 st originOptions
3510: 5b 5d 20 3d 20 7b 0a 09 22 73 74 61 72 74 22 2c [] = {.."start",
3520: 20 22 63 75 72 72 65 6e 74 22 2c 20 22 65 6e 64 "current", "end
3530: 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 ", NULL. };.
3540: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
3550: 69 6e 74 20 6d 6f 64 65 41 72 72 61 79 5b 5d 20 int modeArray[]
3560: 3d 20 7b 53 45 45 4b 5f 53 45 54 2c 20 53 45 45 = {SEEK_SET, SEE
3570: 4b 5f 43 55 52 2c 20 53 45 45 4b 5f 45 4e 44 7d K_CUR, SEEK_END}
3580: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
3590: 20 21 3d 20 33 29 20 26 26 20 28 6f 62 6a 63 20 != 3) && (objc
35a0: 21 3d 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 != 4)) {..Tcl_Wr
35b0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
35c0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
35d0: 6e 6e 65 6c 20 6f 66 66 73 65 74 20 3f 6f 72 69 nnel offset ?ori
35e0: 67 69 6e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 gin?");..return
35f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
3600: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 . if (TclGetC
3610: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e hannelFromObj(in
3620: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 terp, objv[1], &
3630: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 chan, NULL, 0) !
3640: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
3650: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
3660: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c }. if (Tcl
3670: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 GetWideIntFromOb
3680: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
3690: 5d 2c 20 26 6f 66 66 73 65 74 29 20 21 3d 20 54 ], &offset) != T
36a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
36b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
36c0: 7d 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 45 45 }. mode = SEE
36d0: 4b 5f 53 45 54 3b 0a 20 20 20 20 69 66 20 28 6f K_SET;. if (o
36e0: 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09 69 66 20 bjc == 4) {..if
36f0: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f (Tcl_GetIndexFro
3700: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
3710: 76 5b 33 5d 2c 20 6f 72 69 67 69 6e 4f 70 74 69 v[3], originOpti
3720: 6f 6e 73 2c 20 22 6f 72 69 67 69 6e 22 2c 20 30 ons, "origin", 0
3730: 2c 0a 09 09 26 6f 70 74 69 6f 6e 49 6e 64 65 78 ,...&optionIndex
3740: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
3750: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
3760: 52 52 4f 52 3b 0a 09 7d 0a 09 6d 6f 64 65 20 3d RROR;..}..mode =
3770: 20 6d 6f 64 65 41 72 72 61 79 5b 6f 70 74 69 6f modeArray[optio
3780: 6e 49 6e 64 65 78 5d 3b 0a 20 20 20 20 7d 0a 0a nIndex];. }..
3790: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 TclChannelPr
37a0: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 eserve(chan);.
37b0: 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 53 result = Tcl_S
37c0: 65 65 6b 28 63 68 61 6e 2c 20 6f 66 66 73 65 74 eek(chan, offset
37d0: 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 , mode);. if
37e0: 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31 29 20 7b (result == -1) {
37f0: 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 23 32 31 ../*.. * TIP #21
3800: 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 65 20 65 9... * Capture e
3810: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 70 75 rror messages pu
3820: 74 20 62 79 20 74 68 65 20 64 72 69 76 65 72 20 t by the driver
3830: 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 73 20 into the bypass
3840: 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 70 75 74 area and.. * put
3850: 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 72 them into the r
3860: 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72 65 74 egular interpret
3870: 65 72 20 72 65 73 75 6c 74 2e 20 46 61 6c 6c 20 er result. Fall
3880: 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 20 2a 20 back to the.. *
3890: 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 65 20 regular message
38a0: 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 66 if nothing was f
38b0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 70 61 ound in the bypa
38c0: 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 ss... */...if (!
38d0: 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 72 72 TclChanCaughtErr
38e0: 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72 70 2c orBypass(interp,
38f0: 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 20 20 54 chan)) {.. T
3900: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
3910: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 interp, Tcl_ObjP
3920: 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 65 72 rintf(... "er
3930: 72 6f 72 20 64 75 72 69 6e 67 20 73 65 65 6b 20 ror during seek
3940: 6f 6e 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a on \"%s\": %s",.
3950: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 .. TclGetStri
3960: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 54 63 6c ng(objv[1]), Tcl
3970: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
3980: 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43 68 rp)));..}..TclCh
3990: 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 61 annelRelease(cha
39a0: 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f n);..return TCL_
39b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
39c0: 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 TclChannelRelea
39d0: 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 65 se(chan);. re
39e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
39f0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
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 0a 20 2a 0a ------------. *.
3a40: 20 2a 20 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d * Tcl_TellObjCm
3a50: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
3a60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f function is invo
3a70: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 ked to process t
3a80: 68 65 20 54 63 6c 20 22 74 65 6c 6c 22 20 63 6f he Tcl "tell" co
3a90: 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 mmand. See the.
3aa0: 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 *.user documenta
3ab0: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 tion for details
3ac0: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 on what it does
3ad0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
3ae0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
3af0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
3b00: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3b10: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b60: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
3b70: 5f 54 65 6c 6c 4f 62 6a 43 6d 64 28 0a 20 20 20 _TellObjCmd(.
3b80: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
3b90: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
3ba0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
3bb0: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 Current interpr
3bc0: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 eter. */. int
3bd0: 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 objc,.../* Numb
3be0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e er of arguments.
3bf0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
3c00: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f *const objv[])./
3c10: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 * Argument objec
3c20: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c ts. */.{. Tcl
3c30: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 _Channel chan;..
3c40: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 /* The channel t
3c50: 6f 20 74 65 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20 20 o tell on. */.
3c60: 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 65 Tcl_WideInt ne
3c70: 77 4c 6f 63 3b 0a 20 20 20 20 69 6e 74 20 63 6f wLoc;. int co
3c80: 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a de;.. if (obj
3c90: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 c != 2) {..Tcl_W
3ca0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
3cb0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 rp, 1, objv, "ch
3cc0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e annel");..return
3cd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3ce0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
3cf0: 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 63 Try to find a c
3d00: 68 61 6e 6e 65 6c 20 77 69 74 68 20 74 68 65 20 hannel with the
3d10: 72 69 67 68 74 20 6e 61 6d 65 20 61 6e 64 20 70 right name and p
3d20: 65 72 6d 69 73 73 69 6f 6e 73 20 69 6e 20 74 68 ermissions in th
3d30: 65 20 49 4f 0a 20 20 20 20 20 2a 20 63 68 61 6e e IO. * chan
3d40: 6e 65 6c 20 74 61 62 6c 65 20 6f 66 20 74 68 69 nel table of thi
3d50: 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 s interpreter..
3d60: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
3d70: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f TclGetChannelFro
3d80: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
3d90: 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c v[1], &chan, NUL
3da0: 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 L, 0) != TCL_OK)
3db0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
3dc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
3dd0: 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 65 73 65 TclChannelPrese
3de0: 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 6e rve(chan);. n
3df0: 65 77 4c 6f 63 20 3d 20 54 63 6c 5f 54 65 6c 6c ewLoc = Tcl_Tell
3e00: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 0a (chan);.. /*.
3e10: 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 2e * TIP #219.
3e20: 0a 20 20 20 20 20 2a 20 43 61 70 74 75 72 65 20 . * Capture
3e30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 70 error messages p
3e40: 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 72 ut by the driver
3e50: 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 73 into the bypass
3e60: 20 61 72 65 61 20 61 6e 64 20 70 75 74 0a 20 20 area and put.
3e70: 20 20 20 2a 20 74 68 65 6d 20 69 6e 74 6f 20 74 * them into t
3e80: 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 he regular inter
3e90: 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 0a 20 preter result..
3ea0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 63 6f 64 65 */.. code
3eb0: 20 20 3d 20 54 63 6c 43 68 61 6e 43 61 75 67 68 = TclChanCaugh
3ec0: 74 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 tErrorBypass(int
3ed0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 erp, chan);.
3ee0: 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 TclChannelReleas
3ef0: 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 e(chan);. if
3f00: 28 63 6f 64 65 29 20 7b 0a 09 72 65 74 75 72 6e (code) {..return
3f10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3f20: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 }.. Tcl_SetOb
3f30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
3f40: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 Tcl_NewWideIntOb
3f50: 6a 28 6e 65 77 4c 6f 63 29 29 3b 0a 20 20 20 20 j(newLoc));.
3f60: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
3f70: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3fc0: 2a 0a 20 2a 20 54 63 6c 5f 43 6c 6f 73 65 4f 62 *. * Tcl_CloseOb
3fd0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 jCmd --. *. *.Th
3fe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 is function is i
3ff0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 nvoked to proces
4000: 73 20 74 68 65 20 54 63 6c 20 22 63 6c 6f 73 65 s the Tcl "close
4010: 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 " command. See t
4020: 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d he. *.user docum
4030: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
4040: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
4050: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 does.. *. * Resu
4060: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
4070: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
4080: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4090: 73 3a 0a 20 2a 09 4d 61 79 20 64 69 73 63 61 72 s:. *.May discar
40a0: 64 20 71 75 65 75 65 64 20 69 6e 70 75 74 3b 20 d queued input;
40b0: 6d 61 79 20 66 6c 75 73 68 20 71 75 65 75 65 64 may flush queued
40c0: 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20 2a 2d 2d output.. *. *--
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4110: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
4120: 6c 5f 43 6c 6f 73 65 4f 62 6a 43 6d 64 28 0a 20 l_CloseObjCmd(.
4130: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
4140: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
4150: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
4160: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
4170: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 preter. */. i
4180: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 nt objc,.../* Nu
4190: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
41a0: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
41b0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
41c0: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
41d0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 ects. */.{. T
41e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
41f0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
4200: 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 20 20 to close. */.
4210: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
4220: 68 61 72 20 2a 63 6f 6e 73 74 20 64 69 72 4f 70 har *const dirOp
4230: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 72 65 tions[] = {.."re
4240: 61 64 22 2c 20 22 77 72 69 74 65 22 2c 20 4e 55 ad", "write", NU
4250: 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 LL. };. st
4260: 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 64 atic const int d
4270: 69 72 41 72 72 61 79 5b 5d 20 3d 20 7b 54 43 4c irArray[] = {TCL
4280: 5f 43 4c 4f 53 45 5f 52 45 41 44 2c 20 54 43 4c _CLOSE_READ, TCL
4290: 5f 43 4c 4f 53 45 5f 57 52 49 54 45 7d 3b 0a 0a _CLOSE_WRITE};..
42a0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 21 3d if ((objc !=
42b0: 20 32 29 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 2) && (objc !=
42c0: 33 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 3)) {..Tcl_Wrong
42d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
42e0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
42f0: 6c 20 3f 64 69 72 65 63 74 69 6f 6e 3f 22 29 3b l ?direction?");
4300: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
4310: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 OR;. }.. i
4320: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c f (TclGetChannel
4330: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
4340: 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 objv[1], &chan,
4350: 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f NULL, 0) != TCL_
4360: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
4370: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
4380: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 if (objc ==
4390: 33 29 20 7b 0a 09 69 6e 74 20 69 6e 64 65 78 2c 3) {..int index,
43a0: 20 64 69 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 47 dir;.../*.. * G
43b0: 65 74 20 64 69 72 65 63 74 69 6f 6e 20 72 65 71 et direction req
43c0: 75 65 73 74 65 64 20 74 6f 20 63 6c 6f 73 65 2c uested to close,
43d0: 20 61 6e 64 20 63 68 65 63 6b 20 73 79 6e 74 61 and check synta
43e0: 78 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 54 63 x... */...if (Tc
43f0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 l_GetIndexFromOb
4400: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 j(interp, objv[2
4410: 5d 2c 20 64 69 72 4f 70 74 69 6f 6e 73 2c 20 22 ], dirOptions, "
4420: 64 69 72 65 63 74 69 6f 6e 22 2c 20 30 2c 0a 09 direction", 0,..
4430: 09 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f .&index) != TCL_
4440: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
4450: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
4460: 09 64 69 72 20 3d 20 64 69 72 41 72 72 61 79 5b .dir = dirArray[
4470: 69 6e 64 65 78 5d 3b 0a 0a 09 2f 2a 0a 09 20 2a index];.../*.. *
4480: 20 43 68 65 63 6b 20 64 69 72 65 63 74 69 6f 6e Check direction
4490: 20 61 67 61 69 6e 73 74 20 63 68 61 6e 6e 65 6c against channel
44a0: 20 6d 6f 64 65 2e 20 49 74 20 69 73 20 61 6e 20 mode. It is an
44b0: 65 72 72 6f 72 20 69 66 20 77 65 20 74 72 79 20 error if we try
44c0: 74 6f 0a 09 20 2a 20 63 6c 6f 73 65 20 61 20 64 to.. * close a d
44d0: 69 72 65 63 74 69 6f 6e 20 6e 6f 74 20 73 75 70 irection not sup
44e0: 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 63 68 ported by the ch
44f0: 61 6e 6e 65 6c 20 28 61 6c 72 65 61 64 79 20 63 annel (already c
4500: 6c 6f 73 65 64 2c 20 6f 72 0a 09 20 2a 20 6e 65 losed, or.. * ne
4510: 76 65 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 74 ver opened for t
4520: 68 61 74 20 64 69 72 65 63 74 69 6f 6e 29 2e 0a hat direction)..
4530: 09 20 2a 2f 0a 0a 09 69 66 20 28 21 28 64 69 72 . */...if (!(dir
4540: 20 26 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 & Tcl_GetChanne
4550: 6c 4d 6f 64 65 28 63 68 61 6e 29 29 29 20 7b 0a lMode(chan))) {.
4560: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
4570: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
4580: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 l_ObjPrintf(...
4590: 20 20 20 22 48 61 6c 66 2d 63 6c 6f 73 65 20 6f "Half-close o
45a0: 66 20 25 73 2d 73 69 64 65 20 6e 6f 74 20 70 6f f %s-side not po
45b0: 73 73 69 62 6c 65 2c 20 73 69 64 65 20 6e 6f 74 ssible, side not
45c0: 20 6f 70 65 6e 65 64 22 0a 09 09 20 20 20 20 22 opened"... "
45d0: 20 6f 72 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 or already clos
45e0: 65 64 22 2c 20 64 69 72 4f 70 74 69 6f 6e 73 5b ed", dirOptions[
45f0: 69 6e 64 65 78 5d 29 29 3b 0a 09 20 20 20 20 72 index]));.. r
4600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
4610: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 53 70 65 ..}.../*.. * Spe
4620: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 cial handling is
4630: 20 6e 65 65 64 65 64 20 69 66 20 61 6e 64 20 6f needed if and o
4640: 6e 6c 79 20 69 66 20 74 68 65 20 63 68 61 6e 6e nly if the chann
4650: 65 6c 20 6d 6f 64 65 20 73 75 70 70 6f 72 74 73 el mode supports
4660: 0a 09 20 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 .. * more than t
4670: 68 65 20 64 69 72 65 63 74 69 6f 6e 20 74 6f 20 he direction to
4680: 63 6c 6f 73 65 2e 20 42 65 63 61 75 73 65 20 69 close. Because i
4690: 66 20 74 68 65 20 63 6c 6f 73 65 20 74 68 65 20 f the close the
46a0: 6c 61 73 74 0a 09 20 2a 20 64 69 72 65 63 74 69 last.. * directi
46b0: 6f 6e 20 73 75 70 70 6f 72 74 65 64 20 77 65 20 on supported we
46c0: 63 61 6e 20 61 6e 64 20 77 69 6c 6c 20 67 6f 20 can and will go
46d0: 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 67 75 through the regu
46e0: 6c 61 72 0a 09 20 2a 20 70 72 6f 63 65 73 73 2e lar.. * process.
46f0: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 54 63 6c .. */...if ((Tcl
4700: 5f 47 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65 28 _GetChannelMode(
4710: 63 68 61 6e 29 20 26 0a 09 09 28 54 43 4c 5f 43 chan) &...(TCL_C
4720: 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c LOSE_READ|TCL_CL
4730: 4f 53 45 5f 57 52 49 54 45 29 29 20 21 3d 20 64 OSE_WRITE)) != d
4740: 69 72 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 ir) {.. retur
4750: 6e 20 54 63 6c 5f 43 6c 6f 73 65 45 78 28 69 6e n Tcl_CloseEx(in
4760: 74 65 72 70 2c 20 63 68 61 6e 2c 20 64 69 72 29 terp, chan, dir)
4770: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
4780: 69 66 20 28 54 63 6c 5f 55 6e 72 65 67 69 73 74 if (Tcl_Unregist
4790: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 erChannel(interp
47a0: 2c 20 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f , chan) != TCL_O
47b0: 4b 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 K) {../*.. * If
47c0: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f there is an erro
47d0: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 69 74 r message and it
47e0: 20 65 6e 64 73 20 77 69 74 68 20 61 20 6e 65 77 ends with a new
47f0: 6c 69 6e 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 line, remove the
4800: 0a 09 20 2a 20 6e 65 77 6c 69 6e 65 2e 20 54 68 .. * newline. Th
4810: 69 73 20 69 73 20 64 6f 6e 65 20 66 6f 72 20 63 is is done for c
4820: 6f 6d 6d 61 6e 64 20 70 69 70 65 6c 69 6e 65 20 ommand pipeline
4830: 63 68 61 6e 6e 65 6c 73 20 77 68 65 72 65 20 74 channels where t
4840: 68 65 20 65 72 72 6f 72 0a 09 20 2a 20 6f 75 74 he error.. * out
4850: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73 75 62 put from the sub
4860: 70 72 6f 63 65 73 73 65 73 20 69 73 20 73 74 6f processes is sto
4870: 72 65 64 20 69 6e 20 69 6e 74 65 72 70 27 73 20 red in interp's
4880: 72 65 73 75 6c 74 2e 0a 09 20 2a 0a 09 20 2a 20 result... *.. *
4890: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 6c 69 NOTE: This is li
48a0: 6b 65 6c 79 20 74 6f 20 6e 6f 74 20 68 61 76 65 kely to not have
48b0: 20 61 6e 79 20 65 66 66 65 63 74 20 6f 6e 20 72 any effect on r
48c0: 65 67 75 6c 61 72 20 65 72 72 6f 72 0a 09 20 2a egular error.. *
48d0: 20 6d 65 73 73 61 67 65 73 20 70 72 6f 64 75 63 messages produc
48e0: 65 64 20 62 79 20 64 72 69 76 65 72 73 20 64 75 ed by drivers du
48f0: 72 69 6e 67 20 74 68 65 20 63 6c 6f 73 69 6e 67 ring the closing
4900: 20 6f 66 20 61 20 63 68 61 6e 6e 65 6c 2c 0a 09 of a channel,..
4910: 20 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 54 * because the T
4920: 63 6c 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 69 73 cl convention is
4930: 20 74 68 61 74 20 73 75 63 68 20 65 72 72 6f 72 that such error
4940: 20 6d 65 73 73 61 67 65 73 20 64 6f 20 6e 6f 74 messages do not
4950: 20 68 61 76 65 0a 09 20 2a 20 61 20 74 65 72 6d have.. * a term
4960: 69 6e 61 74 69 6e 67 20 6e 65 77 6c 69 6e 65 2e inating newline.
4970: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 4f 62 6a 20 .. */...Tcl_Obj
4980: 2a 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c *resultPtr = Tcl
4990: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _GetObjResult(in
49a0: 74 65 72 70 29 3b 0a 09 63 6f 6e 73 74 20 63 68 terp);..const ch
49b0: 61 72 20 2a 73 74 72 69 6e 67 3b 0a 09 54 63 6c ar *string;..Tcl
49c0: 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 09 69 66 20 _Size len;...if
49d0: 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 72 65 (Tcl_IsShared(re
49e0: 73 75 6c 74 50 74 72 29 29 20 7b 0a 09 20 20 20 sultPtr)) {..
49f0: 20 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c resultPtr = Tcl
4a00: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 72 65 _DuplicateObj(re
4a10: 73 75 6c 74 50 74 72 29 3b 0a 09 20 20 20 20 54 sultPtr);.. T
4a20: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
4a30: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 interp, resultPt
4a40: 72 29 3b 0a 09 7d 0a 09 73 74 72 69 6e 67 20 3d r);..}..string =
4a50: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f TclGetStringFro
4a60: 6d 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 2c 20 mObj(resultPtr,
4a70: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 28 6c 65 6e &len);..if ((len
4a80: 20 3e 20 30 29 20 26 26 20 28 73 74 72 69 6e 67 > 0) && (string
4a90: 5b 6c 65 6e 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e [len - 1] == '\n
4aa0: 27 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 ')) {.. Tcl_S
4ab0: 65 74 4f 62 6a 4c 65 6e 67 74 68 28 72 65 73 75 etObjLength(resu
4ac0: 6c 74 50 74 72 2c 20 6c 65 6e 20 2d 20 31 29 3b ltPtr, len - 1);
4ad0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ..}..return TCL_
4ae0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
4af0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
4b00: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b50: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 63 6f 6e 66 . *. * Tcl_Fconf
4b60: 69 67 75 72 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 igureObjCmd --.
4b70: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
4b80: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f on is invoked to
4b90: 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c process the Tcl
4ba0: 20 22 66 63 6f 6e 66 69 67 75 72 65 22 20 63 6f "fconfigure" co
4bb0: 6d 6d 61 6e 64 2e 20 53 65 65 0a 20 2a 09 74 68 mmand. See. *.th
4bc0: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
4bd0: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 tion for details
4be0: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 on what it does
4bf0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4c00: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 . *.A standard T
4c10: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a cl result.. *. *
4c20: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
4c30: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 *.May modify the
4c40: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 behavior of an
4c50: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 IO channel.. *.
4c60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
4cb0: 0a 54 63 6c 5f 46 63 6f 6e 66 69 67 75 72 65 4f .Tcl_FconfigureO
4cc0: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
4cd0: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
4ce0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
4cf0: 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 nterp,../* Curre
4d00: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 nt interpreter.
4d10: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c */. int objc,
4d20: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 .../* Number of
4d30: 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 arguments. */.
4d40: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
4d50: 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 objv[])./* Argu
4d60: 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f ment objects. */
4d70: 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 .{. const cha
4d80: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 2a r *optionName, *
4d90: 76 61 6c 75 65 4e 61 6d 65 3b 0a 20 20 20 20 54 valueName;. T
4da0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
4db0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c ../* The channel
4dc0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f to set a mode o
4dd0: 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b n. */. int i;
4de0: 09 09 09 2f 2a 20 49 74 65 72 61 74 65 20 6f 76 .../* Iterate ov
4df0: 65 72 20 61 72 67 2d 76 61 6c 75 65 20 70 61 69 er arg-value pai
4e00: 72 73 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 rs. */.. if (
4e10: 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 28 (objc < 2) || ((
4e20: 28 6f 62 6a 63 20 25 20 32 29 20 3d 3d 20 31 29 (objc % 2) == 1)
4e30: 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 29 29 && (objc != 3))
4e40: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
4e50: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
4e60: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 objv, "channel
4e70: 3f 2d 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 2e ?-option value .
4e80: 2e 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 ..?");..return T
4e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4ea0: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 . if (TclGetC
4eb0: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e hannelFromObj(in
4ec0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 terp, objv[1], &
4ed0: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 chan, NULL, 0) !
4ee0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 = TCL_OK) {..ret
4ef0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
4f00: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 62 }.. if (ob
4f10: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 54 63 6c 5f jc == 2) {..Tcl_
4f20: 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a 20 DString ds;../*
4f30: 44 53 74 72 69 6e 67 20 74 6f 20 68 6f 6c 64 20 DString to hold
4f40: 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c 69 6e result of callin
4f50: 67 0a 09 09 09 09 20 2a 20 54 63 6c 5f 47 65 74 g..... * Tcl_Get
4f60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2e 20 2a ChannelOption. *
4f70: 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 /...Tcl_DStringI
4f80: 6e 69 74 28 26 64 73 29 3b 0a 09 69 66 20 28 54 nit(&ds);..if (T
4f90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_GetChannelOpt
4fa0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
4fb0: 2c 20 4e 55 4c 4c 2c 20 26 64 73 29 20 21 3d 20 , NULL, &ds) !=
4fc0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 TCL_OK) {.. T
4fd0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
4fe0: 64 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e ds);.. return
4ff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 TCL_ERROR;..}..
5000: 54 63 6c 5f 44 53 74 72 69 6e 67 52 65 73 75 6c Tcl_DStringResul
5010: 74 28 69 6e 74 65 72 70 2c 20 26 64 73 29 3b 0a t(interp, &ds);.
5020: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a .return TCL_OK;.
5030: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f } else if (o
5040: 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 54 63 6c bjc == 3) {..Tcl
5050: 5f 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a _DString ds;../*
5060: 20 44 53 74 72 69 6e 67 20 74 6f 20 68 6f 6c 64 DString to hold
5070: 20 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c 69 result of calli
5080: 6e 67 0a 09 09 09 09 20 2a 20 54 63 6c 5f 47 65 ng..... * Tcl_Ge
5090: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2e 20 tChannelOption.
50a0: 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 */...Tcl_DString
50b0: 49 6e 69 74 28 26 64 73 29 3b 0a 09 6f 70 74 69 Init(&ds);..opti
50c0: 6f 6e 4e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 onName = TclGetS
50d0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a tring(objv[2]);.
50e0: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e .if (Tcl_GetChan
50f0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 nelOption(interp
5100: 2c 20 63 68 61 6e 2c 20 6f 70 74 69 6f 6e 4e 61 , chan, optionNa
5110: 6d 65 2c 20 26 64 73 29 20 21 3d 20 54 43 4c 5f me, &ds) != TCL_
5120: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 OK) {.. Tcl_D
5130: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
5140: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
5150: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 6c 5f _ERROR;..}..Tcl_
5160: 44 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e DStringResult(in
5170: 74 65 72 70 2c 20 26 64 73 29 3b 0a 09 72 65 74 terp, &ds);..ret
5180: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 urn TCL_OK;.
5190: 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 }.. for (i =
51a0: 33 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 20 2b 3; i < objc; i +
51b0: 3d 20 32 29 20 7b 0a 09 6f 70 74 69 6f 6e 4e 61 = 2) {..optionNa
51c0: 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e me = TclGetStrin
51d0: 67 28 6f 62 6a 76 5b 69 2d 31 5d 29 3b 0a 09 76 g(objv[i-1]);..v
51e0: 61 6c 75 65 4e 61 6d 65 20 3d 20 54 63 6c 47 65 alueName = TclGe
51f0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 tString(objv[i])
5200: 3b 0a 09 69 66 20 28 54 63 6c 5f 53 65 74 43 68 ;..if (Tcl_SetCh
5210: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
5220: 72 70 2c 20 63 68 61 6e 2c 20 6f 70 74 69 6f 6e rp, chan, option
5230: 4e 61 6d 65 2c 20 76 61 6c 75 65 4e 61 6d 65 29 Name, valueName)
5240: 0a 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a ...!= TCL_OK) {.
5250: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
5260: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
5270: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
5280: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
52e0: 63 6c 5f 45 6f 66 4f 62 6a 43 6d 64 20 2d 2d 0a cl_EofObjCmd --.
52f0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
5300: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ion is invoked t
5310: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 o process the Tc
5320: 6c 20 22 65 6f 66 22 20 63 6f 6d 6d 61 6e 64 2e l "eof" command.
5330: 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 See the. *.user
5340: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
5350: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
5360: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 at it does.. *.
5370: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
5380: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
5390: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
53a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
53b0: 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 interp's result
53c0: 20 74 6f 20 62 6f 6f 6c 65 61 6e 20 74 72 75 65 to boolean true
53d0: 20 6f 72 20 66 61 6c 73 65 20 64 65 70 65 6e 64 or false depend
53e0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 74 ing on whether t
53f0: 68 65 0a 20 2a 09 73 70 65 63 69 66 69 65 64 20 he. *.specified
5400: 63 68 61 6e 6e 65 6c 20 68 61 73 20 61 6e 20 45 channel has an E
5410: 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 2a OF condition.. *
5420: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5470: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 45 6f 66 4f */..int.Tcl_EofO
5480: 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 bjCmd(. TCL_U
5490: 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 NUSED(void *),.
54a0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
54b0: 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 nterp,../* Curre
54c0: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 nt interpreter.
54d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c */. int objc,
54e0: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 .../* Number of
54f0: 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 arguments. */.
5500: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
5510: 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 objv[])./* Argu
5520: 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f ment objects. */
5530: 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e .{. Tcl_Chann
5540: 65 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20 69 66 el chan;.. if
5550: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 (objc != 2) {..
5560: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
5570: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
5580: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 , "channel");..r
5590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
55a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
55b0: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f TclGetChannelFro
55c0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
55d0: 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c v[1], &chan, NUL
55e0: 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 L, 0) != TCL_OK)
55f0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
5600: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5610: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
5620: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
5630: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 54 63 6c 5f wBooleanObj(Tcl_
5640: 45 6f 66 28 63 68 61 6e 29 29 29 3b 0a 20 20 20 Eof(chan)));.
5650: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
5660: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 43 68 61 6e 49 73 ---. *. * ChanIs
56c0: 42 69 6e 61 72 79 43 6d 64 20 2d 2d 0a 20 2a 0a BinaryCmd --. *.
56d0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
56e0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
56f0: 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 rocess the Tcl "
5700: 63 68 61 6e 20 69 73 62 69 6e 61 72 79 22 20 63 chan isbinary" c
5710: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a ommand. See the.
5720: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 *.user document
5730: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
5740: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
5750: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
5760: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
5770: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
5780: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5790: 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73 *.Sets interp's
57a0: 20 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65 result to boole
57b0: 61 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 an true or false
57c0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 depending on wh
57d0: 65 74 68 65 72 20 74 68 65 0a 20 2a 09 73 70 65 ether the. *.spe
57e0: 63 69 66 69 65 64 20 63 68 61 6e 6e 65 6c 20 69 cified channel i
57f0: 73 20 61 20 62 69 6e 61 72 79 20 63 68 61 6e 6e s a binary chann
5800: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5850: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
5860: 20 69 6e 74 0a 43 68 61 6e 49 73 42 69 6e 61 72 int.ChanIsBinar
5870: 79 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e yCmd(. TCL_UN
5880: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
5890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
58a0: 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e terp,../* Curren
58b0: 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a t interpreter. *
58c0: 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 /. int objc,.
58d0: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 ../* Number of a
58e0: 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 rguments. */.
58f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
5900: 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d objv[])./* Argum
5910: 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a ent objects. */.
5920: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 {. Tcl_Channe
5930: 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20 69 66 20 l chan;.. if
5940: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
5950: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
5960: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
5970: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 "channel");..re
5980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5990: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 }.. if (T
59a0: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d clGetChannelFrom
59b0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
59c0: 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c [1], &chan, NULL
59d0: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 , 0) != TCL_OK)
59e0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
59f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5a00: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
5a10: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
5a20: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 54 63 6c 43 68 BooleanObj(TclCh
5a30: 61 6e 49 73 42 69 6e 61 72 79 28 63 68 61 6e 29 anIsBinary(chan)
5a40: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ));. return T
5a50: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5aa0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
5ab0: 5f 45 78 65 63 4f 62 6a 43 6d 64 20 2d 2d 0a 20 _ExecObjCmd --.
5ac0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
5ad0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f on is invoked to
5ae0: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 65 78 process the "ex
5af0: 65 63 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e ec" Tcl command.
5b00: 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 See the. *.user
5b10: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
5b20: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
5b30: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 at it does.. *.
5b40: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
5b50: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
5b60: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ult.. *. * Side
5b70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 effects:. *.See
5b80: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
5b90: 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d tation.. *. *---
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5be0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
5bf0: 5f 45 78 65 63 4f 62 6a 43 6d 64 28 0a 20 20 20 _ExecObjCmd(.
5c00: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
5c10: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
5c20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
5c30: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 Current interpr
5c40: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 eter. */. int
5c50: 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 objc,.../* Numb
5c60: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e er of arguments.
5c70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
5c80: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f *const objv[])./
5c90: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 * Argument objec
5ca0: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c ts. */.{. Tcl
5cb0: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72 3b _Obj *resultPtr;
5cc0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
5cd0: 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 6e 20 61 **argv;../* An a
5ce0: 72 72 61 79 20 66 6f 72 20 74 68 65 20 73 74 72 rray for the str
5cf0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 2e 20 53 ing arguments. S
5d00: 74 6f 72 65 64 0a 09 09 09 09 20 2a 20 6f 6e 20 tored..... * on
5d10: 74 68 65 20 5f 54 63 6c 5f 20 73 74 61 63 6b 2e the _Tcl_ stack.
5d20: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
5d30: 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 ar *string;.
5d40: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
5d50: 3b 0a 20 20 20 20 69 6e 74 20 61 72 67 63 2c 20 ;. int argc,
5d60: 62 61 63 6b 67 72 6f 75 6e 64 2c 20 69 2c 20 69 background, i, i
5d70: 6e 64 65 78 2c 20 6b 65 65 70 4e 65 77 6c 69 6e ndex, keepNewlin
5d80: 65 2c 20 72 65 73 75 6c 74 2c 20 73 6b 69 70 2c e, result, skip,
5d90: 20 69 67 6e 6f 72 65 53 74 64 65 72 72 3b 0a 20 ignoreStderr;.
5da0: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 67 Tcl_Size leng
5db0: 74 68 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 th;. static c
5dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 onst char *const
5dd0: 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 options[] = {..
5de0: 22 2d 69 67 6e 6f 72 65 73 74 64 65 72 72 22 2c "-ignorestderr",
5df0: 20 22 2d 6b 65 65 70 6e 65 77 6c 69 6e 65 22 2c "-keepnewline",
5e00: 20 22 2d 2d 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 "--", NULL.
5e10: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 65 78 65 63 };. enum exec
5e20: 4f 70 74 69 6f 6e 73 45 6e 75 6d 20 7b 0a 09 45 OptionsEnum {..E
5e30: 58 45 43 5f 49 47 4e 4f 52 45 53 54 44 45 52 52 XEC_IGNORESTDERR
5e40: 2c 20 45 58 45 43 5f 4b 45 45 50 4e 45 57 4c 49 , EXEC_KEEPNEWLI
5e50: 4e 45 2c 20 45 58 45 43 5f 4c 41 53 54 0a 20 20 NE, EXEC_LAST.
5e60: 20 20 7d 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 };.. /*.
5e70: 20 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e * Check for an
5e80: 79 20 6c 65 61 64 69 6e 67 20 6f 70 74 69 6f 6e y leading option
5e90: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20 arguments..
5ea0: 20 2a 2f 0a 0a 20 20 20 20 6b 65 65 70 4e 65 77 */.. keepNew
5eb0: 6c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 69 67 line = 0;. ig
5ec0: 6e 6f 72 65 53 74 64 65 72 72 20 3d 20 30 3b 0a noreStderr = 0;.
5ed0: 20 20 20 20 66 6f 72 20 28 73 6b 69 70 20 3d 20 for (skip =
5ee0: 31 3b 20 73 6b 69 70 20 3c 20 6f 62 6a 63 3b 20 1; skip < objc;
5ef0: 73 6b 69 70 2b 2b 29 20 7b 0a 09 73 74 72 69 6e skip++) {..strin
5f00: 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 g = TclGetString
5f10: 28 6f 62 6a 76 5b 73 6b 69 70 5d 29 3b 0a 09 69 (objv[skip]);..i
5f20: 66 20 28 73 74 72 69 6e 67 5b 30 5d 20 21 3d 20 f (string[0] !=
5f30: 27 2d 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 '-') {.. brea
5f40: 6b 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 k;..}..if (Tcl_G
5f50: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
5f60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 73 6b 69 70 nterp, objv[skip
5f70: 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 22 6f 70 74 ], options, "opt
5f80: 69 6f 6e 22 2c 0a 09 09 54 43 4c 5f 45 58 41 43 ion",...TCL_EXAC
5f90: 54 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 T, &index) != TC
5fa0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 L_OK) {.. ret
5fb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
5fc0: 7d 0a 09 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 }..if (index ==
5fd0: 45 58 45 43 5f 4b 45 45 50 4e 45 57 4c 49 4e 45 EXEC_KEEPNEWLINE
5fe0: 29 20 7b 0a 09 20 20 20 20 6b 65 65 70 4e 65 77 ) {.. keepNew
5ff0: 6c 69 6e 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 line = 1;..} els
6000: 65 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 45 e if (index == E
6010: 58 45 43 5f 49 47 4e 4f 52 45 53 54 44 45 52 52 XEC_IGNORESTDERR
6020: 29 20 7b 0a 09 20 20 20 20 69 67 6e 6f 72 65 53 ) {.. ignoreS
6030: 74 64 65 72 72 20 3d 20 31 3b 0a 09 7d 20 65 6c tderr = 1;..} el
6040: 73 65 20 7b 0a 09 20 20 20 20 73 6b 69 70 2b 2b se {.. skip++
6050: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d ;.. break;..}
6060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f . }. if (o
6070: 62 6a 63 20 3c 3d 20 73 6b 69 70 29 20 7b 0a 09 bjc <= skip) {..
6080: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
6090: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
60a0: 2c 20 22 3f 2d 6f 70 74 69 6f 6e 20 2e 2e 2e 3f , "?-option ...?
60b0: 20 61 72 67 20 3f 61 72 67 20 2e 2e 2e 3f 22 29 arg ?arg ...?")
60c0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
60d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
60e0: 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 20 69 66 /*. * See if
60f0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 the command is
6100: 74 6f 20 62 65 20 72 75 6e 20 69 6e 20 62 61 63 to be run in bac
6110: 6b 67 72 6f 75 6e 64 2e 0a 20 20 20 20 20 2a 2f kground.. */
6120: 0a 0a 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 .. background
6130: 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 69 6e 67 = 0;. string
6140: 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 = TclGetString(
6150: 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d 29 3b objv[objc - 1]);
6160: 0a 20 20 20 20 69 66 20 28 28 73 74 72 69 6e 67 . if ((string
6170: 5b 30 5d 20 3d 3d 20 27 26 27 29 20 26 26 20 28 [0] == '&') && (
6180: 73 74 72 69 6e 67 5b 31 5d 20 3d 3d 20 27 5c 30 string[1] == '\0
6190: 27 29 29 20 7b 0a 09 6f 62 6a 63 2d 2d 3b 0a 09 ')) {..objc--;..
61a0: 62 61 63 6b 67 72 6f 75 6e 64 20 3d 20 31 3b 0a background = 1;.
61b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
61c0: 20 20 20 2a 20 43 72 65 61 74 65 20 74 68 65 20 * Create the
61d0: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 string argument
61e0: 61 72 72 61 79 20 22 61 72 67 76 22 2e 20 4d 61 array "argv". Ma
61f0: 6b 65 20 73 75 72 65 20 61 72 67 76 20 69 73 20 ke sure argv is
6200: 6c 61 72 67 65 20 65 6e 6f 75 67 68 0a 20 20 20 large enough.
6210: 20 20 2a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 * to hold the
6220: 61 72 67 63 20 61 72 67 75 6d 65 6e 74 73 20 70 argc arguments p
6230: 6c 75 73 20 31 20 65 78 74 72 61 20 66 6f 72 20 lus 1 extra for
6240: 74 68 65 20 7a 65 72 6f 20 65 6e 64 2d 6f 66 2d the zero end-of-
6250: 61 72 67 76 20 77 6f 72 64 2e 0a 20 20 20 20 20 argv word..
6260: 2a 2f 0a 0a 20 20 20 20 61 72 67 63 20 3d 20 6f */.. argc = o
6270: 62 6a 63 20 2d 20 73 6b 69 70 3b 0a 20 20 20 20 bjc - skip;.
6280: 61 72 67 76 20 3d 20 28 63 6f 6e 73 74 20 63 68 argv = (const ch
6290: 61 72 20 2a 2a 29 54 63 6c 53 74 61 63 6b 41 6c ar **)TclStackAl
62a0: 6c 6f 63 28 69 6e 74 65 72 70 2c 20 28 61 72 67 loc(interp, (arg
62b0: 63 20 2b 20 31 29 20 2a 20 73 69 7a 65 6f 66 28 c + 1) * sizeof(
62c0: 63 68 61 72 20 2a 29 29 3b 0a 0a 20 20 20 20 2f char *));.. /
62d0: 2a 0a 20 20 20 20 20 2a 20 43 6f 70 79 20 74 68 *. * Copy th
62e0: 65 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73 e string convers
62f0: 69 6f 6e 73 20 6f 66 20 65 61 63 68 20 28 70 6f ions of each (po
6300: 73 74 20 6f 70 74 69 6f 6e 29 20 6f 62 6a 65 63 st option) objec
6310: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 t into the.
6320: 2a 20 61 72 67 75 6d 65 6e 74 20 76 65 63 74 6f * argument vecto
6330: 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 r.. */..
6340: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
6350: 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 09 61 72 argc; i++) {..ar
6360: 67 76 5b 69 5d 20 3d 20 54 63 6c 47 65 74 53 74 gv[i] = TclGetSt
6370: 72 69 6e 67 28 6f 62 6a 76 5b 69 20 2b 20 73 6b ring(objv[i + sk
6380: 69 70 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ip]);. }.
6390: 61 72 67 76 5b 61 72 67 63 5d 20 3d 20 4e 55 4c argv[argc] = NUL
63a0: 4c 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 L;. chan = Tc
63b0: 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 43 68 61 l_OpenCommandCha
63c0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 61 72 67 nnel(interp, arg
63d0: 63 2c 20 61 72 67 76 2c 20 28 62 61 63 6b 67 72 c, argv, (backgr
63e0: 6f 75 6e 64 20 3f 20 30 20 3a 0a 09 20 20 20 20 ound ? 0 :..
63f0: 69 67 6e 6f 72 65 53 74 64 65 72 72 20 3f 20 54 ignoreStderr ? T
6400: 43 4c 5f 53 54 44 4f 55 54 20 3a 20 54 43 4c 5f CL_STDOUT : TCL_
6410: 53 54 44 4f 55 54 7c 54 43 4c 5f 53 54 44 45 52 STDOUT|TCL_STDER
6420: 52 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 R));.. /*.
6430: 20 20 2a 20 46 72 65 65 20 74 68 65 20 61 72 67 * Free the arg
6440: 76 20 61 72 72 61 79 2e 0a 20 20 20 20 20 2a 2f v array.. */
6450: 0a 0a 20 20 20 20 54 63 6c 53 74 61 63 6b 46 72 .. TclStackFr
6460: 65 65 28 69 6e 74 65 72 70 2c 20 28 76 6f 69 64 ee(interp, (void
6470: 20 2a 29 20 61 72 67 76 29 3b 0a 0a 20 20 20 20 *) argv);..
6480: 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c if (chan == NULL
6490: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
64a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
64b0: 20 20 2f 2a 20 42 75 67 20 5b 30 66 31 64 64 63 /* Bug [0f1ddc
64c0: 30 64 66 37 5d 20 2d 20 65 6e 63 6f 64 69 6e 67 0df7] - encoding
64d0: 20 65 72 72 6f 72 73 20 2d 20 75 73 65 20 72 65 errors - use re
64e0: 70 6c 61 63 65 20 70 72 6f 66 69 6c 65 20 2a 2f place profile */
64f0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 53 65 74 . if (Tcl_Set
6500: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e 55 ChannelOption(NU
6510: 4c 4c 2c 20 63 68 61 6e 2c 20 22 2d 70 72 6f 66 LL, chan, "-prof
6520: 69 6c 65 22 2c 20 22 72 65 70 6c 61 63 65 22 29 ile", "replace")
6530: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
6540: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6550: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
6560: 62 61 63 6b 67 72 6f 75 6e 64 29 20 7b 0a 09 2f background) {../
6570: 2a 0a 09 20 2a 20 53 74 6f 72 65 20 74 68 65 20 *.. * Store the
6580: 6c 69 73 74 20 6f 66 20 50 49 44 73 20 66 72 6f list of PIDs fro
6590: 6d 20 74 68 65 20 70 69 70 65 6c 69 6e 65 20 69 m the pipeline i
65a0: 6e 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c n interp's resul
65b0: 74 20 61 6e 64 0a 09 20 2a 20 64 65 74 61 63 68 t and.. * detach
65c0: 20 74 68 65 20 50 49 44 73 20 28 69 6e 73 74 65 the PIDs (inste
65d0: 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 66 6f ad of waiting fo
65e0: 72 20 74 68 65 6d 29 2e 0a 09 20 2a 2f 0a 0a 09 r them)... */...
65f0: 54 63 6c 47 65 74 41 6e 64 44 65 74 61 63 68 50 TclGetAndDetachP
6600: 69 64 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ids(interp, chan
6610: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 43 6c 6f 73 );..if (Tcl_Clos
6620: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e eEx(interp, chan
6630: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 , 0) != TCL_OK)
6640: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
6650: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 72 65 74 L_ERROR;..}..ret
6660: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 urn TCL_OK;.
6670: 7d 0a 0a 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a }.. TclNewObj
6680: 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 20 20 20 (resultPtr);.
6690: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
66a0: 6e 65 6c 48 61 6e 64 6c 65 28 63 68 61 6e 2c 20 nelHandle(chan,
66b0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 4e 55 TCL_READABLE, NU
66c0: 4c 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b LL) == TCL_OK) {
66d0: 0a 09 69 66 20 28 54 63 6c 5f 52 65 61 64 43 68 ..if (Tcl_ReadCh
66e0: 61 72 73 28 63 68 61 6e 2c 20 72 65 73 75 6c 74 ars(chan, result
66f0: 50 74 72 2c 20 2d 31 2c 20 30 29 20 3d 3d 20 54 Ptr, -1, 0) == T
6700: 43 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 29 20 7b CL_IO_FAILURE) {
6710: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
6720: 20 54 49 50 20 23 32 31 39 2e 0a 09 20 20 20 20 TIP #219...
6730: 20 2a 20 43 61 70 74 75 72 65 20 65 72 72 6f 72 * Capture error
6740: 20 6d 65 73 73 61 67 65 73 20 70 75 74 20 62 79 messages put by
6750: 20 74 68 65 20 64 72 69 76 65 72 20 69 6e 74 6f the driver into
6760: 20 74 68 65 20 62 79 70 61 73 73 20 61 72 65 61 the bypass area
6770: 0a 09 20 20 20 20 20 2a 20 61 6e 64 20 70 75 74 .. * and put
6780: 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 72 them into the r
6790: 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72 65 74 egular interpret
67a0: 65 72 20 72 65 73 75 6c 74 2e 20 46 61 6c 6c 20 er result. Fall
67b0: 62 61 63 6b 20 74 6f 0a 09 20 20 20 20 20 2a 20 back to.. *
67c0: 74 68 65 20 72 65 67 75 6c 61 72 20 6d 65 73 73 the regular mess
67d0: 61 67 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 age if nothing w
67e0: 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 as found in the
67f0: 62 79 70 61 73 73 2e 0a 09 20 20 20 20 20 2a 2f bypass... */
6800: 0a 0a 09 20 20 20 20 69 66 20 28 21 54 63 6c 43 ... if (!TclC
6810: 68 61 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 hanCaughtErrorBy
6820: 70 61 73 73 28 69 6e 74 65 72 70 2c 20 63 68 61 pass(interp, cha
6830: 6e 29 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f n)) {...Tcl_SetO
6840: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
6850: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a Tcl_ObjPrintf(.
6860: 09 09 09 22 65 72 72 6f 72 20 72 65 61 64 69 6e ..."error readin
6870: 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 63 6f g output from co
6880: 6d 6d 61 6e 64 3a 20 25 73 22 2c 0a 09 09 09 54 mmand: %s",....T
6890: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e cl_PosixError(in
68a0: 74 65 72 70 29 29 29 3b 0a 09 09 54 63 6c 5f 44 terp)));...Tcl_D
68b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ecrRefCount(resu
68c0: 6c 74 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 ltPtr);.. }..
68d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
68e0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
68f0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 /*. * If
6900: 20 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 6f the process pro
6910: 64 75 63 65 64 20 61 6e 79 74 68 69 6e 67 20 6f duced anything o
6920: 6e 20 73 74 64 65 72 72 2c 20 69 74 20 77 69 6c n stderr, it wil
6930: 6c 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 l have been retu
6940: 72 6e 65 64 0a 20 20 20 20 20 2a 20 69 6e 20 74 rned. * in t
6950: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 he interpreter r
6960: 65 73 75 6c 74 2e 20 49 74 20 6e 65 65 64 73 20 esult. It needs
6970: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 to be appended t
6980: 6f 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 o the result.
6990: 20 20 2a 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 * string..
69a0: 20 2a 2f 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 */.. result
69b0: 3d 20 54 63 6c 5f 43 6c 6f 73 65 45 78 28 69 6e = Tcl_CloseEx(in
69c0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 30 29 3b 0a terp, chan, 0);.
69d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 Tcl_AppendOb
69e0: 6a 54 6f 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 jToObj(resultPtr
69f0: 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 , Tcl_GetObjResu
6a00: 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 0a 20 20 lt(interp));..
6a10: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74 /*. * If t
6a20: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 he last characte
6a30: 72 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 r of the result
6a40: 69 73 20 61 20 6e 65 77 6c 69 6e 65 2c 20 74 68 is a newline, th
6a50: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 0a 20 20 en remove the.
6a60: 20 20 20 2a 20 6e 65 77 6c 69 6e 65 20 63 68 61 * newline cha
6a70: 72 61 63 74 65 72 2e 0a 20 20 20 20 20 2a 2f 0a racter.. */.
6a80: 0a 20 20 20 20 69 66 20 28 6b 65 65 70 4e 65 77 . if (keepNew
6a90: 6c 69 6e 65 20 3d 3d 20 30 29 20 7b 0a 09 73 74 line == 0) {..st
6aa0: 72 69 6e 67 20 3d 20 54 63 6c 47 65 74 53 74 72 ring = TclGetStr
6ab0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c ingFromObj(resul
6ac0: 74 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a tPtr, &length);.
6ad0: 09 69 66 20 28 28 6c 65 6e 67 74 68 20 3e 20 30 .if ((length > 0
6ae0: 29 20 26 26 20 28 73 74 72 69 6e 67 5b 6c 65 6e ) && (string[len
6af0: 67 74 68 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 gth - 1] == '\n'
6b00: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 )) {.. Tcl_Se
6b10: 74 4f 62 6a 4c 65 6e 67 74 68 28 72 65 73 75 6c tObjLength(resul
6b20: 74 50 74 72 2c 20 6c 65 6e 67 74 68 20 2d 20 31 tPtr, length - 1
6b30: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 );..}. }.
6b40: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
6b50: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 (interp, resultP
6b60: 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e tr);.. return
6b70: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a result;.}.../*.
6b80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6bd0: 0a 20 2a 20 54 63 6c 5f 46 62 6c 6f 63 6b 65 64 . * Tcl_Fblocked
6be0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
6bf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
6c00: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
6c10: 65 73 73 20 74 68 65 20 54 63 6c 20 22 66 62 6c ess the Tcl "fbl
6c20: 6f 63 6b 65 64 22 20 63 6f 6d 6d 61 6e 64 2e 20 ocked" command.
6c30: 53 65 65 0a 20 2a 09 74 68 65 20 75 73 65 72 20 See. *.the user
6c40: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f documentation fo
6c50: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 r details on wha
6c60: 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a t it does.. *. *
6c70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
6c80: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 tandard Tcl resu
6c90: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
6ca0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
6cb0: 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 20 interp's result
6cc0: 74 6f 20 62 6f 6f 6c 65 61 6e 20 74 72 75 65 20 to boolean true
6cd0: 6f 72 20 66 61 6c 73 65 20 64 65 70 65 6e 64 69 or false dependi
6ce0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 ng on whether th
6cf0: 65 0a 20 2a 09 70 72 65 63 65 64 69 6e 67 20 69 e. *.preceding i
6d00: 6e 70 75 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f nput operation o
6d10: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f n the channel wo
6d20: 75 6c 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 64 uld have blocked
6d30: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f --. */..int.Tcl_
6d90: 46 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64 28 0a FblockedObjCmd(.
6da0: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 TCL_UNUSED(v
6db0: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f oid *),. Tcl_
6dc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
6dd0: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 ./* Current inte
6de0: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 rpreter. */.
6df0: 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e int objc,.../* N
6e00: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
6e10: 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f ts. */. Tcl_O
6e20: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
6e30: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 )./* Argument ob
6e40: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 jects. */.{.
6e50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
6e60: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a ;. int mode;.
6e70: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d . if (objc !=
6e80: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
6e90: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
6ea0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 1, objv, "channe
6eb0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c l");..return TCL
6ec0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6ed0: 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 if (TclGetCha
6ee0: 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 nnelFromObj(inte
6ef0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 rp, objv[1], &ch
6f00: 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d an, &mode, 0) !=
6f10: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6f30: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f }. if (!(mo
6f40: 64 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c de & TCL_READABL
6f50: 45 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 E)) {..Tcl_SetOb
6f60: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6f70: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 Tcl_ObjPrintf(..
6f80: 09 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 ."channel \"%s\"
6f90: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 wasn't opened f
6fa0: 6f 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 09 54 or reading",...T
6fb0: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
6fc0: 5b 31 5d 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 [1])));..return
6fd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6fe0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
6ff0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
7000: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a cl_NewBooleanObj
7010: 28 54 63 6c 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 (Tcl_InputBlocke
7020: 64 28 63 68 61 6e 29 29 29 3b 0a 20 20 20 20 72 d(chan)));. r
7030: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
7040: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7090: 0a 20 2a 20 54 63 6c 5f 4f 70 65 6e 4f 62 6a 43 . * Tcl_OpenObjC
70a0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
70b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 function is inv
70c0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
70d0: 74 68 65 20 22 6f 70 65 6e 22 20 54 63 6c 20 63 the "open" Tcl c
70e0: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a ommand. See the.
70f0: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 *.user document
7100: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
7110: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
7120: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
7130: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
7140: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 Tcl result.. *.
7150: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
7160: 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72 20 *.See the user
7170: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 documentation..
7180: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
71d0: 69 6e 74 0a 54 63 6c 5f 4f 70 65 6e 4f 62 6a 43 int.Tcl_OpenObjC
71e0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 md(. TCL_UNUS
71f0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 ED(void *),.
7200: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7210: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 rp,../* Current
7220: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a interpreter. */.
7230: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 int objc,...
7240: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 /* Number of arg
7250: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 uments. */. T
7260: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
7270: 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e jv[])./* Argumen
7280: 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a t objects. */.{.
7290: 20 20 20 20 69 6e 74 20 70 69 70 65 6c 69 6e 65 int pipeline
72a0: 2c 20 70 72 6f 74 3b 0a 20 20 20 20 63 6f 6e 73 , prot;. cons
72b0: 74 20 63 68 61 72 20 2a 6d 6f 64 65 53 74 72 69 t char *modeStri
72c0: 6e 67 2c 20 2a 77 68 61 74 3b 0a 20 20 20 20 54 ng, *what;. T
72d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
72e0: 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 .. if ((objc
72f0: 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 < 2) || (objc >
7300: 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4)) {..Tcl_Wrong
7310: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
7320: 31 2c 20 6f 62 6a 76 2c 20 22 66 69 6c 65 4e 61 1, objv, "fileNa
7330: 6d 65 20 3f 61 63 63 65 73 73 3f 20 3f 70 65 72 me ?access? ?per
7340: 6d 69 73 73 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 missions?");..re
7350: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7360: 20 20 20 20 7d 0a 20 20 20 20 70 72 6f 74 20 3d }. prot =
7370: 20 30 36 36 36 3b 0a 20 20 20 20 69 66 20 28 6f 0666;. if (o
7380: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 6d 6f 64 bjc == 2) {..mod
7390: 65 53 74 72 69 6e 67 20 3d 20 22 72 22 3b 0a 20 eString = "r";.
73a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 6f 64 } else {..mod
73b0: 65 53 74 72 69 6e 67 20 3d 20 54 63 6c 47 65 74 eString = TclGet
73c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b String(objv[2]);
73d0: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 34 29 ..if (objc == 4)
73e0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {.. const ch
73f0: 61 72 20 2a 70 65 72 6d 53 74 72 69 6e 67 20 3d ar *permString =
7400: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 TclGetString(ob
7410: 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 69 6e 74 jv[3]);.. int
7420: 20 63 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 4f code = TCL_ERRO
7430: 52 3b 0a 09 20 20 20 20 69 6e 74 20 73 63 61 6e R;.. int scan
7440: 6e 65 64 20 3d 20 54 63 6c 50 61 72 73 65 41 6c ned = TclParseAl
7450: 6c 57 68 69 74 65 53 70 61 63 65 28 70 65 72 6d lWhiteSpace(perm
7460: 53 74 72 69 6e 67 2c 20 2d 31 29 3b 0a 0a 09 20 String, -1);...
7470: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 53 75 /*.. * Su
7480: 70 70 6f 72 74 20 6c 65 67 61 63 79 20 6f 63 74 pport legacy oct
7490: 61 6c 20 6e 75 6d 62 65 72 73 2e 0a 09 20 20 20 al numbers...
74a0: 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 28 */... if ((
74b0: 70 65 72 6d 53 74 72 69 6e 67 5b 73 63 61 6e 6e permString[scann
74c0: 65 64 5d 20 3d 3d 20 27 30 27 29 0a 09 09 20 20 ed] == '0')...
74d0: 20 20 26 26 20 28 70 65 72 6d 53 74 72 69 6e 67 && (permString
74e0: 5b 73 63 61 6e 6e 65 64 2b 31 5d 20 3e 3d 20 27 [scanned+1] >= '
74f0: 30 27 29 0a 09 09 20 20 20 20 26 26 20 28 70 65 0')... && (pe
7500: 72 6d 53 74 72 69 6e 67 5b 73 63 61 6e 6e 65 64 rmString[scanned
7510: 2b 31 5d 20 3c 3d 20 27 37 27 29 29 20 7b 0a 09 +1] <= '7')) {..
7520: 09 54 63 6c 5f 4f 62 6a 20 2a 70 65 72 6d 4f 62 .Tcl_Obj *permOb
7530: 6a 3b 0a 0a 09 09 54 63 6c 4e 65 77 4c 69 74 65 j;....TclNewLite
7540: 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28 70 65 72 ralStringObj(per
7550: 6d 4f 62 6a 2c 20 22 30 6f 22 29 3b 0a 09 09 54 mObj, "0o");...T
7560: 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 70 cl_AppendToObj(p
7570: 65 72 6d 4f 62 6a 2c 20 70 65 72 6d 53 74 72 69 ermObj, permStri
7580: 6e 67 2b 73 63 61 6e 6e 65 64 2b 31 2c 20 2d 31 ng+scanned+1, -1
7590: 29 3b 0a 09 09 63 6f 64 65 20 3d 20 54 63 6c 47 );...code = TclG
75a0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 4e 55 4c etIntFromObj(NUL
75b0: 4c 2c 20 70 65 72 6d 4f 62 6a 2c 20 26 70 72 6f L, permObj, &pro
75c0: 74 29 3b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 t);...Tcl_DecrRe
75d0: 66 43 6f 75 6e 74 28 70 65 72 6d 4f 62 6a 29 3b fCount(permObj);
75e0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 .. }... if
75f0: 20 28 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 45 ((code == TCL_E
7600: 52 52 4f 52 29 0a 09 09 20 20 20 20 26 26 20 54 RROR)... && T
7610: 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 clGetIntFromObj(
7620: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c interp, objv[3],
7630: 20 26 70 72 6f 74 29 20 21 3d 20 54 43 4c 5f 4f &prot) != TCL_O
7640: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 K) {...return TC
7650: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
7660: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 69 .}. }.. pi
7670: 70 65 6c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 peline = 0;.
7680: 77 68 61 74 20 3d 20 54 63 6c 47 65 74 53 74 72 what = TclGetStr
7690: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 ing(objv[1]);.
76a0: 20 20 69 66 20 28 77 68 61 74 5b 30 5d 20 3d 3d if (what[0] ==
76b0: 20 27 7c 27 29 20 7b 0a 09 70 69 70 65 6c 69 6e '|') {..pipelin
76c0: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 e = 1;. }..
76d0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f 70 65 6e /*. * Open
76e0: 20 74 68 65 20 66 69 6c 65 20 6f 72 20 63 72 65 the file or cre
76f0: 61 74 65 20 61 20 70 72 6f 63 65 73 73 20 70 69 ate a process pi
7700: 70 65 6c 69 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a peline.. */.
7710: 0a 20 20 20 20 69 66 20 28 21 70 69 70 65 6c 69 . if (!pipeli
7720: 6e 65 29 20 7b 0a 09 63 68 61 6e 20 3d 20 54 63 ne) {..chan = Tc
7730: 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e l_FSOpenFileChan
7740: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nel(interp, objv
7750: 5b 31 5d 2c 20 6d 6f 64 65 53 74 72 69 6e 67 2c [1], modeString,
7760: 20 70 72 6f 74 29 3b 0a 20 20 20 20 7d 20 65 6c prot);. } el
7770: 73 65 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 2c 20 se {..int mode,
7780: 6d 6f 64 65 46 6c 61 67 73 3b 0a 09 54 63 6c 5f modeFlags;..Tcl_
7790: 53 69 7a 65 20 63 6d 64 4f 62 6a 63 3b 0a 09 63 Size cmdObjc;..c
77a0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 63 6d 64 41 onst char **cmdA
77b0: 72 67 76 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 53 rgv;...if (Tcl_S
77c0: 70 6c 69 74 4c 69 73 74 28 69 6e 74 65 72 70 2c plitList(interp,
77d0: 20 77 68 61 74 2b 31 2c 20 26 63 6d 64 4f 62 6a what+1, &cmdObj
77e0: 63 2c 20 26 63 6d 64 41 72 67 76 29 20 21 3d 20 c, &cmdArgv) !=
77f0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 TCL_OK) {.. r
7800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7810: 0a 09 7d 0a 0a 09 6d 6f 64 65 20 3d 20 54 63 6c ..}...mode = Tcl
7820: 47 65 74 4f 70 65 6e 4d 6f 64 65 28 69 6e 74 65 GetOpenMode(inte
7830: 72 70 2c 20 6d 6f 64 65 53 74 72 69 6e 67 2c 20 rp, modeString,
7840: 26 6d 6f 64 65 46 6c 61 67 73 29 3b 0a 09 69 66 &modeFlags);..if
7850: 20 28 6d 6f 64 65 20 3d 3d 20 2d 31 29 20 7b 0a (mode == -1) {.
7860: 09 20 20 20 20 63 68 61 6e 20 3d 20 4e 55 4c 4c . chan = NULL
7870: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
7880: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c int flags = TCL
7890: 5f 53 54 44 45 52 52 20 7c 20 54 43 4c 5f 45 4e _STDERR | TCL_EN
78a0: 46 4f 52 43 45 5f 4d 4f 44 45 3b 0a 0a 09 20 20 FORCE_MODE;...
78b0: 20 20 73 77 69 74 63 68 20 28 6d 6f 64 65 20 26 switch (mode &
78c0: 20 4f 5f 41 43 43 4d 4f 44 45 29 20 7b 0a 09 20 O_ACCMODE) {..
78d0: 20 20 20 63 61 73 65 20 4f 5f 52 44 4f 4e 4c 59 case O_RDONLY
78e0: 3a 0a 09 09 66 6c 61 67 73 20 7c 3d 20 54 43 4c :...flags |= TCL
78f0: 5f 53 54 44 4f 55 54 3b 0a 09 09 62 72 65 61 6b _STDOUT;...break
7900: 3b 0a 09 20 20 20 20 63 61 73 65 20 4f 5f 57 52 ;.. case O_WR
7910: 4f 4e 4c 59 3a 0a 09 09 66 6c 61 67 73 20 7c 3d ONLY:...flags |=
7920: 20 54 43 4c 5f 53 54 44 49 4e 3b 0a 09 09 62 72 TCL_STDIN;...br
7930: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 4f eak;.. case O
7940: 5f 52 44 57 52 3a 0a 09 09 66 6c 61 67 73 20 7c _RDWR:...flags |
7950: 3d 20 28 54 43 4c 5f 53 54 44 49 4e 20 7c 20 54 = (TCL_STDIN | T
7960: 43 4c 5f 53 54 44 4f 55 54 29 3b 0a 09 09 62 72 CL_STDOUT);...br
7970: 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 6c eak;.. defaul
7980: 74 3a 0a 09 09 54 63 6c 5f 50 61 6e 69 63 28 22 t:...Tcl_Panic("
7990: 54 63 6c 5f 4f 70 65 6e 43 6d 64 3a 20 69 6e 76 Tcl_OpenCmd: inv
79a0: 61 6c 69 64 20 6d 6f 64 65 20 76 61 6c 75 65 22 alid mode value"
79b0: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 );...break;..
79c0: 20 7d 0a 09 20 20 20 20 63 68 61 6e 20 3d 20 54 }.. chan = T
79d0: 63 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 43 68 cl_OpenCommandCh
79e0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 6d annel(interp, cm
79f0: 64 4f 62 6a 63 2c 20 63 6d 64 41 72 67 76 2c 20 dObjc, cmdArgv,
7a00: 66 6c 61 67 73 29 3b 0a 09 20 20 20 20 69 66 20 flags);.. if
7a10: 28 28 6d 6f 64 65 46 6c 61 67 73 20 26 20 43 48 ((modeFlags & CH
7a20: 41 4e 4e 45 4c 5f 52 41 57 5f 4d 4f 44 45 29 20 ANNEL_RAW_MODE)
7a30: 26 26 20 63 68 61 6e 29 20 7b 0a 09 09 54 63 6c && chan) {...Tcl
7a40: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
7a50: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 n(interp, chan,
7a60: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 "-translation",
7a70: 22 62 69 6e 61 72 79 22 29 3b 0a 09 20 20 20 20 "binary");..
7a80: 7d 0a 09 7d 0a 09 54 63 6c 5f 46 72 65 65 28 28 }..}..Tcl_Free((
7a90: 76 6f 69 64 20 2a 29 63 6d 64 41 72 67 76 29 3b void *)cmdArgv);
7aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 . }. if (c
7ab0: 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 han == NULL) {..
7ac0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
7ae0: 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 RegisterChannel(
7af0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 interp, chan);.
7b00: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
7b10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
7b20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c NewStringObj(Tcl
7b30: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
7b40: 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a 20 20 20 chan), -1));.
7b50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
7b60: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7bb0: 20 2a 0a 20 2a 20 54 63 70 41 63 63 65 70 74 43 *. * TcpAcceptC
7bc0: 61 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65 50 72 allbacksDeletePr
7bd0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 41 73 73 6f oc --. *. *.Asso
7be0: 63 64 61 74 61 20 63 6c 65 61 6e 75 70 20 72 6f cdata cleanup ro
7bf0: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 77 68 65 utine called whe
7c00: 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 n an interpreter
7c10: 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 is being delete
7c20: 64 0a 20 2a 09 74 6f 20 73 65 74 20 74 68 65 20 d. *.to set the
7c30: 69 6e 74 65 72 70 20 66 69 65 6c 64 20 6f 66 20 interp field of
7c40: 61 6c 6c 20 74 68 65 20 61 63 63 65 70 74 20 63 all the accept c
7c50: 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64 73 20 allback records
7c60: 72 65 67 69 73 74 65 72 65 64 0a 20 2a 09 77 69 registered. *.wi
7c70: 74 68 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 th the interpret
7c80: 65 72 20 74 6f 20 4e 55 4c 4c 2e 20 54 68 69 73 er to NULL. This
7c90: 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20 74 68 will prevent th
7ca0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 66 72 e interpreter fr
7cb0: 6f 6d 0a 20 2a 09 62 65 69 6e 67 20 75 73 65 64 om. *.being used
7cc0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 74 in the future t
7cd0: 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20 73 63 o eval accept sc
7ce0: 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 ripts.. *. * Res
7cf0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ults:. *.None..
7d00: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
7d10: 73 3a 0a 20 2a 09 44 65 61 6c 6c 6f 63 61 74 65 s:. *.Deallocate
7d20: 73 20 6d 65 6d 6f 72 79 20 61 6e 64 20 73 65 74 s memory and set
7d30: 73 20 74 68 65 20 69 6e 74 65 72 70 20 66 69 65 s the interp fie
7d40: 6c 64 20 6f 66 20 61 6c 6c 20 74 68 65 20 61 63 ld of all the ac
7d50: 63 65 70 74 0a 20 2a 09 63 61 6c 6c 62 61 63 6b cept. *.callback
7d60: 20 72 65 63 6f 72 64 73 20 74 6f 20 4e 55 4c 4c records to NULL
7d70: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 to prevent this
7d80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 66 72 6f interpreter fro
7d90: 6d 20 62 65 69 6e 67 20 75 73 65 64 0a 20 2a 09 m being used. *.
7da0: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 74 6f 20 subsequently to
7db0: 65 76 61 6c 20 61 63 63 65 70 74 20 73 63 72 69 eval accept scri
7dc0: 70 74 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d pts.. *. *------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e10: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 . */..static voi
7e20: 64 0a 54 63 70 41 63 63 65 70 74 43 61 6c 6c 62 d.TcpAcceptCallb
7e30: 61 63 6b 73 44 65 6c 65 74 65 50 72 6f 63 28 0a acksDeleteProc(.
7e40: 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 void *client
7e50: 44 61 74 61 2c 09 2f 2a 20 44 61 74 61 20 77 68 Data,./* Data wh
7e60: 69 63 68 20 77 61 73 20 70 61 73 73 65 64 20 77 ich was passed w
7e70: 68 65 6e 20 74 68 65 20 61 73 73 6f 63 64 61 74 hen the assocdat
7e80: 61 0a 09 09 09 09 20 2a 20 77 61 73 20 72 65 67 a..... * was reg
7e90: 69 73 74 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 istered. */.
7ea0: 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 49 TCL_UNUSED(Tcl_I
7eb0: 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20 20 20 nterp *)).{.
7ec0: 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a 68 Tcl_HashTable *h
7ed0: 54 62 6c 50 74 72 20 3d 20 28 54 63 6c 5f 48 61 TblPtr = (Tcl_Ha
7ee0: 73 68 54 61 62 6c 65 20 2a 29 63 6c 69 65 6e 74 shTable *)client
7ef0: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 48 61 Data;. Tcl_Ha
7f00: 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0a 20 shEntry *hPtr;.
7f10: 20 20 20 54 63 6c 5f 48 61 73 68 53 65 61 72 63 Tcl_HashSearc
7f20: 68 20 68 53 65 61 72 63 68 3b 0a 0a 20 20 20 20 h hSearch;..
7f30: 66 6f 72 20 28 68 50 74 72 20 3d 20 54 63 6c 5f for (hPtr = Tcl_
7f40: 46 69 72 73 74 48 61 73 68 45 6e 74 72 79 28 68 FirstHashEntry(h
7f50: 54 62 6c 50 74 72 2c 20 26 68 53 65 61 72 63 68 TblPtr, &hSearch
7f60: 29 3b 0a 09 20 20 20 20 68 50 74 72 20 21 3d 20 );.. hPtr !=
7f70: 4e 55 4c 4c 3b 20 68 50 74 72 20 3d 20 54 63 6c NULL; hPtr = Tcl
7f80: 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79 28 26 _NextHashEntry(&
7f90: 68 53 65 61 72 63 68 29 29 20 7b 0a 09 41 63 63 hSearch)) {..Acc
7fa0: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 eptCallback *acc
7fb0: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 20 3d eptCallbackPtr =
7fc0: 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b (AcceptCallback
7fd0: 20 2a 29 54 63 6c 5f 47 65 74 48 61 73 68 56 61 *)Tcl_GetHashVa
7fe0: 6c 75 65 28 68 50 74 72 29 3b 0a 0a 09 61 63 63 lue(hPtr);...acc
7ff0: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e eptCallbackPtr->
8000: 69 6e 74 65 72 70 20 3d 20 4e 55 4c 4c 3b 0a 20 interp = NULL;.
8010: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 6c }. Tcl_Del
8020: 65 74 65 48 61 73 68 54 61 62 6c 65 28 68 54 62 eteHashTable(hTb
8030: 6c 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 46 lPtr);. Tcl_F
8040: 72 65 65 28 68 54 62 6c 50 74 72 29 3b 0a 7d 0a ree(hTblPtr);.}.
8050: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
80a0: 0a 20 2a 20 52 65 67 69 73 74 65 72 54 63 70 53 . * RegisterTcpS
80b0: 65 72 76 65 72 49 6e 74 65 72 70 43 6c 65 61 6e erverInterpClean
80c0: 75 70 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 67 69 up --. *. *.Regi
80d0: 73 74 65 72 73 20 61 6e 20 61 63 63 65 70 74 20 sters an accept
80e0: 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64 20 callback record
80f0: 74 6f 20 68 61 76 65 20 69 74 73 20 69 6e 74 65 to have its inte
8100: 72 70 20 66 69 65 6c 64 20 73 65 74 20 74 6f 0a rp field set to.
8110: 20 2a 09 4e 55 4c 4c 20 77 68 65 6e 20 74 68 65 *.NULL when the
8120: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 interpreter is
8130: 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 deleted.. *. * R
8140: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
8150: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
8160: 63 74 73 3a 0a 20 2a 09 57 68 65 6e 2c 20 69 6e cts:. *.When, in
8170: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 the future, the
8180: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 interpreter is
8190: 64 65 6c 65 74 65 64 2c 20 74 68 65 20 69 6e 74 deleted, the int
81a0: 65 72 70 20 66 69 65 6c 64 20 6f 66 0a 20 2a 09 erp field of. *.
81b0: 74 68 65 20 61 63 63 65 70 74 20 63 61 6c 6c 62 the accept callb
81c0: 61 63 6b 20 64 61 74 61 20 73 74 72 75 63 74 75 ack data structu
81d0: 72 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 re will be set t
81e0: 6f 20 4e 55 4c 4c 2e 20 54 68 69 73 20 77 69 6c o NULL. This wil
81f0: 6c 0a 20 2a 09 70 72 65 76 65 6e 74 20 61 74 74 l. *.prevent att
8200: 65 6d 70 74 73 20 74 6f 20 65 76 61 6c 20 74 68 empts to eval th
8210: 65 20 61 63 63 65 70 74 20 73 63 72 69 70 74 20 e accept script
8220: 69 6e 20 61 20 64 65 6c 65 74 65 64 20 69 6e 74 in a deleted int
8230: 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 2d erpreter.. *. *-
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
8290: 63 20 76 6f 69 64 0a 52 65 67 69 73 74 65 72 54 c void.RegisterT
82a0: 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 6c cpServerInterpCl
82b0: 65 61 6e 75 70 28 0a 20 20 20 20 54 63 6c 5f 49 eanup(. Tcl_I
82c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
82d0: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 66 /* Interpreter f
82e0: 6f 72 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 or which we want
82f0: 20 74 6f 20 62 65 0a 09 09 09 09 20 2a 20 69 6e to be..... * in
8300: 66 6f 72 6d 65 64 20 6f 66 20 64 65 6c 65 74 69 formed of deleti
8310: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 41 63 63 65 70 on. */. Accep
8320: 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 tCallback *accep
8330: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 0a 09 09 tCallbackPtr)...
8340: 09 09 2f 2a 20 54 68 65 20 61 63 63 65 70 74 20 ../* The accept
8350: 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64 20 callback record
8360: 77 68 6f 73 65 20 69 6e 74 65 72 70 0a 09 09 09 whose interp....
8370: 09 20 2a 20 66 69 65 6c 64 20 77 65 20 77 61 6e . * field we wan
8380: 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 77 68 t set to NULL wh
8390: 65 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 69 6e en the..... * in
83a0: 74 65 72 70 72 65 74 65 72 20 69 73 20 64 65 6c terpreter is del
83b0: 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 eted. */.{. T
83c0: 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a 68 54 cl_HashTable *hT
83d0: 62 6c 50 74 72 3b 09 2f 2a 20 48 61 73 68 20 74 blPtr;./* Hash t
83e0: 61 62 6c 65 20 66 6f 72 20 61 63 63 65 70 74 20 able for accept
83f0: 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64 73 callback records
8400: 20 74 6f 0a 09 09 09 09 20 2a 20 73 6d 61 73 68 to..... * smash
8410: 20 77 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 when the interp
8420: 72 65 74 65 72 20 77 69 6c 6c 20 62 65 0a 09 09 reter will be...
8430: 09 09 20 2a 20 64 65 6c 65 74 65 64 2e 20 2a 2f .. * deleted. */
8440: 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 . Tcl_HashEnt
8450: 72 79 20 2a 68 50 74 72 3b 09 2f 2a 20 45 6e 74 ry *hPtr;./* Ent
8460: 72 79 20 66 6f 72 20 74 68 69 73 20 72 65 63 6f ry for this reco
8470: 72 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 rd. */. int i
8480: 73 4e 65 77 3b 09 09 09 2f 2a 20 49 73 20 74 68 sNew;.../* Is th
8490: 65 20 65 6e 74 72 79 20 6e 65 77 3f 20 2a 2f 0a e entry new? */.
84a0: 0a 20 20 20 20 68 54 62 6c 50 74 72 20 3d 20 28 . hTblPtr = (
84b0: 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a 29 Tcl_HashTable *)
84c0: 54 63 6c 5f 47 65 74 41 73 73 6f 63 44 61 74 61 Tcl_GetAssocData
84d0: 28 69 6e 74 65 72 70 2c 20 22 74 63 6c 54 43 50 (interp, "tclTCP
84e0: 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 73 22 AcceptCallbacks"
84f0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 , NULL);.. if
8500: 20 28 68 54 62 6c 50 74 72 20 3d 3d 20 4e 55 4c (hTblPtr == NUL
8510: 4c 29 20 7b 0a 09 68 54 62 6c 50 74 72 20 3d 20 L) {..hTblPtr =
8520: 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a (Tcl_HashTable *
8530: 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f )Tcl_Alloc(sizeo
8540: 66 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 29 f(Tcl_HashTable)
8550: 29 3b 0a 09 54 63 6c 5f 49 6e 69 74 48 61 73 68 );..Tcl_InitHash
8560: 54 61 62 6c 65 28 68 54 62 6c 50 74 72 2c 20 54 Table(hTblPtr, T
8570: 43 4c 5f 4f 4e 45 5f 57 4f 52 44 5f 4b 45 59 53 CL_ONE_WORD_KEYS
8580: 29 3b 0a 09 54 63 6c 5f 53 65 74 41 73 73 6f 63 );..Tcl_SetAssoc
8590: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 22 74 63 Data(interp, "tc
85a0: 6c 54 43 50 41 63 63 65 70 74 43 61 6c 6c 62 61 lTCPAcceptCallba
85b0: 63 6b 73 22 2c 0a 09 09 54 63 70 41 63 63 65 70 cks",...TcpAccep
85c0: 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65 tCallbacksDelete
85d0: 50 72 6f 63 2c 20 68 54 62 6c 50 74 72 29 3b 0a Proc, hTblPtr);.
85e0: 20 20 20 20 7d 0a 0a 20 20 20 20 68 50 74 72 20 }.. hPtr
85f0: 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 = Tcl_CreateHash
8600: 45 6e 74 72 79 28 68 54 62 6c 50 74 72 2c 20 61 Entry(hTblPtr, a
8610: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
8620: 2c 20 26 69 73 4e 65 77 29 3b 0a 20 20 20 20 69 , &isNew);. i
8630: 66 20 28 21 69 73 4e 65 77 29 20 7b 0a 09 54 63 f (!isNew) {..Tc
8640: 6c 5f 50 61 6e 69 63 28 22 52 65 67 69 73 74 65 l_Panic("Registe
8650: 72 54 63 70 53 65 72 76 65 72 43 6c 65 61 6e 75 rTcpServerCleanu
8660: 70 3a 20 64 61 6d 61 67 65 64 20 61 63 63 65 70 p: damaged accep
8670: 74 20 72 65 63 6f 72 64 20 74 61 62 6c 65 22 29 t record table")
8680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
8690: 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 SetHashValue(hPt
86a0: 72 2c 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 r, acceptCallbac
86b0: 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a kPtr);.}.../*. *
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 2d 2d 2d 2d 2d ----------------
8700: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 72 ------. *. * Unr
8710: 65 67 69 73 74 65 72 54 63 70 53 65 72 76 65 72 egisterTcpServer
8720: 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 72 6f InterpCleanupPro
8730: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 55 6e 72 65 67 c --. *. *.Unreg
8740: 69 73 74 65 72 20 61 20 70 72 65 76 69 6f 75 73 ister a previous
8750: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61 63 ly registered ac
8760: 63 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 cept callback re
8770: 63 6f 72 64 2e 20 54 68 65 20 69 6e 74 65 72 70 cord. The interp
8780: 0a 20 2a 09 66 69 65 6c 64 20 6f 66 20 74 68 69 . *.field of thi
8790: 73 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 6e 6f s record will no
87a0: 20 6c 6f 6e 67 65 72 20 62 65 20 73 65 74 20 74 longer be set t
87b0: 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 66 75 o NULL in the fu
87c0: 74 75 72 65 20 77 68 65 6e 0a 20 2a 09 74 68 65 ture when. *.the
87d0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 interpreter is
87e0: 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 deleted.. *. * R
87f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
8800: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
8810: 63 74 73 3a 0a 20 2a 09 50 72 65 76 65 6e 74 73 cts:. *.Prevents
8820: 20 74 68 65 20 69 6e 74 65 72 70 20 66 69 65 6c the interp fiel
8830: 64 20 6f 66 20 74 68 65 20 61 63 63 65 70 74 20 d of the accept
8840: 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64 20 callback record
8850: 66 72 6f 6d 20 62 65 69 6e 67 20 73 65 74 0a 20 from being set.
8860: 2a 09 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 *.to NULL in the
8870: 20 66 75 74 75 72 65 20 77 68 65 6e 20 74 68 65 future when the
8880: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 interpreter is
8890: 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d deleted.. *. *--
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
88f0: 20 76 6f 69 64 0a 55 6e 72 65 67 69 73 74 65 72 void.Unregister
8900: 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 TcpServerInterpC
8910: 6c 65 61 6e 75 70 50 72 6f 63 28 0a 20 20 20 20 leanupProc(.
8920: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
8930: 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 rp,../* Interpre
8940: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 ter in which the
8950: 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b accept callback
8960: 0a 09 09 09 09 20 2a 20 72 65 63 6f 72 64 20 77 ..... * record w
8970: 61 73 20 72 65 67 69 73 74 65 72 65 64 2e 20 2a as registered. *
8980: 2f 0a 20 20 20 20 41 63 63 65 70 74 43 61 6c 6c /. AcceptCall
8990: 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c back *acceptCall
89a0: 62 61 63 6b 50 74 72 29 0a 09 09 09 09 2f 2a 20 backPtr)...../*
89b0: 54 68 65 20 72 65 63 6f 72 64 20 66 6f 72 20 77 The record for w
89c0: 68 69 63 68 20 74 6f 20 64 65 6c 65 74 65 20 74 hich to delete t
89d0: 68 65 0a 09 09 09 09 20 2a 20 72 65 67 69 73 74 he..... * regist
89e0: 72 61 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 ration. */.{.
89f0: 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a Tcl_HashTable *
8a00: 68 54 62 6c 50 74 72 3b 0a 20 20 20 20 54 63 6c hTblPtr;. Tcl
8a10: 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 _HashEntry *hPtr
8a20: 3b 0a 0a 20 20 20 20 68 54 62 6c 50 74 72 20 3d ;.. hTblPtr =
8a30: 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 (Tcl_HashTable
8a40: 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63 44 61 *)Tcl_GetAssocDa
8a50: 74 61 28 69 6e 74 65 72 70 2c 20 22 74 63 6c 54 ta(interp, "tclT
8a60: 43 50 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b CPAcceptCallback
8a70: 73 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 s", NULL);. i
8a80: 66 20 28 68 54 62 6c 50 74 72 20 3d 3d 20 4e 55 f (hTblPtr == NU
8a90: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 LL) {..return;.
8aa0: 20 20 20 7d 0a 0a 20 20 20 20 68 50 74 72 20 3d }.. hPtr =
8ab0: 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74 Tcl_FindHashEnt
8ac0: 72 79 28 68 54 62 6c 50 74 72 2c 20 61 63 63 65 ry(hTblPtr, acce
8ad0: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a ptCallbackPtr);.
8ae0: 20 20 20 20 69 66 20 28 68 50 74 72 20 21 3d 20 if (hPtr !=
8af0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
8b00: 65 74 65 48 61 73 68 45 6e 74 72 79 28 68 50 74 eteHashEntry(hPt
8b10: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a r);. }.}.../*
8b20: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8b70: 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 72 AcceptCallbackPr
8b80: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 oc --. *. *.This
8b90: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 callback is inv
8ba0: 6f 6b 65 64 20 62 79 20 74 68 65 20 54 43 50 20 oked by the TCP
8bb0: 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 77 channel driver w
8bc0: 68 65 6e 20 69 74 20 61 63 63 65 70 74 73 20 61 hen it accepts a
8bd0: 0a 20 2a 09 6e 65 77 20 63 6f 6e 6e 65 63 74 69 . *.new connecti
8be0: 6f 6e 20 66 72 6f 6d 20 61 20 63 6c 69 65 6e 74 on from a client
8bf0: 20 6f 6e 20 61 20 73 65 72 76 65 72 20 73 6f 63 on a server soc
8c00: 6b 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ket.. *. * Resul
8c10: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
8c20: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8c30: 0a 20 2a 09 57 68 61 74 65 76 65 72 20 74 68 65 . *.Whatever the
8c40: 20 73 63 72 69 70 74 20 64 6f 65 73 2e 0a 20 2a script does.. *
8c50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
8ca0: 74 61 74 69 63 20 76 6f 69 64 0a 41 63 63 65 70 tatic void.Accep
8cb0: 74 43 61 6c 6c 62 61 63 6b 50 72 6f 63 28 0a 20 tCallbackProc(.
8cc0: 20 20 20 76 6f 69 64 20 2a 63 61 6c 6c 62 61 63 void *callbac
8cd0: 6b 44 61 74 61 2c 09 2f 2a 20 54 68 65 20 64 61 kData,./* The da
8ce0: 74 61 20 73 74 6f 72 65 64 20 77 68 65 6e 20 74 ta stored when t
8cf0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 0a he callback was.
8d00: 09 09 09 09 20 2a 20 63 72 65 61 74 65 64 20 69 .... * created i
8d10: 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 09 09 n the call to...
8d20: 09 09 20 2a 20 54 63 6c 5f 4f 70 65 6e 54 63 70 .. * Tcl_OpenTcp
8d30: 53 65 72 76 65 72 2e 20 2a 2f 0a 20 20 20 20 54 Server. */. T
8d40: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 2c cl_Channel chan,
8d50: 09 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 66 6f 72 ../* Channel for
8d60: 20 74 68 65 20 6e 65 77 6c 79 20 61 63 63 65 70 the newly accep
8d70: 74 65 64 0a 09 09 09 09 20 2a 20 63 6f 6e 6e 65 ted..... * conne
8d80: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 63 68 ction. */. ch
8d90: 61 72 20 2a 61 64 64 72 65 73 73 2c 09 09 2f 2a ar *address,../*
8da0: 20 41 64 64 72 65 73 73 20 6f 66 20 63 6c 69 65 Address of clie
8db0: 6e 74 20 74 68 61 74 20 77 61 73 20 61 63 63 65 nt that was acce
8dc0: 70 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 pted. */. int
8dd0: 20 70 6f 72 74 29 09 09 09 2f 2a 20 50 6f 72 74 port).../* Port
8de0: 20 6f 66 20 63 6c 69 65 6e 74 20 74 68 61 74 20 of client that
8df0: 77 61 73 20 61 63 63 65 70 74 65 64 2e 20 2a 2f was accepted. */
8e00: 0a 7b 0a 20 20 20 20 41 63 63 65 70 74 43 61 6c .{. AcceptCal
8e10: 6c 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c lback *acceptCal
8e20: 6c 62 61 63 6b 50 74 72 20 3d 20 28 41 63 63 65 lbackPtr = (Acce
8e30: 70 74 43 61 6c 6c 62 61 63 6b 20 2a 29 63 61 6c ptCallback *)cal
8e40: 6c 62 61 63 6b 44 61 74 61 3b 0a 0a 20 20 20 20 lbackData;..
8e50: 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20 /*. * Check
8e60: 69 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 if the callback
8e70: 69 73 20 73 74 69 6c 6c 20 76 61 6c 69 64 3b 20 is still valid;
8e80: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 the interpreter
8e90: 6d 61 79 20 68 61 76 65 20 67 6f 6e 65 0a 20 20 may have gone.
8ea0: 20 20 20 2a 20 61 77 61 79 2c 20 74 68 69 73 20 * away, this
8eb0: 69 73 20 73 69 67 6e 61 6c 6c 65 64 20 62 79 20 is signalled by
8ec0: 73 65 74 74 69 6e 67 20 74 68 65 20 69 6e 74 65 setting the inte
8ed0: 72 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 rp field of the
8ee0: 63 61 6c 6c 62 61 63 6b 0a 20 20 20 20 20 2a 20 callback. *
8ef0: 64 61 74 61 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 data to NULL..
8f00: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61 */.. if (a
8f10: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
8f20: 2d 3e 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c ->interp != NULL
8f30: 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 ) {..Tcl_Interp
8f40: 2a 69 6e 74 65 72 70 20 3d 20 61 63 63 65 70 74 *interp = accept
8f50: 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74 CallbackPtr->int
8f60: 65 72 70 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 73 erp;..Tcl_Obj *s
8f70: 63 72 69 70 74 2c 20 2a 6f 62 6a 76 5b 32 5d 3b cript, *objv[2];
8f80: 0a 09 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 54 ..int result = T
8f90: 43 4c 5f 4f 4b 3b 0a 0a 09 6f 62 6a 76 5b 30 5d CL_OK;...objv[0]
8fa0: 20 3d 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 = acceptCallbac
8fb0: 6b 50 74 72 2d 3e 73 63 72 69 70 74 3b 0a 09 6f kPtr->script;..o
8fc0: 62 6a 76 5b 31 5d 20 3d 20 54 63 6c 5f 4e 65 77 bjv[1] = Tcl_New
8fd0: 4c 69 73 74 4f 62 6a 28 33 2c 20 4e 55 4c 4c 29 ListObj(3, NULL)
8fe0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 ;..Tcl_ListObjAp
8ff0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c pendElement(NULL
9000: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c 5f 4e , objv[1], Tcl_N
9010: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 54 ewStringObj(...T
9020: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
9030: 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a 09 e(chan), -1));..
9040: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
9050: 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f dElement(NULL, o
9060: 62 6a 76 5b 31 5d 2c 20 54 63 6c 5f 4e 65 77 53 bjv[1], Tcl_NewS
9070: 74 72 69 6e 67 4f 62 6a 28 61 64 64 72 65 73 73 tringObj(address
9080: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 , -1));..Tcl_Lis
9090: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e tObjAppendElemen
90a0: 74 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31 5d 2c t(NULL, objv[1],
90b0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f Tcl_NewWideIntO
90c0: 62 6a 28 70 6f 72 74 29 29 3b 0a 0a 09 73 63 72 bj(port));...scr
90d0: 69 70 74 20 3d 20 54 63 6c 5f 43 6f 6e 63 61 74 ipt = Tcl_Concat
90e0: 4f 62 6a 28 32 2c 20 6f 62 6a 76 29 3b 0a 09 54 Obj(2, objv);..T
90f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
9100: 73 63 72 69 70 74 29 3b 0a 09 54 63 6c 5f 44 65 script);..Tcl_De
9110: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b crRefCount(objv[
9120: 31 5d 29 3b 0a 0a 09 54 63 6c 5f 50 72 65 73 65 1]);...Tcl_Prese
9130: 72 76 65 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 rve(interp);..Tc
9140: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 l_RegisterChanne
9150: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b l(interp, chan);
9160: 0a 0a 09 2f 2a 0a 09 20 2a 20 41 72 74 69 66 69 .../*.. * Artifi
9170: 63 69 61 6c 6c 79 20 62 75 6d 70 20 74 68 65 20 cially bump the
9180: 72 65 66 63 6f 75 6e 74 20 74 6f 20 70 72 6f 74 refcount to prot
9190: 65 63 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 ect the channel
91a0: 66 72 6f 6d 20 62 65 69 6e 67 0a 09 20 2a 20 64 from being.. * d
91b0: 65 6c 65 74 65 64 20 77 68 69 6c 65 20 74 68 65 eleted while the
91c0: 20 73 63 72 69 70 74 20 69 73 20 62 65 69 6e 67 script is being
91d0: 20 65 76 61 6c 75 61 74 65 64 2e 0a 09 20 2a 2f evaluated... */
91e0: 0a 0a 09 54 63 6c 5f 52 65 67 69 73 74 65 72 43 ...Tcl_RegisterC
91f0: 68 61 6e 6e 65 6c 28 4e 55 4c 4c 2c 20 63 68 61 hannel(NULL, cha
9200: 6e 29 3b 0a 0a 09 72 65 73 75 6c 74 20 3d 20 54 n);...result = T
9210: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 cl_EvalObjEx(int
9220: 65 72 70 2c 20 73 63 72 69 70 74 2c 20 54 43 4c erp, script, TCL
9230: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c _EVAL_DIRECT|TCL
9240: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 09 _EVAL_GLOBAL);..
9250: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
9260: 28 73 63 72 69 70 74 29 3b 0a 0a 09 69 66 20 28 (script);...if (
9270: 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b result != TCL_OK
9280: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42 61 63 ) {.. Tcl_Bac
9290: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e kgroundException
92a0: 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 29 (interp, result)
92b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 ;.. Tcl_Unreg
92c0: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 isterChannel(int
92d0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 09 7d 0a 0a erp, chan);..}..
92e0: 09 2f 2a 0a 09 20 2a 20 44 65 63 72 65 6d 65 6e ./*.. * Decremen
92f0: 74 20 74 68 65 20 61 72 74 69 66 69 63 69 61 6c t the artificial
9300: 6c 79 20 62 75 6d 70 65 64 20 72 65 66 63 6f 75 ly bumped refcou
9310: 6e 74 2e 20 41 66 74 65 72 20 74 68 69 73 20 69 nt. After this i
9320: 74 20 69 73 20 6e 6f 74 0a 09 20 2a 20 73 61 66 t is not.. * saf
9330: 65 20 61 6e 79 6d 6f 72 65 20 74 6f 20 75 73 65 e anymore to use
9340: 20 22 63 68 61 6e 22 2c 20 62 65 63 61 75 73 65 "chan", because
9350: 20 69 74 20 6d 61 79 20 6e 6f 77 20 62 65 20 64 it may now be d
9360: 65 6c 65 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 eleted... */...T
9370: 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 cl_UnregisterCha
9380: 6e 6e 65 6c 28 4e 55 4c 4c 2c 20 63 68 61 6e 29 nnel(NULL, chan)
9390: 3b 0a 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 ;...Tcl_Release(
93a0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 20 65 interp);. } e
93b0: 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 lse {../*.. * Th
93c0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 68 61 e interpreter ha
93d0: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 s been deleted,
93e0: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 75 so there is no u
93f0: 73 65 66 75 6c 20 77 61 79 20 74 6f 20 75 73 65 seful way to use
9400: 0a 09 20 2a 20 74 68 65 20 63 6c 69 65 6e 74 20 .. * the client
9410: 73 6f 63 6b 65 74 20 2d 20 6a 75 73 74 20 63 6c socket - just cl
9420: 6f 73 65 20 69 74 2e 0a 09 20 2a 2f 0a 0a 09 54 ose it... */...T
9430: 63 6c 5f 43 6c 6f 73 65 45 78 28 4e 55 4c 4c 2c cl_CloseEx(NULL,
9440: 20 63 68 61 6e 2c 20 30 29 3b 0a 20 20 20 20 7d chan, 0);. }
9450: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94a0: 0a 20 2a 0a 20 2a 20 54 63 70 53 65 72 76 65 72 . *. * TcpServer
94b0: 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a CloseProc --. *.
94c0: 20 2a 09 54 68 69 73 20 63 61 6c 6c 62 61 63 6b *.This callback
94d0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 is called when
94e0: 74 68 65 20 54 43 50 20 73 65 72 76 65 72 20 63 the TCP server c
94f0: 68 61 6e 6e 65 6c 20 66 6f 72 20 77 68 69 63 68 hannel for which
9500: 20 69 74 20 77 61 73 0a 20 2a 09 72 65 67 69 73 it was. *.regis
9510: 74 65 72 65 64 20 69 73 20 62 65 69 6e 67 20 63 tered is being c
9520: 6c 6f 73 65 64 2e 20 49 74 20 69 6e 66 6f 72 6d losed. It inform
9530: 73 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 s the interprete
9540: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 0a 20 r in which the.
9550: 2a 09 61 63 63 65 70 74 20 73 63 72 69 70 74 20 *.accept script
9560: 69 73 20 65 76 61 6c 75 61 74 65 64 20 28 69 66 is evaluated (if
9570: 20 74 68 61 74 20 69 6e 74 65 72 70 72 65 74 65 that interprete
9580: 72 20 73 74 69 6c 6c 20 65 78 69 73 74 73 29 20 r still exists)
9590: 74 68 61 74 0a 20 2a 09 74 68 69 73 20 63 68 61 that. *.this cha
95a0: 6e 6e 65 6c 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e nnel no longer n
95b0: 65 65 64 73 20 74 6f 20 62 65 20 69 6e 66 6f 72 eeds to be infor
95c0: 6d 65 64 20 69 66 20 74 68 65 20 69 6e 74 65 72 med if the inter
95d0: 70 72 65 74 65 72 20 69 73 0a 20 2a 09 64 65 6c preter is. *.del
95e0: 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 eted.. *. * Resu
95f0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a lts:. *.None.. *
9600: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
9610: 3a 0a 20 2a 09 49 6e 20 74 68 65 20 66 75 74 75 :. *.In the futu
9620: 72 65 2c 20 69 66 20 74 68 65 20 69 6e 74 65 72 re, if the inter
9630: 70 72 65 74 65 72 20 69 73 20 64 65 6c 65 74 65 preter is delete
9640: 64 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 77 d this channel w
9650: 69 6c 6c 20 6e 6f 0a 20 2a 09 6c 6f 6e 67 65 72 ill no. *.longer
9660: 20 62 65 20 69 6e 66 6f 72 6d 65 64 2e 0a 20 2a be informed.. *
9670: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
9680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
96c0: 74 61 74 69 63 20 76 6f 69 64 0a 54 63 70 53 65 tatic void.TcpSe
96d0: 72 76 65 72 43 6c 6f 73 65 50 72 6f 63 28 0a 20 rverCloseProc(.
96e0: 20 20 20 76 6f 69 64 20 2a 63 61 6c 6c 62 61 63 void *callbac
96f0: 6b 44 61 74 61 29 09 2f 2a 20 54 68 65 20 64 61 kData)./* The da
9700: 74 61 20 70 61 73 73 65 64 20 69 6e 20 74 68 65 ta passed in the
9710: 20 63 61 6c 6c 20 74 6f 0a 09 09 09 09 20 2a 20 call to..... *
9720: 54 63 6c 5f 43 72 65 61 74 65 43 6c 6f 73 65 48 Tcl_CreateCloseH
9730: 61 6e 64 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 andler. */.{.
9740: 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 AcceptCallback
9750: 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 *acceptCallbackP
9760: 74 72 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c tr = (AcceptCall
9770: 62 61 63 6b 20 2a 29 63 61 6c 6c 62 61 63 6b 44 back *)callbackD
9780: 61 74 61 3b 0a 09 09 09 09 2f 2a 20 54 68 65 20 ata;...../* The
9790: 61 63 74 75 61 6c 20 64 61 74 61 2e 20 2a 2f 0a actual data. */.
97a0: 0a 20 20 20 20 69 66 20 28 61 63 63 65 70 74 43 . if (acceptC
97b0: 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74 65 allbackPtr->inte
97c0: 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 55 rp != NULL) {..U
97d0: 6e 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76 nregisterTcpServ
97e0: 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 erInterpCleanupP
97f0: 72 6f 63 28 61 63 63 65 70 74 43 61 6c 6c 62 61 roc(acceptCallba
9800: 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 ckPtr->interp,..
9810: 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 .acceptCallbackP
9820: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 tr);. }. T
9830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
9840: 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 acceptCallbackPt
9850: 72 2d 3e 73 63 72 69 70 74 29 3b 0a 20 20 20 20 r->script);.
9860: 54 63 6c 5f 46 72 65 65 28 61 63 63 65 70 74 43 Tcl_Free(acceptC
9870: 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 7d 0a 0c allbackPtr);.}..
9880: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
98d0: 20 2a 20 54 63 6c 5f 53 6f 63 6b 65 74 4f 62 6a * Tcl_SocketObj
98e0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cmd --. *. *.Thi
98f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
9900: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 voked to process
9910: 20 74 68 65 20 22 73 6f 63 6b 65 74 22 20 54 63 the "socket" Tc
9920: 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 l command. See t
9930: 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d he. *.user docum
9940: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 entation for det
9950: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 ails on what it
9960: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 does.. *. * Resu
9970: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 lts:. *.A standa
9980: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 rd Tcl result..
9990: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
99a0: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 61 20 s:. *.Creates a
99b0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
99c0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a10: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 -. */..int.Tcl_S
9a20: 6f 63 6b 65 74 4f 62 6a 43 6d 64 28 0a 20 20 20 ocketObjCmd(.
9a30: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 TCL_UNUSED(void
9a40: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 *),. Tcl_Int
9a50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a erp *interp,../*
9a60: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 Current interpr
9a70: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 eter. */. int
9a80: 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 objc,.../* Numb
9a90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e er of arguments.
9aa0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
9ab0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f *const objv[])./
9ac0: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 * Argument objec
9ad0: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 73 74 61 ts. */.{. sta
9ae0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
9af0: 63 6f 6e 73 74 20 73 6f 63 6b 65 74 4f 70 74 69 const socketOpti
9b00: 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 61 73 79 ons[] = {.."-asy
9b10: 6e 63 22 2c 20 22 2d 62 61 63 6b 6c 6f 67 22 2c nc", "-backlog",
9b20: 20 22 2d 6d 79 61 64 64 72 22 2c 20 22 2d 6d 79 "-myaddr", "-my
9b30: 70 6f 72 74 22 2c 20 22 2d 72 65 75 73 65 61 64 port", "-reusead
9b40: 64 72 22 2c 0a 09 22 2d 72 65 75 73 65 70 6f 72 dr",.."-reusepor
9b50: 74 22 2c 20 22 2d 73 65 72 76 65 72 22 2c 20 4e t", "-server", N
9b60: 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 ULL. };. e
9b70: 6e 75 6d 20 73 6f 63 6b 65 74 4f 70 74 69 6f 6e num socketOption
9b80: 73 45 6e 75 6d 20 7b 0a 09 53 4b 54 5f 41 53 59 sEnum {..SKT_ASY
9b90: 4e 43 2c 20 53 4b 54 5f 42 41 43 4b 4c 4f 47 2c NC, SKT_BACKLOG,
9ba0: 20 53 4b 54 5f 4d 59 41 44 44 52 2c 20 53 4b 54 SKT_MYADDR, SKT
9bb0: 5f 4d 59 50 4f 52 54 2c 20 53 4b 54 5f 52 45 55 _MYPORT, SKT_REU
9bc0: 53 45 41 44 44 52 2c 0a 09 53 4b 54 5f 52 45 55 SEADDR,..SKT_REU
9bd0: 53 45 50 4f 52 54 2c 20 53 4b 54 5f 53 45 52 56 SEPORT, SKT_SERV
9be0: 45 52 0a 20 20 20 20 7d 20 6f 70 74 69 6f 6e 49 ER. } optionI
9bf0: 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 61 2c ndex;. int a,
9c00: 20 73 65 72 76 65 72 20 3d 20 30 2c 20 6d 79 70 server = 0, myp
9c10: 6f 72 74 20 3d 20 30 2c 20 61 73 79 6e 63 20 3d ort = 0, async =
9c20: 20 30 2c 20 72 65 75 73 65 70 20 3d 20 2d 31 2c 0, reusep = -1,
9c30: 0a 09 72 65 75 73 65 61 20 3d 20 2d 31 2c 20 62 ..reusea = -1, b
9c40: 61 63 6b 6c 6f 67 20 3d 20 2d 31 3b 0a 20 20 20 acklog = -1;.
9c50: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c unsigned int fl
9c60: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e ags = 0;. con
9c70: 73 74 20 63 68 61 72 20 2a 68 6f 73 74 2c 20 2a st char *host, *
9c80: 70 6f 72 74 2c 20 2a 6d 79 61 64 64 72 20 3d 20 port, *myaddr =
9c90: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 NULL;. Tcl_Ob
9ca0: 6a 20 2a 73 63 72 69 70 74 20 3d 20 4e 55 4c 4c j *script = NULL
9cb0: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
9cc0: 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20 54 63 6c l chan;.. Tcl
9cd0: 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 3b 0a 0a InitSockets();..
9ce0: 20 20 20 20 66 6f 72 20 28 61 20 3d 20 31 3b 20 for (a = 1;
9cf0: 61 20 3c 20 6f 62 6a 63 3b 20 61 2b 2b 29 20 7b a < objc; a++) {
9d00: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 ..const char *ar
9d10: 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 g = TclGetString
9d20: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 0a 09 69 66 20 (objv[a]);...if
9d30: 28 61 72 67 5b 30 5d 20 21 3d 20 27 2d 27 29 20 (arg[0] != '-')
9d40: 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d {.. break;..}
9d50: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 ..if (Tcl_GetInd
9d60: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
9d70: 2c 20 6f 62 6a 76 5b 61 5d 2c 20 73 6f 63 6b 65 , objv[a], socke
9d80: 74 4f 70 74 69 6f 6e 73 2c 20 22 6f 70 74 69 6f tOptions, "optio
9d90: 6e 22 2c 0a 09 09 54 43 4c 5f 45 58 41 43 54 2c n",...TCL_EXACT,
9da0: 20 26 6f 70 74 69 6f 6e 49 6e 64 65 78 29 20 21 &optionIndex) !
9db0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
9dc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
9dd0: 52 3b 0a 09 7d 0a 09 73 77 69 74 63 68 20 28 6f R;..}..switch (o
9de0: 70 74 69 6f 6e 49 6e 64 65 78 29 20 7b 0a 09 63 ptionIndex) {..c
9df0: 61 73 65 20 53 4b 54 5f 41 53 59 4e 43 3a 0a 09 ase SKT_ASYNC:..
9e00: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 20 3d if (server =
9e10: 3d 20 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 = 1) {...Tcl_Set
9e20: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
9e30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f , Tcl_NewStringO
9e40: 62 6a 28 0a 09 09 09 22 63 61 6e 6e 6f 74 20 73 bj(...."cannot s
9e50: 65 74 20 2d 61 73 79 6e 63 20 6f 70 74 69 6f 6e et -async option
9e60: 20 66 6f 72 20 73 65 72 76 65 72 20 73 6f 63 6b for server sock
9e70: 65 74 73 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 ets", -1));...re
9e80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9e90: 09 20 20 20 20 7d 0a 09 20 20 20 20 61 73 79 6e . }.. asyn
9ea0: 63 20 3d 20 31 3b 0a 09 20 20 20 20 62 72 65 61 c = 1;.. brea
9eb0: 6b 3b 0a 09 63 61 73 65 20 53 4b 54 5f 4d 59 41 k;..case SKT_MYA
9ec0: 44 44 52 3a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 DDR:.. a++;..
9ed0: 20 20 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a if (a >= obj
9ee0: 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 c) {...Tcl_SetOb
9ef0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
9f00: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
9f10: 28 0a 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e (...."no argumen
9f20: 74 20 67 69 76 65 6e 20 66 6f 72 20 2d 6d 79 61 t given for -mya
9f30: 64 64 72 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 ddr option", -1)
9f40: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
9f50: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
9f60: 20 20 20 6d 79 61 64 64 72 20 3d 20 54 63 6c 47 myaddr = TclG
9f70: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d etString(objv[a]
9f80: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 );.. break;..
9f90: 63 61 73 65 20 53 4b 54 5f 4d 59 50 4f 52 54 3a case SKT_MYPORT:
9fa0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {.. const ch
9fb0: 61 72 20 2a 6d 79 50 6f 72 74 4e 61 6d 65 3b 0a ar *myPortName;.
9fc0: 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 20 .. a++;..
9fd0: 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 7b if (a >= objc) {
9fe0: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
9ff0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
a000: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 NewStringObj(...
a010: 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 69 ."no argument gi
a020: 76 65 6e 20 66 6f 72 20 2d 6d 79 70 6f 72 74 20 ven for -myport
a030: 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 option", -1));..
a040: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
a050: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6d R;.. }.. m
a060: 79 50 6f 72 74 4e 61 6d 65 20 3d 20 54 63 6c 47 yPortName = TclG
a070: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d etString(objv[a]
a080: 29 3b 0a 09 20 20 20 20 69 66 20 28 54 63 6c 53 );.. if (TclS
a090: 6f 63 6b 47 65 74 50 6f 72 74 28 69 6e 74 65 72 ockGetPort(inter
a0a0: 70 2c 20 6d 79 50 6f 72 74 4e 61 6d 65 2c 20 22 p, myPortName, "
a0b0: 74 63 70 22 2c 20 26 6d 79 70 6f 72 74 29 20 21 tcp", &myport) !
a0c0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 = TCL_OK) {...re
a0d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a0e0: 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 . }.. brea
a0f0: 6b 3b 0a 09 7d 0a 09 63 61 73 65 20 53 4b 54 5f k;..}..case SKT_
a100: 53 45 52 56 45 52 3a 0a 09 20 20 20 20 69 66 20 SERVER:.. if
a110: 28 61 73 79 6e 63 20 3d 3d 20 31 29 20 7b 0a 09 (async == 1) {..
a120: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
a130: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
a140: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 wStringObj(...."
a150: 63 61 6e 6e 6f 74 20 73 65 74 20 2d 61 73 79 6e cannot set -asyn
a160: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 73 65 72 c option for ser
a170: 76 65 72 20 73 6f 63 6b 65 74 73 22 2c 20 2d 31 ver sockets", -1
a180: 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ));...return TCL
a190: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
a1a0: 20 20 20 20 73 65 72 76 65 72 20 3d 20 31 3b 0a server = 1;.
a1b0: 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 20 69 . a++;.. i
a1c0: 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a f (a >= objc) {.
a1d0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
a1e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
a1f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 ewStringObj(....
a200: 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 69 76 "no argument giv
a210: 65 6e 20 66 6f 72 20 2d 73 65 72 76 65 72 20 6f en for -server o
a220: 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 ption", -1));...
a230: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a240: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 63 ;.. }.. sc
a250: 72 69 70 74 20 3d 20 6f 62 6a 76 5b 61 5d 3b 0a ript = objv[a];.
a260: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
a270: 65 20 53 4b 54 5f 52 45 55 53 45 41 44 44 52 3a e SKT_REUSEADDR:
a280: 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 20 .. a++;..
a290: 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 7b if (a >= objc) {
a2a0: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
a2b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
a2c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 NewStringObj(...
a2d0: 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 69 ."no argument gi
a2e0: 76 65 6e 20 66 6f 72 20 2d 72 65 75 73 65 61 64 ven for -reusead
a2f0: 64 72 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 dr option", -1))
a300: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ;...return TCL_E
a310: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 RROR;.. }..
a320: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 42 6f 6f if (Tcl_GetBoo
a330: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 leanFromObj(inte
a340: 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 26 72 65 rp, objv[a], &re
a350: 75 73 65 61 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 usea) != TCL_OK)
a360: 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f {...return TCL_
a370: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 ERROR;.. }..
a380: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
a390: 53 4b 54 5f 52 45 55 53 45 50 4f 52 54 3a 0a 09 SKT_REUSEPORT:..
a3a0: 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 20 69 66 a++;.. if
a3b0: 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 (a >= objc) {..
a3c0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
a3d0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 t(interp, Tcl_Ne
a3e0: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 wStringObj(...."
a3f0: 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 69 76 65 no argument give
a400: 6e 20 66 6f 72 20 2d 72 65 75 73 65 70 6f 72 74 n for -reuseport
a410: 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a option", -1));.
a420: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
a430: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 OR;.. }..
a440: 69 66 20 28 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 if (Tcl_GetBoole
a450: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 anFromObj(interp
a460: 2c 20 6f 62 6a 76 5b 61 5d 2c 20 26 72 65 75 73 , objv[a], &reus
a470: 65 70 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ep) != TCL_OK) {
a480: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ...return TCL_ER
a490: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 ROR;.. }..
a4a0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 4b break;..case SK
a4b0: 54 5f 42 41 43 4b 4c 4f 47 3a 0a 09 20 20 20 20 T_BACKLOG:..
a4c0: 61 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28 61 20 a++;.. if (a
a4d0: 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c >= objc) {...Tcl
a4e0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
a4f0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
a500: 69 6e 67 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 ingObj(...."no a
a510: 72 67 75 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f rgument given fo
a520: 72 20 2d 62 61 63 6b 6c 6f 67 20 6f 70 74 69 6f r -backlog optio
a530: 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74 75 n", -1));...retu
a540: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 rn TCL_ERROR;..
a550: 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
a560: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 l_GetIntFromObj(
a570: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c interp, objv[a],
a580: 20 26 62 61 63 6b 6c 6f 67 29 20 21 3d 20 54 43 &backlog) != TC
a590: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e L_OK) {...return
a5a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 TCL_ERROR;..
a5b0: 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 }.. break;..
a5c0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 default:.. Tc
a5d0: 6c 5f 50 61 6e 69 63 28 22 54 63 6c 5f 53 6f 63 l_Panic("Tcl_Soc
a5e0: 6b 65 74 4f 62 6a 43 6d 64 3a 20 62 61 64 20 6f ketObjCmd: bad o
a5f0: 70 74 69 6f 6e 20 69 6e 64 65 78 20 74 6f 20 53 ption index to S
a600: 6f 63 6b 65 74 4f 70 74 69 6f 6e 73 22 29 3b 0a ocketOptions");.
a610: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 .}. }. if
a620: 28 73 65 72 76 65 72 29 20 7b 0a 09 68 6f 73 74 (server) {..host
a630: 20 3d 20 6d 79 61 64 64 72 3b 09 09 2f 2a 20 4e = myaddr;../* N
a640: 55 4c 4c 20 69 6d 70 6c 69 65 73 20 49 4e 41 44 ULL implies INAD
a650: 44 52 5f 41 4e 59 20 2a 2f 0a 09 69 66 20 28 6d DR_ANY */..if (m
a660: 79 70 6f 72 74 20 21 3d 20 30 29 20 7b 0a 09 20 yport != 0) {..
a670: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
a680: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
a690: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 NewStringObj(...
a6a0: 20 20 20 20 22 6f 70 74 69 6f 6e 20 2d 6d 79 70 "option -myp
a6b0: 6f 72 74 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 ort is not valid
a6c0: 20 66 6f 72 20 73 65 72 76 65 72 73 22 2c 20 2d for servers", -
a6d0: 31 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 1));.. return
a6e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 TCL_ERROR;..}.
a6f0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 61 20 } else if (a
a700: 3c 20 6f 62 6a 63 29 20 7b 0a 09 68 6f 73 74 20 < objc) {..host
a710: 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f = TclGetString(o
a720: 62 6a 76 5b 61 5d 29 3b 0a 09 61 2b 2b 3b 0a 20 bjv[a]);..a++;.
a730: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 49 6e 74 } else {..Int
a740: 65 72 70 20 2a 69 50 74 72 3b 0a 0a 20 20 20 20 erp *iPtr;..
a750: 77 72 6f 6e 67 4e 75 6d 41 72 67 73 3a 0a 09 69 wrongNumArgs:..i
a760: 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29 Ptr = (Interp *)
a770: 20 69 6e 74 65 72 70 3b 0a 09 54 63 6c 5f 57 72 interp;..Tcl_Wr
a780: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
a790: 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 09 09 22 3f p, 1, objv,..."?
a7a0: 2d 61 73 79 6e 63 3f 20 3f 2d 6d 79 61 64 64 72 -async? ?-myaddr
a7b0: 20 61 64 64 72 3f 20 3f 2d 6d 79 70 6f 72 74 20 addr? ?-myport
a7c0: 6d 79 70 6f 72 74 3f 20 68 6f 73 74 20 70 6f 72 myport? host por
a7d0: 74 22 29 3b 0a 09 69 50 74 72 2d 3e 66 6c 61 67 t");..iPtr->flag
a7e0: 73 20 7c 3d 20 49 4e 54 45 52 50 5f 41 4c 54 45 s |= INTERP_ALTE
a7f0: 52 4e 41 54 45 5f 57 52 4f 4e 47 5f 41 52 47 53 RNATE_WRONG_ARGS
a800: 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 ;..Tcl_WrongNumA
a810: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
a820: 62 6a 76 2c 0a 09 09 22 2d 73 65 72 76 65 72 20 bjv,..."-server
a830: 63 6f 6d 6d 61 6e 64 20 3f 2d 62 61 63 6b 6c 6f command ?-backlo
a840: 67 20 63 6f 75 6e 74 3f 20 3f 2d 6d 79 61 64 64 g count? ?-myadd
a850: 72 20 61 64 64 72 3f 20 22 0a 09 09 22 3f 2d 72 r addr? "..."?-r
a860: 65 75 73 65 61 64 64 72 20 62 6f 6f 6c 65 61 6e euseaddr boolean
a870: 3f 20 3f 2d 72 65 75 73 65 70 6f 72 74 20 62 6f ? ?-reuseport bo
a880: 6f 6c 65 61 6e 3f 20 70 6f 72 74 22 29 3b 0a 09 olean? port");..
a890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a8a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
a8b0: 28 21 73 65 72 76 65 72 20 26 26 20 28 72 65 75 (!server && (reu
a8c0: 73 65 61 20 21 3d 20 2d 31 20 7c 7c 20 72 65 75 sea != -1 || reu
a8d0: 73 65 70 20 21 3d 20 2d 31 20 7c 7c 20 62 61 63 sep != -1 || bac
a8e0: 6b 6c 6f 67 20 21 3d 20 2d 31 29 29 20 7b 0a 09 klog != -1)) {..
a8f0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
a900: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
a910: 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 6f 70 StringObj(..."op
a920: 74 69 6f 6e 73 20 2d 62 61 63 6b 6c 6f 67 2c 20 tions -backlog,
a930: 2d 72 65 75 73 65 61 64 64 72 2c 20 61 6e 64 20 -reuseaddr, and
a940: 2d 72 65 75 73 65 70 6f 72 74 20 61 72 65 20 6f -reuseport are o
a950: 6e 6c 79 20 76 61 6c 69 64 20 22 0a 09 09 22 66 nly valid "..."f
a960: 6f 72 20 73 65 72 76 65 72 73 22 2c 20 2d 31 29 or servers", -1)
a970: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
a980: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
a990: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 74 /*. * Set t
a9a0: 68 65 20 6f 70 74 69 6f 6e 73 20 74 6f 20 74 68 he options to th
a9b0: 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 eir default valu
a9c0: 65 20 69 66 20 74 68 65 20 75 73 65 72 20 64 69 e if the user di
a9d0: 64 6e 27 74 20 6f 76 65 72 72 69 64 65 0a 20 20 dn't override.
a9e0: 20 20 20 2a 20 74 68 65 69 72 20 76 61 6c 75 65 * their value
a9f0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
aa00: 66 20 28 72 65 75 73 65 70 20 3d 3d 20 2d 31 29 f (reusep == -1)
aa10: 20 7b 0a 09 72 65 75 73 65 70 20 3d 20 30 3b 0a {..reusep = 0;.
aa20: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 }. if (re
aa30: 75 73 65 61 20 3d 3d 20 2d 31 29 20 7b 0a 09 72 usea == -1) {..r
aa40: 65 75 73 65 61 20 3d 20 31 3b 0a 20 20 20 20 7d eusea = 1;. }
aa50: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
aa60: 42 75 69 6c 64 20 74 68 65 20 62 69 74 73 65 74 Build the bitset
aa70: 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 with the flags
aa80: 76 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a 2f 0a values.. */.
aa90: 0a 20 20 20 20 69 66 20 28 72 65 75 73 65 61 29 . if (reusea)
aaa0: 20 7b 0a 09 66 6c 61 67 73 20 7c 3d 20 54 43 4c {..flags |= TCL
aab0: 5f 54 43 50 53 45 52 56 45 52 5f 52 45 55 53 45 _TCPSERVER_REUSE
aac0: 41 44 44 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ADDR;. }.
aad0: 69 66 20 28 72 65 75 73 65 70 29 20 7b 0a 09 66 if (reusep) {..f
aae0: 6c 61 67 73 20 7c 3d 20 54 43 4c 5f 54 43 50 53 lags |= TCL_TCPS
aaf0: 45 52 56 45 52 5f 52 45 55 53 45 50 4f 52 54 3b ERVER_REUSEPORT;
ab00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
ab10: 20 20 20 20 2a 20 41 6c 6c 20 74 68 65 20 61 72 * All the ar
ab20: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 68 guments should h
ab30: 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64 20 ave been parsed
ab40: 62 79 20 6e 6f 77 2c 20 27 61 27 20 70 6f 69 6e by now, 'a' poin
ab50: 74 73 20 74 6f 20 74 68 65 0a 20 20 20 20 20 2a ts to the. *
ab60: 20 6c 61 73 74 20 6f 6e 65 2c 20 74 68 65 20 70 last one, the p
ab70: 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 ort number..
ab80: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61 20 21 */.. if (a !
ab90: 3d 20 6f 62 6a 63 2d 31 29 20 7b 0a 09 67 6f 74 = objc-1) {..got
aba0: 6f 20 77 72 6f 6e 67 4e 75 6d 41 72 67 73 3b 0a o wrongNumArgs;.
abb0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 6f 72 74 20 }.. port
abc0: 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f = TclGetString(o
abd0: 62 6a 76 5b 61 5d 29 3b 0a 0a 20 20 20 20 69 66 bjv[a]);.. if
abe0: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 41 63 63 (server) {..Acc
abf0: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 eptCallback *acc
ac00: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 20 3d eptCallbackPtr =
ac10: 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b (AcceptCallback
ac20: 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a *)Tcl_Alloc(siz
ac30: 65 6f 66 28 41 63 63 65 70 74 43 61 6c 6c 62 61 eof(AcceptCallba
ac40: 63 6b 29 29 3b 0a 0a 09 54 63 6c 5f 49 6e 63 72 ck));...Tcl_Incr
ac50: 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70 74 29 RefCount(script)
ac60: 3b 0a 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 ;..acceptCallbac
ac70: 6b 50 74 72 2d 3e 73 63 72 69 70 74 20 3d 20 73 kPtr->script = s
ac80: 63 72 69 70 74 3b 0a 09 61 63 63 65 70 74 43 61 cript;..acceptCa
ac90: 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 llbackPtr->inter
aca0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 09 63 68 p = interp;...ch
acb0: 61 6e 20 3d 20 54 63 6c 5f 4f 70 65 6e 54 63 70 an = Tcl_OpenTcp
acc0: 53 65 72 76 65 72 45 78 28 69 6e 74 65 72 70 2c ServerEx(interp,
acd0: 20 70 6f 72 74 2c 20 68 6f 73 74 2c 20 66 6c 61 port, host, fla
ace0: 67 73 2c 20 62 61 63 6b 6c 6f 67 2c 0a 09 09 41 gs, backlog,...A
acf0: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 72 6f cceptCallbackPro
ad00: 63 2c 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 c, acceptCallbac
ad10: 6b 50 74 72 29 3b 0a 09 69 66 20 28 63 68 61 6e kPtr);..if (chan
ad20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
ad30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
ad40: 74 28 73 63 72 69 70 74 29 3b 0a 09 20 20 20 20 t(script);..
ad50: 54 63 6c 5f 46 72 65 65 28 61 63 63 65 70 74 43 Tcl_Free(acceptC
ad60: 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 09 20 20 allbackPtr);..
ad70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
ad80: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 OR;..}.../*.. *
ad90: 52 65 67 69 73 74 65 72 20 77 69 74 68 20 74 68 Register with th
ada0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 6f e interpreter to
adb0: 20 6c 65 74 20 75 73 20 6b 6e 6f 77 20 77 68 65 let us know whe
adc0: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 n the interprete
add0: 72 0a 09 20 2a 20 69 73 20 64 65 6c 65 74 65 64 r.. * is deleted
ade0: 20 28 62 79 20 68 61 76 69 6e 67 20 74 68 65 20 (by having the
adf0: 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 74 68 65 callback set the
ae00: 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 6f 66 interp field of
ae10: 20 74 68 65 0a 09 20 2a 20 61 63 63 65 70 74 43 the.. * acceptC
ae20: 61 6c 6c 62 61 63 6b 50 74 72 27 73 20 73 74 72 allbackPtr's str
ae30: 75 63 74 75 72 65 20 74 6f 20 4e 55 4c 4c 29 2e ucture to NULL).
ae40: 20 54 68 69 73 20 69 73 20 74 6f 20 61 76 6f 69 This is to avoi
ae50: 64 20 74 72 79 69 6e 67 20 74 6f 0a 09 20 2a 20 d trying to.. *
ae60: 65 76 61 6c 20 74 68 65 20 73 63 72 69 70 74 20 eval the script
ae70: 69 6e 20 61 20 64 65 6c 65 74 65 64 20 69 6e 74 in a deleted int
ae80: 65 72 70 72 65 74 65 72 2e 0a 09 20 2a 2f 0a 0a erpreter... */..
ae90: 09 52 65 67 69 73 74 65 72 54 63 70 53 65 72 76 .RegisterTcpServ
aea0: 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 28 erInterpCleanup(
aeb0: 69 6e 74 65 72 70 2c 20 61 63 63 65 70 74 43 61 interp, acceptCa
aec0: 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 0a 09 2f 2a llbackPtr);.../*
aed0: 0a 09 20 2a 20 52 65 67 69 73 74 65 72 20 61 20 .. * Register a
aee0: 63 6c 6f 73 65 20 63 61 6c 6c 62 61 63 6b 2e 20 close callback.
aef0: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 This callback wi
af00: 6c 6c 20 69 6e 66 6f 72 6d 20 74 68 65 0a 09 20 ll inform the..
af10: 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20 28 69 * interpreter (i
af20: 66 20 69 74 20 73 74 69 6c 6c 20 65 78 69 73 74 f it still exist
af30: 73 29 20 74 68 61 74 20 74 68 69 73 20 63 68 61 s) that this cha
af40: 6e 6e 65 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 nnel does not ne
af50: 65 64 20 74 6f 0a 09 20 2a 20 62 65 20 69 6e 66 ed to.. * be inf
af60: 6f 72 6d 65 64 20 77 68 65 6e 20 74 68 65 20 69 ormed when the i
af70: 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 64 65 nterpreter is de
af80: 6c 65 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 leted... */...Tc
af90: 6c 5f 43 72 65 61 74 65 43 6c 6f 73 65 48 61 6e l_CreateCloseHan
afa0: 64 6c 65 72 28 63 68 61 6e 2c 20 54 63 70 53 65 dler(chan, TcpSe
afb0: 72 76 65 72 43 6c 6f 73 65 50 72 6f 63 2c 20 61 rverCloseProc, a
afc0: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 cceptCallbackPtr
afd0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
afe0: 09 69 6e 74 20 70 6f 72 74 4e 75 6d 3b 0a 0a 09 .int portNum;...
aff0: 69 66 20 28 54 63 6c 53 6f 63 6b 47 65 74 50 6f if (TclSockGetPo
b000: 72 74 28 69 6e 74 65 72 70 2c 20 70 6f 72 74 2c rt(interp, port,
b010: 20 22 74 63 70 22 2c 20 26 70 6f 72 74 4e 75 6d "tcp", &portNum
b020: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
b030: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b040: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 63 68 61 6e 20 RROR;..}...chan
b050: 3d 20 54 63 6c 5f 4f 70 65 6e 54 63 70 43 6c 69 = Tcl_OpenTcpCli
b060: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 6f 72 74 ent(interp, port
b070: 4e 75 6d 2c 20 68 6f 73 74 2c 20 6d 79 61 64 64 Num, host, myadd
b080: 72 2c 20 6d 79 70 6f 72 74 2c 20 61 73 79 6e 63 r, myport, async
b090: 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 );..if (chan ==
b0a0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 NULL) {.. ret
b0b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
b0c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c }. }.. Tcl
b0d0: 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c _RegisterChannel
b0e0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a (interp, chan);.
b0f0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
b100: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
b110: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
b120: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
b130: 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a 20 20 (chan), -1));.
b140: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
b150: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1a0: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 63 6f 70 79 . *. * Tcl_Fcopy
b1b0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 ObjCmd --. *. *.
b1c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
b1d0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 invoked to proc
b1e0: 65 73 73 20 74 68 65 20 22 66 63 6f 70 79 22 20 ess the "fcopy"
b1f0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 Tcl command. See
b200: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 the. *.user doc
b210: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
b220: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
b230: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
b240: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
b250: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
b260: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
b270: 63 74 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 64 61 cts:. *.Moves da
b280: 74 61 20 62 65 74 77 65 65 6e 20 74 77 6f 20 63 ta between two c
b290: 68 61 6e 6e 65 6c 73 20 61 6e 64 20 70 6f 73 73 hannels and poss
b2a0: 69 62 6c 79 20 73 65 74 73 20 75 70 20 61 20 62 ibly sets up a b
b2b0: 61 63 6b 67 72 6f 75 6e 64 20 63 6f 70 79 0a 20 ackground copy.
b2c0: 2a 09 68 61 6e 64 6c 65 72 2e 0a 20 2a 0a 20 2a *.handler.. *. *
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b310: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
b320: 54 63 6c 5f 46 63 6f 70 79 4f 62 6a 43 6d 64 28 Tcl_FcopyObjCmd(
b330: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 . TCL_UNUSED(
b340: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c void *),. Tcl
b350: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
b360: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 ../* Current int
b370: 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 erpreter. */.
b380: 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 int objc,.../*
b390: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 Number of argume
b3a0: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nts. */. Tcl_
b3b0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
b3c0: 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f ])./* Argument o
b3d0: 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 bjects. */.{.
b3e0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 69 6e 43 Tcl_Channel inC
b3f0: 68 61 6e 2c 20 6f 75 74 43 68 61 6e 3b 0a 20 20 han, outChan;.
b400: 20 20 69 6e 74 20 6d 6f 64 65 2c 20 69 2c 20 69 int mode, i, i
b410: 6e 64 65 78 3b 0a 20 20 20 20 54 63 6c 5f 57 69 ndex;. Tcl_Wi
b420: 64 65 49 6e 74 20 74 6f 52 65 61 64 3b 0a 20 20 deInt toRead;.
b430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 Tcl_Obj *cmdPt
b440: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f r;. static co
b450: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 nst char *const
b460: 73 77 69 74 63 68 65 73 5b 5d 20 3d 20 7b 20 22 switches[] = { "
b470: 2d 73 69 7a 65 22 2c 20 22 2d 63 6f 6d 6d 61 6e -size", "-comman
b480: 64 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 d", NULL };.
b490: 65 6e 75 6d 20 7b 20 46 63 6f 70 79 53 69 7a 65 enum { FcopySize
b4a0: 2c 20 46 63 6f 70 79 43 6f 6d 6d 61 6e 64 20 7d , FcopyCommand }
b4b0: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 ;.. if ((objc
b4c0: 20 3c 20 33 29 20 7c 7c 20 28 6f 62 6a 63 20 3e < 3) || (objc >
b4d0: 20 37 29 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 7) || (objc ==
b4e0: 34 29 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 36 4) || (objc == 6
b4f0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e )) {..Tcl_WrongN
b500: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
b510: 2c 20 6f 62 6a 76 2c 0a 09 09 22 69 6e 70 75 74 , objv,..."input
b520: 20 6f 75 74 70 75 74 20 3f 2d 73 69 7a 65 20 73 output ?-size s
b530: 69 7a 65 3f 20 3f 2d 63 6f 6d 6d 61 6e 64 20 63 ize? ?-command c
b540: 61 6c 6c 62 61 63 6b 3f 22 29 3b 0a 09 72 65 74 allback?");..ret
b550: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
b560: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
b570: 20 20 2a 20 50 61 72 73 65 20 74 68 65 20 63 68 * Parse the ch
b580: 61 6e 6e 65 6c 20 61 72 67 75 6d 65 6e 74 73 20 annel arguments
b590: 61 6e 64 20 76 65 72 69 66 79 20 74 68 61 74 20 and verify that
b5a0: 74 68 65 79 20 61 72 65 20 72 65 61 64 61 62 6c they are readabl
b5b0: 65 20 6f 72 0a 20 20 20 20 20 2a 20 77 72 69 74 e or. * writ
b5c0: 61 62 6c 65 2c 20 61 73 20 61 70 70 72 6f 70 72 able, as appropr
b5d0: 69 61 74 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 iate.. */..
b5e0: 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 if (TclGetCha
b5f0: 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 nnelFromObj(inte
b600: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69 6e rp, objv[1], &in
b610: 43 68 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 Chan, &mode, 0)
b620: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
b630: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b640: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 28 }. if (!(
b650: 6d 6f 64 65 20 26 20 54 43 4c 5f 52 45 41 44 41 mode & TCL_READA
b660: 42 4c 45 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 BLE)) {..Tcl_Set
b670: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
b680: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
b690: 0a 09 09 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 ..."channel \"%s
b6a0: 5c 22 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 \" wasn't opened
b6b0: 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 for reading",..
b6c0: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 .TclGetString(ob
b6d0: 6a 76 5b 31 5d 29 29 29 3b 0a 09 72 65 74 75 72 jv[1])));..retur
b6e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b6f0: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 }. if (TclGe
b700: 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 tChannelFromObj(
b710: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c interp, objv[2],
b720: 20 26 6f 75 74 43 68 61 6e 2c 20 26 6d 6f 64 65 &outChan, &mode
b730: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 , 0) != TCL_OK)
b740: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
b750: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
b760: 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f f (!(mode & TCL_
b770: 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09 54 63 WRITABLE)) {..Tc
b780: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
b790: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
b7a0: 69 6e 74 66 28 0a 09 09 22 63 68 61 6e 6e 65 6c intf(..."channel
b7b0: 20 5c 22 25 73 5c 22 20 77 61 73 6e 27 74 20 6f \"%s\" wasn't o
b7c0: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e pened for writin
b7d0: 67 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 69 g",...TclGetStri
b7e0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 29 3b 0a 09 ng(objv[2])));..
b7f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
b800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 6f 52 ;. }.. toR
b810: 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6d ead = -1;. cm
b820: 64 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 dPtr = NULL;.
b830: 20 66 6f 72 20 28 69 20 3d 20 33 3b 20 69 20 3c for (i = 3; i <
b840: 20 6f 62 6a 63 3b 20 69 20 2b 3d 20 32 29 20 7b objc; i += 2) {
b850: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 ..if (Tcl_GetInd
b860: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 exFromObj(interp
b870: 2c 20 6f 62 6a 76 5b 69 5d 2c 20 73 77 69 74 63 , objv[i], switc
b880: 68 65 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 hes, "option", 0
b890: 2c 0a 09 09 26 69 6e 64 65 78 29 20 21 3d 20 54 ,...&index) != T
b8a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 CL_OK) {.. re
b8b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b8c0: 09 7d 0a 09 73 77 69 74 63 68 20 28 69 6e 64 65 .}..switch (inde
b8d0: 78 29 20 7b 0a 09 63 61 73 65 20 46 63 6f 70 79 x) {..case Fcopy
b8e0: 53 69 7a 65 3a 0a 09 20 20 20 20 69 66 20 28 54 Size:.. if (T
b8f0: 63 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d clGetWideIntFrom
b900: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 Obj(interp, objv
b910: 5b 69 2b 31 5d 2c 20 26 74 6f 52 65 61 64 29 20 [i+1], &toRead)
b920: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 != TCL_OK) {...r
b930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
b940: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 .. }.. if
b950: 28 74 6f 52 65 61 64 20 3c 20 30 29 20 7b 0a 09 (toRead < 0) {..
b960: 09 2f 2a 0a 09 09 20 2a 20 48 61 6e 64 6c 65 20 ./*... * Handle
b970: 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 73 69 7a all negative siz
b980: 65 73 20 6c 69 6b 65 20 2d 31 2c 20 6d 65 61 6e es like -1, mean
b990: 69 6e 67 20 27 63 6f 70 79 20 61 6c 6c 27 2e 20 ing 'copy all'.
b9a0: 42 79 0a 09 09 20 2a 20 72 65 73 65 74 74 69 6e By... * resettin
b9b0: 67 20 74 6f 52 65 61 64 20 77 65 20 61 76 6f 69 g toRead we avoi
b9c0: 64 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 d changes in the
b9d0: 20 63 6f 72 65 20 63 6f 70 79 69 6e 67 0a 09 09 core copying...
b9e0: 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 28 77 68 * functions (wh
b9f0: 69 63 68 20 65 78 70 6c 69 63 69 74 6c 79 20 63 ich explicitly c
ba00: 68 65 63 6b 20 66 6f 72 20 2d 31 20 61 6e 64 20 heck for -1 and
ba10: 63 72 61 73 68 20 6f 6e 20 61 6e 79 0a 09 09 20 crash on any...
ba20: 2a 20 6f 74 68 65 72 20 6e 65 67 61 74 69 76 65 * other negative
ba30: 20 76 61 6c 75 65 29 2e 0a 09 09 20 2a 2f 0a 0a value).... */..
ba40: 09 09 74 6f 52 65 61 64 20 3d 20 2d 31 3b 0a 09 ..toRead = -1;..
ba50: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
ba60: 3b 0a 09 63 61 73 65 20 46 63 6f 70 79 43 6f 6d ;..case FcopyCom
ba70: 6d 61 6e 64 3a 0a 09 20 20 20 20 63 6d 64 50 74 mand:.. cmdPt
ba80: 72 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 0a 09 r = objv[i+1];..
ba90: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 break;..}.
baa0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
bab0: 54 63 6c 43 6f 70 79 43 68 61 6e 6e 65 6c 28 69 TclCopyChannel(i
bac0: 6e 74 65 72 70 2c 20 69 6e 43 68 61 6e 2c 20 6f nterp, inChan, o
bad0: 75 74 43 68 61 6e 2c 20 74 6f 52 65 61 64 2c 20 utChan, toRead,
bae0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
baf0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
bb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
bb40: 0a 20 2a 20 43 68 61 6e 50 65 6e 64 69 6e 67 4f . * ChanPendingO
bb50: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
bb60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
bb70: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 invoked to proce
bb80: 73 73 20 74 68 65 20 54 63 6c 20 22 63 68 61 6e ss the Tcl "chan
bb90: 20 70 65 6e 64 69 6e 67 22 20 63 6f 6d 6d 61 6e pending" comman
bba0: 64 0a 20 2a 09 28 54 49 50 20 23 32 38 37 29 2e d. *.(TIP #287).
bbb0: 20 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f See the user do
bbc0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 cumentation for
bbd0: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 details on what
bbe0: 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 it does.. *. * R
bbf0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 esults:. *.A sta
bc00: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 ndard Tcl result
bc10: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
bc20: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 69 6e ects:. *.Sets in
bc30: 74 65 72 70 27 73 20 72 65 73 75 6c 74 20 74 6f terp's result to
bc40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
bc50: 79 74 65 73 20 6f 66 20 62 75 66 66 65 72 65 64 ytes of buffered
bc60: 20 69 6e 70 75 74 20 6f 72 0a 20 2a 09 6f 75 74 input or. *.out
bc70: 70 75 74 20 28 64 65 70 65 6e 64 69 6e 67 20 6f put (depending o
bc80: 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 66 69 n whether the fi
bc90: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 rst argument is
bca0: 22 69 6e 70 75 74 22 20 6f 72 0a 20 2a 09 22 6f "input" or. *."o
bcb0: 75 74 70 75 74 22 29 2c 20 6f 72 20 2d 31 20 69 utput"), or -1 i
bcc0: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 61 f the channel wa
bcd0: 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 sn't opened for
bce0: 74 68 61 74 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a that mode.. *. *
bcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
bd40: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 68 61 6e .static int.Chan
bd50: 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 28 0a 20 PendingObjCmd(.
bd60: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f TCL_UNUSED(vo
bd70: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 id *),. Tcl_I
bd80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
bd90: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
bda0: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 preter. */. i
bdb0: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 nt objc,.../* Nu
bdc0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
bdd0: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 s. */. Tcl_Ob
bde0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
bdf0: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
be00: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 ects. */.{. T
be10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
be20: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 . static cons
be30: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f 70 t char *const op
be40: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 22 69 6e 70 75 tions[] = {"inpu
be50: 74 22 2c 20 22 6f 75 74 70 75 74 22 2c 20 4e 55 t", "output", NU
be60: 4c 4c 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 65 LL};. enum pe
be70: 6e 64 69 6e 67 4f 70 74 69 6f 6e 73 45 6e 75 6d ndingOptionsEnum
be80: 20 7b 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 2c {PENDING_INPUT,
be90: 20 50 45 4e 44 49 4e 47 5f 4f 55 54 50 55 54 7d PENDING_OUTPUT}
bea0: 20 69 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 index;. int
beb0: 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f mode;.. if (o
bec0: 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c bjc != 3) {..Tcl
bed0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
bee0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
bef0: 6d 6f 64 65 20 63 68 61 6e 6e 65 6c 22 29 3b 0a mode channel");.
bf00: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
bf10: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 R;. }.. if
bf20: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
bf30: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
bf40: 6a 76 5b 31 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 jv[1], options,
bf50: 22 6d 6f 64 65 22 2c 20 30 2c 0a 09 20 20 20 20 "mode", 0,..
bf60: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f &index) != TCL_O
bf70: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
bf80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
bf90: 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 if (TclGetCha
bfa0: 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 nnelFromObj(inte
bfb0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 68 rp, objv[2], &ch
bfc0: 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d an, &mode, 0) !=
bfd0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
bfe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
bff0: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 }.. switch
c000: 28 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 (index) {. ca
c010: 73 65 20 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 se PENDING_INPUT
c020: 3a 0a 09 69 66 20 28 21 28 6d 6f 64 65 20 26 20 :..if (!(mode &
c030: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b TCL_READABLE)) {
c040: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
c050: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
c060: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a cl_NewWideIntObj
c070: 28 2d 31 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b (-1));..} else {
c080: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
c090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
c0a0: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a cl_NewWideIntObj
c0b0: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 (Tcl_InputBuffer
c0c0: 65 64 28 63 68 61 6e 29 29 29 3b 0a 09 7d 0a 09 ed(chan)));..}..
c0d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
c0e0: 50 45 4e 44 49 4e 47 5f 4f 55 54 50 55 54 3a 0a PENDING_OUTPUT:.
c0f0: 09 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 .if (!(mode & TC
c100: 4c 5f 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09 L_WRITABLE)) {..
c110: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
c120: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
c130: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 2d _NewWideIntObj(-
c140: 31 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 1));..} else {..
c150: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
c160: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
c170: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 54 _NewWideIntObj(T
c180: 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 cl_OutputBuffere
c190: 64 28 63 68 61 6e 29 29 29 3b 0a 09 7d 0a 09 62 d(chan)));..}..b
c1a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
c1b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
c1c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c210: 2a 0a 20 2a 20 43 68 61 6e 54 72 75 6e 63 61 74 *. * ChanTruncat
c220: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
c230: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
c240: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
c250: 63 65 73 73 20 74 68 65 20 22 63 68 61 6e 20 74 cess the "chan t
c260: 72 75 6e 63 61 74 65 22 20 54 63 6c 20 63 6f 6d runcate" Tcl com
c270: 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 mand.. *.See the
c280: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 user documentat
c290: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
c2a0: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
c2b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
c2c0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
c2d0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
c2e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
c2f0: 09 54 72 75 6e 63 61 74 65 73 20 61 20 63 68 61 .Truncates a cha
c300: 6e 6e 65 6c 20 28 6f 72 20 72 61 74 68 65 72 20 nnel (or rather
c310: 61 20 66 69 6c 65 20 75 6e 64 65 72 6c 79 69 6e a file underlyin
c320: 67 20 61 20 63 68 61 6e 6e 65 6c 29 2e 0a 20 2a g a channel).. *
c330: 0a 20 2a 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 2d 2d ----------------
c370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
c380: 74 61 74 69 63 20 69 6e 74 0a 43 68 61 6e 54 72 tatic int.ChanTr
c390: 75 6e 63 61 74 65 4f 62 6a 43 6d 64 28 0a 20 20 uncateObjCmd(.
c3a0: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 TCL_UNUSED(voi
c3b0: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e d *),. Tcl_In
c3c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
c3d0: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 * Current interp
c3e0: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e reter. */. in
c3f0: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d t objc,.../* Num
c400: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
c410: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
c420: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 *const objv[]).
c430: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 /* Argument obje
c440: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 cts. */.{. Tc
c450: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a l_Channel chan;.
c460: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 Tcl_WideInt
c470: 6c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 69 66 20 length;.. if
c480: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 ((objc < 2) || (
c490: 6f 62 6a 63 20 3e 20 33 29 29 20 7b 0a 09 54 63 objc > 3)) {..Tc
c4a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
c4b0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
c4c0: 22 63 68 61 6e 6e 65 6c 20 3f 6c 65 6e 67 74 68 "channel ?length
c4d0: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ?");..return TCL
c4e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
c4f0: 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e if (TclGetChan
c500: 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 nelFromObj(inter
c510: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 p, objv[1], &cha
c520: 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 n, NULL, 0) != T
c530: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
c540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
c550: 7d 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 }.. if (objc
c560: 3d 3d 20 33 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 == 3) {../*.. *
c570: 55 73 65 72 20 69 73 20 73 75 70 70 6c 79 69 6e User is supplyin
c580: 67 20 61 6e 20 65 78 70 6c 69 63 69 74 20 6c 65 g an explicit le
c590: 6e 67 74 68 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 ngth... */...if
c5a0: 28 54 63 6c 47 65 74 57 69 64 65 49 6e 74 46 72 (TclGetWideIntFr
c5b0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
c5c0: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 67 74 68 29 20 jv[2], &length)
c5d0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
c5e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
c5f0: 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 6c 65 6e 67 OR;..}..if (leng
c600: 74 68 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 54 th < 0) {.. T
c610: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
c620: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
c630: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 20 20 20 20 tringObj(...
c640: 22 63 61 6e 6e 6f 74 20 74 72 75 6e 63 61 74 65 "cannot truncate
c650: 20 74 6f 20 6e 65 67 61 74 69 76 65 20 6c 65 6e to negative len
c660: 67 74 68 20 6f 66 20 66 69 6c 65 22 2c 20 2d 31 gth of file", -1
c670: 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ));.. return
c680: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
c690: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 } else {../*..
c6a0: 20 2a 20 55 73 65 72 20 77 61 6e 74 73 20 74 6f * User wants to
c6b0: 20 74 72 75 6e 63 61 74 65 20 74 6f 20 74 68 65 truncate to the
c6c0: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 70 6f current file po
c6d0: 73 69 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 6c sition... */...l
c6e0: 65 6e 67 74 68 20 3d 20 54 63 6c 5f 54 65 6c 6c ength = Tcl_Tell
c6f0: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 6c 65 6e (chan);..if (len
c700: 67 74 68 20 3d 3d 20 2d 31 29 20 7b 0a 09 20 20 gth == -1) {..
c710: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
c720: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
c730: 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 bjPrintf(...
c740: 22 63 6f 75 6c 64 20 6e 6f 74 20 64 65 74 65 72 "could not deter
c750: 6d 69 6e 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 mine current loc
c760: 61 74 69 6f 6e 20 69 6e 20 5c 22 25 73 5c 22 3a ation in \"%s\":
c770: 20 25 73 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 %s",... TclG
c780: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d etString(objv[1]
c790: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f ), Tcl_PosixErro
c7a0: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 r(interp)));..
c7b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
c7c0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
c7d0: 20 20 69 66 20 28 54 63 6c 5f 54 72 75 6e 63 61 if (Tcl_Trunca
c7e0: 74 65 43 68 61 6e 6e 65 6c 28 63 68 61 6e 2c 20 teChannel(chan,
c7f0: 6c 65 6e 67 74 68 29 20 21 3d 20 54 43 4c 5f 4f length) != TCL_O
c800: 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a K) {..Tcl_SetObj
c810: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
c820: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
c830: 22 65 72 72 6f 72 20 64 75 72 69 6e 67 20 74 72 "error during tr
c840: 75 6e 63 61 74 65 20 6f 6e 20 5c 22 25 73 5c 22 uncate on \"%s\"
c850: 3a 20 25 73 22 2c 0a 09 09 54 63 6c 47 65 74 53 : %s",...TclGetS
c860: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 tring(objv[1]),
c870: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
c880: 6e 74 65 72 70 29 29 29 3b 0a 09 72 65 74 75 72 nterp)));..retur
c890: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
c8a0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }.. return T
c8b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c900: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 68 61 ------. *. * Cha
c910: 6e 50 69 70 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 nPipeObjCmd --.
c920: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
c930: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f on is invoked to
c940: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 63 68 process the "ch
c950: 61 6e 20 70 69 70 65 22 20 54 63 6c 20 63 6f 6d an pipe" Tcl com
c960: 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 mand.. *.See the
c970: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 user documentat
c980: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
c990: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
c9a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
c9b0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 *.A standard Tc
c9c0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 l result.. *. *
c9d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
c9e0: 09 43 72 65 61 74 65 73 20 61 20 70 61 69 72 20 .Creates a pair
c9f0: 6f 66 20 54 63 6c 20 63 68 61 6e 6e 65 6c 73 20 of Tcl channels
ca00: 77 72 61 70 70 69 6e 67 20 62 6f 74 68 20 65 6e wrapping both en
ca10: 64 73 20 6f 66 20 61 20 6e 65 77 0a 20 2a 09 61 ds of a new. *.a
ca20: 6e 6f 6e 79 6d 6f 75 73 20 70 69 70 65 2e 0a 20 nonymous pipe..
ca30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
ca80: 73 74 61 74 69 63 20 69 6e 74 0a 43 68 61 6e 50 static int.ChanP
ca90: 69 70 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 ipeObjCmd(. T
caa0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a CL_UNUSED(void *
cab0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 ),. Tcl_Inter
cac0: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 p *interp,../* C
cad0: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
cae0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f er. */. int o
caf0: 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 bjc,.../* Number
cb00: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a of arguments. *
cb10: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 /. Tcl_Obj *c
cb20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 onst objv[])./*
cb30: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 Argument objects
cb40: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
cb50: 68 61 6e 6e 65 6c 20 72 63 68 61 6e 2c 20 77 63 hannel rchan, wc
cb60: 68 61 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 han;. const c
cb70: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 har *channelName
cb80: 73 5b 32 5d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 s[2];. Tcl_Ob
cb90: 6a 20 2a 72 65 73 75 6c 74 50 74 72 3b 0a 0a 20 j *resultPtr;..
cba0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 if (objc != 1
cbb0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
cbc0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
cbd0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 objv, "");..ret
cbe0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
cbf0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 }.. if (Tc
cc00: 6c 5f 43 72 65 61 74 65 50 69 70 65 28 69 6e 74 l_CreatePipe(int
cc10: 65 72 70 2c 20 26 72 63 68 61 6e 2c 20 26 77 63 erp, &rchan, &wc
cc20: 68 61 6e 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f han, 0) != TCL_O
cc30: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
cc40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
cc50: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 5b channelNames[
cc60: 30 5d 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 0] = Tcl_GetChan
cc70: 6e 65 6c 4e 61 6d 65 28 72 63 68 61 6e 29 3b 0a nelName(rchan);.
cc80: 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 channelNames
cc90: 5b 31 5d 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 [1] = Tcl_GetCha
cca0: 6e 6e 65 6c 4e 61 6d 65 28 77 63 68 61 6e 29 3b nnelName(wchan);
ccb0: 0a 0a 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a 28 .. TclNewObj(
ccc0: 72 65 73 75 6c 74 50 74 72 29 3b 0a 20 20 20 20 resultPtr);.
ccd0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
cce0: 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 72 dElement(NULL, r
ccf0: 65 73 75 6c 74 50 74 72 2c 0a 09 20 20 20 20 54 esultPtr,.. T
cd00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
cd10: 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 5b 30 5d 2c channelNames[0],
cd20: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c -1));. Tcl_L
cd30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
cd40: 65 6e 74 28 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 ent(NULL, result
cd50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 Ptr,.. Tcl_Ne
cd60: 77 53 74 72 69 6e 67 4f 62 6a 28 63 68 61 6e 6e wStringObj(chann
cd70: 65 6c 4e 61 6d 65 73 5b 31 5d 2c 20 2d 31 29 29 elNames[1], -1))
cd80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a ;. Tcl_SetObj
cd90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 Result(interp, r
cda0: 65 73 75 6c 74 50 74 72 29 3b 0a 0a 20 20 20 20 esultPtr);..
cdb0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
cdc0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
ce10: 2a 0a 20 2a 20 54 63 6c 43 68 61 6e 6e 65 6c 4e *. * TclChannelN
ce20: 61 6d 65 73 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a amesCmd --. *. *
ce30: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
ce40: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f s invoked to pro
ce50: 63 65 73 73 20 74 68 65 20 22 63 68 61 6e 20 6e cess the "chan n
ce60: 61 6d 65 73 22 20 61 6e 64 20 22 66 69 6c 65 0a ames" and "file.
ce70: 20 2a 09 63 68 61 6e 6e 65 6c 73 22 20 54 63 6c *.channels" Tcl
ce80: 20 63 6f 6d 6d 61 6e 64 73 2e 20 20 53 65 65 20 commands. See
ce90: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e the user documen
cea0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 tation for detai
ceb0: 6c 73 20 6f 6e 0a 20 2a 09 77 68 61 74 20 74 68 ls on. *.what th
cec0: 65 79 20 64 6f 2e 0a 20 2a 0a 20 2a 20 52 65 73 ey do.. *. * Res
ced0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 ults:. *.A stand
cee0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a ard Tcl result..
cef0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
cf00: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
cf10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
cf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
cf60: 74 0a 54 63 6c 43 68 61 6e 6e 65 6c 4e 61 6d 65 t.TclChannelName
cf70: 73 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e sCmd(. TCL_UN
cf80: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 USED(void *),.
cf90: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
cfa0: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 terp,. int ob
cfb0: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 jc,. Tcl_Obj
cfc0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b *const objv[]).{
cfd0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 . if (objc <
cfe0: 31 20 7c 7c 20 6f 62 6a 63 20 3e 20 32 29 20 7b 1 || objc > 2) {
cff0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
d000: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
d010: 6a 76 2c 20 22 3f 70 61 74 74 65 72 6e 3f 22 29 jv, "?pattern?")
d020: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
d030: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
d040: 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 eturn Tcl_GetCha
d050: 6e 6e 65 6c 4e 61 6d 65 73 45 78 28 69 6e 74 65 nnelNamesEx(inte
d060: 72 70 2c 0a 09 20 20 20 20 28 28 6f 62 6a 63 20 rp,.. ((objc
d070: 3d 3d 20 31 29 20 3f 20 4e 55 4c 4c 20 3a 20 54 == 1) ? NULL : T
d080: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
d090: 5b 31 5d 29 29 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 [1])));.}.../*.
d0a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
d0f0: 6c 49 6e 69 74 43 68 61 6e 43 6d 64 20 2d 2d 0a lInitChanCmd --.
d100: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
d110: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 ion is invoked t
d120: 6f 20 63 72 65 61 74 65 20 74 68 65 20 22 63 68 o create the "ch
d130: 61 6e 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e an" Tcl command.
d140: 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 See the. *.user
d150: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 documentation f
d160: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 or details on wh
d170: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 at it does.. *.
d180: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
d190: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 68 61 6e 64 Tcl command hand
d1a0: 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 le.. *. * Side e
d1b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 20 ffects:. *.None
d1c0: 28 73 69 6e 63 65 20 6e 6f 74 68 69 6e 67 20 69 (since nothing i
d1d0: 73 20 62 79 74 65 2d 63 6f 6d 70 69 6c 65 64 29 s byte-compiled)
d1e0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
d1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
d230: 2f 0a 0a 54 63 6c 5f 43 6f 6d 6d 61 6e 64 0a 54 /..Tcl_Command.T
d240: 63 6c 49 6e 69 74 43 68 61 6e 43 6d 64 28 0a 20 clInitChanCmd(.
d250: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
d260: 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 2f 2a 0a nterp).{. /*.
d270: 20 20 20 20 20 2a 20 4d 6f 73 74 20 63 6f 6d 6d * Most comm
d280: 61 6e 64 73 20 61 72 65 20 70 6c 75 67 67 65 64 ands are plugged
d290: 20 64 69 72 65 63 74 6c 79 20 74 6f 67 65 74 68 directly togeth
d2a0: 65 72 2c 20 62 75 74 20 73 6f 6d 65 20 61 72 65 er, but some are
d2b0: 20 64 6f 6e 65 20 76 69 61 0a 20 20 20 20 20 2a done via. *
d2c0: 20 61 6c 69 61 73 2d 6c 69 6b 65 20 72 65 77 72 alias-like rewr
d2d0: 69 74 69 6e 67 3b 20 5b 63 68 61 6e 20 63 6f 6e iting; [chan con
d2e0: 66 69 67 75 72 65 5d 20 69 73 20 74 68 69 73 20 figure] is this
d2f0: 77 61 79 20 66 6f 72 20 73 65 63 75 72 69 74 79 way for security
d300: 20 72 65 61 73 6f 6e 73 0a 20 20 20 20 20 2a 20 reasons. *
d310: 28 77 61 6e 74 20 6f 76 65 72 77 72 69 74 69 6e (want overwritin
d320: 67 20 6f 66 20 5b 66 63 6f 6e 66 69 67 75 72 65 g of [fconfigure
d330: 5d 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 ] to control tha
d340: 74 20 6e 69 63 65 6c 79 29 2c 20 61 6e 64 20 5b t nicely), and [
d350: 63 68 61 6e 0a 20 20 20 20 20 2a 20 6e 61 6d 65 chan. * name
d360: 73 5d 20 62 65 63 61 75 73 65 20 74 68 65 20 66 s] because the f
d370: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 69 73 6e unctionality isn
d380: 27 74 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 't available as
d390: 61 20 73 65 70 61 72 61 74 65 20 63 6f 6d 6d 61 a separate comma
d3a0: 6e 64 0a 20 20 20 20 20 2a 20 66 75 6e 63 74 69 nd. * functi
d3b0: 6f 6e 20 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 on at the moment
d3c0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 .. */. st
d3d0: 61 74 69 63 20 63 6f 6e 73 74 20 45 6e 73 65 6d atic const Ensem
d3e0: 62 6c 65 49 6d 70 6c 4d 61 70 20 69 6e 69 74 4d bleImplMap initM
d3f0: 61 70 5b 5d 20 3d 20 7b 0a 09 7b 22 62 6c 6f 63 ap[] = {..{"bloc
d400: 6b 65 64 22 2c 09 54 63 6c 5f 46 62 6c 6f 63 6b ked",.Tcl_Fblock
d410: 65 64 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d edObjCmd,.TclCom
d420: 70 69 6c 65 42 61 73 69 63 31 41 72 67 43 6d 64 pileBasic1ArgCmd
d430: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d , NULL, NULL, 0}
d440: 2c 0a 09 7b 22 63 6c 6f 73 65 22 2c 09 54 63 6c ,..{"close",.Tcl
d450: 5f 43 6c 6f 73 65 4f 62 6a 43 6d 64 2c 09 54 63 _CloseObjCmd,.Tc
d460: 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 4f 72 lCompileBasic1Or
d470: 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 2ArgCmd, NULL, N
d480: 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 63 6f 70 79 ULL, 0},..{"copy
d490: 22 2c 09 54 63 6c 5f 46 63 6f 70 79 4f 62 6a 43 ",.Tcl_FcopyObjC
d4a0: 6d 64 2c 09 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 md,.NULL, NULL,
d4b0: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 63 72 65 NULL, 0},..{"cre
d4c0: 61 74 65 22 2c 09 54 63 6c 43 68 61 6e 43 72 65 ate",.TclChanCre
d4d0: 61 74 65 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f ateObjCmd,.TclCo
d4e0: 6d 70 69 6c 65 42 61 73 69 63 32 41 72 67 43 6d mpileBasic2ArgCm
d4f0: 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 d, NULL, NULL, 0
d500: 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32 31 39 20 },../* TIP #219
d510: 2a 2f 0a 09 7b 22 65 6f 66 22 2c 09 09 54 63 6c */..{"eof",..Tcl
d520: 5f 45 6f 66 4f 62 6a 43 6d 64 2c 09 09 54 63 6c _EofObjCmd,..Tcl
d530: 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 41 72 67 CompileBasic1Arg
d540: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c Cmd, NULL, NULL,
d550: 20 30 7d 2c 0a 09 7b 22 65 76 65 6e 74 22 2c 09 0},..{"event",.
d560: 54 63 6c 5f 46 69 6c 65 45 76 65 6e 74 4f 62 6a Tcl_FileEventObj
d570: 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 Cmd,.TclCompileB
d580: 61 73 69 63 32 4f 72 33 41 72 67 43 6d 64 2c 20 asic2Or3ArgCmd,
d590: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a NULL, NULL, 0},.
d5a0: 09 7b 22 66 6c 75 73 68 22 2c 09 54 63 6c 5f 46 .{"flush",.Tcl_F
d5b0: 6c 75 73 68 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 lushObjCmd,.TclC
d5c0: 6f 6d 70 69 6c 65 42 61 73 69 63 31 41 72 67 43 ompileBasic1ArgC
d5d0: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 md, NULL, NULL,
d5e0: 30 7d 2c 0a 09 7b 22 67 65 74 73 22 2c 09 54 63 0},..{"gets",.Tc
d5f0: 6c 5f 47 65 74 73 4f 62 6a 43 6d 64 2c 09 09 54 l_GetsObjCmd,..T
d600: 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 4f clCompileBasic1O
d610: 72 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 r2ArgCmd, NULL,
d620: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 69 73 62 NULL, 0},..{"isb
d630: 69 6e 61 72 79 22 2c 09 43 68 61 6e 49 73 42 69 inary",.ChanIsBi
d640: 6e 61 72 79 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 naryCmd,.TclComp
d650: 69 6c 65 42 61 73 69 63 31 41 72 67 43 6d 64 2c ileBasic1ArgCmd,
d660: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c NULL, NULL, 0},
d670: 0a 09 7b 22 6e 61 6d 65 73 22 2c 09 54 63 6c 43 ..{"names",.TclC
d680: 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 2c 09 hannelNamesCmd,.
d690: 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 30 TclCompileBasic0
d6a0: 4f 72 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c Or1ArgCmd, NULL,
d6b0: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 70 65 NULL, 0},..{"pe
d6c0: 6e 64 69 6e 67 22 2c 09 43 68 61 6e 50 65 6e 64 nding",.ChanPend
d6d0: 69 6e 67 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f ingObjCmd,.TclCo
d6e0: 6d 70 69 6c 65 42 61 73 69 63 32 41 72 67 43 6d mpileBasic2ArgCm
d6f0: 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 d, NULL, NULL, 0
d700: 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32 38 37 20 },../* TIP #287
d710: 2a 2f 0a 09 7b 22 70 69 70 65 22 2c 09 43 68 61 */..{"pipe",.Cha
d720: 6e 50 69 70 65 4f 62 6a 43 6d 64 2c 09 09 54 63 nPipeObjCmd,..Tc
d730: 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 30 41 72 lCompileBasic0Ar
d740: 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c gCmd, NULL, NULL
d750: 2c 20 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 33 , 0},../* TIP #3
d760: 30 34 20 2a 2f 0a 09 7b 22 70 6f 70 22 2c 09 09 04 */..{"pop",..
d770: 54 63 6c 43 68 61 6e 50 6f 70 4f 62 6a 43 6d 64 TclChanPopObjCmd
d780: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 ,.TclCompileBasi
d790: 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 c1ArgCmd, NULL,
d7a0: 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54 49 NULL, 0},../* TI
d7b0: 50 20 23 32 33 30 20 2a 2f 0a 09 7b 22 70 6f 73 P #230 */..{"pos
d7c0: 74 65 76 65 6e 74 22 2c 09 54 63 6c 43 68 61 6e tevent",.TclChan
d7d0: 50 6f 73 74 45 76 65 6e 74 4f 62 6a 43 6d 64 2c PostEventObjCmd,
d7e0: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 .TclCompileBasic
d7f0: 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 2ArgCmd, NULL, N
d800: 55 4c 4c 2c 20 30 7d 2c 09 2f 2a 20 54 49 50 20 ULL, 0},./* TIP
d810: 23 32 31 39 20 2a 2f 0a 09 7b 22 70 75 73 68 22 #219 */..{"push"
d820: 2c 09 54 63 6c 43 68 61 6e 50 75 73 68 4f 62 6a ,.TclChanPushObj
d830: 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 Cmd,.TclCompileB
d840: 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c asic2ArgCmd, NUL
d850: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f 2a L, NULL, 0},../*
d860: 20 54 49 50 20 23 32 33 30 20 2a 2f 0a 09 7b 22 TIP #230 */..{"
d870: 70 75 74 73 22 2c 09 54 63 6c 5f 50 75 74 73 4f puts",.Tcl_PutsO
d880: 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c 20 4e 55 bjCmd,..NULL, NU
d890: 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b LL, NULL, 0},..{
d8a0: 22 72 65 61 64 22 2c 09 54 63 6c 5f 52 65 61 64 "read",.Tcl_Read
d8b0: 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c 20 4e ObjCmd,..NULL, N
d8c0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 ULL, NULL, 0},..
d8d0: 7b 22 73 65 65 6b 22 2c 09 54 63 6c 5f 53 65 65 {"seek",.Tcl_See
d8e0: 6b 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d kObjCmd,..TclCom
d8f0: 70 69 6c 65 42 61 73 69 63 32 4f 72 33 41 72 67 pileBasic2Or3Arg
d900: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c Cmd, NULL, NULL,
d910: 20 30 7d 2c 0a 09 7b 22 74 65 6c 6c 22 2c 09 54 0},..{"tell",.T
d920: 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 2c 09 09 cl_TellObjCmd,..
d930: 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 TclCompileBasic1
d940: 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 ArgCmd, NULL, NU
d950: 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 74 72 75 6e 63 LL, 0},..{"trunc
d960: 61 74 65 22 2c 09 43 68 61 6e 54 72 75 6e 63 61 ate",.ChanTrunca
d970: 74 65 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d teObjCmd,.TclCom
d980: 70 69 6c 65 42 61 73 69 63 31 4f 72 32 41 72 67 pileBasic1Or2Arg
d990: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c Cmd, NULL, NULL,
d9a0: 20 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32 30 0},../* TIP #20
d9b0: 38 20 2a 2f 0a 09 7b 4e 55 4c 4c 2c 20 4e 55 4c 8 */..{NULL, NUL
d9c0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e L, NULL, NULL, N
d9d0: 55 4c 4c 2c 20 30 7d 0a 20 20 20 20 7d 3b 0a 20 ULL, 0}. };.
d9e0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
d9f0: 63 68 61 72 20 2a 63 6f 6e 73 74 20 65 78 74 72 char *const extr
da00: 61 73 5b 5d 20 3d 20 7b 0a 09 22 63 6f 6e 66 69 as[] = {.."confi
da10: 67 75 72 65 22 2c 09 22 3a 3a 66 63 6f 6e 66 69 gure",."::fconfi
da20: 67 75 72 65 22 2c 0a 09 4e 55 4c 4c 0a 20 20 20 gure",..NULL.
da30: 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 43 6f 6d 6d };. Tcl_Comm
da40: 61 6e 64 20 65 6e 73 65 6d 62 6c 65 3b 0a 20 20 and ensemble;.
da50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 70 4f 62 Tcl_Obj *mapOb
da60: 6a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 j;. int i;..
da70: 20 20 20 65 6e 73 65 6d 62 6c 65 20 3d 20 54 63 ensemble = Tc
da80: 6c 4d 61 6b 65 45 6e 73 65 6d 62 6c 65 28 69 6e lMakeEnsemble(in
da90: 74 65 72 70 2c 20 22 63 68 61 6e 22 2c 20 69 6e terp, "chan", in
daa0: 69 74 4d 61 70 29 3b 0a 20 20 20 20 54 63 6c 5f itMap);. Tcl_
dab0: 47 65 74 45 6e 73 65 6d 62 6c 65 4d 61 70 70 69 GetEnsembleMappi
dac0: 6e 67 44 69 63 74 28 4e 55 4c 4c 2c 20 65 6e 73 ngDict(NULL, ens
dad0: 65 6d 62 6c 65 2c 20 26 6d 61 70 4f 62 6a 29 3b emble, &mapObj);
dae0: 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 20 3b 20 . for (i=0 ;
daf0: 65 78 74 72 61 73 5b 69 5d 20 3b 20 69 2b 3d 32 extras[i] ; i+=2
db00: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 61 6e 20 ) {../*.. * Can
db10: 61 73 73 75 6d 65 20 74 68 61 74 20 72 65 66 65 assume that refe
db20: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 72 65 rence counts are
db30: 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 65 64 all incremented
db40: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 44 69 63 74 ... */...TclDict
db50: 50 75 74 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 PutString(NULL,
db60: 6d 61 70 4f 62 6a 2c 20 65 78 74 72 61 73 5b 69 mapObj, extras[i
db70: 5d 2c 20 65 78 74 72 61 73 5b 69 20 2b 20 31 5d ], extras[i + 1]
db80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
db90: 5f 53 65 74 45 6e 73 65 6d 62 6c 65 4d 61 70 70 _SetEnsembleMapp
dba0: 69 6e 67 44 69 63 74 28 69 6e 74 65 72 70 2c 20 ingDict(interp,
dbb0: 65 6e 73 65 6d 62 6c 65 2c 20 6d 61 70 4f 62 6a ensemble, mapObj
dbc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 6e );. return en
dbd0: 73 65 6d 62 6c 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 semble;.}.../*.
dbe0: 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 * Local Variable
dbf0: 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 0a 20 2a s:. * mode: c. *
dc00: 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 65 74 3a c-basic-offset:
dc10: 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75 6d 4. * fill-colum
dc20: 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a 0a 20 2a n: 78. * End:. *
dc30: 2f 0a /.