Tcl Source Code

Hex Artifact Content
Login

Artifact d8ff397545be07687f29f827bf8e114ef987465759be03f0b91d2b78a5342627:


0000: 2f 2a 0a 20 2a 20 74 63 6c 49 4f 43 6d 64 2e 63  /*. * tclIOCmd.c
0010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 74 61 69   --. *. *.Contai
0020: 6e 73 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ns the definitio
0030: 6e 73 20 6f 66 20 6d 6f 73 74 20 6f 66 20 74 68  ns of most of th
0040: 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 20 72  e Tcl commands r
0050: 65 6c 61 74 69 6e 67 20 74 6f 20 49 4f 2e 0a 20  elating to IO.. 
0060: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 c2  *. * Copyright �
0070: a9 20 31 39 39 35 2d 31 39 39 37 20 53 75 6e 20  � 1995-1997 Sun 
0080: 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e  Microsystems, In
0090: 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65  c.. *. * See the
00a0: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74   file "license.t
00b0: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d  erms" for inform
00c0: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61  ation on usage a
00d0: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f  nd redistributio
00e0: 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c  n of. * this fil
00f0: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53  e, and for a DIS
0100: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57  CLAIMER OF ALL W
0110: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a  ARRANTIES.. */..
0120: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 49 6e 74  #include "tclInt
0130: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63  .h".#include "tc
0140: 6c 49 4f 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  lIO.h".#include 
0150: 22 74 63 6c 54 6f 6d 4d 61 74 68 2e 68 22 0a 0a  "tclTomMath.h"..
0160: 2f 2a 0a 20 2a 20 43 61 6c 6c 62 61 63 6b 20 73  /*. * Callback s
0170: 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 63 63  tructure for acc
0180: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 69 6e 20  ept callback in 
0190: 61 20 54 43 50 20 73 65 72 76 65 72 2e 0a 20 2a  a TCP server.. *
01a0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
01b0: 74 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  t {.    Tcl_Obj 
01c0: 2a 73 63 72 69 70 74 3b 09 09 2f 2a 20 53 63 72  *script;../* Scr
01d0: 69 70 74 20 74 6f 20 69 6e 76 6f 6b 65 2e 20 2a  ipt to invoke. *
01e0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
01f0: 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 49 6e   *interp;../* In
0200: 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69  terpreter in whi
0210: 63 68 20 74 6f 20 72 75 6e 20 69 74 2e 20 2a 2f  ch to run it. */
0220: 0a 7d 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63  .} AcceptCallbac
0230: 6b 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64  k;../*. * Thread
0240: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 75   local storage u
0250: 73 65 64 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20  sed to maintain 
0260: 61 20 70 65 72 2d 74 68 72 65 61 64 20 73 74 64  a per-thread std
0270: 6f 75 74 20 63 68 61 6e 6e 65 6c 20 6f 62 6a 2e  out channel obj.
0280: 0a 20 2a 20 49 74 20 6d 75 73 74 20 62 65 20 70  . * It must be p
0290: 65 72 2d 74 68 72 65 61 64 20 62 65 63 61 75 73  er-thread becaus
02a0: 65 20 6f 66 20 73 74 64 20 63 68 61 6e 6e 65 6c  e of std channel
02b0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 0a 20 2a   limitations.. *
02c0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
02d0: 74 20 7b 0a 20 20 20 20 69 6e 74 20 69 6e 69 74  t {.    int init
02e0: 69 61 6c 69 7a 65 64 3b 09 09 2f 2a 20 53 65 74  ialized;../* Set
02f0: 20 74 6f 20 31 20 77 68 65 6e 20 74 68 65 20 6d   to 1 when the m
0300: 6f 64 75 6c 65 20 69 73 20 69 6e 69 74 69 61 6c  odule is initial
0310: 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  ized. */.    Tcl
0320: 5f 4f 62 6a 20 2a 73 74 64 6f 75 74 4f 62 6a 50  _Obj *stdoutObjP
0330: 74 72 3b 09 2f 2a 20 43 61 63 68 65 64 20 73 74  tr;./* Cached st
0340: 64 6f 75 74 20 63 68 61 6e 6e 65 6c 20 54 63 6c  dout channel Tcl
0350: 5f 4f 62 6a 20 2a 2f 0a 7d 20 54 68 72 65 61 64  _Obj */.} Thread
0360: 53 70 65 63 69 66 69 63 44 61 74 61 3b 0a 0a 73  SpecificData;..s
0370: 74 61 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64  tatic Tcl_Thread
0380: 44 61 74 61 4b 65 79 20 64 61 74 61 4b 65 79 3b  DataKey dataKey;
0390: 0a 0a 2f 2a 0a 20 2a 20 4b 65 79 20 66 6f 72 20  ../*. * Key for 
03a0: 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
03b0: 61 62 6c 65 20 6f 66 20 72 65 67 69 73 74 65 72  able of register
03c0: 65 64 20 54 43 50 20 61 63 63 65 70 74 20 63 61  ed TCP accept ca
03d0: 6c 6c 62 61 63 6b 73 2c 20 61 20 68 61 73 68 0a  llbacks, a hash.
03e0: 20 2a 20 74 61 62 6c 65 20 69 6e 64 65 78 65 64   * table indexed
03f0: 20 62 79 20 41 63 63 65 70 74 43 61 6c 6c 62 61   by AcceptCallba
0400: 63 6b 20 72 65 66 65 72 65 6e 63 65 73 2c 20 75  ck references, u
0410: 73 65 64 20 61 73 20 61 20 73 65 74 20 28 76 61  sed as a set (va
0420: 6c 75 65 73 20 61 72 65 0a 20 2a 20 6d 65 61 6e  lues are. * mean
0430: 69 6e 67 6c 65 73 73 29 2e 0a 20 2a 2f 0a 23 64  ingless).. */.#d
0440: 65 66 69 6e 65 20 41 53 53 4f 43 5f 4b 45 59 20  efine ASSOC_KEY 
0450: 22 74 63 6c 54 43 50 41 63 63 65 70 74 43 61 6c  "tclTCPAcceptCal
0460: 6c 62 61 63 6b 73 22 0a 0a 2f 2a 0a 20 2a 20 53  lbacks"../*. * S
0470: 74 61 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20  tatic functions 
0480: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 3a 0a 20  for this file:. 
0490: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 45  */..static Tcl_E
04a0: 78 69 74 50 72 6f 63 09 46 69 6e 61 6c 69 7a 65  xitProc.Finalize
04b0: 49 4f 43 6d 64 54 53 44 3b 0a 73 74 61 74 69 63  IOCmdTSD;.static
04c0: 20 54 63 6c 5f 54 63 70 41 63 63 65 70 74 50 72   Tcl_TcpAcceptPr
04d0: 6f 63 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63  oc AcceptCallbac
04e0: 6b 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63  kProc;.static Tc
04f0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 32 09 43 68  l_ObjCmdProc2.Ch
0500: 61 6e 49 73 42 69 6e 61 72 79 43 6d 64 3b 0a 73  anIsBinaryCmd;.s
0510: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64  tatic Tcl_ObjCmd
0520: 50 72 6f 63 32 09 43 68 61 6e 50 65 6e 64 69 6e  Proc2.ChanPendin
0530: 67 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20  gObjCmd;.static 
0540: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 32 09  Tcl_ObjCmdProc2.
0550: 43 68 61 6e 50 69 70 65 4f 62 6a 43 6d 64 3b 0a  ChanPipeObjCmd;.
0560: 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d  static Tcl_ObjCm
0570: 64 50 72 6f 63 32 09 43 68 61 6e 54 72 75 6e 63  dProc2.ChanTrunc
0580: 61 74 65 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69  ateObjCmd;.stati
0590: 63 20 76 6f 69 64 09 09 52 65 67 69 73 74 65 72  c void..Register
05a0: 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43  TcpServerInterpC
05b0: 6c 65 61 6e 75 70 28 0a 09 09 09 20 20 20 20 54  leanup(....    T
05c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
05d0: 70 2c 0a 09 09 09 20 20 20 20 41 63 63 65 70 74  p,....    Accept
05e0: 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 74  Callback *accept
05f0: 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 73 74  CallbackPtr);.st
0600: 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 44  atic Tcl_InterpD
0610: 65 6c 65 74 65 50 72 6f 63 09 54 63 70 41 63 63  eleteProc.TcpAcc
0620: 65 70 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65  eptCallbacksDele
0630: 74 65 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 76  teProc;.static v
0640: 6f 69 64 09 09 54 63 70 53 65 72 76 65 72 43 6c  oid..TcpServerCl
0650: 6f 73 65 50 72 6f 63 28 76 6f 69 64 20 2a 63 61  oseProc(void *ca
0660: 6c 6c 62 61 63 6b 44 61 74 61 29 3b 0a 73 74 61  llbackData);.sta
0670: 74 69 63 20 76 6f 69 64 09 09 55 6e 72 65 67 69  tic void..Unregi
0680: 73 74 65 72 54 63 70 53 65 72 76 65 72 49 6e 74  sterTcpServerInt
0690: 65 72 70 43 6c 65 61 6e 75 70 50 72 6f 63 28 0a  erpCleanupProc(.
06a0: 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ...    Tcl_Inter
06b0: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20  p *interp,....  
06c0: 20 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b    AcceptCallback
06d0: 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b   *acceptCallback
06e0: 50 74 72 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65  Ptr);../*. * The
06f0: 20 62 61 73 69 63 20 64 65 73 63 72 69 70 74 69   basic descripti
0700: 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 73 20  on of the parts 
0710: 6f 66 20 74 68 65 20 5b 63 68 61 6e 5d 20 65 6e  of the [chan] en
0720: 73 65 6d 62 6c 65 2e 0a 20 2a 20 41 6c 73 6f 20  semble.. * Also 
0730: 63 6f 6e 74 61 69 6e 73 20 5b 63 68 61 6e 20 63  contains [chan c
0740: 6f 6e 66 69 67 75 72 65 5d 2c 20 77 68 69 63 68  onfigure], which
0750: 20 69 73 20 5b 66 63 6f 6e 66 69 67 75 72 65 5d   is [fconfigure]
0760: 2e 0a 20 2a 2f 0a 63 6f 6e 73 74 20 45 6e 73 65  .. */.const Ense
0770: 6d 62 6c 65 49 6d 70 6c 4d 61 70 20 74 63 6c 43  mbleImplMap tclC
0780: 68 61 6e 49 6d 70 6c 4d 61 70 5b 5d 20 3d 20 7b  hanImplMap[] = {
0790: 0a 20 20 20 20 7b 22 62 6c 6f 63 6b 65 64 22 2c  .    {"blocked",
07a0: 09 09 54 63 6c 5f 46 62 6c 6f 63 6b 65 64 4f 62  ..Tcl_FblockedOb
07b0: 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65  jCmd,.TclCompile
07c0: 42 61 73 69 63 31 41 72 67 43 6d 64 2c 20 4e 55  Basic1ArgCmd, NU
07d0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20  LL, NULL, 0},.  
07e0: 20 20 7b 22 63 6c 6f 73 65 22 2c 09 09 54 63 6c    {"close",..Tcl
07f0: 5f 43 6c 6f 73 65 4f 62 6a 43 6d 64 2c 09 54 63  _CloseObjCmd,.Tc
0800: 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31 4f 72  lCompileBasic1Or
0810: 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e  2ArgCmd, NULL, N
0820: 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b 22 63  ULL, 0},.    {"c
0830: 6f 70 79 22 2c 09 09 54 63 6c 5f 46 63 6f 70 79  opy",..Tcl_Fcopy
0840: 4f 62 6a 43 6d 64 2c 09 4e 55 4c 4c 2c 09 09 09  ObjCmd,.NULL,...
0850: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  NULL, NULL, 0},.
0860: 20 20 20 20 7b 22 63 72 65 61 74 65 22 2c 09 09      {"create",..
0870: 54 63 6c 43 68 61 6e 43 72 65 61 74 65 4f 62 6a  TclChanCreateObj
0880: 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42  Cmd,.TclCompileB
0890: 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c  asic2ArgCmd, NUL
08a0: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 20 20 20  L, NULL, 0},.   
08b0: 2f 2a 20 54 49 50 20 23 32 31 39 20 2a 2f 0a 20  /* TIP #219 */. 
08c0: 20 20 20 7b 22 65 6f 66 22 2c 09 09 54 63 6c 5f     {"eof",..Tcl_
08d0: 45 6f 66 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43  EofObjCmd,..TclC
08e0: 6f 6d 70 69 6c 65 42 61 73 69 63 31 41 72 67 43  ompileBasic1ArgC
08f0: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  md, NULL, NULL, 
0900: 30 7d 2c 0a 20 20 20 20 7b 22 65 76 65 6e 74 22  0},.    {"event"
0910: 2c 09 09 54 63 6c 5f 46 69 6c 65 45 76 65 6e 74  ,..Tcl_FileEvent
0920: 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69  ObjCmd,.TclCompi
0930: 6c 65 42 61 73 69 63 32 4f 72 33 41 72 67 43 6d  leBasic2Or3ArgCm
0940: 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  d, NULL, NULL, 0
0950: 7d 2c 0a 20 20 20 20 7b 22 66 6c 75 73 68 22 2c  },.    {"flush",
0960: 09 09 54 63 6c 5f 46 6c 75 73 68 4f 62 6a 43 6d  ..Tcl_FlushObjCm
0970: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73  d,.TclCompileBas
0980: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c  ic1ArgCmd, NULL,
0990: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b   NULL, 0},.    {
09a0: 22 67 65 74 73 22 2c 09 09 54 63 6c 5f 47 65 74  "gets",..Tcl_Get
09b0: 73 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d  sObjCmd,..TclCom
09c0: 70 69 6c 65 42 61 73 69 63 31 4f 72 32 41 72 67  pileBasic1Or2Arg
09d0: 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  Cmd, NULL, NULL,
09e0: 20 30 7d 2c 0a 20 20 20 20 7b 22 69 73 62 69 6e   0},.    {"isbin
09f0: 61 72 79 22 2c 09 43 68 61 6e 49 73 42 69 6e 61  ary",.ChanIsBina
0a00: 72 79 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c  ryCmd,.TclCompil
0a10: 65 42 61 73 69 63 31 41 72 67 43 6d 64 2c 20 4e  eBasic1ArgCmd, N
0a20: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20  ULL, NULL, 0},. 
0a30: 20 20 20 7b 22 6e 61 6d 65 73 22 2c 09 09 54 63     {"names",..Tc
0a40: 6c 43 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64  lChannelNamesCmd
0a50: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69  ,.TclCompileBasi
0a60: 63 30 4f 72 31 41 72 67 43 6d 64 2c 20 4e 55 4c  c0Or1ArgCmd, NUL
0a70: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20  L, NULL, 0},.   
0a80: 20 7b 22 70 65 6e 64 69 6e 67 22 2c 09 09 43 68   {"pending",..Ch
0a90: 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 2c  anPendingObjCmd,
0aa0: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63  .TclCompileBasic
0ab0: 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e  2ArgCmd, NULL, N
0ac0: 55 4c 4c 2c 20 30 7d 2c 09 20 20 20 2f 2a 20 54  ULL, 0},.   /* T
0ad0: 49 50 20 23 32 38 37 20 2a 2f 0a 20 20 20 20 7b  IP #287 */.    {
0ae0: 22 70 69 70 65 22 2c 09 09 43 68 61 6e 50 69 70  "pipe",..ChanPip
0af0: 65 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d  eObjCmd,..TclCom
0b00: 70 69 6c 65 42 61 73 69 63 30 41 72 67 43 6d 64  pileBasic0ArgCmd
0b10: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d  , NULL, NULL, 0}
0b20: 2c 09 20 20 20 2f 2a 20 54 49 50 20 23 33 30 34  ,.   /* TIP #304
0b30: 20 2a 2f 0a 20 20 20 20 7b 22 70 6f 70 22 2c 09   */.    {"pop",.
0b40: 09 54 63 6c 43 68 61 6e 50 6f 70 4f 62 6a 43 6d  .TclChanPopObjCm
0b50: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73  d,.TclCompileBas
0b60: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c  ic1ArgCmd, NULL,
0b70: 20 4e 55 4c 4c 2c 20 30 7d 2c 20 20 20 20 2f 2a   NULL, 0},    /*
0b80: 20 54 49 50 20 23 32 33 30 20 2a 2f 0a 20 20 20   TIP #230 */.   
0b90: 20 7b 22 70 6f 73 74 65 76 65 6e 74 22 2c 09 54   {"postevent",.T
0ba0: 63 6c 43 68 61 6e 50 6f 73 74 45 76 65 6e 74 4f  clChanPostEventO
0bb0: 62 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c  bjCmd,.TclCompil
0bc0: 65 42 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e  eBasic2ArgCmd, N
0bd0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 20  ULL, NULL, 0},. 
0be0: 20 20 2f 2a 20 54 49 50 20 23 32 31 39 20 2a 2f    /* TIP #219 */
0bf0: 0a 20 20 20 20 7b 22 70 75 73 68 22 2c 09 09 54  .    {"push",..T
0c00: 63 6c 43 68 61 6e 50 75 73 68 4f 62 6a 43 6d 64  clChanPushObjCmd
0c10: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69  ,.TclCompileBasi
0c20: 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20  c2ArgCmd, NULL, 
0c30: 4e 55 4c 4c 2c 20 30 7d 2c 09 20 20 20 2f 2a 20  NULL, 0},.   /* 
0c40: 54 49 50 20 23 32 33 30 20 2a 2f 0a 20 20 20 20  TIP #230 */.    
0c50: 7b 22 70 75 74 73 22 2c 09 09 54 63 6c 5f 50 75  {"puts",..Tcl_Pu
0c60: 74 73 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c  tsObjCmd,..NULL,
0c70: 09 09 09 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  ...NULL, NULL, 0
0c80: 7d 2c 0a 20 20 20 20 7b 22 72 65 61 64 22 2c 09  },.    {"read",.
0c90: 09 54 63 6c 5f 52 65 61 64 4f 62 6a 43 6d 64 2c  .Tcl_ReadObjCmd,
0ca0: 09 09 4e 55 4c 4c 2c 09 09 09 4e 55 4c 4c 2c 20  ..NULL,...NULL, 
0cb0: 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b 22  NULL, 0},.    {"
0cc0: 73 65 65 6b 22 2c 09 09 54 63 6c 5f 53 65 65 6b  seek",..Tcl_Seek
0cd0: 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d 70  ObjCmd,..TclComp
0ce0: 69 6c 65 42 61 73 69 63 32 4f 72 33 41 72 67 43  ileBasic2Or3ArgC
0cf0: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  md, NULL, NULL, 
0d00: 30 7d 2c 0a 20 20 20 20 7b 22 74 65 6c 6c 22 2c  0},.    {"tell",
0d10: 09 09 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64  ..Tcl_TellObjCmd
0d20: 2c 09 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73  ,..TclCompileBas
0d30: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c  ic1ArgCmd, NULL,
0d40: 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 20 20 20 20 7b   NULL, 0},.    {
0d50: 22 74 72 75 6e 63 61 74 65 22 2c 09 43 68 61 6e  "truncate",.Chan
0d60: 54 72 75 6e 63 61 74 65 4f 62 6a 43 6d 64 2c 09  TruncateObjCmd,.
0d70: 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 31  TclCompileBasic1
0d80: 4f 72 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c  Or2ArgCmd, NULL,
0d90: 20 4e 55 4c 4c 2c 20 30 7d 2c 20 2f 2a 20 54 49   NULL, 0}, /* TI
0da0: 50 20 23 32 30 38 20 2a 2f 0a 20 20 20 20 7b 4e  P #208 */.    {N
0db0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ULL, NULL, NULL,
0dc0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 0a   NULL, NULL, 0}.
0dd0: 7d 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  };.../*. *------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 0a 20 2a 0a 20 2a 20 46 69 6e 61 6c 69 7a 65 49  . *. * FinalizeI
0e30: 4f 43 6d 64 54 53 44 20 2d 2d 0a 20 2a 0a 20 2a  OCmdTSD --. *. *
0e40: 09 52 65 6c 65 61 73 65 20 74 68 65 20 73 74 6f  .Release the sto
0e50: 72 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 20  rage associated 
0e60: 77 69 74 68 20 74 68 65 20 70 65 72 2d 74 68 72  with the per-thr
0e70: 65 61 64 20 63 61 63 68 65 2e 0a 20 2a 0a 20 2a  ead cache.. *. *
0e80: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
0e90: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
0ea0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
0eb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 46 69 6e  .static void.Fin
0f10: 61 6c 69 7a 65 49 4f 43 6d 64 54 53 44 28 0a 20  alizeIOCmdTSD(. 
0f20: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
0f30: 69 64 20 2a 29 29 0a 7b 0a 20 20 20 20 54 68 72  id *)).{.    Thr
0f40: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20  eadSpecificData 
0f50: 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53  *tsdPtr = TCL_TS
0f60: 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29  D_INIT(&dataKey)
0f70: 3b 0a 0a 20 20 20 20 69 66 20 28 74 73 64 50 74  ;..    if (tsdPt
0f80: 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 20  r->stdoutObjPtr 
0f90: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
0fa0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 73 64  DecrRefCount(tsd
0fb0: 50 74 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74  Ptr->stdoutObjPt
0fc0: 72 29 3b 0a 09 74 73 64 50 74 72 2d 3e 73 74 64  r);..tsdPtr->std
0fd0: 6f 75 74 4f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  outObjPtr = NULL
0fe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 73 64 50  ;.    }.    tsdP
0ff0: 74 72 2d 3e 69 6e 69 74 69 61 6c 69 7a 65 64 20  tr->initialized 
1000: 3d 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  = 0;.}.../*. *--
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 50  ----. *. * Tcl_P
1060: 75 74 73 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  utsObjCmd --. *.
1070: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
1080: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
1090: 72 6f 63 65 73 73 20 74 68 65 20 22 70 75 74 73  rocess the "puts
10a0: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53  " Tcl command. S
10b0: 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64  ee the. *.user d
10c0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
10d0: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74   details on what
10e0: 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20   it does.. *. * 
10f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
1100: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
1110: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
1120: 66 65 63 74 73 3a 0a 20 2a 09 50 72 6f 64 75 63  fects:. *.Produc
1130: 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 61 20 63  es output on a c
1140: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
1150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
11a0: 5f 50 75 74 73 4f 62 6a 43 6d 64 28 0a 20 20 20  _PutsObjCmd(.   
11b0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
11c0: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
11d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
11e0: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72   Current interpr
11f0: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  eter. */.    Tcl
1200: 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20  _Size objc,../* 
1210: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1220: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nts. */.    Tcl_
1230: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76  Obj *const *objv
1240: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62  )./* Argument ob
1250: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20  jects. */.{.    
1260: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
1270: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
1280: 6c 20 74 6f 20 70 75 74 73 20 6f 6e 2e 20 2a 2f  l to puts on. */
1290: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 74  .    Tcl_Obj *st
12a0: 72 69 6e 67 3b 09 09 2f 2a 20 53 74 72 69 6e 67  ring;../* String
12b0: 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 20 20   to write. */.  
12c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 68 61 6e 4f    Tcl_Obj *chanO
12d0: 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 09 2f 2a  bjPtr = NULL;./*
12e0: 20 63 68 61 6e 6e 65 6c 20 6f 62 6a 65 63 74 2e   channel object.
12f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 6c   */.    int newl
1300: 69 6e 65 3b 09 09 2f 2a 20 41 64 64 20 61 20 6e  ine;../* Add a n
1310: 65 77 6c 69 6e 65 20 61 74 20 65 6e 64 3f 20 2a  ewline at end? *
1320: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 72  /.    Tcl_Size r
1330: 65 73 75 6c 74 3b 09 09 2f 2a 20 52 65 73 75 6c  esult;../* Resul
1340: 74 20 6f 66 20 70 75 74 73 20 6f 70 65 72 61 74  t of puts operat
1350: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion. */.    int 
1360: 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64 65 20  mode;.../* Mode 
1370: 69 6e 20 77 68 69 63 68 20 63 68 61 6e 6e 65 6c  in which channel
1380: 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 0a   is opened. */..
1390: 20 20 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63      switch (objc
13a0: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 32 3a 09  ) {.    case 2:.
13b0: 09 09 2f 2a 20 5b 70 75 74 73 20 24 78 5d 20 2a  ../* [puts $x] *
13c0: 2f 0a 09 73 74 72 69 6e 67 20 3d 20 6f 62 6a 76  /..string = objv
13d0: 5b 31 5d 3b 0a 09 6e 65 77 6c 69 6e 65 20 3d 20  [1];..newline = 
13e0: 31 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20  1;..break;..    
13f0: 63 61 73 65 20 33 3a 09 09 09 2f 2a 20 5b 70 75  case 3:.../* [pu
1400: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 78  ts -nonewline $x
1410: 5d 20 6f 72 20 5b 70 75 74 73 20 24 63 68 61 6e  ] or [puts $chan
1420: 20 24 78 5d 20 2a 2f 0a 09 69 66 20 28 73 74 72   $x] */..if (str
1430: 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69 6e 67  cmp(TclGetString
1440: 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e 6f 6e  (objv[1]), "-non
1450: 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29 20 7b  ewline") == 0) {
1460: 0a 09 20 20 20 20 6e 65 77 6c 69 6e 65 20 3d 20  ..    newline = 
1470: 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  0;..} else {..  
1480: 20 20 6e 65 77 6c 69 6e 65 20 3d 20 31 3b 0a 09    newline = 1;..
1490: 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d      chanObjPtr =
14a0: 20 6f 62 6a 76 5b 31 5d 3b 0a 09 7d 0a 09 73 74   objv[1];..}..st
14b0: 72 69 6e 67 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  ring = objv[2];.
14c0: 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73  .break;..    cas
14d0: 65 20 34 3a 09 09 09 2f 2a 20 5b 70 75 74 73 20  e 4:.../* [puts 
14e0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 63 68 61 6e  -nonewline $chan
14f0: 20 24 78 5d 20 6f 72 0a 09 09 09 09 20 2a 20 5b   $x] or..... * [
1500: 70 75 74 73 20 24 63 68 61 6e 20 24 78 20 6e 6f  puts $chan $x no
1510: 6e 65 77 6c 69 6e 65 5d 20 2a 2f 0a 09 6e 65 77  newline] */..new
1520: 6c 69 6e 65 20 3d 20 30 3b 0a 09 69 66 20 28 73  line = 0;..if (s
1530: 74 72 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69  trcmp(TclGetStri
1540: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e  ng(objv[1]), "-n
1550: 6f 6e 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29  onewline") == 0)
1560: 20 7b 0a 09 20 20 20 20 63 68 61 6e 4f 62 6a 50   {..    chanObjP
1570: 74 72 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 20  tr = objv[2];.. 
1580: 20 20 20 73 74 72 69 6e 67 20 3d 20 6f 62 6a 76     string = objv
1590: 5b 33 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  [3];..    break;
15a0: 0a 09 7d 0a 09 54 43 4c 5f 46 41 4c 4c 54 48 52  ..}..TCL_FALLTHR
15b0: 4f 55 47 48 28 29 3b 0a 20 20 20 20 64 65 66 61  OUGH();.    defa
15c0: 75 6c 74 3a 09 09 09 2f 2a 20 5b 70 75 74 73 5d  ult:.../* [puts]
15d0: 20 6f 72 0a 09 09 09 09 20 2a 20 5b 70 75 74 73   or..... * [puts
15e0: 20 73 6f 6d 65 20 62 61 64 20 6e 75 6d 62 65 72   some bad number
15f0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 2e 2e   of arguments...
1600: 5d 20 2a 2f 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  ] */..Tcl_WrongN
1610: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1620: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6e 6f 6e 65 77  , objv, "?-nonew
1630: 6c 69 6e 65 3f 20 3f 63 68 61 6e 6e 65 6c 3f 20  line? ?channel? 
1640: 73 74 72 69 6e 67 22 29 3b 0a 09 72 65 74 75 72  string");..retur
1650: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1660: 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 68 61 6e   }..    if (chan
1670: 4f 62 6a 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  ObjPtr == NULL) 
1680: 7b 0a 09 54 68 72 65 61 64 53 70 65 63 69 66 69  {..ThreadSpecifi
1690: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
16a0: 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61  TCL_TSD_INIT(&da
16b0: 74 61 4b 65 79 29 3b 0a 0a 09 69 66 20 28 21 74  taKey);...if (!t
16c0: 73 64 50 74 72 2d 3e 69 6e 69 74 69 61 6c 69 7a  sdPtr->initializ
16d0: 65 64 29 20 7b 0a 09 20 20 20 20 74 73 64 50 74  ed) {..    tsdPt
16e0: 72 2d 3e 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  r->initialized =
16f0: 20 31 3b 0a 09 20 20 20 20 54 63 6c 4e 65 77 4c   1;..    TclNewL
1700: 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28  iteralStringObj(
1710: 74 73 64 50 74 72 2d 3e 73 74 64 6f 75 74 4f 62  tsdPtr->stdoutOb
1720: 6a 50 74 72 2c 20 22 73 74 64 6f 75 74 22 29 3b  jPtr, "stdout");
1730: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
1740: 66 43 6f 75 6e 74 28 74 73 64 50 74 72 2d 3e 73  fCount(tsdPtr->s
1750: 74 64 6f 75 74 4f 62 6a 50 74 72 29 3b 0a 09 20  tdoutObjPtr);.. 
1760: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 54 68 72     Tcl_CreateThr
1770: 65 61 64 45 78 69 74 48 61 6e 64 6c 65 72 28 46  eadExitHandler(F
1780: 69 6e 61 6c 69 7a 65 49 4f 43 6d 64 54 53 44 2c  inalizeIOCmdTSD,
1790: 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 63 68 61 6e   NULL);..}..chan
17a0: 4f 62 6a 50 74 72 20 3d 20 74 73 64 50 74 72 2d  ObjPtr = tsdPtr-
17b0: 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 3b 0a 20  >stdoutObjPtr;. 
17c0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
17d0: 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62  GetChannelFromOb
17e0: 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 4f 62  j(interp, chanOb
17f0: 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 26 6d 6f  jPtr, &chan, &mo
1800: 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  de, 0) != TCL_OK
1810: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
1820: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1830: 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43   if (!(mode & TC
1840: 4c 5f 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09  L_WRITABLE)) {..
1850: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1860: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
1870: 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 6e 6e  Printf(..."chann
1880: 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e 27 74  el \"%s\" wasn't
1890: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
18a0: 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 53 74  ing",...TclGetSt
18b0: 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29  ring(chanObjPtr)
18c0: 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ));..return TCL_
18d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
18e0: 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72 65 73    TclChannelPres
18f0: 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20 20 20  erve(chan);.    
1900: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 57 72 69  result = Tcl_Wri
1910: 74 65 4f 62 6a 28 63 68 61 6e 2c 20 73 74 72 69  teObj(chan, stri
1920: 6e 67 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73  ng);.    if (res
1930: 75 6c 74 20 3d 3d 20 54 43 4c 5f 49 4e 44 45 58  ult == TCL_INDEX
1940: 5f 4e 4f 4e 45 29 20 7b 0a 09 67 6f 74 6f 20 65  _NONE) {..goto e
1950: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
1960: 69 66 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30  if (newline != 0
1970: 29 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63  ) {..result = Tc
1980: 6c 5f 57 72 69 74 65 43 68 61 72 73 28 63 68 61  l_WriteChars(cha
1990: 6e 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 09 69 66  n, "\n", 1);..if
19a0: 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f   (result == TCL_
19b0: 49 4e 44 45 58 5f 4e 4f 4e 45 29 20 7b 0a 09 20  INDEX_NONE) {.. 
19c0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09     goto error;..
19d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 43  }.    }.    TclC
19e0: 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68  hannelRelease(ch
19f0: 61 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  an);.    return 
1a00: 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 0a  TCL_OK;..    /*.
1a10: 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 2e       * TIP #219.
1a20: 0a 20 20 20 20 20 2a 20 43 61 70 74 75 72 65 20  .     * Capture 
1a30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 70  error messages p
1a40: 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 72  ut by the driver
1a50: 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 73   into the bypass
1a60: 20 61 72 65 61 20 61 6e 64 20 70 75 74 0a 20 20   area and put.  
1a70: 20 20 20 2a 20 74 68 65 6d 20 69 6e 74 6f 20 74     * them into t
1a80: 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72  he regular inter
1a90: 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46  preter result. F
1aa0: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
1ab0: 72 65 67 75 6c 61 72 0a 20 20 20 20 20 2a 20 6d  regular.     * m
1ac0: 65 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e  essage if nothin
1ad0: 67 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74  g was found in t
1ae0: 68 65 20 62 79 70 61 73 73 2e 0a 20 20 20 20 20  he bypass..     
1af0: 2a 2f 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20  */..  error:.   
1b00: 20 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61 75   if (!TclChanCau
1b10: 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 69  ghtErrorBypass(i
1b20: 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a  nterp, chan)) {.
1b30: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
1b40: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
1b50: 6a 50 72 69 6e 74 66 28 22 65 72 72 6f 72 20 77  jPrintf("error w
1b60: 72 69 74 69 6e 67 20 5c 22 25 73 5c 22 3a 20 25  riting \"%s\": %
1b70: 73 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 69  s",...TclGetStri
1b80: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20  ng(chanObjPtr), 
1b90: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
1ba0: 6e 74 65 72 70 29 29 29 3b 0a 20 20 20 20 7d 0a  nterp)));.    }.
1bb0: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65      TclChannelRe
1bc0: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20  lease(chan);.   
1bd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1be0: 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  R;.}.../*. *----
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c30: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 6c 75  --. *. * Tcl_Flu
1c40: 73 68 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  shObjCmd --. *. 
1c50: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
1c60: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
1c70: 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 66 6c  cess the Tcl "fl
1c80: 75 73 68 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65  ush" command. Se
1c90: 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f  e the. *.user do
1ca0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
1cb0: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20  details on what 
1cc0: 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52  it does.. *. * R
1cd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
1ce0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
1cf0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
1d00: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 75  ects:. *.May cau
1d10: 73 65 20 6f 75 74 70 75 74 20 74 6f 20 61 70 70  se output to app
1d20: 65 61 72 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ear on the speci
1d30: 66 69 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  fied channel.. *
1d40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69  ---------. */..i
1d90: 6e 74 0a 54 63 6c 5f 46 6c 75 73 68 4f 62 6a 43  nt.Tcl_FlushObjC
1da0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
1db0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
1dc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1dd0: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
1de0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
1df0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 6a      Tcl_Size obj
1e00: 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c,../* Number of
1e10: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20   arguments. */. 
1e20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
1e30: 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67 75  t *objv)./* Argu
1e40: 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f  ment objects. */
1e50: 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .{.    Tcl_Obj *
1e60: 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20 20  chanObjPtr;.    
1e70: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
1e80: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
1e90: 6c 20 74 6f 20 66 6c 75 73 68 20 6f 6e 2e 20 2a  l to flush on. *
1ea0: 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a  /.    int mode;.
1eb0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
1ec0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
1ed0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ee0: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
1ef0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
1f00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1f10: 20 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f    chanObjPtr = o
1f20: 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28  bjv[1];.    if (
1f30: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f  TclGetChannelFro
1f40: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 61  mObj(interp, cha
1f50: 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20  nObjPtr, &chan, 
1f60: 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c  &mode, 0) != TCL
1f70: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
1f80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
1f90: 20 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26      if (!(mode &
1fa0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29 20   TCL_WRITABLE)) 
1fb0: 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  {..Tcl_SetObjRes
1fc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1fd0: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68  ObjPrintf(..."ch
1fe0: 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73  annel \"%s\" was
1ff0: 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  n't opened for w
2000: 72 69 74 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65  riting",...TclGe
2010: 74 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50  tString(chanObjP
2020: 74 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54  tr)));..return T
2030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2040: 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50  .    TclChannelP
2050: 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20  reserve(chan);. 
2060: 20 20 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68     if (Tcl_Flush
2070: 28 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b  (chan) != TCL_OK
2080: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20  ) {../*.. * TIP 
2090: 23 32 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72  #219... * Captur
20a0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
20b0: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76   put by the driv
20c0: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61  er into the bypa
20d0: 73 73 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20  ss area and.. * 
20e0: 70 75 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68  put them into th
20f0: 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70  e regular interp
2100: 72 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61  reter result. Fa
2110: 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09  ll back to the..
2120: 20 2a 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61   * regular messa
2130: 67 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61  ge if nothing wa
2140: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62  s found in the b
2150: 79 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66  ypass... */...if
2160: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74   (!TclChanCaught
2170: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65  ErrorBypass(inte
2180: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20  rp, chan)) {..  
2190: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
21b0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20  bjPrintf(...    
21c0: 22 65 72 72 6f 72 20 66 6c 75 73 68 69 6e 67 20  "error flushing 
21d0: 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 20  \"%s\": %s",... 
21e0: 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28     TclGetString(
21f0: 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20 54 63 6c  chanObjPtr), Tcl
2200: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
2210: 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43 68  rp)));..}..TclCh
2220: 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 61  annelRelease(cha
2230: 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  n);..return TCL_
2240: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2250: 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61   TclChannelRelea
2260: 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 65  se(chan);.    re
2270: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
2280: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
22d0: 20 2a 20 54 63 6c 5f 47 65 74 73 4f 62 6a 43 6d   * Tcl_GetsObjCm
22e0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
22f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2300: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
2310: 65 20 54 63 6c 20 22 67 65 74 73 22 20 63 6f 6d  e Tcl "gets" com
2320: 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 2a  mand. See the. *
2330: 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74  .user documentat
2340: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20  ion for details 
2350: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e  on what it does.
2360: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
2370: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
2380: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
2390: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
23a0: 09 4d 61 79 20 63 6f 6e 73 75 6d 65 20 69 6e 70  .May consume inp
23b0: 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 2e  ut from channel.
23c0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2410: 0a 0a 69 6e 74 0a 54 63 6c 5f 47 65 74 73 4f 62  ..int.Tcl_GetsOb
2420: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
2430: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
2440: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2450: 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e  terp,../* Curren
2460: 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a  t interpreter. *
2470: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f  /.    Tcl_Size o
2480: 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20  bjc,../* Number 
2490: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f  of arguments. */
24a0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
24b0: 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72  nst *objv)./* Ar
24c0: 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20  gument objects. 
24d0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  */.{.    Tcl_Cha
24e0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
24f0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 72 65  he channel to re
2500: 61 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ad from. */.    
2510: 54 63 6c 5f 53 69 7a 65 20 6c 69 6e 65 4c 65 6e  Tcl_Size lineLen
2520: 3b 09 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20  ;../* Length of 
2530: 6c 69 6e 65 20 6a 75 73 74 20 72 65 61 64 2e 20  line just read. 
2540: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b  */.    int mode;
2550: 09 09 09 2f 2a 20 4d 6f 64 65 20 69 6e 20 77 68  .../* Mode in wh
2560: 69 63 68 20 63 68 61 6e 6e 65 6c 20 69 73 20 6f  ich channel is o
2570: 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63  pened. */.    Tc
2580: 6c 5f 4f 62 6a 20 2a 6c 69 6e 65 50 74 72 2c 20  l_Obj *linePtr, 
2590: 2a 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20  *chanObjPtr;.   
25a0: 20 69 6e 74 20 63 6f 64 65 20 3d 20 54 43 4c 5f   int code = TCL_
25b0: 4f 4b 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62  OK;..    if ((ob
25c0: 6a 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a  jc != 2) && (obj
25d0: 63 20 21 3d 20 33 29 29 20 7b 0a 09 54 63 6c 5f  c != 3)) {..Tcl_
25e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
25f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
2600: 68 61 6e 6e 65 6c 20 3f 76 61 72 4e 61 6d 65 3f  hannel ?varName?
2610: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
2620: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2630: 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f 62   chanObjPtr = ob
2640: 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28 54  jv[1];.    if (T
2650: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d  clGetChannelFrom
2660: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  Obj(interp, chan
2670: 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 26  ObjPtr, &chan, &
2680: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f  mode, 0) != TCL_
2690: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
26a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
26b0: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20     if (!(mode & 
26c0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b  TCL_READABLE)) {
26d0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
26e0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
26f0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61  bjPrintf(..."cha
2700: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e  nnel \"%s\" wasn
2710: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  't opened for re
2720: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74  ading",...TclGet
2730: 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74  String(chanObjPt
2740: 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  r)));..return TC
2750: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
2760: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72      TclChannelPr
2770: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20  eserve(chan);.  
2780: 20 20 54 63 6c 4e 65 77 4f 62 6a 28 6c 69 6e 65    TclNewObj(line
2790: 50 74 72 29 3b 0a 20 20 20 20 6c 69 6e 65 4c 65  Ptr);.    lineLe
27a0: 6e 20 3d 20 54 63 6c 5f 47 65 74 73 4f 62 6a 28  n = Tcl_GetsObj(
27b0: 63 68 61 6e 2c 20 6c 69 6e 65 50 74 72 29 3b 0a  chan, linePtr);.
27c0: 20 20 20 20 69 66 20 28 6c 69 6e 65 4c 65 6e 20      if (lineLen 
27d0: 3d 3d 20 54 43 4c 5f 49 4f 5f 46 41 49 4c 55 52  == TCL_IO_FAILUR
27e0: 45 29 20 7b 0a 09 69 66 20 28 21 54 63 6c 5f 45  E) {..if (!Tcl_E
27f0: 6f 66 28 63 68 61 6e 29 20 26 26 20 21 54 63 6c  of(chan) && !Tcl
2800: 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68  _InputBlocked(ch
2810: 61 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  an)) {..    Tcl_
2820: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 6e  DecrRefCount(lin
2830: 65 50 74 72 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a  ePtr);...    /*.
2840: 09 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39  .     * TIP #219
2850: 2e 0a 09 20 20 20 20 20 2a 20 43 61 70 74 75 72  ...     * Captur
2860: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
2870: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76   put by the driv
2880: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61  er into the bypa
2890: 73 73 20 61 72 65 61 0a 09 20 20 20 20 20 2a 20  ss area..     * 
28a0: 61 6e 64 20 70 75 74 20 74 68 65 6d 20 69 6e 74  and put them int
28b0: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e  o the regular in
28c0: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
28d0: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 09  . Fall back to..
28e0: 20 20 20 20 20 2a 20 74 68 65 20 72 65 67 75 6c       * the regul
28f0: 61 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f  ar message if no
2900: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20  thing was found 
2910: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09  in the bypass...
2920: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
2930: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74   (!TclChanCaught
2940: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65  ErrorBypass(inte
2950: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 09 54  rp, chan)) {...T
2960: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2970: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
2980: 72 69 6e 74 66 28 0a 09 09 09 22 65 72 72 6f 72  rintf(...."error
2990: 20 72 65 61 64 69 6e 67 20 5c 22 25 73 5c 22 3a   reading \"%s\":
29a0: 20 25 73 22 2c 0a 09 09 09 54 63 6c 47 65 74 53   %s",....TclGetS
29b0: 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72  tring(chanObjPtr
29c0: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f  ), Tcl_PosixErro
29d0: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20  r(interp)));..  
29e0: 20 20 7d 0a 09 20 20 20 20 63 6f 64 65 20 3d 20    }..    code = 
29f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
2a00: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 6c  goto done;..}..l
2a10: 69 6e 65 4c 65 6e 20 3d 20 54 43 4c 5f 49 4f 5f  ineLen = TCL_IO_
2a20: 46 41 49 4c 55 52 45 3b 0a 20 20 20 20 7d 0a 20  FAILURE;.    }. 
2a30: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33     if (objc == 3
2a40: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 4f 62 6a  ) {..if (Tcl_Obj
2a50: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
2a60: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 6c  objv[2], NULL, l
2a70: 69 6e 65 50 74 72 2c 0a 09 09 54 43 4c 5f 4c 45  inePtr,...TCL_LE
2a80: 41 56 45 5f 45 52 52 5f 4d 53 47 29 20 3d 3d 20  AVE_ERR_MSG) == 
2a90: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 64  NULL) {..    cod
2aa0: 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  e = TCL_ERROR;..
2ab0: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09      goto done;..
2ac0: 7d 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 6e 65  }..Tcl_Obj *line
2ad0: 4c 65 6e 4f 62 6a 3b 0a 09 54 63 6c 4e 65 77 49  LenObj;..TclNewI
2ae0: 6e 64 65 78 4f 62 6a 28 6c 69 6e 65 4c 65 6e 4f  ndexObj(lineLenO
2af0: 62 6a 2c 20 6c 69 6e 65 4c 65 6e 29 3b 0a 09 54  bj, lineLen);..T
2b00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2b10: 69 6e 74 65 72 70 2c 20 6c 69 6e 65 4c 65 6e 4f  interp, lineLenO
2b20: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  bj);.    } else 
2b30: 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  {..Tcl_SetObjRes
2b40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 6e 65  ult(interp, line
2b50: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 64 6f  Ptr);.    }.  do
2b60: 6e 65 3a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e  ne:.    TclChann
2b70: 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b  elRelease(chan);
2b80: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65  .    return code
2b90: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2be0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 52 65 61 64  -. *. * Tcl_Read
2bf0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
2c00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2c10: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
2c20: 65 73 73 20 74 68 65 20 54 63 6c 20 22 72 65 61  ess the Tcl "rea
2c30: 64 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20  d" command. See 
2c40: 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75  the. *.user docu
2c50: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65  mentation for de
2c60: 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74  tails on what it
2c70: 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73   does.. *. * Res
2c80: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
2c90: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
2ca0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2cb0: 74 73 3a 0a 20 2a 09 4d 61 79 20 63 6f 6e 73 75  ts:. *.May consu
2cc0: 6d 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 63 68  me input from ch
2cd0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f  --. */..int.Tcl_
2d30: 52 65 61 64 4f 62 6a 43 6d 64 28 0a 20 20 20 20  ReadObjCmd(.    
2d40: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
2d50: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
2d60: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
2d70: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65  Current interpre
2d80: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ter. */.    Tcl_
2d90: 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e  Size objc,../* N
2da0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2db0: 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ts. */.    Tcl_O
2dc0: 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29  bj *const *objv)
2dd0: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a  ./* Argument obj
2de0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54  ects. */.{.    T
2df0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
2e00: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
2e10: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 2a   to read from. *
2e20: 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 6c 69 6e  /.    int newlin
2e30: 65 3b 09 09 2f 2a 20 44 69 73 63 61 72 64 20 6e  e;../* Discard n
2e40: 65 77 6c 69 6e 65 20 61 74 20 65 6e 64 3f 20 2a  ewline at end? *
2e50: 2f 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  /.    Tcl_WideIn
2e60: 74 20 74 6f 52 65 61 64 3b 09 09 2f 2a 20 48 6f  t toRead;../* Ho
2e70: 77 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  w many bytes to 
2e80: 72 65 61 64 3f 20 2a 2f 0a 20 20 20 20 54 63 6c  read? */.    Tcl
2e90: 5f 53 69 7a 65 20 63 68 61 72 61 63 74 65 72 73  _Size characters
2ea0: 52 65 61 64 3b 09 2f 2a 20 48 6f 77 20 6d 61 6e  Read;./* How man
2eb0: 79 20 63 68 61 72 61 63 74 65 72 73 20 77 65 72  y characters wer
2ec0: 65 20 72 65 61 64 3f 20 2a 2f 0a 20 20 20 20 69  e read? */.    i
2ed0: 6e 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f  nt mode;.../* Mo
2ee0: 64 65 20 69 6e 20 77 68 69 63 68 20 63 68 61 6e  de in which chan
2ef0: 6e 65 6c 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a  nel is opened. *
2f00: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69  /.    Tcl_Size i
2f10: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  ;.    Tcl_Obj *r
2f20: 65 73 75 6c 74 50 74 72 2c 20 2a 63 68 61 6e 4f  esultPtr, *chanO
2f30: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28  bjPtr;..    if (
2f40: 28 6f 62 6a 63 20 21 3d 20 32 29 20 26 26 20 28  (objc != 2) && (
2f50: 6f 62 6a 63 20 21 3d 20 33 29 29 20 7b 0a 09 49  objc != 3)) {..I
2f60: 6e 74 65 72 70 20 2a 69 50 74 72 3b 0a 0a 20 20  nterp *iPtr;..  
2f70: 20 20 61 72 67 65 72 72 6f 72 3a 0a 09 69 50 74    argerror:..iPt
2f80: 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29 20 69  r = (Interp *) i
2f90: 6e 74 65 72 70 3b 0a 09 54 63 6c 5f 57 72 6f 6e  nterp;..Tcl_Wron
2fa0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2fb0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
2fc0: 65 6c 20 3f 6e 75 6d 43 68 61 72 73 3f 22 29 3b  el ?numChars?");
2fd0: 0a 0a 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e 6f 74  .../*.. * Do not
2fe0: 20 61 70 70 65 6e 64 20 64 69 72 65 63 74 6c 79   append directly
2ff0: 3b 20 74 68 61 74 20 6d 61 6b 65 73 20 65 6e 73  ; that makes ens
3000: 65 6d 62 6c 65 73 20 75 73 69 6e 67 20 74 68 69  embles using thi
3010: 73 20 63 6f 6d 6d 61 6e 64 20 61 73 0a 09 20 2a  s command as.. *
3020: 20 61 20 73 75 62 63 6f 6d 6d 61 6e 64 20 70 72   a subcommand pr
3030: 6f 64 75 63 65 20 74 68 65 20 77 72 6f 6e 67 20  oduce the wrong 
3040: 6d 65 73 73 61 67 65 2e 0a 09 20 2a 2f 0a 0a 09  message... */...
3050: 69 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 49  iPtr->flags |= I
3060: 4e 54 45 52 50 5f 41 4c 54 45 52 4e 41 54 45 5f  NTERP_ALTERNATE_
3070: 57 52 4f 4e 47 5f 41 52 47 53 3b 0a 09 54 63 6c  WRONG_ARGS;..Tcl
3080: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
3090: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
30a0: 3f 2d 6e 6f 6e 65 77 6c 69 6e 65 3f 20 63 68 61  ?-nonewline? cha
30b0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
30c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
30d0: 0a 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ..    i = 1;.   
30e0: 20 6e 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 20 20   newline = 0;.  
30f0: 20 20 69 66 20 28 73 74 72 63 6d 70 28 54 63 6c    if (strcmp(Tcl
3100: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
3110: 5d 29 2c 20 22 2d 6e 6f 6e 65 77 6c 69 6e 65 22  ]), "-nonewline"
3120: 29 20 3d 3d 20 30 29 20 7b 0a 09 6e 65 77 6c 69  ) == 0) {..newli
3130: 6e 65 20 3d 20 31 3b 0a 09 69 2b 2b 3b 0a 20 20  ne = 1;..i++;.  
3140: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 20 3d    }..    if (i =
3150: 3d 20 6f 62 6a 63 29 20 7b 0a 09 67 6f 74 6f 20  = objc) {..goto 
3160: 61 72 67 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  argerror;.    }.
3170: 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20  .    chanObjPtr 
3180: 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 20 20 20 20 69  = objv[i];.    i
3190: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c  f (TclGetChannel
31a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
31b0: 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61  chanObjPtr, &cha
31c0: 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20  n, &mode, 0) != 
31d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
31e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
31f0: 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64   }.    if (!(mod
3200: 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  e & TCL_READABLE
3210: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  )) {..Tcl_SetObj
3220: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3230: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09  cl_ObjPrintf(...
3240: 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20  "channel \"%s\" 
3250: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f  wasn't opened fo
3260: 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 09 54 63  r reading",...Tc
3270: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f  lGetString(chanO
3280: 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72  bjPtr)));..retur
3290: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
32a0: 20 7d 0a 20 20 20 20 69 2b 2b 3b 09 09 09 2f 2a   }.    i++;.../*
32b0: 20 43 6f 6e 73 75 6d 65 64 20 63 68 61 6e 6e 65   Consumed channe
32c0: 6c 20 6e 61 6d 65 2e 20 2a 2f 0a 0a 20 20 20 20  l name. */..    
32d0: 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6d 70 75 74  /*.     * Comput
32e0: 65 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  e how many bytes
32f0: 20 74 6f 20 72 65 61 64 2e 0a 20 20 20 20 20 2a   to read..     *
3300: 2f 0a 0a 20 20 20 20 74 6f 52 65 61 64 20 3d 20  /..    toRead = 
3310: 2d 31 3b 0a 20 20 20 20 69 66 20 28 69 20 3c 20  -1;.    if (i < 
3320: 6f 62 6a 63 29 20 7b 0a 09 69 66 20 28 28 54 63  objc) {..if ((Tc
3330: 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  lGetWideIntFromO
3340: 62 6a 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 69 5d  bj(NULL, objv[i]
3350: 2c 20 26 74 6f 52 65 61 64 29 20 21 3d 20 54 43  , &toRead) != TC
3360: 4c 5f 4f 4b 29 0a 09 09 7c 7c 20 28 74 6f 52 65  L_OK)...|| (toRe
3370: 61 64 20 3c 20 30 29 29 20 7b 0a 09 20 20 20 20  ad < 0)) {..    
3380: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
3390: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
33a0: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 65  Printf(...    "e
33b0: 78 70 65 63 74 65 64 20 6e 6f 6e 2d 6e 65 67 61  xpected non-nega
33c0: 74 69 76 65 20 69 6e 74 65 67 65 72 20 62 75 74  tive integer but
33d0: 20 67 6f 74 20 5c 22 25 73 5c 22 22 2c 0a 09 09   got \"%s\"",...
33e0: 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67      TclGetString
33f0: 28 6f 62 6a 76 5b 69 5d 29 29 29 3b 0a 09 20 20  (objv[i])));..  
3400: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
3410: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22  de(interp, "TCL"
3420: 2c 20 22 56 41 4c 55 45 22 2c 20 22 4e 55 4d 42  , "VALUE", "NUMB
3430: 45 52 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ER", (char *)NUL
3440: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
3450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 69  TCL_ERROR;..}..i
3460: 66 20 28 74 6f 52 65 61 64 20 3e 20 54 43 4c 5f  f (toRead > TCL_
3470: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 20 20 20  SIZE_MAX) {..   
3480: 20 2f 2a 20 42 75 67 20 36 65 38 32 37 32 30 65   /* Bug 6e82720e
3490: 31 34 20 2a 2f 0a 09 20 20 20 20 74 6f 52 65 61  14 */..    toRea
34a0: 64 20 3d 20 54 43 4c 5f 53 49 5a 45 5f 4d 41 58  d = TCL_SIZE_MAX
34b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
34c0: 54 63 6c 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74  TclNewObj(result
34d0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 43 68 61  Ptr);.    TclCha
34e0: 6e 6e 65 6c 50 72 65 73 65 72 76 65 28 63 68 61  nnelPreserve(cha
34f0: 6e 29 3b 0a 20 20 20 20 63 68 61 72 61 63 74 65  n);.    characte
3500: 72 73 52 65 61 64 20 3d 20 54 63 6c 5f 52 65 61  rsRead = Tcl_Rea
3510: 64 43 68 61 72 73 28 63 68 61 6e 2c 20 72 65 73  dChars(chan, res
3520: 75 6c 74 50 74 72 2c 20 74 6f 52 65 61 64 2c 20  ultPtr, toRead, 
3530: 30 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 72  0);.    if (char
3540: 61 63 74 65 72 73 52 65 61 64 20 3d 3d 20 54 43  actersRead == TC
3550: 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 29 20 7b 0a  L_IO_FAILURE) {.
3560: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 75 72 6e  .Tcl_Obj *return
3570: 4f 70 74 73 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  OptsPtr = NULL;.
3580: 09 69 66 20 28 54 63 6c 43 68 61 6e 6e 65 6c 47  .if (TclChannelG
3590: 65 74 42 6c 6f 63 6b 69 6e 67 4d 6f 64 65 28 63  etBlockingMode(c
35a0: 68 61 6e 29 29 20 7b 0a 09 20 20 20 20 72 65 74  han)) {..    ret
35b0: 75 72 6e 4f 70 74 73 50 74 72 20 3d 20 54 63 6c  urnOptsPtr = Tcl
35c0: 5f 4e 65 77 44 69 63 74 4f 62 6a 28 29 3b 0a 09  _NewDictObj();..
35d0: 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a 50      Tcl_DictObjP
35e0: 75 74 28 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 4f  ut(NULL, returnO
35f0: 70 74 73 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ptsPtr, Tcl_NewS
3600: 74 72 69 6e 67 4f 62 6a 28 22 2d 64 61 74 61 22  tringObj("-data"
3610: 2c 20 2d 31 29 2c 0a 09 09 20 20 20 20 72 65 73  , -1),...    res
3620: 75 6c 74 50 74 72 29 3b 0a 09 7d 20 65 6c 73 65  ultPtr);..} else
3630: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72   {..    Tcl_Decr
3640: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 50  RefCount(resultP
3650: 74 72 29 3b 0a 09 7d 0a 09 2f 2a 0a 09 20 2a 20  tr);..}../*.. * 
3660: 54 49 50 20 23 32 31 39 2e 0a 09 20 2a 20 43 61  TIP #219... * Ca
3670: 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73  pture error mess
3680: 61 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20  ages put by the 
3690: 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20  driver into the 
36a0: 62 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 0a  bypass area and.
36b0: 09 20 2a 20 70 75 74 20 74 68 65 6d 20 69 6e 74  . * put them int
36c0: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e  o the regular in
36d0: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
36e0: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  . Fall back to t
36f0: 68 65 0a 09 20 2a 20 72 65 67 75 6c 61 72 20 6d  he.. * regular m
3700: 65 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e  essage if nothin
3710: 67 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74  g was found in t
3720: 68 65 20 62 79 70 61 73 73 2e 0a 09 20 2a 2f 0a  he bypass... */.
3730: 0a 09 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61  ..if (!TclChanCa
3740: 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28  ughtErrorBypass(
3750: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b  interp, chan)) {
3760: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
3770: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3780: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09  cl_ObjPrintf(...
3790: 20 20 20 20 22 65 72 72 6f 72 20 72 65 61 64 69      "error readi
37a0: 6e 67 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a  ng \"%s\": %s",.
37b0: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69  ..    TclGetStri
37c0: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20  ng(chanObjPtr), 
37d0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
37e0: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63  nterp)));..}..Tc
37f0: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28  lChannelRelease(
3800: 63 68 61 6e 29 3b 0a 09 69 66 20 28 72 65 74 75  chan);..if (retu
3810: 72 6e 4f 70 74 73 50 74 72 29 20 7b 0a 09 20 20  rnOptsPtr) {..  
3820: 20 20 54 63 6c 5f 53 65 74 52 65 74 75 72 6e 4f    Tcl_SetReturnO
3830: 70 74 69 6f 6e 73 28 69 6e 74 65 72 70 2c 20 72  ptions(interp, r
3840: 65 74 75 72 6e 4f 70 74 73 50 74 72 29 3b 0a 09  eturnOptsPtr);..
3850: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  }..return TCL_ER
3860: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
3870: 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 72 65 71  /*.     * If req
3880: 75 65 73 74 65 64 2c 20 72 65 6d 6f 76 65 20 74  uested, remove t
3890: 68 65 20 6c 61 73 74 20 6e 65 77 6c 69 6e 65 20  he last newline 
38a0: 69 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69  in the channel i
38b0: 66 20 61 74 20 45 4f 46 2e 0a 20 20 20 20 20 2a  f at EOF..     *
38c0: 2f 0a 0a 20 20 20 20 69 66 20 28 28 63 68 61 72  /..    if ((char
38d0: 61 63 74 65 72 73 52 65 61 64 20 3e 20 30 29 20  actersRead > 0) 
38e0: 26 26 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30  && (newline != 0
38f0: 29 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72  )) {..const char
3900: 20 2a 72 65 73 75 6c 74 3b 0a 09 54 63 6c 5f 53   *result;..Tcl_S
3910: 69 7a 65 20 6c 65 6e 67 74 68 3b 0a 0a 09 72 65  ize length;...re
3920: 73 75 6c 74 20 3d 20 54 63 6c 47 65 74 53 74 72  sult = TclGetStr
3930: 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c  ingFromObj(resul
3940: 74 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a  tPtr, &length);.
3950: 09 69 66 20 28 72 65 73 75 6c 74 5b 6c 65 6e 67  .if (result[leng
3960: 74 68 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29  th - 1] == '\n')
3970: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f   {..    Tcl_SetO
3980: 62 6a 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 50  bjLength(resultP
3990: 74 72 2c 20 6c 65 6e 67 74 68 20 2d 20 31 29 3b  tr, length - 1);
39a0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ..}.    }.    Tc
39b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
39c0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72  nterp, resultPtr
39d0: 29 3b 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65  );.    TclChanne
39e0: 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a  lRelease(chan);.
39f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
3a00: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 53 65 65  --. *. * Tcl_See
3a60: 6b 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  kObjCmd --. *. *
3a70: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69  .This function i
3a80: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
3a90: 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 73 65  cess the Tcl "se
3aa0: 65 6b 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65  ek" command. See
3ab0: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63   the. *.user doc
3ac0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64  umentation for d
3ad0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69  etails on what i
3ae0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65  t does.. *. * Re
3af0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
3b00: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
3b10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
3b20: 63 74 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 74 68  cts:. *.Moves th
3b30: 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  e position of th
3b40: 65 20 61 63 63 65 73 73 20 70 6f 69 6e 74 20 6f  e access point o
3b50: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
3b60: 63 68 61 6e 6e 65 6c 2e 20 20 4d 61 79 0a 20 2a  channel.  May. *
3b70: 09 66 6c 75 73 68 20 71 75 65 75 65 64 20 6f 75  .flush queued ou
3b80: 74 70 75 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  tput.. *. *-----
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bd0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53  -. */..int.Tcl_S
3be0: 65 65 6b 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  eekObjCmd(.    T
3bf0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
3c00: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
3c10: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43  p *interp,../* C
3c20: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  urrent interpret
3c30: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53  er. */.    Tcl_S
3c40: 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75  ize objc,../* Nu
3c50: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3c60: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  s. */.    Tcl_Ob
3c70: 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09  j *const *objv).
3c80: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65  /* Argument obje
3c90: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  cts. */.{.    Tc
3ca0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
3cb0: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
3cc0: 74 6f 20 74 65 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20  to tell on. */. 
3cd0: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6f     Tcl_WideInt o
3ce0: 66 66 73 65 74 3b 09 09 2f 2a 20 57 68 65 72 65  ffset;../* Where
3cf0: 20 74 6f 20 73 65 65 6b 3f 20 2a 2f 0a 20 20 20   to seek? */.   
3d00: 20 69 6e 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20   int mode;.../* 
3d10: 48 6f 77 20 74 6f 20 73 65 65 6b 3f 20 2a 2f 0a  How to seek? */.
3d20: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
3d30: 72 65 73 75 6c 74 3b 09 09 2f 2a 20 4f 66 20 63  result;../* Of c
3d40: 61 6c 6c 69 6e 67 20 54 63 6c 5f 53 65 65 6b 2e  alling Tcl_Seek.
3d50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 74 69   */.    int opti
3d60: 6f 6e 49 6e 64 65 78 3b 0a 20 20 20 20 73 74 61  onIndex;.    sta
3d70: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3d80: 63 6f 6e 73 74 20 6f 72 69 67 69 6e 4f 70 74 69  const originOpti
3d90: 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 73 74 61 72  ons[] = {.."star
3da0: 74 22 2c 20 22 63 75 72 72 65 6e 74 22 2c 20 22  t", "current", "
3db0: 65 6e 64 22 2c 20 4e 55 4c 4c 0a 20 20 20 20 7d  end", NULL.    }
3dc0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
3dd0: 73 74 20 69 6e 74 20 6d 6f 64 65 41 72 72 61 79  st int modeArray
3de0: 5b 5d 20 3d 20 7b 53 45 45 4b 5f 53 45 54 2c 20  [] = {SEEK_SET, 
3df0: 53 45 45 4b 5f 43 55 52 2c 20 53 45 45 4b 5f 45  SEEK_CUR, SEEK_E
3e00: 4e 44 7d 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f  ND};..    if ((o
3e10: 62 6a 63 20 21 3d 20 33 29 20 26 26 20 28 6f 62  bjc != 3) && (ob
3e20: 6a 63 20 21 3d 20 34 29 29 20 7b 0a 09 54 63 6c  jc != 4)) {..Tcl
3e30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
3e40: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
3e50: 63 68 61 6e 6e 65 6c 20 6f 66 66 73 65 74 20 3f  channel offset ?
3e60: 6f 72 69 67 69 6e 3f 22 29 3b 0a 09 72 65 74 75  origin?");..retu
3e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3e80: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 47    }.    if (TclG
3e90: 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a  etChannelFromObj
3ea0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
3eb0: 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30  , &chan, NULL, 0
3ec0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
3ed0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
3ef0: 54 63 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f  TclGetWideIntFro
3f00: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
3f10: 76 5b 32 5d 2c 20 26 6f 66 66 73 65 74 29 20 21  v[2], &offset) !
3f20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
3f30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3f40: 20 20 20 7d 0a 20 20 20 20 6d 6f 64 65 20 3d 20     }.    mode = 
3f50: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 69 66  SEEK_SET;.    if
3f60: 20 28 6f 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09   (objc == 4) {..
3f70: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
3f80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
3f90: 6f 62 6a 76 5b 33 5d 2c 20 6f 72 69 67 69 6e 4f  objv[3], originO
3fa0: 70 74 69 6f 6e 73 2c 20 22 6f 72 69 67 69 6e 22  ptions, "origin"
3fb0: 2c 20 30 2c 0a 09 09 26 6f 70 74 69 6f 6e 49 6e  , 0,...&optionIn
3fc0: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
3fd0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
3fe0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 6d 6f 64  L_ERROR;..}..mod
3ff0: 65 20 3d 20 6d 6f 64 65 41 72 72 61 79 5b 6f 70  e = modeArray[op
4000: 74 69 6f 6e 49 6e 64 65 78 5d 3b 0a 20 20 20 20  tionIndex];.    
4010: 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65  }..    TclChanne
4020: 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b  lPreserve(chan);
4030: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63  .    result = Tc
4040: 6c 5f 53 65 65 6b 28 63 68 61 6e 2c 20 6f 66 66  l_Seek(chan, off
4050: 73 65 74 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20  set, mode);.    
4060: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31  if (result == -1
4070: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20  ) {../*.. * TIP 
4080: 23 32 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72  #219... * Captur
4090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
40a0: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76   put by the driv
40b0: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61  er into the bypa
40c0: 73 73 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20  ss area and.. * 
40d0: 70 75 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68  put them into th
40e0: 65 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70  e regular interp
40f0: 72 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61  reter result. Fa
4100: 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09  ll back to the..
4110: 20 2a 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61   * regular messa
4120: 67 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61  ge if nothing wa
4130: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62  s found in the b
4140: 79 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66  ypass... */...if
4150: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74   (!TclChanCaught
4160: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65  ErrorBypass(inte
4170: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20  rp, chan)) {..  
4180: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
4190: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
41a0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20  bjPrintf(...    
41b0: 22 65 72 72 6f 72 20 64 75 72 69 6e 67 20 73 65  "error during se
41c0: 65 6b 20 6f 6e 20 5c 22 25 73 5c 22 3a 20 25 73  ek on \"%s\": %s
41d0: 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53  ",...    TclGetS
41e0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
41f0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
4200: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63  nterp)));..}..Tc
4210: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28  lChannelRelease(
4220: 63 68 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54  chan);..return T
4230: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4240: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65      TclChannelRe
4250: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20  lease(chan);.   
4260: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4270: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
42c0: 20 2a 0a 20 2a 20 54 63 6c 5f 54 65 6c 6c 4f 62   *. * Tcl_TellOb
42d0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
42e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
42f0: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
4300: 73 20 74 68 65 20 54 63 6c 20 22 74 65 6c 6c 22  s the Tcl "tell"
4310: 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68   command. See th
4320: 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65  e. *.user docume
4330: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61  ntation for deta
4340: 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64  ils on what it d
4350: 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  oes.. *. * Resul
4360: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
4370: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
4380: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4390: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a  ------. */..int.
43f0: 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 28 0a  Tcl_TellObjCmd(.
4400: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76      TCL_UNUSED(v
4410: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f  oid *),.    Tcl_
4420: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
4430: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65  ./* Current inte
4440: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20  rpreter. */.    
4450: 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09  Tcl_Size objc,..
4460: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4470: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54  uments. */.    T
4480: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f  cl_Obj *const *o
4490: 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  bjv)./* Argument
44a0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
44b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
44c0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
44d0: 6e 6e 65 6c 20 74 6f 20 74 65 6c 6c 20 6f 6e 2e  nnel to tell on.
44e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 57 69 64 65   */.    Tcl_Wide
44f0: 49 6e 74 20 6e 65 77 4c 6f 63 3b 0a 20 20 20 20  Int newLoc;.    
4500: 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 69  int code;..    i
4510: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
4520: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
4530: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
4540: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
4550: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4560: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
4570: 20 20 20 20 20 2a 20 54 72 79 20 74 6f 20 66 69       * Try to fi
4580: 6e 64 20 61 20 63 68 61 6e 6e 65 6c 20 77 69 74  nd a channel wit
4590: 68 20 74 68 65 20 72 69 67 68 74 20 6e 61 6d 65  h the right name
45a0: 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
45b0: 20 69 6e 20 74 68 65 20 49 4f 0a 20 20 20 20 20   in the IO.     
45c0: 2a 20 63 68 61 6e 6e 65 6c 20 74 61 62 6c 65 20  * channel table 
45d0: 6f 66 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  of this interpre
45e0: 74 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ter..     */..  
45f0: 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e    if (TclGetChan
4600: 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  nelFromObj(inter
4610: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61  p, objv[1], &cha
4620: 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54  n, NULL, 0) != T
4630: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
4640: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4650: 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65  }..    TclChanne
4660: 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b  lPreserve(chan);
4670: 0a 20 20 20 20 6e 65 77 4c 6f 63 20 3d 20 54 63  .    newLoc = Tc
4680: 6c 5f 54 65 6c 6c 28 63 68 61 6e 29 3b 0a 0a 20  l_Tell(chan);.. 
4690: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50     /*.     * TIP
46a0: 20 23 32 31 39 2e 0a 20 20 20 20 20 2a 20 43 61   #219..     * Ca
46b0: 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73  pture error mess
46c0: 61 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20  ages put by the 
46d0: 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20  driver into the 
46e0: 62 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 20  bypass area and 
46f0: 70 75 74 0a 20 20 20 20 20 2a 20 74 68 65 6d 20  put.     * them 
4700: 69 6e 74 6f 20 74 68 65 20 72 65 67 75 6c 61 72  into the regular
4710: 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 73   interpreter res
4720: 75 6c 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ult..     */..  
4730: 20 20 63 6f 64 65 20 20 3d 20 54 63 6c 43 68 61    code  = TclCha
4740: 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 61  nCaughtErrorBypa
4750: 73 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  ss(interp, chan)
4760: 3b 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c  ;.    TclChannel
4770: 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20  Release(chan);. 
4780: 20 20 20 69 66 20 28 63 6f 64 65 29 20 7b 0a 09     if (code) {..
4790: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
47a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
47b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
47c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
47d0: 65 49 6e 74 4f 62 6a 28 6e 65 77 4c 6f 63 29 29  eIntObj(newLoc))
47e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
47f0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 43  ----. *. * Tcl_C
4850: 6c 6f 73 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  loseObjCmd --. *
4860: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
4870: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  n is invoked to 
4880: 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20  process the Tcl 
4890: 22 63 6c 6f 73 65 22 20 63 6f 6d 6d 61 6e 64 2e  "close" command.
48a0: 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72   See the. *.user
48b0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
48c0: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68  or details on wh
48d0: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20  at it does.. *. 
48e0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
48f0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
4900: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
4910: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
4920: 64 69 73 63 61 72 64 20 71 75 65 75 65 64 20 69  discard queued i
4930: 6e 70 75 74 3b 20 6d 61 79 20 66 6c 75 73 68 20  nput; may flush 
4940: 71 75 65 75 65 64 20 6f 75 74 70 75 74 2e 0a 20  queued output.. 
4950: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
49a0: 69 6e 74 0a 54 63 6c 5f 43 6c 6f 73 65 4f 62 6a  int.Tcl_CloseObj
49b0: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
49c0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
49d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
49e0: 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74  erp,../* Current
49f0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f   interpreter. */
4a00: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62  .    Tcl_Size ob
4a10: 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  jc,../* Number o
4a20: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  f arguments. */.
4a30: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
4a40: 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67  st *objv)./* Arg
4a50: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a  ument objects. *
4a60: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  /.{.    Tcl_Chan
4a70: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
4a80: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 63 6c 6f  e channel to clo
4a90: 73 65 2e 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  se. */.    stati
4aa0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
4ab0: 6e 73 74 20 64 69 72 4f 70 74 69 6f 6e 73 5b 5d  nst dirOptions[]
4ac0: 20 3d 20 7b 0a 09 22 72 65 61 64 22 2c 20 22 77   = {.."read", "w
4ad0: 72 69 74 65 22 2c 20 4e 55 4c 4c 0a 20 20 20 20  rite", NULL.    
4ae0: 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  };.    static co
4af0: 6e 73 74 20 69 6e 74 20 64 69 72 41 72 72 61 79  nst int dirArray
4b00: 5b 5d 20 3d 20 7b 54 43 4c 5f 43 4c 4f 53 45 5f  [] = {TCL_CLOSE_
4b10: 52 45 41 44 2c 20 54 43 4c 5f 43 4c 4f 53 45 5f  READ, TCL_CLOSE_
4b20: 57 52 49 54 45 7d 3b 0a 0a 20 20 20 20 69 66 20  WRITE};..    if 
4b30: 28 28 6f 62 6a 63 20 21 3d 20 32 29 20 26 26 20  ((objc != 2) && 
4b40: 28 6f 62 6a 63 20 21 3d 20 33 29 29 20 7b 0a 09  (objc != 3)) {..
4b50: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4b60: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
4b70: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 64 69 72 65  , "channel ?dire
4b80: 63 74 69 6f 6e 3f 22 29 3b 0a 09 72 65 74 75 72  ction?");..retur
4b90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4ba0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 47   }..    if (TclG
4bb0: 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a  etChannelFromObj
4bc0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
4bd0: 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30  , &chan, NULL, 0
4be0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
4bf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4c00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
4c10: 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 69  (objc == 3) {..i
4c20: 6e 74 20 69 6e 64 65 78 2c 20 64 69 72 3b 0a 0a  nt index, dir;..
4c30: 09 2f 2a 0a 09 20 2a 20 47 65 74 20 64 69 72 65  ./*.. * Get dire
4c40: 63 74 69 6f 6e 20 72 65 71 75 65 73 74 65 64 20  ction requested 
4c50: 74 6f 20 63 6c 6f 73 65 2c 20 61 6e 64 20 63 68  to close, and ch
4c60: 65 63 6b 20 73 79 6e 74 61 78 2e 0a 09 20 2a 2f  eck syntax... */
4c70: 0a 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
4c80: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
4c90: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 64 69 72 4f  p, objv[2], dirO
4ca0: 70 74 69 6f 6e 73 2c 20 22 64 69 72 65 63 74 69  ptions, "directi
4cb0: 6f 6e 22 2c 20 30 2c 0a 09 09 26 69 6e 64 65 78  on", 0,...&index
4cc0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
4cd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ce0: 52 52 4f 52 3b 0a 09 7d 0a 09 64 69 72 20 3d 20  RROR;..}..dir = 
4cf0: 64 69 72 41 72 72 61 79 5b 69 6e 64 65 78 5d 3b  dirArray[index];
4d00: 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20  .../*.. * Check 
4d10: 64 69 72 65 63 74 69 6f 6e 20 61 67 61 69 6e 73  direction agains
4d20: 74 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65 2e 20  t channel mode. 
4d30: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  It is an error i
4d40: 66 20 77 65 20 74 72 79 20 74 6f 0a 09 20 2a 20  f we try to.. * 
4d50: 63 6c 6f 73 65 20 61 20 64 69 72 65 63 74 69 6f  close a directio
4d60: 6e 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  n not supported 
4d70: 62 79 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 28  by the channel (
4d80: 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64 2c 20  already closed, 
4d90: 6f 72 0a 09 20 2a 20 6e 65 76 65 72 20 6f 70 65  or.. * never ope
4da0: 6e 65 64 20 66 6f 72 20 74 68 61 74 20 64 69 72  ned for that dir
4db0: 65 63 74 69 6f 6e 29 2e 0a 09 20 2a 2f 0a 0a 09  ection)... */...
4dc0: 69 66 20 28 21 28 64 69 72 20 26 20 54 63 6c 5f  if (!(dir & Tcl_
4dd0: 47 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65 28 63  GetChannelMode(c
4de0: 68 61 6e 29 29 29 20 7b 0a 09 20 20 20 20 54 63  han))) {..    Tc
4df0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
4e00: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
4e10: 69 6e 74 66 28 0a 09 09 20 20 20 20 22 48 61 6c  intf(...    "Hal
4e20: 66 2d 63 6c 6f 73 65 20 6f 66 20 25 73 2d 73 69  f-close of %s-si
4e30: 64 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  de not possible,
4e40: 20 73 69 64 65 20 6e 6f 74 20 6f 70 65 6e 65 64   side not opened
4e50: 22 0a 09 09 20 20 20 20 22 20 6f 72 20 61 6c 72  "...    " or alr
4e60: 65 61 64 79 20 63 6c 6f 73 65 64 22 2c 20 64 69  eady closed", di
4e70: 72 4f 70 74 69 6f 6e 73 5b 69 6e 64 65 78 5d 29  rOptions[index])
4e80: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
4e90: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
4ea0: 2a 0a 09 20 2a 20 53 70 65 63 69 61 6c 20 68 61  *.. * Special ha
4eb0: 6e 64 6c 69 6e 67 20 69 73 20 6e 65 65 64 65 64  ndling is needed
4ec0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
4ed0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65  the channel mode
4ee0: 20 73 75 70 70 6f 72 74 73 0a 09 20 2a 20 6d 6f   supports.. * mo
4ef0: 72 65 20 74 68 61 6e 20 74 68 65 20 64 69 72 65  re than the dire
4f00: 63 74 69 6f 6e 20 74 6f 20 63 6c 6f 73 65 2e 20  ction to close. 
4f10: 42 65 63 61 75 73 65 20 69 66 20 74 68 65 20 63  Because if the c
4f20: 6c 6f 73 65 20 74 68 65 20 6c 61 73 74 0a 09 20  lose the last.. 
4f30: 2a 20 64 69 72 65 63 74 69 6f 6e 20 73 75 70 70  * direction supp
4f40: 6f 72 74 65 64 20 77 65 20 63 61 6e 20 61 6e 64  orted we can and
4f50: 20 77 69 6c 6c 20 67 6f 20 74 68 72 6f 75 67 68   will go through
4f60: 20 74 68 65 20 72 65 67 75 6c 61 72 0a 09 20 2a   the regular.. *
4f70: 20 70 72 6f 63 65 73 73 2e 0a 09 20 2a 2f 0a 0a   process... */..
4f80: 09 69 66 20 28 28 54 63 6c 5f 47 65 74 43 68 61  .if ((Tcl_GetCha
4f90: 6e 6e 65 6c 4d 6f 64 65 28 63 68 61 6e 29 20 26  nnelMode(chan) &
4fa0: 0a 09 09 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45  ...(TCL_CLOSE_RE
4fb0: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49  AD|TCL_CLOSE_WRI
4fc0: 54 45 29 29 20 21 3d 20 64 69 72 29 20 7b 0a 09  TE)) != dir) {..
4fd0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 43      return Tcl_C
4fe0: 6c 6f 73 65 45 78 28 69 6e 74 65 72 70 2c 20 63  loseEx(interp, c
4ff0: 68 61 6e 2c 20 64 69 72 29 3b 0a 09 7d 0a 20 20  han, dir);..}.  
5000: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c    }..    if (Tcl
5010: 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e  _UnregisterChann
5020: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
5030: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f   != TCL_OK) {../
5040: 2a 0a 09 20 2a 20 49 66 20 74 68 65 72 65 20 69  *.. * If there i
5050: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
5060: 67 65 20 61 6e 64 20 69 74 20 65 6e 64 73 20 77  ge and it ends w
5070: 69 74 68 20 61 20 6e 65 77 6c 69 6e 65 2c 20 72  ith a newline, r
5080: 65 6d 6f 76 65 20 74 68 65 0a 09 20 2a 20 6e 65  emove the.. * ne
5090: 77 6c 69 6e 65 2e 20 54 68 69 73 20 69 73 20 64  wline. This is d
50a0: 6f 6e 65 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 20  one for command 
50b0: 70 69 70 65 6c 69 6e 65 20 63 68 61 6e 6e 65 6c  pipeline channel
50c0: 73 20 77 68 65 72 65 20 74 68 65 20 65 72 72 6f  s where the erro
50d0: 72 0a 09 20 2a 20 6f 75 74 70 75 74 20 66 72 6f  r.. * output fro
50e0: 6d 20 74 68 65 20 73 75 62 70 72 6f 63 65 73 73  m the subprocess
50f0: 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
5100: 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 2e  interp's result.
5110: 0a 09 20 2a 0a 09 20 2a 20 4e 4f 54 45 3a 20 54  .. *.. * NOTE: T
5120: 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  his is likely to
5130: 20 6e 6f 74 20 68 61 76 65 20 61 6e 79 20 65 66   not have any ef
5140: 66 65 63 74 20 6f 6e 20 72 65 67 75 6c 61 72 20  fect on regular 
5150: 65 72 72 6f 72 0a 09 20 2a 20 6d 65 73 73 61 67  error.. * messag
5160: 65 73 20 70 72 6f 64 75 63 65 64 20 62 79 20 64  es produced by d
5170: 72 69 76 65 72 73 20 64 75 72 69 6e 67 20 74 68  rivers during th
5180: 65 20 63 6c 6f 73 69 6e 67 20 6f 66 20 61 20 63  e closing of a c
5190: 68 61 6e 6e 65 6c 2c 0a 09 20 2a 20 62 65 63 61  hannel,.. * beca
51a0: 75 73 65 20 74 68 65 20 54 63 6c 20 63 6f 6e 76  use the Tcl conv
51b0: 65 6e 74 69 6f 6e 20 69 73 20 74 68 61 74 20 73  ention is that s
51c0: 75 63 68 20 65 72 72 6f 72 20 6d 65 73 73 61 67  uch error messag
51d0: 65 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 0a 09  es do not have..
51e0: 20 2a 20 61 20 74 65 72 6d 69 6e 61 74 69 6e 67   * a terminating
51f0: 20 6e 65 77 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a   newline... */..
5200: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74  .Tcl_Obj *result
5210: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Ptr = Tcl_GetObj
5220: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
5230: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72  .const char *str
5240: 69 6e 67 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c  ing;..Tcl_Size l
5250: 65 6e 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 49 73  en;...if (Tcl_Is
5260: 53 68 61 72 65 64 28 72 65 73 75 6c 74 50 74 72  Shared(resultPtr
5270: 29 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74  )) {..    result
5280: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
5290: 61 74 65 4f 62 6a 28 72 65 73 75 6c 74 50 74 72  ateObj(resultPtr
52a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f  );..    Tcl_SetO
52b0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
52c0: 20 72 65 73 75 6c 74 50 74 72 29 3b 0a 09 7d 0a   resultPtr);..}.
52d0: 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 47 65 74  .string = TclGet
52e0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65  StringFromObj(re
52f0: 73 75 6c 74 50 74 72 2c 20 26 6c 65 6e 29 3b 0a  sultPtr, &len);.
5300: 09 69 66 20 28 28 6c 65 6e 20 3e 20 30 29 20 26  .if ((len > 0) &
5310: 26 20 28 73 74 72 69 6e 67 5b 6c 65 6e 20 2d 20  & (string[len - 
5320: 31 5d 20 3d 3d 20 27 5c 6e 27 29 29 20 7b 0a 09  1] == '\n')) {..
5330: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 4c 65      Tcl_SetObjLe
5340: 6e 67 74 68 28 72 65 73 75 6c 74 50 74 72 2c 20  ngth(resultPtr, 
5350: 6c 65 6e 20 2d 20 31 29 3b 0a 09 7d 0a 09 72 65  len - 1);..}..re
5360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5370: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
5380: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
5390: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
53e0: 54 63 6c 5f 46 63 6f 6e 66 69 67 75 72 65 4f 62  Tcl_FconfigureOb
53f0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
5400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
5410: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
5420: 73 20 74 68 65 20 54 63 6c 20 22 66 63 6f 6e 66  s the Tcl "fconf
5430: 69 67 75 72 65 22 20 63 6f 6d 6d 61 6e 64 2e 20  igure" command. 
5440: 53 65 65 0a 20 2a 09 74 68 65 20 75 73 65 72 20  See. *.the user 
5450: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
5460: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61  r details on wha
5470: 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a  t it does.. *. *
5480: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
5490: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
54a0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
54b0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
54c0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
54d0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
54e0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 46 63  . */..int.Tcl_Fc
5540: 6f 6e 66 69 67 75 72 65 4f 62 6a 43 6d 64 28 0a  onfigureObjCmd(.
5550: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76      TCL_UNUSED(v
5560: 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f  oid *),.    Tcl_
5570: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
5580: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65  ./* Current inte
5590: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20  rpreter. */.    
55a0: 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09  Tcl_Size objc,..
55b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
55c0: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54  uments. */.    T
55d0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f  cl_Obj *const *o
55e0: 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  bjv)./* Argument
55f0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
5600: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f     const char *o
5610: 70 74 69 6f 6e 4e 61 6d 65 2c 20 2a 76 61 6c 75  ptionName, *valu
5620: 65 4e 61 6d 65 3b 0a 20 20 20 20 54 63 6c 5f 43  eName;.    Tcl_C
5630: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
5640: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
5650: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
5660: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69  /.    Tcl_Size i
5670: 3b 09 09 09 2f 2a 20 49 74 65 72 61 74 65 20 6f  ;.../* Iterate o
5680: 76 65 72 20 61 72 67 2d 76 61 6c 75 65 20 70 61  ver arg-value pa
5690: 69 72 73 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 20  irs. */..    if 
56a0: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
56b0: 28 28 6f 62 6a 63 20 25 20 32 29 20 3d 3d 20 31  ((objc % 2) == 1
56c0: 29 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 29  ) && (objc != 3)
56d0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
56e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
56f0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
5700: 20 3f 2d 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20   ?-option value 
5710: 2e 2e 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ...?");..return 
5720: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5730: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74  ..    if (TclGet
5740: 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69  ChannelFromObj(i
5750: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
5760: 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20  &chan, NULL, 0) 
5770: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
5780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5790: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f      }..    if (o
57a0: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc == 2) {..Tcl
57b0: 5f 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a  _DString ds;../*
57c0: 20 44 53 74 72 69 6e 67 20 74 6f 20 68 6f 6c 64   DString to hold
57d0: 20 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c 69   result of calli
57e0: 6e 67 0a 09 09 09 09 20 2a 20 54 63 6c 5f 47 65  ng..... * Tcl_Ge
57f0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2e 20  tChannelOption. 
5800: 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  */...Tcl_DString
5810: 49 6e 69 74 28 26 64 73 29 3b 0a 09 69 66 20 28  Init(&ds);..if (
5820: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
5830: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
5840: 6e 2c 20 4e 55 4c 4c 2c 20 26 64 73 29 20 21 3d  n, NULL, &ds) !=
5850: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
5860: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
5870: 26 64 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72  &ds);..    retur
5880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
5890: 09 54 63 6c 5f 44 53 74 72 69 6e 67 52 65 73 75  .Tcl_DStringResu
58a0: 6c 74 28 69 6e 74 65 72 70 2c 20 26 64 73 29 3b  lt(interp, &ds);
58b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  ..return TCL_OK;
58c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
58d0: 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 54 63  objc == 3) {..Tc
58e0: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f  l_DString ds;../
58f0: 2a 20 44 53 74 72 69 6e 67 20 74 6f 20 68 6f 6c  * DString to hol
5900: 64 20 72 65 73 75 6c 74 20 6f 66 20 63 61 6c 6c  d result of call
5910: 69 6e 67 0a 09 09 09 09 20 2a 20 54 63 6c 5f 47  ing..... * Tcl_G
5920: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2e  etChannelOption.
5930: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e   */...Tcl_DStrin
5940: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 6f 70 74  gInit(&ds);..opt
5950: 69 6f 6e 4e 61 6d 65 20 3d 20 54 63 6c 47 65 74  ionName = TclGet
5960: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
5970: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61  ..if (Tcl_GetCha
5980: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
5990: 70 2c 20 63 68 61 6e 2c 20 6f 70 74 69 6f 6e 4e  p, chan, optionN
59a0: 61 6d 65 2c 20 26 64 73 29 20 21 3d 20 54 43 4c  ame, &ds) != TCL
59b0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  _OK) {..    Tcl_
59c0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
59d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
59e0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 6c  L_ERROR;..}..Tcl
59f0: 5f 44 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  _DStringResult(i
5a00: 6e 74 65 72 70 2c 20 26 64 73 29 3b 0a 09 72 65  nterp, &ds);..re
5a10: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
5a20: 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d   }..    for (i =
5a30: 20 33 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 20   3; i < objc; i 
5a40: 2b 3d 20 32 29 20 7b 0a 09 6f 70 74 69 6f 6e 4e  += 2) {..optionN
5a50: 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69  ame = TclGetStri
5a60: 6e 67 28 6f 62 6a 76 5b 69 2d 31 5d 29 3b 0a 09  ng(objv[i-1]);..
5a70: 76 61 6c 75 65 4e 61 6d 65 20 3d 20 54 63 6c 47  valueName = TclG
5a80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
5a90: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 53 65 74 43  );..if (Tcl_SetC
5aa0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
5ab0: 65 72 70 2c 20 63 68 61 6e 2c 20 6f 70 74 69 6f  erp, chan, optio
5ac0: 6e 4e 61 6d 65 2c 20 76 61 6c 75 65 4e 61 6d 65  nName, valueName
5ad0: 29 0a 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  )...!= TCL_OK) {
5ae0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
5af0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
5b00: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
5b10: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5b70: 54 63 6c 5f 45 6f 66 4f 62 6a 43 6d 64 20 2d 2d  Tcl_EofObjCmd --
5b80: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
5b90: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
5ba0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 54  to process the T
5bb0: 63 6c 20 22 65 6f 66 22 20 63 6f 6d 6d 61 6e 64  cl "eof" command
5bc0: 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65  . See the. *.use
5bd0: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  r documentation 
5be0: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77  for details on w
5bf0: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a  hat it does.. *.
5c00: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
5c10: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
5c20: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
5c30: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74   effects:. *.Set
5c40: 73 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c  s interp's resul
5c50: 74 20 74 6f 20 62 6f 6f 6c 65 61 6e 20 74 72 75  t to boolean tru
5c60: 65 20 6f 72 20 66 61 6c 73 65 20 64 65 70 65 6e  e or false depen
5c70: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
5c80: 74 68 65 0a 20 2a 09 73 70 65 63 69 66 69 65 64  the. *.specified
5c90: 20 63 68 61 6e 6e 65 6c 20 68 61 73 20 61 6e 20   channel has an 
5ca0: 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20  EOF condition.. 
5cb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5d00: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 45 6f 66   */..int.Tcl_Eof
5d10: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
5d20: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
5d30: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
5d40: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72  interp,../* Curr
5d50: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
5d60: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65   */.    Tcl_Size
5d70: 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65   objc,../* Numbe
5d80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
5d90: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
5da0: 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20  const *objv)./* 
5db0: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73  Argument objects
5dc0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  . */.{.    Tcl_C
5dd0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 0a 20 20  hannel chan;..  
5de0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29    if (objc != 2)
5df0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
5e00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
5e10: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29  objv, "channel")
5e20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5e40: 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65  if (TclGetChanne
5e50: 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  lFromObj(interp,
5e60: 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c   objv[1], &chan,
5e70: 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 43 4c   NULL, 0) != TCL
5e80: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
5e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5ea0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
5eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
5ec0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
5ed0: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 29 29 3b  Tcl_Eof(chan)));
5ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5ef0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
5f50: 68 61 6e 49 73 42 69 6e 61 72 79 43 6d 64 20 2d  hanIsBinaryCmd -
5f60: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
5f70: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
5f80: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
5f90: 54 63 6c 20 22 63 68 61 6e 20 69 73 62 69 6e 61  Tcl "chan isbina
5fa0: 72 79 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65  ry" command. See
5fb0: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63   the. *.user doc
5fc0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64  umentation for d
5fd0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69  etails on what i
5fe0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65  t does.. *. * Re
5ff0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
6000: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
6010: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6020: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 69 6e 74  cts:. *.Sets int
6030: 65 72 70 27 73 20 72 65 73 75 6c 74 20 74 6f 20  erp's result to 
6040: 62 6f 6f 6c 65 61 6e 20 74 72 75 65 20 6f 72 20  boolean true or 
6050: 66 61 6c 73 65 20 64 65 70 65 6e 64 69 6e 67 20  false depending 
6060: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0a 20  on whether the. 
6070: 2a 09 73 70 65 63 69 66 69 65 64 20 63 68 61 6e  *.specified chan
6080: 6e 65 6c 20 69 73 20 61 20 62 69 6e 61 72 79 20  nel is a binary 
6090: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
60f0: 74 61 74 69 63 20 69 6e 74 0a 43 68 61 6e 49 73  tatic int.ChanIs
6100: 42 69 6e 61 72 79 43 6d 64 28 0a 20 20 20 20 54  BinaryCmd(.    T
6110: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
6120: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
6130: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43  p *interp,../* C
6140: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  urrent interpret
6150: 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53  er. */.    Tcl_S
6160: 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75  ize objc,../* Nu
6170: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
6180: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  s. */.    Tcl_Ob
6190: 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09  j *const *objv).
61a0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65  /* Argument obje
61b0: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  cts. */.{.    Tc
61c0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
61d0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
61e0: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
61f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
6200: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
6210: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
6220: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
6230: 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68 61     if (TclGetCha
6240: 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  nnelFromObj(inte
6250: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63 68  rp, objv[1], &ch
6260: 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d 20  an, NULL, 0) != 
6270: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
6280: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6290: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   }..    Tcl_SetO
62a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
62b0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
62c0: 62 6a 28 54 63 6c 43 68 61 6e 49 73 42 69 6e 61  bj(TclChanIsBina
62d0: 72 79 28 63 68 61 6e 29 29 29 3b 0a 20 20 20 20  ry(chan)));.    
62e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
62f0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6340: 2a 0a 20 2a 20 54 63 6c 5f 45 78 65 63 4f 62 6a  *. * Tcl_ExecObj
6350: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
6360: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
6370: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
6380: 20 74 68 65 20 22 65 78 65 63 22 20 54 63 6c 20   the "exec" Tcl 
6390: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65  command. See the
63a0: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e  . *.user documen
63b0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  tation for detai
63c0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f  ls on what it do
63d0: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
63e0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
63f0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
6400: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6410: 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72  . *.See the user
6420: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
6430: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6480: 0a 69 6e 74 0a 54 63 6c 5f 45 78 65 63 4f 62 6a  .int.Tcl_ExecObj
6490: 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
64a0: 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
64b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
64c0: 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74  erp,../* Current
64d0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f   interpreter. */
64e0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62  .    Tcl_Size ob
64f0: 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  jc,../* Number o
6500: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  f arguments. */.
6510: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
6520: 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67  st *objv)./* Arg
6530: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a  ument objects. *
6540: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.{.    Tcl_Obj 
6550: 2a 72 65 73 75 6c 74 50 74 72 3b 0a 20 20 20 20  *resultPtr;.    
6560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
6570: 76 3b 09 09 2f 2a 20 41 6e 20 61 72 72 61 79 20  v;../* An array 
6580: 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 61  for the string a
6590: 72 67 75 6d 65 6e 74 73 2e 20 53 74 6f 72 65 64  rguments. Stored
65a0: 0a 09 09 09 09 20 2a 20 6f 6e 20 74 68 65 20 5f  ..... * on the _
65b0: 54 63 6c 5f 20 73 74 61 63 6b 2e 20 2a 2f 0a 20  Tcl_ stack. */. 
65c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
65d0: 74 72 69 6e 67 3b 0a 20 20 20 20 54 63 6c 5f 43  tring;.    Tcl_C
65e0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
65f0: 20 69 6e 74 20 62 61 63 6b 67 72 6f 75 6e 64 2c   int background,
6600: 20 69 2c 20 69 6e 64 65 78 2c 20 6b 65 65 70 4e   i, index, keepN
6610: 65 77 6c 69 6e 65 2c 20 72 65 73 75 6c 74 2c 20  ewline, result, 
6620: 69 67 6e 6f 72 65 53 74 64 65 72 72 3b 0a 20 20  ignoreStderr;.  
6630: 20 20 54 63 6c 5f 53 69 7a 65 20 61 72 67 63 2c    Tcl_Size argc,
6640: 20 6c 65 6e 67 74 68 2c 20 73 6b 69 70 3b 0a 20   length, skip;. 
6650: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6660: 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f 70 74 69  char *const opti
6670: 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 69 67 6e  ons[] = {.."-ign
6680: 6f 72 65 73 74 64 65 72 72 22 2c 20 22 2d 6b 65  orestderr", "-ke
6690: 65 70 6e 65 77 6c 69 6e 65 22 2c 20 22 2d 65 6e  epnewline", "-en
66a0: 63 6f 64 69 6e 67 22 2c 20 22 2d 2d 22 2c 20 4e  coding", "--", N
66b0: 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65  ULL.    };.    e
66c0: 6e 75 6d 20 65 78 65 63 4f 70 74 69 6f 6e 73 45  num execOptionsE
66d0: 6e 75 6d 20 7b 0a 09 45 58 45 43 5f 49 47 4e 4f  num {..EXEC_IGNO
66e0: 52 45 53 54 44 45 52 52 2c 20 45 58 45 43 5f 4b  RESTDERR, EXEC_K
66f0: 45 45 50 4e 45 57 4c 49 4e 45 2c 20 45 58 45 43  EEPNEWLINE, EXEC
6700: 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 58 45 43 5f  _ENCODING, EXEC_
6710: 4c 41 53 54 0a 20 20 20 20 7d 3b 0a 20 20 20 20  LAST.    };.    
6720: 54 63 6c 5f 4f 62 6a 20 2a 65 6e 63 6f 64 69 6e  Tcl_Obj *encodin
6730: 67 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  gObj = NULL;..  
6740: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63    /*.     * Chec
6750: 6b 20 66 6f 72 20 61 6e 79 20 6c 65 61 64 69 6e  k for any leadin
6760: 67 20 6f 70 74 69 6f 6e 20 61 72 67 75 6d 65 6e  g option argumen
6770: 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ts..     */..   
6780: 20 6b 65 65 70 4e 65 77 6c 69 6e 65 20 3d 20 30   keepNewline = 0
6790: 3b 0a 20 20 20 20 69 67 6e 6f 72 65 53 74 64 65  ;.    ignoreStde
67a0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 20  rr = 0;.    for 
67b0: 28 73 6b 69 70 20 3d 20 31 3b 20 73 6b 69 70 20  (skip = 1; skip 
67c0: 3c 20 6f 62 6a 63 3b 20 73 6b 69 70 2b 2b 29 20  < objc; skip++) 
67d0: 7b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 47  {..string = TclG
67e0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 73 6b  etString(objv[sk
67f0: 69 70 5d 29 3b 0a 09 69 66 20 28 73 74 72 69 6e  ip]);..if (strin
6800: 67 5b 30 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09  g[0] != '-') {..
6810: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 69      break;..}..i
6820: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
6830: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
6840: 62 6a 76 5b 73 6b 69 70 5d 2c 20 6f 70 74 69 6f  bjv[skip], optio
6850: 6e 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 0a 09 09  ns, "option",...
6860: 54 43 4c 5f 45 58 41 43 54 2c 20 26 69 6e 64 65  TCL_EXACT, &inde
6870: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  x) != TCL_OK) {.
6880: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6890: 45 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 69  ERROR;..}..if (i
68a0: 6e 64 65 78 20 3d 3d 20 45 58 45 43 5f 4c 41 53  ndex == EXEC_LAS
68b0: 54 29 20 7b 0a 09 20 20 20 20 73 6b 69 70 2b 2b  T) {..    skip++
68c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
68d0: 0a 09 73 77 69 74 63 68 20 28 69 6e 64 65 78 29  ..switch (index)
68e0: 20 7b 0a 09 63 61 73 65 20 45 58 45 43 5f 4b 45   {..case EXEC_KE
68f0: 45 50 4e 45 57 4c 49 4e 45 3a 0a 09 20 20 20 20  EPNEWLINE:..    
6900: 6b 65 65 70 4e 65 77 6c 69 6e 65 20 3d 20 31 3b  keepNewline = 1;
6910: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
6920: 73 65 20 45 58 45 43 5f 49 47 4e 4f 52 45 53 54  se EXEC_IGNOREST
6930: 44 45 52 52 3a 0a 09 20 20 20 20 69 67 6e 6f 72  DERR:..    ignor
6940: 65 53 74 64 65 72 72 20 3d 20 31 3b 0a 09 20 20  eStderr = 1;..  
6950: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 45    break;..case E
6960: 58 45 43 5f 45 4e 43 4f 44 49 4e 47 3a 0a 09 20  XEC_ENCODING:.. 
6970: 20 20 20 69 66 20 28 2b 2b 73 6b 69 70 20 3e 3d     if (++skip >=
6980: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53   objc) {...Tcl_S
6990: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
69a0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
69b0: 67 4f 62 6a 28 22 4e 6f 20 76 61 6c 75 65 20 67  gObj("No value g
69c0: 69 76 65 6e 20 66 6f 72 20 6f 70 74 69 6f 6e 20  iven for option 
69d0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 2d 31 29 29  -encoding", -1))
69e0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
69f0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73  RROR;..    } els
6a00: 65 20 7b 0a 09 09 54 63 6c 5f 45 6e 63 6f 64 69  e {...Tcl_Encodi
6a10: 6e 67 20 65 6e 63 6f 64 69 6e 67 3b 0a 09 09 65  ng encoding;...e
6a20: 6e 63 6f 64 69 6e 67 4f 62 6a 20 3d 20 6f 62 6a  ncodingObj = obj
6a30: 76 5b 73 6b 69 70 5d 3b 0a 09 09 2f 2a 20 56 65  v[skip];.../* Ve
6a40: 72 69 66 79 20 76 61 6c 69 64 69 74 79 20 2d 20  rify validity - 
6a50: 62 75 67 20 5b 64 61 35 65 31 62 63 37 62 63 5d  bug [da5e1bc7bc]
6a60: 20 2a 2f 0a 09 09 69 66 20 28 54 63 6c 5f 47 65   */...if (Tcl_Ge
6a70: 74 45 6e 63 6f 64 69 6e 67 46 72 6f 6d 4f 62 6a  tEncodingFromObj
6a80: 28 69 6e 74 65 72 70 2c 20 65 6e 63 6f 64 69 6e  (interp, encodin
6a90: 67 4f 62 6a 2c 20 26 65 6e 63 6f 64 69 6e 67 29  gObj, &encoding)
6aa0: 0a 09 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ....!= TCL_OK) {
6ab0: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
6ac0: 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 54  L_ERROR;...}...T
6ad0: 63 6c 5f 46 72 65 65 45 6e 63 6f 64 69 6e 67 28  cl_FreeEncoding(
6ae0: 65 6e 63 6f 64 69 6e 67 29 3b 0a 09 20 20 20 20  encoding);..    
6af0: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 64  }..    break;..d
6b00: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 54 43 4c  efault:..    TCL
6b10: 5f 55 4e 52 45 41 43 48 41 42 4c 45 28 29 3b 0a  _UNREACHABLE();.
6b20: 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  .}.    }.    if 
6b30: 28 6f 62 6a 63 20 3c 3d 20 73 6b 69 70 29 20 7b  (objc <= skip) {
6b40: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
6b50: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
6b60: 6a 76 2c 20 22 3f 2d 6f 70 74 69 6f 6e 20 2e 2e  jv, "?-option ..
6b70: 2e 3f 20 61 72 67 20 3f 61 72 67 20 2e 2e 2e 3f  .? arg ?arg ...?
6b80: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
6b90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6ba0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 20    /*.     * See 
6bb0: 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69  if the command i
6bc0: 73 20 74 6f 20 62 65 20 72 75 6e 20 69 6e 20 62  s to be run in b
6bd0: 61 63 6b 67 72 6f 75 6e 64 2e 0a 20 20 20 20 20  ackground..     
6be0: 2a 2f 0a 0a 20 20 20 20 62 61 63 6b 67 72 6f 75  */..    backgrou
6bf0: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 69  nd = 0;.    stri
6c00: 6e 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e  ng = TclGetStrin
6c10: 67 28 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d  g(objv[objc - 1]
6c20: 29 3b 0a 20 20 20 20 69 66 20 28 28 73 74 72 69  );.    if ((stri
6c30: 6e 67 5b 30 5d 20 3d 3d 20 27 26 27 29 20 26 26  ng[0] == '&') &&
6c40: 20 28 73 74 72 69 6e 67 5b 31 5d 20 3d 3d 20 27   (string[1] == '
6c50: 5c 30 27 29 29 20 7b 0a 09 6f 62 6a 63 2d 2d 3b  \0')) {..objc--;
6c60: 0a 09 62 61 63 6b 67 72 6f 75 6e 64 20 3d 20 31  ..background = 1
6c70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
6c80: 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 74 68       * Create th
6c90: 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e  e string argumen
6ca0: 74 20 61 72 72 61 79 20 22 61 72 67 76 22 2e 20  t array "argv". 
6cb0: 4d 61 6b 65 20 73 75 72 65 20 61 72 67 76 20 69  Make sure argv i
6cc0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 0a 20  s large enough. 
6cd0: 20 20 20 20 2a 20 74 6f 20 68 6f 6c 64 20 74 68      * to hold th
6ce0: 65 20 61 72 67 63 20 61 72 67 75 6d 65 6e 74 73  e argc arguments
6cf0: 20 70 6c 75 73 20 31 20 65 78 74 72 61 20 66 6f   plus 1 extra fo
6d00: 72 20 74 68 65 20 7a 65 72 6f 20 65 6e 64 2d 6f  r the zero end-o
6d10: 66 2d 61 72 67 76 20 77 6f 72 64 2e 0a 20 20 20  f-argv word..   
6d20: 20 20 2a 2f 0a 0a 20 20 20 20 61 72 67 63 20 3d    */..    argc =
6d30: 20 6f 62 6a 63 20 2d 20 73 6b 69 70 3b 0a 20 20   objc - skip;.  
6d40: 20 20 61 72 67 76 20 3d 20 28 63 6f 6e 73 74 20    argv = (const 
6d50: 63 68 61 72 20 2a 2a 29 54 63 6c 53 74 61 63 6b  char **)TclStack
6d60: 41 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 28 61  Alloc(interp, (a
6d70: 72 67 63 20 2b 20 31 29 20 2a 20 73 69 7a 65 6f  rgc + 1) * sizeo
6d80: 66 28 63 68 61 72 20 2a 29 29 3b 0a 0a 20 20 20  f(char *));..   
6d90: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 70 79 20   /*.     * Copy 
6da0: 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 76 65  the string conve
6db0: 72 73 69 6f 6e 73 20 6f 66 20 65 61 63 68 20 28  rsions of each (
6dc0: 70 6f 73 74 20 6f 70 74 69 6f 6e 29 20 6f 62 6a  post option) obj
6dd0: 65 63 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ect into the.   
6de0: 20 20 2a 20 61 72 67 75 6d 65 6e 74 20 76 65 63    * argument vec
6df0: 74 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  tor..     */..  
6e00: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
6e10: 3c 20 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 09  < argc; i++) {..
6e20: 61 72 67 76 5b 69 5d 20 3d 20 54 63 6c 47 65 74  argv[i] = TclGet
6e30: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 20 2b 20  String(objv[i + 
6e40: 73 6b 69 70 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  skip]);.    }.  
6e50: 20 20 61 72 67 76 5b 61 72 67 63 5d 20 3d 20 4e    argv[argc] = N
6e60: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20  ULL;.    chan = 
6e70: 54 63 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 43  Tcl_OpenCommandC
6e80: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 61  hannel(interp, a
6e90: 72 67 63 2c 20 61 72 67 76 2c 20 28 62 61 63 6b  rgc, argv, (back
6ea0: 67 72 6f 75 6e 64 20 3f 20 30 20 3a 0a 09 20 20  ground ? 0 :..  
6eb0: 20 20 69 67 6e 6f 72 65 53 74 64 65 72 72 20 3f    ignoreStderr ?
6ec0: 20 54 43 4c 5f 53 54 44 4f 55 54 20 3a 20 54 43   TCL_STDOUT : TC
6ed0: 4c 5f 53 54 44 4f 55 54 7c 54 43 4c 5f 53 54 44  L_STDOUT|TCL_STD
6ee0: 45 52 52 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ERR));..    /*. 
6ef0: 20 20 20 20 2a 20 46 72 65 65 20 74 68 65 20 61      * Free the a
6f00: 72 67 76 20 61 72 72 61 79 2e 0a 20 20 20 20 20  rgv array..     
6f10: 2a 2f 0a 0a 20 20 20 20 54 63 6c 53 74 61 63 6b  */..    TclStack
6f20: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 28 76 6f  Free(interp, (vo
6f30: 69 64 20 2a 29 20 61 72 67 76 29 3b 0a 0a 20 20  id *) argv);..  
6f40: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55    if (chan == NU
6f50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
6f60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
6f70: 20 20 20 20 69 66 20 28 62 61 63 6b 67 72 6f 75      if (backgrou
6f80: 6e 64 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74  nd) {../*.. * St
6f90: 6f 72 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ore the list of 
6fa0: 50 49 44 73 20 66 72 6f 6d 20 74 68 65 20 70 69  PIDs from the pi
6fb0: 70 65 6c 69 6e 65 20 69 6e 20 69 6e 74 65 72 70  peline in interp
6fc0: 27 73 20 72 65 73 75 6c 74 20 61 6e 64 0a 09 20  's result and.. 
6fd0: 2a 20 64 65 74 61 63 68 20 74 68 65 20 50 49 44  * detach the PID
6fe0: 73 20 28 69 6e 73 74 65 61 64 20 6f 66 20 77 61  s (instead of wa
6ff0: 69 74 69 6e 67 20 66 6f 72 20 74 68 65 6d 29 2e  iting for them).
7000: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 47 65 74 41 6e  .. */...TclGetAn
7010: 64 44 65 74 61 63 68 50 69 64 73 28 69 6e 74 65  dDetachPids(inte
7020: 72 70 2c 20 63 68 61 6e 29 3b 0a 09 69 66 20 28  rp, chan);..if (
7030: 54 63 6c 5f 43 6c 6f 73 65 45 78 28 69 6e 74 65  Tcl_CloseEx(inte
7040: 72 70 2c 20 63 68 61 6e 2c 20 30 29 20 21 3d 20  rp, chan, 0) != 
7050: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
7060: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7070: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ..}..return TCL_
7080: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
7090: 2a 20 42 75 67 20 5b 30 66 31 64 64 63 30 64 66  * Bug [0f1ddc0df
70a0: 37 5d 20 2d 20 65 6e 63 6f 64 69 6e 67 20 65 72  7] - encoding er
70b0: 72 6f 72 73 20 2d 20 75 73 65 20 72 65 70 6c 61  rors - use repla
70c0: 63 65 20 70 72 6f 66 69 6c 65 20 2a 2f 0a 20 20  ce profile */.  
70d0: 20 20 69 66 20 28 54 63 6c 5f 53 65 74 43 68 61    if (Tcl_SetCha
70e0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
70f0: 70 2c 20 63 68 61 6e 2c 20 22 2d 70 72 6f 66 69  p, chan, "-profi
7100: 6c 65 22 2c 20 22 72 65 70 6c 61 63 65 22 29 20  le", "replace") 
7110: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f  != TCL_OK) {..go
7120: 74 6f 20 65 72 72 6f 72 57 69 74 68 4f 70 65 6e  to errorWithOpen
7130: 43 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 7d 0a 0a  Channel;.    }..
7140: 20 20 20 20 2f 2a 20 54 49 50 20 37 31 36 20 2a      /* TIP 716 *
7150: 2f 0a 20 20 20 20 69 66 20 28 65 6e 63 6f 64 69  /.    if (encodi
7160: 6e 67 4f 62 6a 20 26 26 0a 09 20 20 20 20 54 63  ngObj &&..    Tc
7170: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
7180: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
7190: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 0a 09 09   "-encoding",...
71a0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
71b0: 67 28 65 6e 63 6f 64 69 6e 67 4f 62 6a 29 29 20  g(encodingObj)) 
71c0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f  != TCL_OK) {..go
71d0: 74 6f 20 65 72 72 6f 72 57 69 74 68 4f 70 65 6e  to errorWithOpen
71e0: 43 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 7d 0a 0a  Channel;.    }..
71f0: 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a 28 72 65      TclNewObj(re
7200: 73 75 6c 74 50 74 72 29 3b 0a 20 20 20 20 69 66  sultPtr);.    if
7210: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
7220: 48 61 6e 64 6c 65 28 63 68 61 6e 2c 20 54 43 4c  Handle(chan, TCL
7230: 5f 52 45 41 44 41 42 4c 45 2c 20 4e 55 4c 4c 29  _READABLE, NULL)
7240: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 69   == TCL_OK) {..i
7250: 66 20 28 54 63 6c 5f 52 65 61 64 43 68 61 72 73  f (Tcl_ReadChars
7260: 28 63 68 61 6e 2c 20 72 65 73 75 6c 74 50 74 72  (chan, resultPtr
7270: 2c 20 2d 31 2c 20 30 29 20 3d 3d 20 54 43 4c 5f  , -1, 0) == TCL_
7280: 49 4f 5f 46 41 49 4c 55 52 45 29 20 7b 0a 09 20  IO_FAILURE) {.. 
7290: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 49     /*..     * TI
72a0: 50 20 23 32 31 39 2e 0a 09 20 20 20 20 20 2a 20  P #219...     * 
72b0: 43 61 70 74 75 72 65 20 65 72 72 6f 72 20 6d 65  Capture error me
72c0: 73 73 61 67 65 73 20 70 75 74 20 62 79 20 74 68  ssages put by th
72d0: 65 20 64 72 69 76 65 72 20 69 6e 74 6f 20 74 68  e driver into th
72e0: 65 20 62 79 70 61 73 73 20 61 72 65 61 0a 09 20  e bypass area.. 
72f0: 20 20 20 20 2a 20 61 6e 64 20 70 75 74 20 74 68      * and put th
7300: 65 6d 20 69 6e 74 6f 20 74 68 65 20 72 65 67 75  em into the regu
7310: 6c 61 72 20 69 6e 74 65 72 70 72 65 74 65 72 20  lar interpreter 
7320: 72 65 73 75 6c 74 2e 20 46 61 6c 6c 20 62 61 63  result. Fall bac
7330: 6b 20 74 6f 0a 09 20 20 20 20 20 2a 20 74 68 65  k to..     * the
7340: 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 65   regular message
7350: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 20   if nothing was 
7360: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 70  found in the byp
7370: 61 73 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  ass...     */...
7380: 20 20 20 20 69 66 20 28 21 54 63 6c 43 68 61 6e      if (!TclChan
7390: 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 73  CaughtErrorBypas
73a0: 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 29  s(interp, chan))
73b0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
73c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
73d0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09  l_ObjPrintf(....
73e0: 22 65 72 72 6f 72 20 72 65 61 64 69 6e 67 20 6f  "error reading o
73f0: 75 74 70 75 74 20 66 72 6f 6d 20 63 6f 6d 6d 61  utput from comma
7400: 6e 64 3a 20 25 73 22 2c 0a 09 09 09 54 63 6c 5f  nd: %s",....Tcl_
7410: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
7420: 70 29 29 29 3b 0a 09 09 54 63 6c 5f 44 65 63 72  p)));...Tcl_Decr
7430: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 50  RefCount(resultP
7440: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  tr);..    }..   
7450: 20 67 6f 74 6f 20 65 72 72 6f 72 57 69 74 68 4f   goto errorWithO
7460: 70 65 6e 43 68 61 6e 6e 65 6c 3b 0a 09 7d 0a 20  penChannel;..}. 
7470: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
7480: 20 20 2a 20 49 66 20 74 68 65 20 70 72 6f 63 65    * If the proce
7490: 73 73 20 70 72 6f 64 75 63 65 64 20 61 6e 79 74  ss produced anyt
74a0: 68 69 6e 67 20 6f 6e 20 73 74 64 65 72 72 2c 20  hing on stderr, 
74b0: 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  it will have bee
74c0: 6e 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20  n returned.     
74d0: 2a 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72  * in the interpr
74e0: 65 74 65 72 20 72 65 73 75 6c 74 2e 20 49 74 20  eter result. It 
74f0: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 70 70 65  needs to be appe
7500: 6e 64 65 64 20 74 6f 20 74 68 65 20 72 65 73 75  nded to the resu
7510: 6c 74 0a 20 20 20 20 20 2a 20 73 74 72 69 6e 67  lt.     * string
7520: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72  ..     */..    r
7530: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 43 6c 6f 73  esult = Tcl_Clos
7540: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  eEx(interp, chan
7550: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  , 0);.    Tcl_Ap
7560: 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 72 65 73  pendObjToObj(res
7570: 75 6c 74 50 74 72 2c 20 54 63 6c 5f 47 65 74 4f  ultPtr, Tcl_GetO
7580: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
7590: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
75a0: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 68  * If the last ch
75b0: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 72  aracter of the r
75c0: 65 73 75 6c 74 20 69 73 20 61 20 6e 65 77 6c 69  esult is a newli
75d0: 6e 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ne, then remove 
75e0: 74 68 65 0a 20 20 20 20 20 2a 20 6e 65 77 6c 69  the.     * newli
75f0: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  ne character..  
7600: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6b     */..    if (k
7610: 65 65 70 4e 65 77 6c 69 6e 65 20 3d 3d 20 30 29  eepNewline == 0)
7620: 20 7b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c   {..string = Tcl
7630: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7640: 28 72 65 73 75 6c 74 50 74 72 2c 20 26 6c 65 6e  (resultPtr, &len
7650: 67 74 68 29 3b 0a 09 69 66 20 28 28 6c 65 6e 67  gth);..if ((leng
7660: 74 68 20 3e 20 30 29 20 26 26 20 28 73 74 72 69  th > 0) && (stri
7670: 6e 67 5b 6c 65 6e 67 74 68 20 2d 20 31 5d 20 3d  ng[length - 1] =
7680: 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 20 20 20 20  = '\n')) {..    
7690: 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 6e 67 74 68  Tcl_SetObjLength
76a0: 28 72 65 73 75 6c 74 50 74 72 2c 20 6c 65 6e 67  (resultPtr, leng
76b0: 74 68 20 2d 20 31 29 3b 0a 09 7d 0a 20 20 20 20  th - 1);..}.    
76c0: 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
76d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72  Result(interp, r
76e0: 65 73 75 6c 74 50 74 72 29 3b 0a 0a 20 20 20 20  esultPtr);..    
76f0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 0a  return result;..
7700: 65 72 72 6f 72 57 69 74 68 4f 70 65 6e 43 68 61  errorWithOpenCha
7710: 6e 6e 65 6c 3a 0a 20 20 20 20 2f 2a 20 49 6e 74  nnel:.    /* Int
7720: 65 72 70 72 65 74 65 72 20 73 68 6f 75 6c 64 20  erpreter should 
7730: 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 20  already contain 
7740: 65 72 72 6f 72 2e 20 50 61 73 73 20 4e 55 4c 4c  error. Pass NULL
7750: 20 74 6f 20 6e 6f 74 20 6f 76 65 72 77 72 69 74   to not overwrit
7760: 65 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 54  e */.    (void)T
7770: 63 6c 5f 43 6c 6f 73 65 45 78 28 4e 55 4c 4c 2c  cl_CloseEx(NULL,
7780: 20 63 68 61 6e 2c 20 30 29 3b 0a 20 20 20 20 72   chan, 0);.    r
7790: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
77a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f  -----. *. * Tcl_
7800: 46 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64 20 2d  FblockedObjCmd -
7810: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
7820: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
7830: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
7840: 54 63 6c 20 22 66 62 6c 6f 63 6b 65 64 22 20 63  Tcl "fblocked" c
7850: 6f 6d 6d 61 6e 64 2e 20 53 65 65 0a 20 2a 09 74  ommand. See. *.t
7860: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
7870: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ation for detail
7880: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65  s on what it doe
7890: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
78a0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
78b0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
78c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
78d0: 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73   *.Sets interp's
78e0: 20 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65   result to boole
78f0: 61 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  an true or false
7900: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
7910: 65 74 68 65 72 20 74 68 65 0a 20 2a 09 70 72 65  ether the. *.pre
7920: 63 65 64 69 6e 67 20 69 6e 70 75 74 20 6f 70 65  ceding input ope
7930: 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 68  ration on the ch
7940: 61 6e 6e 65 6c 20 77 6f 75 6c 64 20 68 61 76 65  annel would have
7950: 20 62 6c 6f 63 6b 65 64 2e 0a 20 2a 0a 20 2a 2d   blocked.. *. *-
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
79b0: 69 6e 74 0a 54 63 6c 5f 46 62 6c 6f 63 6b 65 64  int.Tcl_Fblocked
79c0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
79d0: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
79e0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
79f0: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72  interp,../* Curr
7a00: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
7a10: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65   */.    Tcl_Size
7a20: 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 65   objc,../* Numbe
7a30: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
7a40: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
7a50: 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a 20  const *objv)./* 
7a60: 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73  Argument objects
7a70: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  . */.{.    Tcl_C
7a80: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
7a90: 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20   int mode;..    
7aa0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
7ab0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7ac0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7ad0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
7ae0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7af0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
7b00: 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46   (TclGetChannelF
7b10: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7b20: 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 26  bjv[1], &chan, &
7b30: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f  mode, 0) != TCL_
7b40: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7b50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7b60: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20     if (!(mode & 
7b70: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b  TCL_READABLE)) {
7b80: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
7b90: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
7ba0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61  bjPrintf(..."cha
7bb0: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e  nnel \"%s\" wasn
7bc0: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  't opened for re
7bd0: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74  ading",...TclGet
7be0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
7bf0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7c00: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
7c10: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
7c20: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
7c30: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 54 63 6c 5f  wBooleanObj(Tcl_
7c40: 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 61  InputBlocked(cha
7c50: 6e 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n)));.    return
7c60: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
7c70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
7cc0: 63 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 20 2d 2d  cl_OpenObjCmd --
7cd0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
7ce0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
7cf0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
7d00: 6f 70 65 6e 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  open" Tcl comman
7d10: 64 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73  d. See the. *.us
7d20: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  er documentation
7d30: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20   for details on 
7d40: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a  what it does.. *
7d50: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7d60: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7d70: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
7d80: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
7d90: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d  e the user docum
7da0: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d  entation.. *. *-
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
7e00: 63 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 28 0a 20  cl_OpenObjCmd(. 
7e10: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
7e20: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
7e30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
7e40: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
7e50: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54  preter. */.    T
7e60: 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f  cl_Size objc,../
7e70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
7e80: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
7e90: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62  l_Obj *const *ob
7ea0: 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20  jv)./* Argument 
7eb0: 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20  objects. */.{.  
7ec0: 20 20 69 6e 74 20 70 69 70 65 6c 69 6e 65 2c 20    int pipeline, 
7ed0: 70 72 6f 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  prot;.    const 
7ee0: 63 68 61 72 20 2a 6d 6f 64 65 53 74 72 69 6e 67  char *modeString
7ef0: 2c 20 2a 77 68 61 74 3b 0a 20 20 20 20 54 63 6c  , *what;.    Tcl
7f00: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 0a  _Channel chan;..
7f10: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20      if ((objc < 
7f20: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29  2) || (objc > 4)
7f30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
7f40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7f50: 20 6f 62 6a 76 2c 20 22 66 69 6c 65 4e 61 6d 65   objv, "fileName
7f60: 20 3f 61 63 63 65 73 73 3f 20 3f 70 65 72 6d 69   ?access? ?permi
7f70: 73 73 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ssions?");..retu
7f80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7f90: 20 20 7d 0a 20 20 20 20 70 72 6f 74 20 3d 20 30    }.    prot = 0
7fa0: 36 36 36 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a  666;.    if (obj
7fb0: 63 20 3d 3d 20 32 29 20 7b 0a 09 6d 6f 64 65 53  c == 2) {..modeS
7fc0: 74 72 69 6e 67 20 3d 20 22 72 22 3b 0a 20 20 20  tring = "r";.   
7fd0: 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 6f 64 65 53   } else {..modeS
7fe0: 74 72 69 6e 67 20 3d 20 54 63 6c 47 65 74 53 74  tring = TclGetSt
7ff0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09  ring(objv[2]);..
8000: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 34 29 20 7b  if (objc == 4) {
8010: 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ..    const char
8020: 20 2a 70 65 72 6d 53 74 72 69 6e 67 20 3d 20 54   *permString = T
8030: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  clGetString(objv
8040: 5b 33 5d 29 3b 0a 09 20 20 20 20 69 6e 74 20 63  [3]);..    int c
8050: 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  ode = TCL_ERROR;
8060: 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73  ..    Tcl_Size s
8070: 63 61 6e 6e 65 64 20 3d 20 54 63 6c 50 61 72 73  canned = TclPars
8080: 65 41 6c 6c 57 68 69 74 65 53 70 61 63 65 28 70  eAllWhiteSpace(p
8090: 65 72 6d 53 74 72 69 6e 67 2c 20 2d 31 29 3b 0a  ermString, -1);.
80a0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
80b0: 20 53 75 70 70 6f 72 74 20 6c 65 67 61 63 79 20   Support legacy 
80c0: 6f 63 74 61 6c 20 6e 75 6d 62 65 72 73 2e 0a 09  octal numbers...
80d0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
80e0: 20 28 28 70 65 72 6d 53 74 72 69 6e 67 5b 73 63   ((permString[sc
80f0: 61 6e 6e 65 64 5d 20 3d 3d 20 27 30 27 29 0a 09  anned] == '0')..
8100: 09 20 20 20 20 26 26 20 28 70 65 72 6d 53 74 72  .    && (permStr
8110: 69 6e 67 5b 73 63 61 6e 6e 65 64 2b 31 5d 20 3e  ing[scanned+1] >
8120: 3d 20 27 30 27 29 0a 09 09 20 20 20 20 26 26 20  = '0')...    && 
8130: 28 70 65 72 6d 53 74 72 69 6e 67 5b 73 63 61 6e  (permString[scan
8140: 6e 65 64 2b 31 5d 20 3c 3d 20 27 37 27 29 29 20  ned+1] <= '7')) 
8150: 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20 2a 70 65 72  {...Tcl_Obj *per
8160: 6d 4f 62 6a 3b 0a 0a 09 09 54 63 6c 4e 65 77 4c  mObj;....TclNewL
8170: 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28  iteralStringObj(
8180: 70 65 72 6d 4f 62 6a 2c 20 22 30 6f 22 29 3b 0a  permObj, "0o");.
8190: 09 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62  ..Tcl_AppendToOb
81a0: 6a 28 70 65 72 6d 4f 62 6a 2c 20 70 65 72 6d 53  j(permObj, permS
81b0: 74 72 69 6e 67 2b 73 63 61 6e 6e 65 64 2b 31 2c  tring+scanned+1,
81c0: 20 2d 31 29 3b 0a 09 09 63 6f 64 65 20 3d 20 54   -1);...code = T
81d0: 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  clGetIntFromObj(
81e0: 4e 55 4c 4c 2c 20 70 65 72 6d 4f 62 6a 2c 20 26  NULL, permObj, &
81f0: 70 72 6f 74 29 3b 0a 09 09 54 63 6c 5f 44 65 63  prot);...Tcl_Dec
8200: 72 52 65 66 43 6f 75 6e 74 28 70 65 72 6d 4f 62  rRefCount(permOb
8210: 6a 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  j);..    }...   
8220: 20 69 66 20 28 28 63 6f 64 65 20 3d 3d 20 54 43   if ((code == TC
8230: 4c 5f 45 52 52 4f 52 29 0a 09 09 20 20 20 20 26  L_ERROR)...    &
8240: 26 20 54 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f  & TclGetIntFromO
8250: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
8260: 33 5d 2c 20 26 70 72 6f 74 29 20 21 3d 20 54 43  3], &prot) != TC
8270: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
8280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
8290: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20   }..}.    }..   
82a0: 20 70 69 70 65 6c 69 6e 65 20 3d 20 30 3b 0a 20   pipeline = 0;. 
82b0: 20 20 20 77 68 61 74 20 3d 20 54 63 6c 47 65 74     what = TclGet
82c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
82d0: 0a 20 20 20 20 69 66 20 28 77 68 61 74 5b 30 5d  .    if (what[0]
82e0: 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 70 69 70 65   == '|') {..pipe
82f0: 6c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  line = 1;.    }.
8300: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f  .    /*.     * O
8310: 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6f 72 20  pen the file or 
8320: 63 72 65 61 74 65 20 61 20 70 72 6f 63 65 73 73  create a process
8330: 20 70 69 70 65 6c 69 6e 65 2e 0a 20 20 20 20 20   pipeline..     
8340: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 70 69 70  */..    if (!pip
8350: 65 6c 69 6e 65 29 20 7b 0a 09 63 68 61 6e 20 3d  eline) {..chan =
8360: 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 43   Tcl_FSOpenFileC
8370: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6f  hannel(interp, o
8380: 62 6a 76 5b 31 5d 2c 20 6d 6f 64 65 53 74 72 69  bjv[1], modeStri
8390: 6e 67 2c 20 70 72 6f 74 29 3b 0a 20 20 20 20 7d  ng, prot);.    }
83a0: 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 6d 6f 64   else {..int mod
83b0: 65 2c 20 6d 6f 64 65 46 6c 61 67 73 3b 0a 09 54  e, modeFlags;..T
83c0: 63 6c 5f 53 69 7a 65 20 63 6d 64 4f 62 6a 63 3b  cl_Size cmdObjc;
83d0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 63  ..const char **c
83e0: 6d 64 41 72 67 76 3b 0a 0a 09 69 66 20 28 54 63  mdArgv;...if (Tc
83f0: 6c 5f 53 70 6c 69 74 4c 69 73 74 28 69 6e 74 65  l_SplitList(inte
8400: 72 70 2c 20 77 68 61 74 2b 31 2c 20 26 63 6d 64  rp, what+1, &cmd
8410: 4f 62 6a 63 2c 20 26 63 6d 64 41 72 67 76 29 20  Objc, &cmdArgv) 
8420: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
8430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8440: 4f 52 3b 0a 09 7d 0a 0a 09 6d 6f 64 65 20 3d 20  OR;..}...mode = 
8450: 54 63 6c 47 65 74 4f 70 65 6e 4d 6f 64 65 28 69  TclGetOpenMode(i
8460: 6e 74 65 72 70 2c 20 6d 6f 64 65 53 74 72 69 6e  nterp, modeStrin
8470: 67 2c 20 26 6d 6f 64 65 46 6c 61 67 73 29 3b 0a  g, &modeFlags);.
8480: 09 69 66 20 28 6d 6f 64 65 20 3d 3d 20 2d 31 29  .if (mode == -1)
8490: 20 7b 0a 09 20 20 20 20 63 68 61 6e 20 3d 20 4e   {..    chan = N
84a0: 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ULL;..} else {..
84b0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
84c0: 54 43 4c 5f 53 54 44 45 52 52 20 7c 20 54 43 4c  TCL_STDERR | TCL
84d0: 5f 45 4e 46 4f 52 43 45 5f 4d 4f 44 45 3b 0a 0a  _ENFORCE_MODE;..
84e0: 09 20 20 20 20 73 77 69 74 63 68 20 28 6d 6f 64  .    switch (mod
84f0: 65 20 26 20 4f 5f 41 43 43 4d 4f 44 45 29 20 7b  e & O_ACCMODE) {
8500: 0a 09 20 20 20 20 63 61 73 65 20 4f 5f 52 44 4f  ..    case O_RDO
8510: 4e 4c 59 3a 0a 09 09 66 6c 61 67 73 20 7c 3d 20  NLY:...flags |= 
8520: 54 43 4c 5f 53 54 44 4f 55 54 3b 0a 09 09 62 72  TCL_STDOUT;...br
8530: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 4f  eak;..    case O
8540: 5f 57 52 4f 4e 4c 59 3a 0a 09 09 66 6c 61 67 73  _WRONLY:...flags
8550: 20 7c 3d 20 54 43 4c 5f 53 54 44 49 4e 3b 0a 09   |= TCL_STDIN;..
8560: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
8570: 65 20 4f 5f 52 44 57 52 3a 0a 09 09 66 6c 61 67  e O_RDWR:...flag
8580: 73 20 7c 3d 20 28 54 43 4c 5f 53 54 44 49 4e 20  s |= (TCL_STDIN 
8590: 7c 20 54 43 4c 5f 53 54 44 4f 55 54 29 3b 0a 09  | TCL_STDOUT);..
85a0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64 65 66  .break;..    def
85b0: 61 75 6c 74 3a 0a 09 09 54 63 6c 5f 50 61 6e 69  ault:...Tcl_Pani
85c0: 63 28 22 54 63 6c 5f 4f 70 65 6e 43 6d 64 3a 20  c("Tcl_OpenCmd: 
85d0: 69 6e 76 61 6c 69 64 20 6d 6f 64 65 20 76 61 6c  invalid mode val
85e0: 75 65 22 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  ue");...break;..
85f0: 20 20 20 20 7d 0a 09 20 20 20 20 63 68 61 6e 20      }..    chan 
8600: 3d 20 54 63 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e  = Tcl_OpenComman
8610: 64 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  dChannel(interp,
8620: 20 63 6d 64 4f 62 6a 63 2c 20 63 6d 64 41 72 67   cmdObjc, cmdArg
8630: 76 2c 20 66 6c 61 67 73 29 3b 0a 09 20 20 20 20  v, flags);..    
8640: 69 66 20 28 28 6d 6f 64 65 46 6c 61 67 73 20 26  if ((modeFlags &
8650: 20 43 48 41 4e 4e 45 4c 5f 52 41 57 5f 4d 4f 44   CHANNEL_RAW_MOD
8660: 45 29 20 26 26 20 63 68 61 6e 29 20 7b 0a 09 09  E) && chan) {...
8670: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
8680: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
8690: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
86a0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 09 20  ", "binary");.. 
86b0: 20 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 46 72 65     }..}..Tcl_Fre
86c0: 65 28 28 76 6f 69 64 20 2a 29 63 6d 64 41 72 67  e((void *)cmdArg
86d0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
86e0: 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20   (chan == NULL) 
86f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8700: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
8710: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e  cl_RegisterChann
8720: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
8730: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
8740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
8750: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8760: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
8770: 6d 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a  me(chan), -1));.
8780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
8790: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 41 63 63 65  --. *. * TcpAcce
87f0: 70 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 74  ptCallbacksDelet
8800: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 41  eProc --. *. *.A
8810: 73 73 6f 63 64 61 74 61 20 63 6c 65 61 6e 75 70  ssocdata cleanup
8820: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
8830: 77 68 65 6e 20 61 6e 20 69 6e 74 65 72 70 72 65  when an interpre
8840: 74 65 72 20 69 73 20 62 65 69 6e 67 20 64 65 6c  ter is being del
8850: 65 74 65 64 0a 20 2a 09 74 6f 20 73 65 74 20 74  eted. *.to set t
8860: 68 65 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20  he interp field 
8870: 6f 66 20 61 6c 6c 20 74 68 65 20 61 63 63 65 70  of all the accep
8880: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72  t callback recor
8890: 64 73 20 72 65 67 69 73 74 65 72 65 64 0a 20 2a  ds registered. *
88a0: 09 77 69 74 68 20 74 68 65 20 69 6e 74 65 72 70  .with the interp
88b0: 72 65 74 65 72 20 74 6f 20 4e 55 4c 4c 2e 20 54  reter to NULL. T
88c0: 68 69 73 20 77 69 6c 6c 20 70 72 65 76 65 6e 74  his will prevent
88d0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
88e0: 20 66 72 6f 6d 0a 20 2a 09 62 65 69 6e 67 20 75   from. *.being u
88f0: 73 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72  sed in the futur
8900: 65 20 74 6f 20 65 76 61 6c 20 61 63 63 65 70 74  e to eval accept
8910: 20 73 63 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 20   scripts.. *. * 
8920: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
8930: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8940: 65 63 74 73 3a 0a 20 2a 09 44 65 61 6c 6c 6f 63  ects:. *.Dealloc
8950: 61 74 65 73 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ates memory and 
8960: 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 70 20  sets the interp 
8970: 66 69 65 6c 64 20 6f 66 20 61 6c 6c 20 74 68 65  field of all the
8980: 20 61 63 63 65 70 74 0a 20 2a 09 63 61 6c 6c 62   accept. *.callb
8990: 61 63 6b 20 72 65 63 6f 72 64 73 20 74 6f 20 4e  ack records to N
89a0: 55 4c 4c 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ULL to prevent t
89b0: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
89c0: 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 0a  from being used.
89d0: 20 2a 09 73 75 62 73 65 71 75 65 6e 74 6c 79 20   *.subsequently 
89e0: 74 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20 73  to eval accept s
89f0: 63 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  cripts.. *. *---
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a40: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
8a50: 76 6f 69 64 0a 54 63 70 41 63 63 65 70 74 43 61  void.TcpAcceptCa
8a60: 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65 50 72 6f  llbacksDeletePro
8a70: 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  c(.    void *cli
8a80: 65 6e 74 44 61 74 61 2c 09 09 2f 2a 20 44 61 74  entData,../* Dat
8a90: 61 20 77 68 69 63 68 20 77 61 73 20 70 61 73 73  a which was pass
8aa0: 65 64 20 77 68 65 6e 20 74 68 65 20 61 73 73 6f  ed when the asso
8ab0: 63 64 61 74 61 0a 09 09 09 09 20 2a 20 77 61 73  cdata..... * was
8ac0: 20 72 65 67 69 73 74 65 72 65 64 2e 20 2a 2f 0a   registered. */.
8ad0: 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54      TCL_UNUSED(T
8ae0: 63 6c 5f 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a  cl_Interp *)).{.
8af0: 20 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c      Tcl_HashTabl
8b00: 65 20 2a 68 54 62 6c 50 74 72 20 3d 20 28 54 63  e *hTblPtr = (Tc
8b10: 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a 29 63 6c  l_HashTable *)cl
8b20: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63  ientData;.    Tc
8b30: 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74  l_HashEntry *hPt
8b40: 72 3b 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 53  r;.    Tcl_HashS
8b50: 65 61 72 63 68 20 68 53 65 61 72 63 68 3b 0a 0a  earch hSearch;..
8b60: 20 20 20 20 66 6f 72 20 28 68 50 74 72 20 3d 20      for (hPtr = 
8b70: 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74  Tcl_FirstHashEnt
8b80: 72 79 28 68 54 62 6c 50 74 72 2c 20 26 68 53 65  ry(hTblPtr, &hSe
8b90: 61 72 63 68 29 3b 0a 09 20 20 20 20 68 50 74 72  arch);..    hPtr
8ba0: 20 21 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20 3d   != NULL; hPtr =
8bb0: 20 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74   Tcl_NextHashEnt
8bc0: 72 79 28 26 68 53 65 61 72 63 68 29 29 20 7b 0a  ry(&hSearch)) {.
8bd0: 09 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20  .AcceptCallback 
8be0: 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50  *acceptCallbackP
8bf0: 74 72 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c  tr = (AcceptCall
8c00: 62 61 63 6b 20 2a 29 54 63 6c 5f 47 65 74 48 61  back *)Tcl_GetHa
8c10: 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 0a  shValue(hPtr);..
8c20: 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50  .acceptCallbackP
8c30: 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 4e 55 4c  tr->interp = NUL
8c40: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  L;.    }.    Tcl
8c50: 5f 44 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65  _DeleteHashTable
8c60: 28 68 54 62 6c 50 74 72 29 3b 0a 20 20 20 20 54  (hTblPtr);.    T
8c70: 63 6c 5f 46 72 65 65 28 68 54 62 6c 50 74 72 29  cl_Free(hTblPtr)
8c80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cd0: 2d 0a 20 2a 0a 20 2a 20 52 65 67 69 73 74 65 72  -. *. * Register
8ce0: 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43  TcpServerInterpC
8cf0: 6c 65 61 6e 75 70 20 2d 2d 0a 20 2a 0a 20 2a 09  leanup --. *. *.
8d00: 52 65 67 69 73 74 65 72 73 20 61 6e 20 61 63 63  Registers an acc
8d10: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63  ept callback rec
8d20: 6f 72 64 20 74 6f 20 68 61 76 65 20 69 74 73 20  ord to have its 
8d30: 69 6e 74 65 72 70 20 66 69 65 6c 64 20 73 65 74  interp field set
8d40: 20 74 6f 0a 20 2a 09 4e 55 4c 4c 20 77 68 65 6e   to. *.NULL when
8d50: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
8d60: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a   is deleted.. *.
8d70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
8d80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
8d90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 68 65 6e  effects:. *.When
8da0: 2c 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  , in the future,
8db0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
8dc0: 20 69 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65   is deleted, the
8dd0: 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 6f 66   interp field of
8de0: 0a 20 2a 09 74 68 65 20 61 63 63 65 70 74 20 63  . *.the accept c
8df0: 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 73 74 72  allback data str
8e00: 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20 73  ucture will be s
8e10: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 54 68 69 73  et to NULL. This
8e20: 20 77 69 6c 6c 0a 20 2a 09 70 72 65 76 65 6e 74   will. *.prevent
8e30: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 76 61   attempts to eva
8e40: 6c 20 74 68 65 20 61 63 63 65 70 74 20 73 63 72  l the accept scr
8e50: 69 70 74 20 69 6e 20 61 20 64 65 6c 65 74 65 64  ipt in a deleted
8e60: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a   interpreter.. *
8e70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
8ec0: 74 61 74 69 63 20 76 6f 69 64 0a 52 65 67 69 73  tatic void.Regis
8ed0: 74 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65  terTcpServerInte
8ee0: 72 70 43 6c 65 61 6e 75 70 28 0a 20 20 20 20 54  rpCleanup(.    T
8ef0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8f00: 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74  p,../* Interpret
8f10: 65 72 20 66 6f 72 20 77 68 69 63 68 20 77 65 20  er for which we 
8f20: 77 61 6e 74 20 74 6f 20 62 65 0a 09 09 09 09 20  want to be..... 
8f30: 2a 20 69 6e 66 6f 72 6d 65 64 20 6f 66 20 64 65  * informed of de
8f40: 6c 65 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 41  letion. */.    A
8f50: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61  cceptCallback *a
8f60: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72  cceptCallbackPtr
8f70: 29 0a 09 09 09 09 2f 2a 20 54 68 65 20 61 63 63  )...../* The acc
8f80: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63  ept callback rec
8f90: 6f 72 64 20 77 68 6f 73 65 20 69 6e 74 65 72 70  ord whose interp
8fa0: 0a 09 09 09 09 20 2a 20 66 69 65 6c 64 20 77 65  ..... * field we
8fb0: 20 77 61 6e 74 20 73 65 74 20 74 6f 20 4e 55 4c   want set to NUL
8fc0: 4c 20 77 68 65 6e 20 74 68 65 0a 09 09 09 09 20  L when the..... 
8fd0: 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73  * interpreter is
8fe0: 20 64 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20   deleted. */.{. 
8ff0: 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65     Tcl_HashTable
9000: 20 2a 68 54 62 6c 50 74 72 3b 09 2f 2a 20 48 61   *hTblPtr;./* Ha
9010: 73 68 20 74 61 62 6c 65 20 66 6f 72 20 61 63 63  sh table for acc
9020: 65 70 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63  ept callback rec
9030: 6f 72 64 73 20 74 6f 0a 09 09 09 09 20 2a 20 73  ords to..... * s
9040: 6d 61 73 68 20 77 68 65 6e 20 74 68 65 20 69 6e  mash when the in
9050: 74 65 72 70 72 65 74 65 72 20 77 69 6c 6c 20 62  terpreter will b
9060: 65 0a 09 09 09 09 20 2a 20 64 65 6c 65 74 65 64  e..... * deleted
9070: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73  . */.    Tcl_Has
9080: 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 09 2f 2a  hEntry *hPtr;./*
9090: 20 45 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   Entry for this 
90a0: 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 69  record. */.    i
90b0: 6e 74 20 69 73 4e 65 77 3b 09 09 09 2f 2a 20 49  nt isNew;.../* I
90c0: 73 20 74 68 65 20 65 6e 74 72 79 20 6e 65 77 3f  s the entry new?
90d0: 20 2a 2f 0a 0a 20 20 20 20 68 54 62 6c 50 74 72   */..    hTblPtr
90e0: 20 3d 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c   = (Tcl_HashTabl
90f0: 65 20 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63  e *)Tcl_GetAssoc
9100: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 41 53 53  Data(interp, ASS
9110: 4f 43 5f 4b 45 59 2c 20 4e 55 4c 4c 29 3b 0a 0a  OC_KEY, NULL);..
9120: 20 20 20 20 69 66 20 28 68 54 62 6c 50 74 72 20      if (hTblPtr 
9130: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 68 54 62 6c  == NULL) {..hTbl
9140: 50 74 72 20 3d 20 28 54 63 6c 5f 48 61 73 68 54  Ptr = (Tcl_HashT
9150: 61 62 6c 65 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  able *)Tcl_Alloc
9160: 28 73 69 7a 65 6f 66 28 54 63 6c 5f 48 61 73 68  (sizeof(Tcl_Hash
9170: 54 61 62 6c 65 29 29 3b 0a 09 54 63 6c 5f 49 6e  Table));..Tcl_In
9180: 69 74 48 61 73 68 54 61 62 6c 65 28 68 54 62 6c  itHashTable(hTbl
9190: 50 74 72 2c 20 54 43 4c 5f 4f 4e 45 5f 57 4f 52  Ptr, TCL_ONE_WOR
91a0: 44 5f 4b 45 59 53 29 3b 0a 09 54 63 6c 5f 53 65  D_KEYS);..Tcl_Se
91b0: 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65 72  tAssocData(inter
91c0: 70 2c 20 41 53 53 4f 43 5f 4b 45 59 2c 0a 09 09  p, ASSOC_KEY,...
91d0: 54 63 70 41 63 63 65 70 74 43 61 6c 6c 62 61 63  TcpAcceptCallbac
91e0: 6b 73 44 65 6c 65 74 65 50 72 6f 63 2c 20 68 54  ksDeleteProc, hT
91f0: 62 6c 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  blPtr);.    }.. 
9200: 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 43 72     hPtr = Tcl_Cr
9210: 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 68 54  eateHashEntry(hT
9220: 62 6c 50 74 72 2c 20 61 63 63 65 70 74 43 61 6c  blPtr, acceptCal
9230: 6c 62 61 63 6b 50 74 72 2c 20 26 69 73 4e 65 77  lbackPtr, &isNew
9240: 29 3b 0a 20 20 20 20 69 66 20 28 21 69 73 4e 65  );.    if (!isNe
9250: 77 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 28  w) {..Tcl_Panic(
9260: 22 52 65 67 69 73 74 65 72 54 63 70 53 65 72 76  "RegisterTcpServ
9270: 65 72 43 6c 65 61 6e 75 70 3a 20 64 61 6d 61 67  erCleanup: damag
9280: 65 64 20 61 63 63 65 70 74 20 72 65 63 6f 72 64  ed accept record
9290: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 0a   table");.    }.
92a0: 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73 68 56      Tcl_SetHashV
92b0: 61 6c 75 65 28 68 50 74 72 2c 20 61 63 63 65 70  alue(hPtr, accep
92c0: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 7d  tCallbackPtr);.}
92d0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9320: 2a 0a 20 2a 20 55 6e 72 65 67 69 73 74 65 72 54  *. * UnregisterT
9330: 63 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 6c  cpServerInterpCl
9340: 65 61 6e 75 70 50 72 6f 63 20 2d 2d 0a 20 2a 0a  eanupProc --. *.
9350: 20 2a 09 55 6e 72 65 67 69 73 74 65 72 20 61 20   *.Unregister a 
9360: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
9370: 74 65 72 65 64 20 61 63 63 65 70 74 20 63 61 6c  tered accept cal
9380: 6c 62 61 63 6b 20 72 65 63 6f 72 64 2e 20 54 68  lback record. Th
9390: 65 20 69 6e 74 65 72 70 0a 20 2a 09 66 69 65 6c  e interp. *.fiel
93a0: 64 20 6f 66 20 74 68 69 73 20 72 65 63 6f 72 64  d of this record
93b0: 20 77 69 6c 6c 20 6e 6f 20 6c 6f 6e 67 65 72 20   will no longer 
93c0: 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  be set to NULL i
93d0: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65  n the future whe
93e0: 6e 0a 20 2a 09 74 68 65 20 69 6e 74 65 72 70 72  n. *.the interpr
93f0: 65 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2e  eter is deleted.
9400: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
9410: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53   *.None.. *. * S
9420: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9430: 50 72 65 76 65 6e 74 73 20 74 68 65 20 69 6e 74  Prevents the int
9440: 65 72 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65  erp field of the
9450: 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b   accept callback
9460: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 62 65 69   record from bei
9470: 6e 67 20 73 65 74 0a 20 2a 09 74 6f 20 4e 55 4c  ng set. *.to NUL
9480: 4c 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  L in the future 
9490: 77 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72  when the interpr
94a0: 65 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2e  eter is deleted.
94b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9500: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 55 6e  ..static void.Un
9510: 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76 65  registerTcpServe
9520: 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 72  rInterpCleanupPr
9530: 6f 63 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  oc(.    Tcl_Inte
9540: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
9550: 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 77  Interpreter in w
9560: 68 69 63 68 20 74 68 65 20 61 63 63 65 70 74 20  hich the accept 
9570: 63 61 6c 6c 62 61 63 6b 0a 09 09 09 09 20 2a 20  callback..... * 
9580: 72 65 63 6f 72 64 20 77 61 73 20 72 65 67 69 73  record was regis
9590: 74 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 41 63  tered. */.    Ac
95a0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63  ceptCallback *ac
95b0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29  ceptCallbackPtr)
95c0: 0a 09 09 09 09 2f 2a 20 54 68 65 20 72 65 63 6f  ...../* The reco
95d0: 72 64 20 66 6f 72 20 77 68 69 63 68 20 74 6f 20  rd for which to 
95e0: 64 65 6c 65 74 65 20 74 68 65 0a 09 09 09 09 20  delete the..... 
95f0: 2a 20 72 65 67 69 73 74 72 61 74 69 6f 6e 2e 20  * registration. 
9600: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 48 61 73  */.{.    Tcl_Has
9610: 68 54 61 62 6c 65 20 2a 68 54 62 6c 50 74 72 3b  hTable *hTblPtr;
9620: 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74  .    Tcl_HashEnt
9630: 72 79 20 2a 68 50 74 72 3b 0a 0a 20 20 20 20 68  ry *hPtr;..    h
9640: 54 62 6c 50 74 72 20 3d 20 28 54 63 6c 5f 48 61  TblPtr = (Tcl_Ha
9650: 73 68 54 61 62 6c 65 20 2a 29 54 63 6c 5f 47 65  shTable *)Tcl_Ge
9660: 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65 72  tAssocData(inter
9670: 70 2c 20 41 53 53 4f 43 5f 4b 45 59 2c 20 4e 55  p, ASSOC_KEY, NU
9680: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 68 54 62  LL);.    if (hTb
9690: 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  lPtr == NULL) {.
96a0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a  .return;.    }..
96b0: 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 46      hPtr = Tcl_F
96c0: 69 6e 64 48 61 73 68 45 6e 74 72 79 28 68 54 62  indHashEntry(hTb
96d0: 6c 50 74 72 2c 20 61 63 63 65 70 74 43 61 6c 6c  lPtr, acceptCall
96e0: 62 61 63 6b 50 74 72 29 3b 0a 20 20 20 20 69 66  backPtr);.    if
96f0: 20 28 68 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20   (hPtr != NULL) 
9700: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 48 61 73  {..Tcl_DeleteHas
9710: 68 45 6e 74 72 79 28 68 50 74 72 29 3b 0a 20 20  hEntry(hPtr);.  
9720: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
9730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9770: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 63 63 65 70 74  ---. *. * Accept
9780: 43 61 6c 6c 62 61 63 6b 50 72 6f 63 20 2d 2d 0a  CallbackProc --.
9790: 20 2a 0a 20 2a 09 54 68 69 73 20 63 61 6c 6c 62   *. *.This callb
97a0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ack is invoked b
97b0: 79 20 74 68 65 20 54 43 50 20 63 68 61 6e 6e 65  y the TCP channe
97c0: 6c 20 64 72 69 76 65 72 20 77 68 65 6e 20 69 74  l driver when it
97d0: 20 61 63 63 65 70 74 73 20 61 0a 20 2a 09 6e 65   accepts a. *.ne
97e0: 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f  w connection fro
97f0: 6d 20 61 20 63 6c 69 65 6e 74 20 6f 6e 20 61 20  m a client on a 
9800: 73 65 72 76 65 72 20 73 6f 63 6b 65 74 2e 0a 20  server socket.. 
9810: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
9820: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  .None.. *. * Sid
9830: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 68  e effects:. *.Wh
9840: 61 74 65 76 65 72 20 74 68 65 20 73 63 72 69 70  atever the scrip
9850: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  t does.. *. *---
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
98b0: 76 6f 69 64 0a 41 63 63 65 70 74 43 61 6c 6c 62  void.AcceptCallb
98c0: 61 63 6b 50 72 6f 63 28 0a 20 20 20 20 76 6f 69  ackProc(.    voi
98d0: 64 20 2a 63 61 6c 6c 62 61 63 6b 44 61 74 61 2c  d *callbackData,
98e0: 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74  ../* The data st
98f0: 6f 72 65 64 20 77 68 65 6e 20 74 68 65 20 63 61  ored when the ca
9900: 6c 6c 62 61 63 6b 20 77 61 73 0a 09 09 09 09 20  llback was..... 
9910: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
9920: 20 63 61 6c 6c 20 74 6f 0a 09 09 09 09 20 2a 20   call to..... * 
9930: 54 63 6c 5f 4f 70 65 6e 54 63 70 53 65 72 76 65  Tcl_OpenTcpServe
9940: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68  r. */.    Tcl_Ch
9950: 61 6e 6e 65 6c 20 63 68 61 6e 2c 09 09 2f 2a 20  annel chan,../* 
9960: 43 68 61 6e 6e 65 6c 20 66 6f 72 20 74 68 65 20  Channel for the 
9970: 6e 65 77 6c 79 20 61 63 63 65 70 74 65 64 0a 09  newly accepted..
9980: 09 09 09 20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  ... * connection
9990: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 61  . */.    char *a
99a0: 64 64 72 65 73 73 2c 09 09 2f 2a 20 41 64 64 72  ddress,../* Addr
99b0: 65 73 73 20 6f 66 20 63 6c 69 65 6e 74 20 74 68  ess of client th
99c0: 61 74 20 77 61 73 20 61 63 63 65 70 74 65 64 2e  at was accepted.
99d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f 72 74   */.    int port
99e0: 29 09 09 09 2f 2a 20 50 6f 72 74 20 6f 66 20 63  ).../* Port of c
99f0: 6c 69 65 6e 74 20 74 68 61 74 20 77 61 73 20 61  lient that was a
9a00: 63 63 65 70 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20  ccepted. */.{.  
9a10: 20 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b    AcceptCallback
9a20: 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b   *acceptCallback
9a30: 50 74 72 20 3d 20 28 41 63 63 65 70 74 43 61 6c  Ptr = (AcceptCal
9a40: 6c 62 61 63 6b 20 2a 29 63 61 6c 6c 62 61 63 6b  lback *)callback
9a50: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Data;..    /*.  
9a60: 20 20 20 2a 20 43 68 65 63 6b 20 69 66 20 74 68     * Check if th
9a70: 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74  e callback is st
9a80: 69 6c 6c 20 76 61 6c 69 64 3b 20 74 68 65 20 69  ill valid; the i
9a90: 6e 74 65 72 70 72 65 74 65 72 20 6d 61 79 20 68  nterpreter may h
9aa0: 61 76 65 20 67 6f 6e 65 0a 20 20 20 20 20 2a 20  ave gone.     * 
9ab0: 61 77 61 79 2c 20 74 68 69 73 20 69 73 20 73 69  away, this is si
9ac0: 67 6e 61 6c 6c 65 64 20 62 79 20 73 65 74 74 69  gnalled by setti
9ad0: 6e 67 20 74 68 65 20 69 6e 74 65 72 70 20 66 69  ng the interp fi
9ae0: 65 6c 64 20 6f 66 20 74 68 65 20 63 61 6c 6c 62  eld of the callb
9af0: 61 63 6b 0a 20 20 20 20 20 2a 20 64 61 74 61 20  ack.     * data 
9b00: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 2a 2f  to NULL..     */
9b10: 0a 0a 20 20 20 20 69 66 20 28 61 63 63 65 70 74  ..    if (accept
9b20: 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74  CallbackPtr->int
9b30: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  erp != NULL) {..
9b40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9b50: 72 70 20 3d 20 61 63 63 65 70 74 43 61 6c 6c 62  rp = acceptCallb
9b60: 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  ackPtr->interp;.
9b70: 09 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74  .Tcl_Obj *script
9b80: 2c 20 2a 6f 62 6a 76 5b 32 5d 3b 0a 09 69 6e 74  , *objv[2];..int
9b90: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b   result = TCL_OK
9ba0: 3b 0a 0a 09 6f 62 6a 76 5b 30 5d 20 3d 20 61 63  ;...objv[0] = ac
9bb0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d  ceptCallbackPtr-
9bc0: 3e 73 63 72 69 70 74 3b 0a 09 6f 62 6a 76 5b 31  >script;..objv[1
9bd0: 5d 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  ] = Tcl_NewListO
9be0: 62 6a 28 33 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  bj(3, NULL);..Tc
9bf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
9c00: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a  lement(NULL, obj
9c10: 76 5b 31 5d 2c 20 54 63 6c 5f 4e 65 77 53 74 72  v[1], Tcl_NewStr
9c20: 69 6e 67 4f 62 6a 28 0a 09 09 54 63 6c 5f 47 65  ingObj(...Tcl_Ge
9c30: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
9c40: 6e 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  n), -1));..Tcl_L
9c50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
9c60: 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31  ent(NULL, objv[1
9c70: 5d 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ], Tcl_NewString
9c80: 4f 62 6a 28 61 64 64 72 65 73 73 2c 20 2d 31 29  Obj(address, -1)
9c90: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
9ca0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c  ppendElement(NUL
9cb0: 4c 2c 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c 5f  L, objv[1], Tcl_
9cc0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 70 6f  NewWideIntObj(po
9cd0: 72 74 29 29 3b 0a 0a 09 73 63 72 69 70 74 20 3d  rt));...script =
9ce0: 20 54 63 6c 5f 43 6f 6e 63 61 74 4f 62 6a 28 32   Tcl_ConcatObj(2
9cf0: 2c 20 6f 62 6a 76 29 3b 0a 09 54 63 6c 5f 49 6e  , objv);..Tcl_In
9d00: 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70  crRefCount(scrip
9d10: 74 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  t);..Tcl_DecrRef
9d20: 43 6f 75 6e 74 28 6f 62 6a 76 5b 31 5d 29 3b 0a  Count(objv[1]);.
9d30: 0a 09 54 63 6c 5f 50 72 65 73 65 72 76 65 28 69  ..Tcl_Preserve(i
9d40: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 52 65 67  nterp);..Tcl_Reg
9d50: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74  isterChannel(int
9d60: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 0a 09 2f 2a  erp, chan);.../*
9d70: 0a 09 20 2a 20 41 72 74 69 66 69 63 69 61 6c 6c  .. * Artificiall
9d80: 79 20 62 75 6d 70 20 74 68 65 20 72 65 66 63 6f  y bump the refco
9d90: 75 6e 74 20 74 6f 20 70 72 6f 74 65 63 74 20 74  unt to protect t
9da0: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
9db0: 62 65 69 6e 67 0a 09 20 2a 20 64 65 6c 65 74 65  being.. * delete
9dc0: 64 20 77 68 69 6c 65 20 74 68 65 20 73 63 72 69  d while the scri
9dd0: 70 74 20 69 73 20 62 65 69 6e 67 20 65 76 61 6c  pt is being eval
9de0: 75 61 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63  uated... */...Tc
9df0: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
9e00: 6c 28 4e 55 4c 4c 2c 20 63 68 61 6e 29 3b 0a 0a  l(NULL, chan);..
9e10: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 45 76  .result = Tcl_Ev
9e20: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
9e30: 73 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c  script, TCL_EVAL
9e40: 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c  _DIRECT|TCL_EVAL
9e50: 5f 47 4c 4f 42 41 4c 29 3b 0a 09 54 63 6c 5f 44  _GLOBAL);..Tcl_D
9e60: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69  ecrRefCount(scri
9e70: 70 74 29 3b 0a 0a 09 69 66 20 28 72 65 73 75 6c  pt);...if (resul
9e80: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
9e90: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
9ea0: 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65  ndException(inte
9eb0: 72 70 2c 20 72 65 73 75 6c 74 29 3b 0a 09 20 20  rp, result);..  
9ec0: 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72    Tcl_Unregister
9ed0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
9ee0: 63 68 61 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  chan);..}.../*..
9ef0: 20 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65   * Decrement the
9f00: 20 61 72 74 69 66 69 63 69 61 6c 6c 79 20 62 75   artificially bu
9f10: 6d 70 65 64 20 72 65 66 63 6f 75 6e 74 2e 20 41  mped refcount. A
9f20: 66 74 65 72 20 74 68 69 73 20 69 74 20 69 73 20  fter this it is 
9f30: 6e 6f 74 0a 09 20 2a 20 73 61 66 65 20 61 6e 79  not.. * safe any
9f40: 6d 6f 72 65 20 74 6f 20 75 73 65 20 22 63 68 61  more to use "cha
9f50: 6e 22 2c 20 62 65 63 61 75 73 65 20 69 74 20 6d  n", because it m
9f60: 61 79 20 6e 6f 77 20 62 65 20 64 65 6c 65 74 65  ay now be delete
9f70: 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 55 6e  d... */...Tcl_Un
9f80: 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  registerChannel(
9f90: 4e 55 4c 4c 2c 20 63 68 61 6e 29 3b 0a 0a 09 54  NULL, chan);...T
9fa0: 63 6c 5f 52 65 6c 65 61 73 65 28 69 6e 74 65 72  cl_Release(inter
9fb0: 70 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  p);.    } else {
9fc0: 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 69 6e 74  ../*.. * The int
9fd0: 65 72 70 72 65 74 65 72 20 68 61 73 20 62 65 65  erpreter has bee
9fe0: 6e 20 64 65 6c 65 74 65 64 2c 20 73 6f 20 74 68  n deleted, so th
9ff0: 65 72 65 20 69 73 20 6e 6f 20 75 73 65 66 75 6c  ere is no useful
a000: 20 77 61 79 20 74 6f 20 75 73 65 0a 09 20 2a 20   way to use.. * 
a010: 74 68 65 20 63 6c 69 65 6e 74 20 73 6f 63 6b 65  the client socke
a020: 74 20 2d 20 6a 75 73 74 20 63 6c 6f 73 65 20 69  t - just close i
a030: 74 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 6c  t... */...Tcl_Cl
a040: 6f 73 65 45 78 28 4e 55 4c 4c 2c 20 63 68 61 6e  oseEx(NULL, chan
a050: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  , 0);.    }.}...
a060: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
a070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
a0b0: 2a 20 54 63 70 53 65 72 76 65 72 43 6c 6f 73 65  * TcpServerClose
a0c0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
a0d0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 63  is callback is c
a0e0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 54  alled when the T
a0f0: 43 50 20 73 65 72 76 65 72 20 63 68 61 6e 6e 65  CP server channe
a100: 6c 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 77  l for which it w
a110: 61 73 0a 20 2a 09 72 65 67 69 73 74 65 72 65 64  as. *.registered
a120: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
a130: 2e 20 49 74 20 69 6e 66 6f 72 6d 73 20 74 68 65  . It informs the
a140: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20   interpreter in 
a150: 77 68 69 63 68 20 74 68 65 0a 20 2a 09 61 63 63  which the. *.acc
a160: 65 70 74 20 73 63 72 69 70 74 20 69 73 20 65 76  ept script is ev
a170: 61 6c 75 61 74 65 64 20 28 69 66 20 74 68 61 74  aluated (if that
a180: 20 69 6e 74 65 72 70 72 65 74 65 72 20 73 74 69   interpreter sti
a190: 6c 6c 20 65 78 69 73 74 73 29 20 74 68 61 74 0a  ll exists) that.
a1a0: 20 2a 09 74 68 69 73 20 63 68 61 6e 6e 65 6c 20   *.this channel 
a1b0: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 73 20  no longer needs 
a1c0: 74 6f 20 62 65 20 69 6e 66 6f 72 6d 65 64 20 69  to be informed i
a1d0: 66 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  f the interprete
a1e0: 72 20 69 73 0a 20 2a 09 64 65 6c 65 74 65 64 2e  r is. *.deleted.
a1f0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
a200: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53   *.None.. *. * S
a210: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
a220: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 69  In the future, i
a230: 66 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  f the interprete
a240: 72 20 69 73 20 64 65 6c 65 74 65 64 20 74 68 69  r is deleted thi
a250: 73 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 6e  s channel will n
a260: 6f 0a 20 2a 09 6c 6f 6e 67 65 72 20 62 65 20 69  o. *.longer be i
a270: 6e 66 6f 72 6d 65 64 2e 0a 20 2a 0a 20 2a 2d 2d  nformed.. *. *--
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
a2d0: 20 76 6f 69 64 0a 54 63 70 53 65 72 76 65 72 43   void.TcpServerC
a2e0: 6c 6f 73 65 50 72 6f 63 28 0a 20 20 20 20 76 6f  loseProc(.    vo
a2f0: 69 64 20 2a 63 61 6c 6c 62 61 63 6b 44 61 74 61  id *callbackData
a300: 29 09 09 2f 2a 20 54 68 65 20 64 61 74 61 20 70  )../* The data p
a310: 61 73 73 65 64 20 69 6e 20 74 68 65 20 63 61 6c  assed in the cal
a320: 6c 20 74 6f 0a 09 09 09 09 20 2a 20 54 63 6c 5f  l to..... * Tcl_
a330: 43 72 65 61 74 65 43 6c 6f 73 65 48 61 6e 64 6c  CreateCloseHandl
a340: 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 41 63 63  er. */.{.    Acc
a350: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63  eptCallback *acc
a360: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 20 3d  eptCallbackPtr =
a370: 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b   (AcceptCallback
a380: 20 2a 29 63 61 6c 6c 62 61 63 6b 44 61 74 61 3b   *)callbackData;
a390: 0a 09 09 09 09 2f 2a 20 54 68 65 20 61 63 74 75  ...../* The actu
a3a0: 61 6c 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20  al data. */..   
a3b0: 20 69 66 20 28 61 63 63 65 70 74 43 61 6c 6c 62   if (acceptCallb
a3c0: 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 20 21  ackPtr->interp !
a3d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 55 6e 72 65 67  = NULL) {..Unreg
a3e0: 69 73 74 65 72 54 63 70 53 65 72 76 65 72 49 6e  isterTcpServerIn
a3f0: 74 65 72 70 43 6c 65 61 6e 75 70 50 72 6f 63 28  terpCleanupProc(
a400: 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74  acceptCallbackPt
a410: 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 09 61 63 63  r->interp,...acc
a420: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b  eptCallbackPtr);
a430: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
a440: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 63 63 65  ecrRefCount(acce
a450: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 73  ptCallbackPtr->s
a460: 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f  cript);.    Tcl_
a470: 46 72 65 65 28 61 63 63 65 70 74 43 61 6c 6c 62  Free(acceptCallb
a480: 61 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  ackPtr);.}.../*.
a490: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
a4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
a4e0: 63 6c 5f 53 6f 63 6b 65 74 4f 62 6a 43 6d 64 20  cl_SocketObjCmd 
a4f0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
a500: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
a510: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
a520: 20 22 73 6f 63 6b 65 74 22 20 54 63 6c 20 63 6f   "socket" Tcl co
a530: 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20  mmand. See the. 
a540: 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61  *.user documenta
a550: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73  tion for details
a560: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73   on what it does
a570: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
a580: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
a590: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
a5a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
a5b0: 2a 09 43 72 65 61 74 65 73 20 61 20 73 6f 63 6b  *.Creates a sock
a5c0: 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
a5d0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
a620: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 6f 63 6b 65  /..int.Tcl_Socke
a630: 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  tObjCmd(.    TCL
a640: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
a650: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
a660: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72  *interp,../* Cur
a670: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
a680: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a  . */.    Tcl_Siz
a690: 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62  e objc,../* Numb
a6a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
a6b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
a6c0: 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a  *const *objv)./*
a6d0: 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74   Argument object
a6e0: 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 73 74 61 74  s. */.{.    stat
a6f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
a700: 6f 6e 73 74 20 73 6f 63 6b 65 74 4f 70 74 69 6f  onst socketOptio
a710: 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 61 73 79 6e  ns[] = {.."-asyn
a720: 63 22 2c 20 22 2d 62 61 63 6b 6c 6f 67 22 2c 20  c", "-backlog", 
a730: 22 2d 6d 79 61 64 64 72 22 2c 20 22 2d 6d 79 70  "-myaddr", "-myp
a740: 6f 72 74 22 2c 20 22 2d 72 65 75 73 65 61 64 64  ort", "-reuseadd
a750: 72 22 2c 0a 09 22 2d 72 65 75 73 65 70 6f 72 74  r",.."-reuseport
a760: 22 2c 20 22 2d 73 65 72 76 65 72 22 2c 20 4e 55  ", "-server", NU
a770: 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 65 6e  LL.    };.    en
a780: 75 6d 20 73 6f 63 6b 65 74 4f 70 74 69 6f 6e 73  um socketOptions
a790: 45 6e 75 6d 20 7b 0a 09 53 4b 54 5f 41 53 59 4e  Enum {..SKT_ASYN
a7a0: 43 2c 20 53 4b 54 5f 42 41 43 4b 4c 4f 47 2c 20  C, SKT_BACKLOG, 
a7b0: 53 4b 54 5f 4d 59 41 44 44 52 2c 20 53 4b 54 5f  SKT_MYADDR, SKT_
a7c0: 4d 59 50 4f 52 54 2c 20 53 4b 54 5f 52 45 55 53  MYPORT, SKT_REUS
a7d0: 45 41 44 44 52 2c 0a 09 53 4b 54 5f 52 45 55 53  EADDR,..SKT_REUS
a7e0: 45 50 4f 52 54 2c 20 53 4b 54 5f 53 45 52 56 45  EPORT, SKT_SERVE
a7f0: 52 0a 20 20 20 20 7d 20 6f 70 74 69 6f 6e 49 6e  R.    } optionIn
a800: 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 73 65 72  dex;.    int ser
a810: 76 65 72 20 3d 20 30 2c 20 6d 79 70 6f 72 74 20  ver = 0, myport 
a820: 3d 20 30 2c 20 61 73 79 6e 63 20 3d 20 30 2c 20  = 0, async = 0, 
a830: 72 65 75 73 65 70 20 3d 20 2d 31 2c 20 72 65 75  reusep = -1, reu
a840: 73 65 61 20 3d 20 2d 31 2c 20 62 61 63 6b 6c 6f  sea = -1, backlo
a850: 67 20 3d 20 2d 31 3b 0a 09 54 63 6c 5f 53 69 7a  g = -1;..Tcl_Siz
a860: 65 20 61 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  e a;.    unsigne
a870: 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b  d int flags = 0;
a880: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a890: 2a 68 6f 73 74 2c 20 2a 70 6f 72 74 2c 20 2a 6d  *host, *port, *m
a8a0: 79 61 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  yaddr = NULL;.  
a8b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70    Tcl_Obj *scrip
a8c0: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  t = NULL;.    Tc
a8d0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
a8e0: 0a 20 20 20 20 54 63 6c 49 6e 69 74 53 6f 63 6b  .    TclInitSock
a8f0: 65 74 73 28 29 3b 0a 0a 20 20 20 20 66 6f 72 20  ets();..    for 
a900: 28 61 20 3d 20 31 3b 20 61 20 3c 20 6f 62 6a 63  (a = 1; a < objc
a910: 3b 20 61 2b 2b 29 20 7b 0a 09 63 6f 6e 73 74 20  ; a++) {..const 
a920: 63 68 61 72 20 2a 61 72 67 20 3d 20 54 63 6c 47  char *arg = TclG
a930: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d  etString(objv[a]
a940: 29 3b 0a 0a 09 69 66 20 28 61 72 67 5b 30 5d 20  );...if (arg[0] 
a950: 21 3d 20 27 2d 27 29 20 7b 0a 09 20 20 20 20 62  != '-') {..    b
a960: 72 65 61 6b 3b 0a 09 7d 0a 09 69 66 20 28 54 63  reak;..}..if (Tc
a970: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
a980: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61  j(interp, objv[a
a990: 5d 2c 20 73 6f 63 6b 65 74 4f 70 74 69 6f 6e 73  ], socketOptions
a9a0: 2c 20 22 6f 70 74 69 6f 6e 22 2c 0a 09 09 54 43  , "option",...TC
a9b0: 4c 5f 45 58 41 43 54 2c 20 26 6f 70 74 69 6f 6e  L_EXACT, &option
a9c0: 49 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b  Index) != TCL_OK
a9d0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
a9e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73  TCL_ERROR;..}..s
a9f0: 77 69 74 63 68 20 28 6f 70 74 69 6f 6e 49 6e 64  witch (optionInd
aa00: 65 78 29 20 7b 0a 09 63 61 73 65 20 53 4b 54 5f  ex) {..case SKT_
aa10: 41 53 59 4e 43 3a 0a 09 20 20 20 20 69 66 20 28  ASYNC:..    if (
aa20: 73 65 72 76 65 72 20 3d 3d 20 31 29 20 7b 0a 09  server == 1) {..
aa30: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
aa40: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
aa50: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22  wStringObj(...."
aa60: 63 61 6e 6e 6f 74 20 73 65 74 20 2d 61 73 79 6e  cannot set -asyn
aa70: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 73 65 72  c option for ser
aa80: 76 65 72 20 73 6f 63 6b 65 74 73 22 2c 20 2d 31  ver sockets", -1
aa90: 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ));...return TCL
aaa0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
aab0: 20 20 20 20 61 73 79 6e 63 20 3d 20 31 3b 0a 09      async = 1;..
aac0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
aad0: 20 53 4b 54 5f 4d 59 41 44 44 52 3a 0a 09 20 20   SKT_MYADDR:..  
aae0: 20 20 61 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28    a++;..    if (
aaf0: 61 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 09 54  a >= objc) {...T
ab00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ab10: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
ab20: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 6e 6f  tringObj(...."no
ab30: 20 61 72 67 75 6d 65 6e 74 20 67 69 76 65 6e 20   argument given 
ab40: 66 6f 72 20 2d 6d 79 61 64 64 72 20 6f 70 74 69  for -myaddr opti
ab50: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74  on", -1));...ret
ab60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
ab70: 20 20 20 20 7d 0a 09 20 20 20 20 6d 79 61 64 64      }..    myadd
ab80: 72 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  r = TclGetString
ab90: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 09 20 20 20 20  (objv[a]);..    
aba0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 4b 54  break;..case SKT
abb0: 5f 4d 59 50 4f 52 54 3a 20 7b 0a 09 20 20 20 20  _MYPORT: {..    
abc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 79 50 6f  const char *myPo
abd0: 72 74 4e 61 6d 65 3b 0a 0a 09 20 20 20 20 61 2b  rtName;...    a+
abe0: 2b 3b 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d  +;..    if (a >=
abf0: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53   objc) {...Tcl_S
ac00: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ac10: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
ac20: 67 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67  gObj(...."no arg
ac30: 75 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20  ument given for 
ac40: 2d 6d 79 70 6f 72 74 20 6f 70 74 69 6f 6e 22 2c  -myport option",
ac50: 20 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20   -1));...return 
ac60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
ac70: 7d 0a 09 20 20 20 20 6d 79 50 6f 72 74 4e 61 6d  }..    myPortNam
ac80: 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  e = TclGetString
ac90: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 09 20 20 20 20  (objv[a]);..    
aca0: 69 66 20 28 54 63 6c 53 6f 63 6b 47 65 74 50 6f  if (TclSockGetPo
acb0: 72 74 28 69 6e 74 65 72 70 2c 20 6d 79 50 6f 72  rt(interp, myPor
acc0: 74 4e 61 6d 65 2c 20 22 74 63 70 22 2c 20 26 6d  tName, "tcp", &m
acd0: 79 70 6f 72 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  yport) != TCL_OK
ace0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ) {...return TCL
acf0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
ad00: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 63      break;..}..c
ad10: 61 73 65 20 53 4b 54 5f 53 45 52 56 45 52 3a 0a  ase SKT_SERVER:.
ad20: 09 20 20 20 20 69 66 20 28 61 73 79 6e 63 20 3d  .    if (async =
ad30: 3d 20 31 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  = 1) {...Tcl_Set
ad40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ad50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ad60: 62 6a 28 0a 09 09 09 22 63 61 6e 6e 6f 74 20 73  bj(...."cannot s
ad70: 65 74 20 2d 61 73 79 6e 63 20 6f 70 74 69 6f 6e  et -async option
ad80: 20 66 6f 72 20 73 65 72 76 65 72 20 73 6f 63 6b   for server sock
ad90: 65 74 73 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65  ets", -1));...re
ada0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
adb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 72 76  .    }..    serv
adc0: 65 72 20 3d 20 31 3b 0a 09 20 20 20 20 61 2b 2b  er = 1;..    a++
add0: 3b 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d 20  ;..    if (a >= 
ade0: 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65  objc) {...Tcl_Se
adf0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
ae00: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
ae10: 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 75  Obj(...."no argu
ae20: 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 2d  ment given for -
ae30: 73 65 72 76 65 72 20 6f 70 74 69 6f 6e 22 2c 20  server option", 
ae40: 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  -1));...return T
ae50: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
ae60: 0a 09 20 20 20 20 73 63 72 69 70 74 20 3d 20 6f  ..    script = o
ae70: 62 6a 76 5b 61 5d 3b 0a 09 20 20 20 20 62 72 65  bjv[a];..    bre
ae80: 61 6b 3b 0a 09 63 61 73 65 20 53 4b 54 5f 52 45  ak;..case SKT_RE
ae90: 55 53 45 41 44 44 52 3a 0a 09 20 20 20 20 61 2b  USEADDR:..    a+
aea0: 2b 3b 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d  +;..    if (a >=
aeb0: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53   objc) {...Tcl_S
aec0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
aed0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
aee0: 67 4f 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67  gObj(...."no arg
aef0: 75 6d 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20  ument given for 
af00: 2d 72 65 75 73 65 61 64 64 72 20 6f 70 74 69 6f  -reuseaddr optio
af10: 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74 75  n", -1));...retu
af20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
af30: 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
af40: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
af50: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
af60: 5b 61 5d 2c 20 26 72 65 75 73 65 61 29 20 21 3d  [a], &reusea) !=
af70: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   TCL_OK) {...ret
af80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
af90: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b      }..    break
afa0: 3b 0a 09 63 61 73 65 20 53 4b 54 5f 52 45 55 53  ;..case SKT_REUS
afb0: 45 50 4f 52 54 3a 0a 09 20 20 20 20 61 2b 2b 3b  EPORT:..    a++;
afc0: 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d 20 6f  ..    if (a >= o
afd0: 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  bjc) {...Tcl_Set
afe0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
aff0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b000: 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 75 6d  bj(...."no argum
b010: 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 2d 72  ent given for -r
b020: 65 75 73 65 70 6f 72 74 20 6f 70 74 69 6f 6e 22  euseport option"
b030: 2c 20 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e  , -1));...return
b040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
b050: 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f   }..    if (Tcl_
b060: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
b070: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61  j(interp, objv[a
b080: 5d 2c 20 26 72 65 75 73 65 70 29 20 21 3d 20 54  ], &reusep) != T
b090: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
b0a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
b0b0: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a    }..    break;.
b0c0: 09 63 61 73 65 20 53 4b 54 5f 42 41 43 4b 4c 4f  .case SKT_BACKLO
b0d0: 47 3a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20  G:..    a++;..  
b0e0: 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29    if (a >= objc)
b0f0: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
b100: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
b110: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
b120: 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ..."no argument 
b130: 67 69 76 65 6e 20 66 6f 72 20 2d 62 61 63 6b 6c  given for -backl
b140: 6f 67 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29  og option", -1))
b150: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
b160: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
b170: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74    if (Tcl_GetInt
b180: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b190: 6f 62 6a 76 5b 61 5d 2c 20 26 62 61 63 6b 6c 6f  objv[a], &backlo
b1a0: 67 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  g) != TCL_OK) {.
b1b0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b1c0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
b1d0: 62 72 65 61 6b 3b 0a 09 64 65 66 61 75 6c 74 3a  break;..default:
b1e0: 0a 09 20 20 20 20 54 43 4c 5f 55 4e 52 45 41 43  ..    TCL_UNREAC
b1f0: 48 41 42 4c 45 28 29 3b 0a 09 7d 0a 20 20 20 20  HABLE();..}.    
b200: 7d 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  }.    if (server
b210: 29 20 7b 0a 09 68 6f 73 74 20 3d 20 6d 79 61 64  ) {..host = myad
b220: 64 72 3b 09 09 2f 2a 20 4e 55 4c 4c 20 69 6d 70  dr;../* NULL imp
b230: 6c 69 65 73 20 49 4e 41 44 44 52 5f 41 4e 59 20  lies INADDR_ANY 
b240: 2a 2f 0a 09 69 66 20 28 6d 79 70 6f 72 74 20 21  */..if (myport !
b250: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
b260: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b270: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
b280: 6e 67 4f 62 6a 28 0a 09 09 20 20 20 20 22 6f 70  ngObj(...    "op
b290: 74 69 6f 6e 20 2d 6d 79 70 6f 72 74 20 69 73 20  tion -myport is 
b2a0: 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 73 65  not valid for se
b2b0: 72 76 65 72 73 22 2c 20 2d 31 29 29 3b 0a 09 20  rvers", -1));.. 
b2c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b2d0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ROR;..}.    } el
b2e0: 73 65 20 69 66 20 28 61 20 3c 20 6f 62 6a 63 29  se if (a < objc)
b2f0: 20 7b 0a 09 68 6f 73 74 20 3d 20 54 63 6c 47 65   {..host = TclGe
b300: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d 29  tString(objv[a])
b310: 3b 0a 09 61 2b 2b 3b 0a 20 20 20 20 7d 20 65 6c  ;..a++;.    } el
b320: 73 65 20 7b 0a 09 49 6e 74 65 72 70 20 2a 69 50  se {..Interp *iP
b330: 74 72 3b 0a 0a 20 20 20 20 77 72 6f 6e 67 4e 75  tr;..    wrongNu
b340: 6d 41 72 67 73 3a 0a 09 69 50 74 72 20 3d 20 28  mArgs:..iPtr = (
b350: 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70  Interp *) interp
b360: 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ;..Tcl_WrongNumA
b370: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b380: 62 6a 76 2c 0a 09 09 22 3f 2d 61 73 79 6e 63 3f  bjv,..."?-async?
b390: 20 3f 2d 6d 79 61 64 64 72 20 61 64 64 72 3f 20   ?-myaddr addr? 
b3a0: 3f 2d 6d 79 70 6f 72 74 20 6d 79 70 6f 72 74 3f  ?-myport myport?
b3b0: 20 68 6f 73 74 20 70 6f 72 74 22 29 3b 0a 09 69   host port");..i
b3c0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 49 4e  Ptr->flags |= IN
b3d0: 54 45 52 50 5f 41 4c 54 45 52 4e 41 54 45 5f 57  TERP_ALTERNATE_W
b3e0: 52 4f 4e 47 5f 41 52 47 53 3b 0a 09 54 63 6c 5f  RONG_ARGS;..Tcl_
b3f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
b400: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 09 09  erp, 1, objv,...
b410: 22 2d 73 65 72 76 65 72 20 63 6f 6d 6d 61 6e 64  "-server command
b420: 20 3f 2d 62 61 63 6b 6c 6f 67 20 63 6f 75 6e 74   ?-backlog count
b430: 3f 20 3f 2d 6d 79 61 64 64 72 20 61 64 64 72 3f  ? ?-myaddr addr?
b440: 20 22 0a 09 09 22 3f 2d 72 65 75 73 65 61 64 64   "..."?-reuseadd
b450: 72 20 62 6f 6f 6c 65 61 6e 3f 20 3f 2d 72 65 75  r boolean? ?-reu
b460: 73 65 70 6f 72 74 20 62 6f 6f 6c 65 61 6e 3f 20  seport boolean? 
b470: 70 6f 72 74 22 29 3b 0a 09 72 65 74 75 72 6e 20  port");..return 
b480: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b490: 0a 0a 20 20 20 20 69 66 20 28 21 73 65 72 76 65  ..    if (!serve
b4a0: 72 20 26 26 20 28 72 65 75 73 65 61 20 21 3d 20  r && (reusea != 
b4b0: 2d 31 20 7c 7c 20 72 65 75 73 65 70 20 21 3d 20  -1 || reusep != 
b4c0: 2d 31 20 7c 7c 20 62 61 63 6b 6c 6f 67 20 21 3d  -1 || backlog !=
b4d0: 20 2d 31 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74   -1)) {..Tcl_Set
b4e0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
b4f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b500: 62 6a 28 0a 09 09 22 6f 70 74 69 6f 6e 73 20 2d  bj(..."options -
b510: 62 61 63 6b 6c 6f 67 2c 20 2d 72 65 75 73 65 61  backlog, -reusea
b520: 64 64 72 2c 20 61 6e 64 20 2d 72 65 75 73 65 70  ddr, and -reusep
b530: 6f 72 74 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  ort are only val
b540: 69 64 20 22 0a 09 09 22 66 6f 72 20 73 65 72 76  id "..."for serv
b550: 65 72 73 22 2c 20 2d 31 29 29 3b 0a 09 72 65 74  ers", -1));..ret
b560: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b570: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
b580: 20 20 2a 20 53 65 74 20 74 68 65 20 6f 70 74 69    * Set the opti
b590: 6f 6e 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  ons to their def
b5a0: 61 75 6c 74 20 76 61 6c 75 65 20 69 66 20 74 68  ault value if th
b5b0: 65 20 75 73 65 72 20 64 69 64 6e 27 74 20 6f 76  e user didn't ov
b5c0: 65 72 72 69 64 65 0a 20 20 20 20 20 2a 20 74 68  erride.     * th
b5d0: 65 69 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 20  eir value..     
b5e0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 75 73  */..    if (reus
b5f0: 65 70 20 3d 3d 20 2d 31 29 20 7b 0a 09 72 65 75  ep == -1) {..reu
b600: 73 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  sep = 0;.    }. 
b610: 20 20 20 69 66 20 28 72 65 75 73 65 61 20 3d 3d     if (reusea ==
b620: 20 2d 31 29 20 7b 0a 09 72 65 75 73 65 61 20 3d   -1) {..reusea =
b630: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
b640: 2a 0a 20 20 20 20 20 2a 20 42 75 69 6c 64 20 74  *.     * Build t
b650: 68 65 20 62 69 74 73 65 74 20 77 69 74 68 20 74  he bitset with t
b660: 68 65 20 66 6c 61 67 73 20 76 61 6c 75 65 73 2e  he flags values.
b670: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
b680: 20 28 72 65 75 73 65 61 29 20 7b 0a 09 66 6c 61   (reusea) {..fla
b690: 67 73 20 7c 3d 20 54 43 4c 5f 54 43 50 53 45 52  gs |= TCL_TCPSER
b6a0: 56 45 52 5f 52 45 55 53 45 41 44 44 52 3b 0a 20  VER_REUSEADDR;. 
b6b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 75     }.    if (reu
b6c0: 73 65 70 29 20 7b 0a 09 66 6c 61 67 73 20 7c 3d  sep) {..flags |=
b6d0: 20 54 43 4c 5f 54 43 50 53 45 52 56 45 52 5f 52   TCL_TCPSERVER_R
b6e0: 45 55 53 45 50 4f 52 54 3b 0a 20 20 20 20 7d 0a  EUSEPORT;.    }.
b6f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41  .    /*.     * A
b700: 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ll the arguments
b710: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
b720: 6e 20 70 61 72 73 65 64 20 62 79 20 6e 6f 77 2c  n parsed by now,
b730: 20 27 61 27 20 70 6f 69 6e 74 73 20 74 6f 20 74   'a' points to t
b740: 68 65 0a 20 20 20 20 20 2a 20 6c 61 73 74 20 6f  he.     * last o
b750: 6e 65 2c 20 74 68 65 20 70 6f 72 74 20 6e 75 6d  ne, the port num
b760: 62 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ber..     */..  
b770: 20 20 69 66 20 28 61 20 21 3d 20 6f 62 6a 63 2d    if (a != objc-
b780: 31 29 20 7b 0a 09 67 6f 74 6f 20 77 72 6f 6e 67  1) {..goto wrong
b790: 4e 75 6d 41 72 67 73 3b 0a 20 20 20 20 7d 0a 0a  NumArgs;.    }..
b7a0: 20 20 20 20 70 6f 72 74 20 3d 20 54 63 6c 47 65      port = TclGe
b7b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 61 5d 29  tString(objv[a])
b7c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  ;..    if (serve
b7d0: 72 29 20 7b 0a 09 41 63 63 65 70 74 43 61 6c 6c  r) {..AcceptCall
b7e0: 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c  back *acceptCall
b7f0: 62 61 63 6b 50 74 72 20 3d 20 28 41 63 63 65 70  backPtr = (Accep
b800: 74 43 61 6c 6c 62 61 63 6b 20 2a 29 54 63 6c 5f  tCallback *)Tcl_
b810: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 41 63 63  Alloc(sizeof(Acc
b820: 65 70 74 43 61 6c 6c 62 61 63 6b 29 29 3b 0a 0a  eptCallback));..
b830: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e  .Tcl_IncrRefCoun
b840: 74 28 73 63 72 69 70 74 29 3b 0a 09 61 63 63 65  t(script);..acce
b850: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 73  ptCallbackPtr->s
b860: 63 72 69 70 74 20 3d 20 73 63 72 69 70 74 3b 0a  cript = script;.
b870: 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50  .acceptCallbackP
b880: 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  tr->interp = int
b890: 65 72 70 3b 0a 0a 09 63 68 61 6e 20 3d 20 54 63  erp;...chan = Tc
b8a0: 6c 5f 4f 70 65 6e 54 63 70 53 65 72 76 65 72 45  l_OpenTcpServerE
b8b0: 78 28 69 6e 74 65 72 70 2c 20 70 6f 72 74 2c 20  x(interp, port, 
b8c0: 68 6f 73 74 2c 20 66 6c 61 67 73 2c 20 62 61 63  host, flags, bac
b8d0: 6b 6c 6f 67 2c 0a 09 09 41 63 63 65 70 74 43 61  klog,...AcceptCa
b8e0: 6c 6c 62 61 63 6b 50 72 6f 63 2c 20 61 63 63 65  llbackProc, acce
b8f0: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a  ptCallbackPtr);.
b900: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c  .if (chan == NUL
b910: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65  L) {..    Tcl_De
b920: 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70  crRefCount(scrip
b930: 74 29 3b 0a 09 20 20 20 20 54 63 6c 5f 46 72 65  t);..    Tcl_Fre
b940: 65 28 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b  e(acceptCallback
b950: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
b960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b970: 0a 09 2f 2a 0a 09 20 2a 20 52 65 67 69 73 74 65  ../*.. * Registe
b980: 72 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 72  r with the inter
b990: 70 72 65 74 65 72 20 74 6f 20 6c 65 74 20 75 73  preter to let us
b9a0: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 68 65 20 69   know when the i
b9b0: 6e 74 65 72 70 72 65 74 65 72 0a 09 20 2a 20 69  nterpreter.. * i
b9c0: 73 20 64 65 6c 65 74 65 64 20 28 62 79 20 68 61  s deleted (by ha
b9d0: 76 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  ving the callbac
b9e0: 6b 20 73 65 74 20 74 68 65 20 69 6e 74 65 72 70  k set the interp
b9f0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 09 20   field of the.. 
ba00: 2a 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b  * acceptCallback
ba10: 50 74 72 27 73 20 73 74 72 75 63 74 75 72 65 20  Ptr's structure 
ba20: 74 6f 20 4e 55 4c 4c 29 2e 20 54 68 69 73 20 69  to NULL). This i
ba30: 73 20 74 6f 20 61 76 6f 69 64 20 74 72 79 69 6e  s to avoid tryin
ba40: 67 20 74 6f 0a 09 20 2a 20 65 76 61 6c 20 74 68  g to.. * eval th
ba50: 65 20 73 63 72 69 70 74 20 69 6e 20 61 20 64 65  e script in a de
ba60: 6c 65 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  leted interprete
ba70: 72 2e 0a 09 20 2a 2f 0a 0a 09 52 65 67 69 73 74  r... */...Regist
ba80: 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72  erTcpServerInter
ba90: 70 43 6c 65 61 6e 75 70 28 69 6e 74 65 72 70 2c  pCleanup(interp,
baa0: 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50   acceptCallbackP
bab0: 74 72 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65  tr);.../*.. * Re
bac0: 67 69 73 74 65 72 20 61 20 63 6c 6f 73 65 20 63  gister a close c
bad0: 61 6c 6c 62 61 63 6b 2e 20 54 68 69 73 20 63 61  allback. This ca
bae0: 6c 6c 62 61 63 6b 20 77 69 6c 6c 20 69 6e 66 6f  llback will info
baf0: 72 6d 20 74 68 65 0a 09 20 2a 20 69 6e 74 65 72  rm the.. * inter
bb00: 70 72 65 74 65 72 20 28 69 66 20 69 74 20 73 74  preter (if it st
bb10: 69 6c 6c 20 65 78 69 73 74 73 29 20 74 68 61 74  ill exists) that
bb20: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 64 6f   this channel do
bb30: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 09  es not need to..
bb40: 20 2a 20 62 65 20 69 6e 66 6f 72 6d 65 64 20 77   * be informed w
bb50: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65  hen the interpre
bb60: 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ter is deleted..
bb70: 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 72 65 61 74  . */...Tcl_Creat
bb80: 65 43 6c 6f 73 65 48 61 6e 64 6c 65 72 28 63 68  eCloseHandler(ch
bb90: 61 6e 2c 20 54 63 70 53 65 72 76 65 72 43 6c 6f  an, TcpServerClo
bba0: 73 65 50 72 6f 63 2c 20 61 63 63 65 70 74 43 61  seProc, acceptCa
bbb0: 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 20 20 20 20  llbackPtr);.    
bbc0: 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 70 6f  } else {..int po
bbd0: 72 74 4e 75 6d 3b 0a 0a 09 69 66 20 28 54 63 6c  rtNum;...if (Tcl
bbe0: 53 6f 63 6b 47 65 74 50 6f 72 74 28 69 6e 74 65  SockGetPort(inte
bbf0: 72 70 2c 20 70 6f 72 74 2c 20 22 74 63 70 22 2c  rp, port, "tcp",
bc00: 20 26 70 6f 72 74 4e 75 6d 29 20 21 3d 20 54 43   &portNum) != TC
bc10: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74  L_OK) {..    ret
bc20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bc30: 7d 0a 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 4f  }...chan = Tcl_O
bc40: 70 65 6e 54 63 70 43 6c 69 65 6e 74 28 69 6e 74  penTcpClient(int
bc50: 65 72 70 2c 20 70 6f 72 74 4e 75 6d 2c 20 68 6f  erp, portNum, ho
bc60: 73 74 2c 20 6d 79 61 64 64 72 2c 20 6d 79 70 6f  st, myaddr, mypo
bc70: 72 74 2c 20 61 73 79 6e 63 29 3b 0a 09 69 66 20  rt, async);..if 
bc80: 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (chan == NULL) {
bc90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
bca0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
bcb0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 67 69 73 74  ..    Tcl_Regist
bcc0: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
bcd0: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 54 63 6c  , chan);.    Tcl
bce0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
bcf0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
bd00: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
bd10: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
bd20: 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
bd30: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
bd40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
bd90: 54 63 6c 5f 46 63 6f 70 79 4f 62 6a 43 6d 64 20  Tcl_FcopyObjCmd 
bda0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
bdb0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
bdc0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
bdd0: 20 22 66 63 6f 70 79 22 20 54 63 6c 20 63 6f 6d   "fcopy" Tcl com
bde0: 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 2a  mand. See the. *
bdf0: 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74  .user documentat
be00: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20  ion for details 
be10: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e  on what it does.
be20: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
be30: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
be40: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
be50: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
be60: 09 4d 6f 76 65 73 20 64 61 74 61 20 62 65 74 77  .Moves data betw
be70: 65 65 6e 20 74 77 6f 20 63 68 61 6e 6e 65 6c 73  een two channels
be80: 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 73 65   and possibly se
be90: 74 73 20 75 70 20 61 20 62 61 63 6b 67 72 6f 75  ts up a backgrou
bea0: 6e 64 20 63 6f 70 79 0a 20 2a 09 68 61 6e 64 6c  nd copy. *.handl
beb0: 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  er.. *. *-------
bec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
bf00: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 46 63 6f   */..int.Tcl_Fco
bf10: 70 79 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  pyObjCmd(.    TC
bf20: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
bf30: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
bf40: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75   *interp,../* Cu
bf50: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  rrent interprete
bf60: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69  r. */.    Tcl_Si
bf70: 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d  ze objc,../* Num
bf80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
bf90: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
bfa0: 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f   *const *objv)./
bfb0: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63  * Argument objec
bfc0: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c  ts. */.{.    Tcl
bfd0: 5f 43 68 61 6e 6e 65 6c 20 69 6e 43 68 61 6e 2c  _Channel inChan,
bfe0: 20 6f 75 74 43 68 61 6e 3b 0a 20 20 20 20 69 6e   outChan;.    in
bff0: 74 20 6d 6f 64 65 2c 20 69 6e 64 65 78 3b 0a 20  t mode, index;. 
c000: 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 3b 0a 20     Tcl_Size i;. 
c010: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 74     Tcl_WideInt t
c020: 6f 52 65 61 64 3b 0a 20 20 20 20 54 63 6c 5f 4f  oRead;.    Tcl_O
c030: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
c040: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c050: 72 20 2a 63 6f 6e 73 74 20 73 77 69 74 63 68 65  r *const switche
c060: 73 5b 5d 20 3d 20 7b 20 22 2d 73 69 7a 65 22 2c  s[] = { "-size",
c070: 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 4e 55 4c   "-command", NUL
c080: 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 7b 20  L };.    enum { 
c090: 46 63 6f 70 79 53 69 7a 65 2c 20 46 63 6f 70 79  FcopySize, Fcopy
c0a0: 43 6f 6d 6d 61 6e 64 20 7d 3b 0a 0a 20 20 20 20  Command };..    
c0b0: 69 66 20 28 28 6f 62 6a 63 20 3c 20 33 29 20 7c  if ((objc < 3) |
c0c0: 7c 20 28 6f 62 6a 63 20 3e 20 37 29 20 7c 7c 20  | (objc > 7) || 
c0d0: 28 6f 62 6a 63 20 3d 3d 20 34 29 20 7c 7c 20 28  (objc == 4) || (
c0e0: 6f 62 6a 63 20 3d 3d 20 36 29 29 20 7b 0a 09 54  objc == 6)) {..T
c0f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c100: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c110: 0a 09 09 22 69 6e 70 75 74 20 6f 75 74 70 75 74  ..."input output
c120: 20 3f 2d 73 69 7a 65 20 73 69 7a 65 3f 20 3f 2d   ?-size size? ?-
c130: 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 62 61 63 6b  command callback
c140: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
c150: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
c160: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 61 72     /*.     * Par
c170: 73 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 61  se the channel a
c180: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 76 65 72  rguments and ver
c190: 69 66 79 20 74 68 61 74 20 74 68 65 79 20 61 72  ify that they ar
c1a0: 65 20 72 65 61 64 61 62 6c 65 20 6f 72 0a 20 20  e readable or.  
c1b0: 20 20 20 2a 20 77 72 69 74 61 62 6c 65 2c 20 61     * writable, a
c1c0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
c1d0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
c1e0: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f  TclGetChannelFro
c1f0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
c200: 76 5b 31 5d 2c 20 26 69 6e 43 68 61 6e 2c 20 26  v[1], &inChan, &
c210: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f  mode, 0) != TCL_
c220: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
c230: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
c240: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20     if (!(mode & 
c250: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b  TCL_READABLE)) {
c260: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
c270: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
c280: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61  bjPrintf(..."cha
c290: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e  nnel \"%s\" wasn
c2a0: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  't opened for re
c2b0: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74  ading",...TclGet
c2c0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
c2d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
c2e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
c2f0: 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65  if (TclGetChanne
c300: 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  lFromObj(interp,
c310: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 75 74 43 68   objv[2], &outCh
c320: 61 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d  an, &mode, 0) !=
c330: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
c340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c350: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f    }.    if (!(mo
c360: 64 65 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c  de & TCL_WRITABL
c370: 45 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62  E)) {..Tcl_SetOb
c380: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c390: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09  Tcl_ObjPrintf(..
c3a0: 09 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22  ."channel \"%s\"
c3b0: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66   wasn't opened f
c3c0: 6f 72 20 77 72 69 74 69 6e 67 22 2c 0a 09 09 54  or writing",...T
c3d0: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  clGetString(objv
c3e0: 5b 32 5d 29 29 29 3b 0a 09 72 65 74 75 72 6e 20  [2])));..return 
c3f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
c400: 0a 0a 20 20 20 20 74 6f 52 65 61 64 20 3d 20 2d  ..    toRead = -
c410: 31 3b 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  1;.    cmdPtr = 
c420: 4e 55 4c 4c 3b 0a 20 20 20 20 66 6f 72 20 28 69  NULL;.    for (i
c430: 20 3d 20 33 3b 20 69 20 3c 20 6f 62 6a 63 3b 20   = 3; i < objc; 
c440: 69 20 2b 3d 20 32 29 20 7b 0a 09 69 66 20 28 54  i += 2) {..if (T
c450: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
c460: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c470: 69 5d 2c 20 73 77 69 74 63 68 65 73 2c 20 22 6f  i], switches, "o
c480: 70 74 69 6f 6e 22 2c 20 30 2c 0a 09 09 26 69 6e  ption", 0,...&in
c490: 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  dex) != TCL_OK) 
c4a0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
c4b0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73 77 69  L_ERROR;..}..swi
c4c0: 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 09 63  tch (index) {..c
c4d0: 61 73 65 20 46 63 6f 70 79 53 69 7a 65 3a 0a 09  ase FcopySize:..
c4e0: 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 57 69      if (TclGetWi
c4f0: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
c500: 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
c510: 26 74 6f 52 65 61 64 29 20 21 3d 20 54 43 4c 5f  &toRead) != TCL_
c520: 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54  OK) {...return T
c530: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
c540: 0a 09 20 20 20 20 69 66 20 28 74 6f 52 65 61 64  ..    if (toRead
c550: 20 3c 20 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20   < 0) {.../*... 
c560: 2a 20 48 61 6e 64 6c 65 20 61 6c 6c 20 6e 65 67  * Handle all neg
c570: 61 74 69 76 65 20 73 69 7a 65 73 20 6c 69 6b 65  ative sizes like
c580: 20 2d 31 2c 20 6d 65 61 6e 69 6e 67 20 27 63 6f   -1, meaning 'co
c590: 70 79 20 61 6c 6c 27 2e 20 42 79 0a 09 09 20 2a  py all'. By... *
c5a0: 20 72 65 73 65 74 74 69 6e 67 20 74 6f 52 65 61   resetting toRea
c5b0: 64 20 77 65 20 61 76 6f 69 64 20 63 68 61 6e 67  d we avoid chang
c5c0: 65 73 20 69 6e 20 74 68 65 20 63 6f 72 65 20 63  es in the core c
c5d0: 6f 70 79 69 6e 67 0a 09 09 20 2a 20 66 75 6e 63  opying... * func
c5e0: 74 69 6f 6e 73 20 28 77 68 69 63 68 20 65 78 70  tions (which exp
c5f0: 6c 69 63 69 74 6c 79 20 63 68 65 63 6b 20 66 6f  licitly check fo
c600: 72 20 2d 31 20 61 6e 64 20 63 72 61 73 68 20 6f  r -1 and crash o
c610: 6e 20 61 6e 79 0a 09 09 20 2a 20 6f 74 68 65 72  n any... * other
c620: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 29   negative value)
c630: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 74 6f 52 65 61  .... */....toRea
c640: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  d = -1;..    }..
c650: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
c660: 20 46 63 6f 70 79 43 6f 6d 6d 61 6e 64 3a 0a 09   FcopyCommand:..
c670: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 6f 62 6a      cmdPtr = obj
c680: 76 5b 69 2b 31 5d 3b 0a 09 20 20 20 20 62 72 65  v[i+1];..    bre
c690: 61 6b 3b 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  ak;..default:.. 
c6a0: 20 20 20 54 43 4c 5f 55 4e 52 45 41 43 48 41 42     TCL_UNREACHAB
c6b0: 4c 45 28 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  LE();..}.    }..
c6c0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 43 6f      return TclCo
c6d0: 70 79 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  pyChannel(interp
c6e0: 2c 20 69 6e 43 68 61 6e 2c 20 6f 75 74 43 68 61  , inChan, outCha
c6f0: 6e 2c 20 74 6f 52 65 61 64 2c 20 63 6d 64 50 74  n, toRead, cmdPt
c700: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
c760: 68 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64  hanPendingObjCmd
c770: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
c780: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
c790: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
c7a0: 65 20 54 63 6c 20 22 63 68 61 6e 20 70 65 6e 64  e Tcl "chan pend
c7b0: 69 6e 67 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09  ing" command. *.
c7c0: 28 54 49 50 20 23 32 38 37 29 2e 20 53 65 65 20  (TIP #287). See 
c7d0: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e  the user documen
c7e0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  tation for detai
c7f0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f  ls on what it do
c800: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
c810: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
c820: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
c830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
c840: 0a 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27  . *.Sets interp'
c850: 73 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  s result to the 
c860: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c870: 6f 66 20 62 75 66 66 65 72 65 64 20 69 6e 70 75  of buffered inpu
c880: 74 20 6f 72 0a 20 2a 09 6f 75 74 70 75 74 20 28  t or. *.output (
c890: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
c8a0: 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 61  ther the first a
c8b0: 72 67 75 6d 65 6e 74 20 69 73 20 22 69 6e 70 75  rgument is "inpu
c8c0: 74 22 20 6f 72 0a 20 2a 09 22 6f 75 74 70 75 74  t" or. *."output
c8d0: 22 29 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  "), or -1 if the
c8e0: 20 63 68 61 6e 6e 65 6c 20 77 61 73 6e 27 74 20   channel wasn't 
c8f0: 6f 70 65 6e 65 64 20 66 6f 72 20 74 68 61 74 20  opened for that 
c900: 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mode.. *. *-----
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c950: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
c960: 69 63 20 69 6e 74 0a 43 68 61 6e 50 65 6e 64 69  ic int.ChanPendi
c970: 6e 67 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  ngObjCmd(.    TC
c980: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
c990: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
c9a0: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75   *interp,../* Cu
c9b0: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  rrent interprete
c9c0: 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69  r. */.    Tcl_Si
c9d0: 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d  ze objc,../* Num
c9e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c9f0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
ca00: 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f   *const *objv)./
ca10: 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63  * Argument objec
ca20: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c  ts. */.{.    Tcl
ca30: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
ca40: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
ca50: 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f 70 74 69  char *const opti
ca60: 6f 6e 73 5b 5d 20 3d 20 7b 22 69 6e 70 75 74 22  ons[] = {"input"
ca70: 2c 20 22 6f 75 74 70 75 74 22 2c 20 4e 55 4c 4c  , "output", NULL
ca80: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70 65 6e 64  };.    enum pend
ca90: 69 6e 67 4f 70 74 69 6f 6e 73 45 6e 75 6d 20 7b  ingOptionsEnum {
caa0: 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 2c 20 50  PENDING_INPUT, P
cab0: 45 4e 44 49 4e 47 5f 4f 55 54 50 55 54 7d 20 69  ENDING_OUTPUT} i
cac0: 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  ndex;.    int mo
cad0: 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  de;..    if (obj
cae0: 63 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c 5f 57  c != 3) {..Tcl_W
caf0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
cb00: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6d 6f  rp, 1, objv, "mo
cb10: 64 65 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  de channel");..r
cb20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cb30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
cb40: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
cb50: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
cb60: 5b 31 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 22 6d  [1], options, "m
cb70: 6f 64 65 22 2c 20 30 2c 0a 09 20 20 20 20 26 69  ode", 0,..    &i
cb80: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ndex) != TCL_OK)
cb90: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
cba0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
cbb0: 20 69 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e   if (TclGetChann
cbc0: 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  elFromObj(interp
cbd0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 68 61 6e  , objv[2], &chan
cbe0: 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54  , &mode, 0) != T
cbf0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
cc00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cc10: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 69  }..    switch (i
cc20: 6e 64 65 78 29 20 7b 0a 20 20 20 20 63 61 73 65  ndex) {.    case
cc30: 20 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54 3a 0a   PENDING_INPUT:.
cc40: 09 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43  .if (!(mode & TC
cc50: 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b 0a 09  L_READABLE)) {..
cc60: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
cc70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
cc80: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 2d  _NewWideIntObj(-
cc90: 31 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  1));..} else {..
cca0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
ccb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
ccc0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 54  _NewWideIntObj(T
ccd0: 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64  cl_InputBuffered
cce0: 28 63 68 61 6e 29 29 29 3b 0a 09 7d 0a 09 62 72  (chan)));..}..br
ccf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 45  eak;.    case PE
cd00: 4e 44 49 4e 47 5f 4f 55 54 50 55 54 3a 0a 09 69  NDING_OUTPUT:..i
cd10: 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f  f (!(mode & TCL_
cd20: 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09 20 20  WRITABLE)) {..  
cd30: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
cd40: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
cd50: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 2d 31 29  ewWideIntObj(-1)
cd60: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
cd70: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
cd80: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
cd90: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 54 63 6c  ewWideIntObj(Tcl
cda0: 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28  _OutputBuffered(
cdb0: 63 68 61 6e 29 29 29 3b 0a 09 7d 0a 09 62 72 65  chan)));..}..bre
cdc0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
cdd0: 0a 09 54 43 4c 5f 55 4e 52 45 41 43 48 41 42 4c  ..TCL_UNREACHABL
cde0: 45 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  E();.    }.    r
cdf0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ce00: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
ce50: 0a 20 2a 20 43 68 61 6e 54 72 75 6e 63 61 74 65  . * ChanTruncate
ce60: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
ce70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ce80: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
ce90: 65 73 73 20 74 68 65 20 22 63 68 61 6e 20 74 72  ess the "chan tr
cea0: 75 6e 63 61 74 65 22 20 54 63 6c 20 63 6f 6d 6d  uncate" Tcl comm
ceb0: 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 20  and.. *.See the 
cec0: 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69  user documentati
ced0: 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f  on for details o
cee0: 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a  n what it does..
cef0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
cf00: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
cf10: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
cf20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
cf30: 54 72 75 6e 63 61 74 65 73 20 61 20 63 68 61 6e  Truncates a chan
cf40: 6e 65 6c 20 28 6f 72 20 72 61 74 68 65 72 20 61  nel (or rather a
cf50: 20 66 69 6c 65 20 75 6e 64 65 72 6c 79 69 6e 67   file underlying
cf60: 20 61 20 63 68 61 6e 6e 65 6c 29 2e 0a 20 2a 0a   a channel).. *.
cf70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
cfc0: 61 74 69 63 20 69 6e 74 0a 43 68 61 6e 54 72 75  atic int.ChanTru
cfd0: 6e 63 61 74 65 4f 62 6a 43 6d 64 28 0a 20 20 20  ncateObjCmd(.   
cfe0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
cff0: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
d000: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
d010: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72   Current interpr
d020: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  eter. */.    Tcl
d030: 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20  _Size objc,../* 
d040: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d050: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nts. */.    Tcl_
d060: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76  Obj *const *objv
d070: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62  )./* Argument ob
d080: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20  jects. */.{.    
d090: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
d0a0: 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e  ;.    Tcl_WideIn
d0b0: 74 20 6c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 69  t length;..    i
d0c0: 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c  f ((objc < 2) ||
d0d0: 20 28 6f 62 6a 63 20 3e 20 33 29 29 20 7b 0a 09   (objc > 3)) {..
d0e0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d0f0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
d100: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6c 65 6e 67  , "channel ?leng
d110: 74 68 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  th?");..return T
d120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d130: 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43 68      if (TclGetCh
d140: 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e 74  annelFromObj(int
d150: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 63  erp, objv[1], &c
d160: 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21 3d  han, NULL, 0) !=
d170: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
d180: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d190: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a    }..    if (obj
d1a0: 63 20 3d 3d 20 33 29 20 7b 0a 09 2f 2a 0a 09 20  c == 3) {../*.. 
d1b0: 2a 20 55 73 65 72 20 69 73 20 73 75 70 70 6c 79  * User is supply
d1c0: 69 6e 67 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ing an explicit 
d1d0: 6c 65 6e 67 74 68 2e 0a 09 20 2a 2f 0a 0a 09 69  length... */...i
d1e0: 66 20 28 54 63 6c 47 65 74 57 69 64 65 49 6e 74  f (TclGetWideInt
d1f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
d200: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 67 74 68  objv[2], &length
d210: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
d220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d230: 52 52 4f 52 3b 0a 09 7d 0a 09 69 66 20 28 6c 65  RROR;..}..if (le
d240: 6e 67 74 68 20 3c 20 30 29 20 7b 0a 09 20 20 20  ngth < 0) {..   
d250: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
d260: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
d270: 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 20 20  wStringObj(...  
d280: 20 20 22 63 61 6e 6e 6f 74 20 74 72 75 6e 63 61    "cannot trunca
d290: 74 65 20 74 6f 20 6e 65 67 61 74 69 76 65 20 6c  te to negative l
d2a0: 65 6e 67 74 68 20 6f 66 20 66 69 6c 65 22 2c 20  ength of file", 
d2b0: 2d 31 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72  -1));..    retur
d2c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
d2d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
d2e0: 0a 09 20 2a 20 55 73 65 72 20 77 61 6e 74 73 20  .. * User wants 
d2f0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 6f 20 74  to truncate to t
d300: 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  he current file 
d310: 70 6f 73 69 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a  position... */..
d320: 09 6c 65 6e 67 74 68 20 3d 20 54 63 6c 5f 54 65  .length = Tcl_Te
d330: 6c 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 6c  ll(chan);..if (l
d340: 65 6e 67 74 68 20 3d 3d 20 2d 31 29 20 7b 0a 09  ength == -1) {..
d350: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
d360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
d370: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20  _ObjPrintf(...  
d380: 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 64 65 74    "could not det
d390: 65 72 6d 69 6e 65 20 63 75 72 72 65 6e 74 20 6c  ermine current l
d3a0: 6f 63 61 74 69 6f 6e 20 69 6e 20 5c 22 25 73 5c  ocation in \"%s\
d3b0: 22 3a 20 25 73 22 2c 0a 09 09 20 20 20 20 54 63  ": %s",...    Tc
d3c0: 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  lGetString(objv[
d3d0: 31 5d 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72  1]), Tcl_PosixEr
d3e0: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09  ror(interp)));..
d3f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d400: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
d410: 20 20 20 20 69 66 20 28 54 63 6c 5f 54 72 75 6e      if (Tcl_Trun
d420: 63 61 74 65 43 68 61 6e 6e 65 6c 28 63 68 61 6e  cateChannel(chan
d430: 2c 20 6c 65 6e 67 74 68 29 20 21 3d 20 54 43 4c  , length) != TCL
d440: 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f  _OK) {..Tcl_SetO
d450: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
d460: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a   Tcl_ObjPrintf(.
d470: 09 09 22 65 72 72 6f 72 20 64 75 72 69 6e 67 20  .."error during 
d480: 74 72 75 6e 63 61 74 65 20 6f 6e 20 5c 22 25 73  truncate on \"%s
d490: 5c 22 3a 20 25 73 22 2c 0a 09 09 54 63 6c 47 65  \": %s",...TclGe
d4a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d4b0: 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  , Tcl_PosixError
d4c0: 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 72 65 74  (interp)));..ret
d4d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
d4e0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
d4f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
d500: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
d550: 68 61 6e 50 69 70 65 4f 62 6a 43 6d 64 20 2d 2d  hanPipeObjCmd --
d560: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
d570: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
d580: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
d590: 63 68 61 6e 20 70 69 70 65 22 20 54 63 6c 20 63  chan pipe" Tcl c
d5a0: 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74  ommand.. *.See t
d5b0: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
d5c0: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ation for detail
d5d0: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65  s on what it doe
d5e0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
d5f0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
d600: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
d610: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d620: 20 2a 09 43 72 65 61 74 65 73 20 61 20 70 61 69   *.Creates a pai
d630: 72 20 6f 66 20 54 63 6c 20 63 68 61 6e 6e 65 6c  r of Tcl channel
d640: 73 20 77 72 61 70 70 69 6e 67 20 62 6f 74 68 20  s wrapping both 
d650: 65 6e 64 73 20 6f 66 20 61 20 6e 65 77 0a 20 2a  ends of a new. *
d660: 09 61 6e 6f 6e 79 6d 6f 75 73 20 70 69 70 65 2e  .anonymous pipe.
d670: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
d680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
d6c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 68 61  ..static int.Cha
d6d0: 6e 50 69 70 65 4f 62 6a 43 6d 64 28 0a 20 20 20  nPipeObjCmd(.   
d6e0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
d6f0: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
d700: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
d710: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72   Current interpr
d720: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  eter. */.    Tcl
d730: 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20  _Size objc,../* 
d740: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
d750: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nts. */.    Tcl_
d760: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76  Obj *const *objv
d770: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62  )./* Argument ob
d780: 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20  jects. */.{.    
d790: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72 63 68 61  Tcl_Channel rcha
d7a0: 6e 2c 20 77 63 68 61 6e 3b 0a 20 20 20 20 63 6f  n, wchan;.    co
d7b0: 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65  nst char *channe
d7c0: 6c 4e 61 6d 65 73 5b 32 5d 3b 0a 20 20 20 20 54  lNames[2];.    T
d7d0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74  cl_Obj *resultPt
d7e0: 72 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  r;..    if (objc
d7f0: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72   != 1) {..Tcl_Wr
d800: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d810: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
d820: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d830: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
d840: 66 20 28 54 63 6c 5f 43 72 65 61 74 65 50 69 70  f (Tcl_CreatePip
d850: 65 28 69 6e 74 65 72 70 2c 20 26 72 63 68 61 6e  e(interp, &rchan
d860: 2c 20 26 77 63 68 61 6e 2c 20 30 29 20 21 3d 20  , &wchan, 0) != 
d870: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
d880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d890: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e   }..    channelN
d8a0: 61 6d 65 73 5b 30 5d 20 3d 20 54 63 6c 5f 47 65  ames[0] = Tcl_Ge
d8b0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 72 63 68  tChannelName(rch
d8c0: 61 6e 29 3b 0a 20 20 20 20 63 68 61 6e 6e 65 6c  an);.    channel
d8d0: 4e 61 6d 65 73 5b 31 5d 20 3d 20 54 63 6c 5f 47  Names[1] = Tcl_G
d8e0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 77 63  etChannelName(wc
d8f0: 68 61 6e 29 3b 0a 0a 20 20 20 20 54 63 6c 4e 65  han);..    TclNe
d900: 77 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 29 3b  wObj(resultPtr);
d910: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
d920: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55  AppendElement(NU
d930: 4c 4c 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a 09  LL, resultPtr,..
d940: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
d950: 67 4f 62 6a 28 63 68 61 6e 6e 65 6c 4e 61 6d 65  gObj(channelName
d960: 73 5b 30 5d 2c 20 2d 31 29 29 3b 0a 20 20 20 20  s[0], -1));.    
d970: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
d980: 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 72  dElement(NULL, r
d990: 65 73 75 6c 74 50 74 72 2c 0a 09 20 20 20 20 54  esultPtr,..    T
d9a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
d9b0: 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 5b 31 5d 2c  channelNames[1],
d9c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53   -1));.    Tcl_S
d9d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
d9e0: 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0a  rp, resultPtr);.
d9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
da00: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
da10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 43 68 61  ---. *. * TclCha
da60: 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 20 2d 2d 0a  nnelNamesCmd --.
da70: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
da80: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ion is invoked t
da90: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 63  o process the "c
daa0: 68 61 6e 20 6e 61 6d 65 73 22 20 61 6e 64 20 22  han names" and "
dab0: 66 69 6c 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 73  file. *.channels
dac0: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 2e 20  " Tcl commands. 
dad0: 20 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f   See the user do
dae0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
daf0: 64 65 74 61 69 6c 73 20 6f 6e 0a 20 2a 09 77 68  details on. *.wh
db00: 61 74 20 74 68 65 79 20 64 6f 2e 0a 20 2a 0a 20  at they do.. *. 
db10: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
db20: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
db30: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
db40: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
db50: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
db60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
db70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
db80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
dba0: 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68 61 6e 6e 65  /..int.TclChanne
dbb0: 6c 4e 61 6d 65 73 43 6d 64 28 0a 20 20 20 20 54  lNamesCmd(.    T
dbc0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
dbd0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
dbe0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54  p *interp,.    T
dbf0: 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 0a 20 20  cl_Size objc,.  
dc00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
dc10: 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 69 66   *objv).{.    if
dc20: 20 28 6f 62 6a 63 20 3c 20 31 20 7c 7c 20 6f 62   (objc < 1 || ob
dc30: 6a 63 20 3e 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc > 2) {..Tcl_W
dc40: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
dc50: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70  rp, 1, objv, "?p
dc60: 61 74 74 65 72 6e 3f 22 29 3b 0a 09 72 65 74 75  attern?");..retu
dc70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dc80: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
dc90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
dca0: 65 73 45 78 28 69 6e 74 65 72 70 2c 0a 09 20 20  esEx(interp,..  
dcb0: 20 20 28 28 6f 62 6a 63 20 3d 3d 20 31 29 20 3f    ((objc == 1) ?
dcc0: 20 4e 55 4c 4c 20 3a 20 54 63 6c 47 65 74 53 74   NULL : TclGetSt
dcd0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29 3b  ring(objv[1])));
dce0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
dcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd30: 0a 20 2a 0a 20 2a 20 54 63 6c 53 65 74 55 70 43  . *. * TclSetUpC
dd40: 68 61 6e 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  hanCmd --. *. *.
dd50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
dd60: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
dd70: 75 70 20 74 68 65 20 22 63 68 61 6e 22 20 54 63  up the "chan" Tc
dd80: 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74  l command. See t
dd90: 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d  he. *.user docum
dda0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74  entation for det
ddb0: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20  ails on what it 
ddc0: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  does.. *. * Resu
ddd0: 6c 74 73 3a 0a 20 2a 09 54 63 6c 20 72 65 73 75  lts:. *.Tcl resu
dde0: 6c 74 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 53  lt code.. *. * S
ddf0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
de00: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
de10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de50: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 53 65  -. */..int.TclSe
de60: 74 55 70 43 68 61 6e 43 6d 64 28 0a 20 20 20 20  tUpChanCmd(.    
de70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
de80: 72 70 2c 0a 20 20 20 20 54 63 6c 5f 43 6f 6d 6d  rp,.    Tcl_Comm
de90: 61 6e 64 20 65 6e 73 65 6d 62 6c 65 29 0a 7b 0a  and ensemble).{.
dea0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 6f      /*.     * Mo
deb0: 73 74 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65 20  st commands are 
dec0: 70 6c 75 67 67 65 64 20 64 69 72 65 63 74 6c 79  plugged directly
ded0: 20 74 6f 67 65 74 68 65 72 2c 20 62 75 74 20 73   together, but s
dee0: 6f 6d 65 20 61 72 65 20 64 6f 6e 65 20 76 69 61  ome are done via
def0: 0a 20 20 20 20 20 2a 20 61 6c 69 61 73 2d 6c 69  .     * alias-li
df00: 6b 65 20 72 65 77 72 69 74 69 6e 67 3b 20 5b 63  ke rewriting; [c
df10: 68 61 6e 20 63 6f 6e 66 69 67 75 72 65 5d 20 69  han configure] i
df20: 73 20 74 68 69 73 20 77 61 79 20 66 6f 72 20 73  s this way for s
df30: 65 63 75 72 69 74 79 20 72 65 61 73 6f 6e 73 0a  ecurity reasons.
df40: 20 20 20 20 20 2a 20 28 77 61 6e 74 20 6f 76 65       * (want ove
df50: 72 77 72 69 74 69 6e 67 20 6f 66 20 5b 66 63 6f  rwriting of [fco
df60: 6e 66 69 67 75 72 65 5d 20 74 6f 20 63 6f 6e 74  nfigure] to cont
df70: 72 6f 6c 20 74 68 61 74 20 6e 69 63 65 6c 79 29  rol that nicely)
df80: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54  ..     */..    T
df90: 63 6c 5f 4f 62 6a 20 2a 6d 61 70 4f 62 6a 3b 0a  cl_Obj *mapObj;.
dfa0: 20 20 20 20 54 63 6c 5f 47 65 74 45 6e 73 65 6d      Tcl_GetEnsem
dfb0: 62 6c 65 4d 61 70 70 69 6e 67 44 69 63 74 28 4e  bleMappingDict(N
dfc0: 55 4c 4c 2c 20 65 6e 73 65 6d 62 6c 65 2c 20 26  ULL, ensemble, &
dfd0: 6d 61 70 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c  mapObj);.    Tcl
dfe0: 44 69 63 74 50 75 74 53 74 72 69 6e 67 28 4e 55  DictPutString(NU
dff0: 4c 4c 2c 20 6d 61 70 4f 62 6a 2c 20 22 63 6f 6e  LL, mapObj, "con
e000: 66 69 67 75 72 65 22 2c 20 22 3a 3a 66 63 6f 6e  figure", "::fcon
e010: 66 69 67 75 72 65 22 29 3b 0a 20 20 20 20 72 65  figure");.    re
e020: 74 75 72 6e 20 54 63 6c 5f 53 65 74 45 6e 73 65  turn Tcl_SetEnse
e030: 6d 62 6c 65 4d 61 70 70 69 6e 67 44 69 63 74 28  mbleMappingDict(
e040: 69 6e 74 65 72 70 2c 20 65 6e 73 65 6d 62 6c 65  interp, ensemble
e050: 2c 20 6d 61 70 4f 62 6a 29 3b 0a 7d 0a 0c 0a 2f  , mapObj);.}.../
e060: 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61  *. * Local Varia
e070: 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63  bles:. * mode: c
e080: 0a 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73  . * c-basic-offs
e090: 65 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f  et: 4. * fill-co
e0a0: 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a  lumn: 78. * End:
e0b0: 0a 20 2a 2f 0a                                   . */.