Tcl Source Code

Hex Artifact Content
Login

Artifact f227eef6faa66326f095d6abb9cb8d53a93d4e1c29a3f3cb67612779b566e054:


0000: 2f 2a 0a 20 2a 20 74 63 6c 49 4f 43 6d 64 2e 63  /*. * tclIOCmd.c
0010: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 74 61 69   --. *. *.Contai
0020: 6e 73 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ns the definitio
0030: 6e 73 20 6f 66 20 6d 6f 73 74 20 6f 66 20 74 68  ns of most of th
0040: 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 20 72  e Tcl commands r
0050: 65 6c 61 74 69 6e 67 20 74 6f 20 49 4f 2e 0a 20  elating to IO.. 
0060: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 c2  *. * Copyright �
0070: a9 20 31 39 39 35 2d 31 39 39 37 20 53 75 6e 20  � 1995-1997 Sun 
0080: 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e  Microsystems, In
0090: 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65  c.. *. * See the
00a0: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74   file "license.t
00b0: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d  erms" for inform
00c0: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61  ation on usage a
00d0: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f  nd redistributio
00e0: 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c  n of. * this fil
00f0: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53  e, and for a DIS
0100: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57  CLAIMER OF ALL W
0110: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a  ARRANTIES.. */..
0120: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 49 6e 74  #include "tclInt
0130: 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 43 61 6c 6c 62  .h"../*. * Callb
0140: 61 63 6b 20 73 74 72 75 63 74 75 72 65 20 66 6f  ack structure fo
0150: 72 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63  r accept callbac
0160: 6b 20 69 6e 20 61 20 54 43 50 20 73 65 72 76 65  k in a TCP serve
0170: 72 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20  r.. */..typedef 
0180: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 54 63 6c  struct {.    Tcl
0190: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 3b 09 09 2f  _Obj *script;../
01a0: 2a 20 53 63 72 69 70 74 20 74 6f 20 69 6e 76 6f  * Script to invo
01b0: 6b 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ke. */.    Tcl_I
01c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09  nterp *interp;..
01d0: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 69  /* Interpreter i
01e0: 6e 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20 69  n which to run i
01f0: 74 2e 20 2a 2f 0a 7d 20 41 63 63 65 70 74 43 61  t. */.} AcceptCa
0200: 6c 6c 62 61 63 6b 3b 0a 0a 2f 2a 0a 20 2a 20 54  llback;../*. * T
0210: 68 72 65 61 64 20 6c 6f 63 61 6c 20 73 74 6f 72  hread local stor
0220: 61 67 65 20 75 73 65 64 20 74 6f 20 6d 61 69 6e  age used to main
0230: 74 61 69 6e 20 61 20 70 65 72 2d 74 68 72 65 61  tain a per-threa
0240: 64 20 73 74 64 6f 75 74 20 63 68 61 6e 6e 65 6c  d stdout channel
0250: 20 6f 62 6a 2e 0a 20 2a 20 49 74 20 6d 75 73 74   obj.. * It must
0260: 20 62 65 20 70 65 72 2d 74 68 72 65 61 64 20 62   be per-thread b
0270: 65 63 61 75 73 65 20 6f 66 20 73 74 64 20 63 68  ecause of std ch
0280: 61 6e 6e 65 6c 20 6c 69 6d 69 74 61 74 69 6f 6e  annel limitation
0290: 73 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20  s.. */..typedef 
02a0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
02b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 3b 09 09 2f   initialized;../
02c0: 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
02d0: 74 68 65 20 6d 6f 64 75 6c 65 20 69 73 20 69 6e  the module is in
02e0: 69 74 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20  itialized. */.  
02f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 74 64 6f 75    Tcl_Obj *stdou
0300: 74 4f 62 6a 50 74 72 3b 09 2f 2a 20 43 61 63 68  tObjPtr;./* Cach
0310: 65 64 20 73 74 64 6f 75 74 20 63 68 61 6e 6e 65  ed stdout channe
0320: 6c 20 54 63 6c 5f 4f 62 6a 20 2a 2f 0a 7d 20 54  l Tcl_Obj */.} T
0330: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
0340: 61 3b 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 54  a;..static Tcl_T
0350: 68 72 65 61 64 44 61 74 61 4b 65 79 20 64 61 74  hreadDataKey dat
0360: 61 4b 65 79 3b 0a 0a 2f 2a 0a 20 2a 20 53 74 61  aKey;../*. * Sta
0370: 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f  tic functions fo
0380: 72 20 74 68 69 73 20 66 69 6c 65 3a 0a 20 2a 2f  r this file:. */
0390: 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 45 78 69  ..static Tcl_Exi
03a0: 74 50 72 6f 63 09 09 46 69 6e 61 6c 69 7a 65 49  tProc..FinalizeI
03b0: 4f 43 6d 64 54 53 44 3b 0a 73 74 61 74 69 63 20  OCmdTSD;.static 
03c0: 54 63 6c 5f 54 63 70 41 63 63 65 70 74 50 72 6f  Tcl_TcpAcceptPro
03d0: 63 20 09 41 63 63 65 70 74 43 61 6c 6c 62 61 63  c .AcceptCallbac
03e0: 6b 50 72 6f 63 3b 0a 73 74 61 74 69 63 20 54 63  kProc;.static Tc
03f0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 09 09 43 68  l_ObjCmdProc..Ch
0400: 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64 3b  anPendingObjCmd;
0410: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43  .static Tcl_ObjC
0420: 6d 64 50 72 6f 63 09 09 43 68 61 6e 54 72 75 6e  mdProc..ChanTrun
0430: 63 61 74 65 4f 62 6a 43 6d 64 3b 0a 73 74 61 74  cateObjCmd;.stat
0440: 69 63 20 76 6f 69 64 09 09 09 52 65 67 69 73 74  ic void...Regist
0450: 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72  erTcpServerInter
0460: 70 43 6c 65 61 6e 75 70 28 0a 09 09 09 09 20 20  pCleanup(.....  
0470: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0480: 74 65 72 70 2c 0a 09 09 09 09 20 20 20 20 41 63  terp,.....    Ac
0490: 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63  ceptCallback *ac
04a0: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29  ceptCallbackPtr)
04b0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74  ;.static Tcl_Int
04c0: 65 72 70 44 65 6c 65 74 65 50 72 6f 63 09 54 63  erpDeleteProc.Tc
04d0: 70 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 73  pAcceptCallbacks
04e0: 44 65 6c 65 74 65 50 72 6f 63 3b 0a 73 74 61 74  DeleteProc;.stat
04f0: 69 63 20 76 6f 69 64 09 09 54 63 70 53 65 72 76  ic void..TcpServ
0500: 65 72 43 6c 6f 73 65 50 72 6f 63 28 76 6f 69 64  erCloseProc(void
0510: 20 2a 63 61 6c 6c 62 61 63 6b 44 61 74 61 29 3b   *callbackData);
0520: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 55 6e  .static void..Un
0530: 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76 65  registerTcpServe
0540: 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50 72  rInterpCleanupPr
0550: 6f 63 28 0a 09 09 09 20 20 20 20 54 63 6c 5f 49  oc(....    Tcl_I
0560: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09  nterp *interp,..
0570: 09 09 20 20 20 20 41 63 63 65 70 74 43 61 6c 6c  ..    AcceptCall
0580: 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c  back *acceptCall
0590: 62 61 63 6b 50 74 72 29 3b 0a 0c 0a 2f 2a 0a 20  backPtr);.../*. 
05a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 69  -------. *. * Fi
05f0: 6e 61 6c 69 7a 65 49 4f 43 6d 64 54 53 44 20 2d  nalizeIOCmdTSD -
0600: 2d 0a 20 2a 0a 20 2a 09 52 65 6c 65 61 73 65 20  -. *. *.Release 
0610: 74 68 65 20 73 74 6f 72 61 67 65 20 61 73 73 6f  the storage asso
0620: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
0630: 70 65 72 2d 74 68 72 65 61 64 20 63 61 63 68 65  per-thread cache
0640: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
0650: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
0660: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
0670: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  --. */..static v
06d0: 6f 69 64 0a 46 69 6e 61 6c 69 7a 65 49 4f 43 6d  oid.FinalizeIOCm
06e0: 64 54 53 44 28 0a 20 20 20 20 54 43 4c 5f 55 4e  dTSD(.    TCL_UN
06f0: 55 53 45 44 28 76 6f 69 64 20 2a 29 29 0a 7b 0a  USED(void *)).{.
0700: 20 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66      ThreadSpecif
0710: 69 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d  icData *tsdPtr =
0720: 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64   TCL_TSD_INIT(&d
0730: 61 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 69 66  ataKey);..    if
0740: 20 28 74 73 64 50 74 72 2d 3e 73 74 64 6f 75 74   (tsdPtr->stdout
0750: 4f 62 6a 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20  ObjPtr != NULL) 
0760: 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
0770: 75 6e 74 28 74 73 64 50 74 72 2d 3e 73 74 64 6f  unt(tsdPtr->stdo
0780: 75 74 4f 62 6a 50 74 72 29 3b 0a 09 74 73 64 50  utObjPtr);..tsdP
0790: 74 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72  tr->stdoutObjPtr
07a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
07b0: 20 20 20 74 73 64 50 74 72 2d 3e 69 6e 69 74 69     tsdPtr->initi
07c0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 7d 0a 0c 0a  alized = 0;.}...
07d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0820: 2a 20 54 63 6c 5f 50 75 74 73 4f 62 6a 43 6d 64  * Tcl_PutsObjCmd
0830: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
0840: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
0850: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
0860: 65 20 22 70 75 74 73 22 20 54 63 6c 20 63 6f 6d  e "puts" Tcl com
0870: 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a 20 2a  mand. See the. *
0880: 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74  .user documentat
0890: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20  ion for details 
08a0: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e  on what it does.
08b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
08c0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
08d0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
08e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
08f0: 09 50 72 6f 64 75 63 65 73 20 6f 75 74 70 75 74  .Produces output
0900: 20 6f 6e 20 61 20 63 68 61 6e 6e 65 6c 2e 0a 20   on a channel.. 
0910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
0960: 69 6e 74 0a 54 63 6c 5f 50 75 74 73 4f 62 6a 43  int.Tcl_PutsObjC
0970: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
0980: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
0990: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
09a0: 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
09b0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
09c0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09      int objc,...
09d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
09e0: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54  uments. */.    T
09f0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
0a00: 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e  jv[])./* Argumen
0a10: 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a  t objects. */.{.
0a20: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
0a30: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
0a40: 61 6e 6e 65 6c 20 74 6f 20 70 75 74 73 20 6f 6e  annel to puts on
0a50: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
0a60: 20 2a 73 74 72 69 6e 67 3b 09 09 2f 2a 20 53 74   *string;../* St
0a70: 72 69 6e 67 20 74 6f 20 77 72 69 74 65 2e 20 2a  ring to write. *
0a80: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  /.    Tcl_Obj *c
0a90: 68 61 6e 4f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  hanObjPtr = NULL
0aa0: 3b 09 2f 2a 20 63 68 61 6e 6e 65 6c 20 6f 62 6a  ;./* channel obj
0ab0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ect. */.    int 
0ac0: 6e 65 77 6c 69 6e 65 3b 09 09 2f 2a 20 41 64 64  newline;../* Add
0ad0: 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 65 6e   a newline at en
0ae0: 64 3f 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74  d? */.    size_t
0af0: 20 72 65 73 75 6c 74 3b 09 09 2f 2a 20 52 65 73   result;../* Res
0b00: 75 6c 74 20 6f 66 20 70 75 74 73 20 6f 70 65 72  ult of puts oper
0b10: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ation. */.    in
0b20: 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64  t mode;.../* Mod
0b30: 65 20 69 6e 20 77 68 69 63 68 20 63 68 61 6e 6e  e in which chann
0b40: 65 6c 20 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f  el is opened. */
0b50: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f 62  ..    switch (ob
0b60: 6a 63 29 20 7b 0a 20 20 20 20 63 61 73 65 20 32  jc) {.    case 2
0b70: 3a 09 09 09 2f 2a 20 5b 70 75 74 73 20 24 78 5d  :.../* [puts $x]
0b80: 20 2a 2f 0a 09 73 74 72 69 6e 67 20 3d 20 6f 62   */..string = ob
0b90: 6a 76 5b 31 5d 3b 0a 09 6e 65 77 6c 69 6e 65 20  jv[1];..newline 
0ba0: 3d 20 31 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20  = 1;..break;..  
0bb0: 20 20 63 61 73 65 20 33 3a 09 09 09 2f 2a 20 5b    case 3:.../* [
0bc0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
0bd0: 24 78 5d 20 6f 72 20 5b 70 75 74 73 20 24 63 68  $x] or [puts $ch
0be0: 61 6e 20 24 78 5d 20 2a 2f 0a 09 69 66 20 28 73  an $x] */..if (s
0bf0: 74 72 63 6d 70 28 54 63 6c 47 65 74 53 74 72 69  trcmp(TclGetStri
0c00: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6e  ng(objv[1]), "-n
0c10: 6f 6e 65 77 6c 69 6e 65 22 29 20 3d 3d 20 30 29  onewline") == 0)
0c20: 20 7b 0a 09 20 20 20 20 6e 65 77 6c 69 6e 65 20   {..    newline 
0c30: 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
0c40: 20 20 20 20 6e 65 77 6c 69 6e 65 20 3d 20 31 3b      newline = 1;
0c50: 0a 09 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72  ..    chanObjPtr
0c60: 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 09 7d 0a 09   = objv[1];..}..
0c70: 73 74 72 69 6e 67 20 3d 20 6f 62 6a 76 5b 32 5d  string = objv[2]
0c80: 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63  ;..break;..    c
0c90: 61 73 65 20 34 3a 09 09 09 2f 2a 20 5b 70 75 74  ase 4:.../* [put
0ca0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 63 68  s -nonewline $ch
0cb0: 61 6e 20 24 78 5d 20 6f 72 0a 09 09 09 09 20 2a  an $x] or..... *
0cc0: 20 5b 70 75 74 73 20 24 63 68 61 6e 20 24 78 20   [puts $chan $x 
0cd0: 6e 6f 6e 65 77 6c 69 6e 65 5d 20 2a 2f 0a 09 6e  nonewline] */..n
0ce0: 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 09 69 66 20  ewline = 0;..if 
0cf0: 28 73 74 72 63 6d 70 28 54 63 6c 47 65 74 53 74  (strcmp(TclGetSt
0d00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ring(objv[1]), "
0d10: 2d 6e 6f 6e 65 77 6c 69 6e 65 22 29 20 3d 3d 20  -nonewline") == 
0d20: 30 29 20 7b 0a 09 20 20 20 20 63 68 61 6e 4f 62  0) {..    chanOb
0d30: 6a 50 74 72 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  jPtr = objv[2];.
0d40: 09 20 20 20 20 73 74 72 69 6e 67 20 3d 20 6f 62  .    string = ob
0d50: 6a 76 5b 33 5d 3b 0a 09 20 20 20 20 62 72 65 61  jv[3];..    brea
0d60: 6b 3b 0a 09 7d 0a 09 2f 2a 20 46 61 6c 6c 20 74  k;..}../* Fall t
0d70: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
0d80: 66 61 75 6c 74 3a 09 09 09 2f 2a 20 5b 70 75 74  fault:.../* [put
0d90: 73 5d 20 6f 72 0a 09 09 09 09 20 2a 20 5b 70 75  s] or..... * [pu
0da0: 74 73 20 73 6f 6d 65 20 62 61 64 20 6e 75 6d 62  ts some bad numb
0db0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
0dc0: 2e 2e 5d 20 2a 2f 0a 09 54 63 6c 5f 57 72 6f 6e  ..] */..Tcl_Wron
0dd0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
0de0: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6e 6f 6e   1, objv, "?-non
0df0: 65 77 6c 69 6e 65 3f 20 3f 63 68 61 6e 6e 65 6c  ewline? ?channel
0e00: 49 64 3f 20 73 74 72 69 6e 67 22 29 3b 0a 09 72  Id? string");..r
0e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0e20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
0e30: 63 68 61 6e 4f 62 6a 50 74 72 20 3d 3d 20 4e 55  chanObjPtr == NU
0e40: 4c 4c 29 20 7b 0a 09 54 68 72 65 61 64 53 70 65  LL) {..ThreadSpe
0e50: 63 69 66 69 63 44 61 74 61 20 2a 74 73 64 50 74  cificData *tsdPt
0e60: 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54  r = TCL_TSD_INIT
0e70: 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 09 69 66  (&dataKey);...if
0e80: 20 28 21 74 73 64 50 74 72 2d 3e 69 6e 69 74 69   (!tsdPtr->initi
0e90: 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 74  alized) {..    t
0ea0: 73 64 50 74 72 2d 3e 69 6e 69 74 69 61 6c 69 7a  sdPtr->initializ
0eb0: 65 64 20 3d 20 31 3b 0a 09 20 20 20 20 54 63 6c  ed = 1;..    Tcl
0ec0: 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67  NewLiteralString
0ed0: 4f 62 6a 28 74 73 64 50 74 72 2d 3e 73 74 64 6f  Obj(tsdPtr->stdo
0ee0: 75 74 4f 62 6a 50 74 72 2c 20 22 73 74 64 6f 75  utObjPtr, "stdou
0ef0: 74 22 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  t");..    Tcl_In
0f00: 63 72 52 65 66 43 6f 75 6e 74 28 74 73 64 50 74  crRefCount(tsdPt
0f10: 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74 72 29  r->stdoutObjPtr)
0f20: 3b 0a 09 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ;..    Tcl_Creat
0f30: 65 54 68 72 65 61 64 45 78 69 74 48 61 6e 64 6c  eThreadExitHandl
0f40: 65 72 28 46 69 6e 61 6c 69 7a 65 49 4f 43 6d 64  er(FinalizeIOCmd
0f50: 54 53 44 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09  TSD, NULL);..}..
0f60: 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 74 73 64  chanObjPtr = tsd
0f70: 50 74 72 2d 3e 73 74 64 6f 75 74 4f 62 6a 50 74  Ptr->stdoutObjPt
0f80: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  r;.    }.    if 
0f90: 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72  (TclGetChannelFr
0fa0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68  omObj(interp, ch
0fb0: 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c  anObjPtr, &chan,
0fc0: 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43   &mode, 0) != TC
0fd0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
0fe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
0ff0: 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20  .    if (!(mode 
1000: 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 29  & TCL_WRITABLE))
1010: 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65   {..Tcl_SetObjRe
1020: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1030: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63  _ObjPrintf(..."c
1040: 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61  hannel \"%s\" wa
1050: 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20  sn't opened for 
1060: 77 72 69 74 69 6e 67 22 2c 0a 09 09 54 63 6c 47  writing",...TclG
1070: 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a  etString(chanObj
1080: 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20  Ptr)));..return 
1090: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10a0: 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c  ..    TclChannel
10b0: 50 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a  Preserve(chan);.
10c0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c      result = Tcl
10d0: 5f 57 72 69 74 65 4f 62 6a 28 63 68 61 6e 2c 20  _WriteObj(chan, 
10e0: 73 74 72 69 6e 67 29 3b 0a 20 20 20 20 69 66 20  string);.    if 
10f0: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 49  (result == TCL_I
1100: 4e 44 45 58 5f 4e 4f 4e 45 29 20 7b 0a 09 67 6f  NDEX_NONE) {..go
1110: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to error;.    }.
1120: 20 20 20 20 69 66 20 28 6e 65 77 6c 69 6e 65 20      if (newline 
1130: 21 3d 20 30 29 20 7b 0a 09 72 65 73 75 6c 74 20  != 0) {..result 
1140: 3d 20 54 63 6c 5f 57 72 69 74 65 43 68 61 72 73  = Tcl_WriteChars
1150: 28 63 68 61 6e 2c 20 22 5c 6e 22 2c 20 31 29 3b  (chan, "\n", 1);
1160: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20  ..if (result == 
1170: 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 20  TCL_INDEX_NONE) 
1180: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  {..    goto erro
1190: 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  r;..}.    }.    
11a0: 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73  TclChannelReleas
11b0: 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72 65 74  e(chan);.    ret
11c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20  urn TCL_OK;..   
11d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20 23   /*.     * TIP #
11e0: 32 31 39 2e 0a 20 20 20 20 20 2a 20 43 61 70 74  219..     * Capt
11f0: 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ure error messag
1200: 65 73 20 70 75 74 20 62 79 20 74 68 65 20 64 72  es put by the dr
1210: 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79  iver into the by
1220: 70 61 73 73 20 61 72 65 61 20 61 6e 64 20 70 75  pass area and pu
1230: 74 0a 20 20 20 20 20 2a 20 74 68 65 6d 20 69 6e  t.     * them in
1240: 74 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69  to the regular i
1250: 6e 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c  nterpreter resul
1260: 74 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  t. Fall back to 
1270: 74 68 65 20 72 65 67 75 6c 61 72 0a 20 20 20 20  the regular.    
1280: 20 2a 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f   * message if no
1290: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20  thing was found 
12a0: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 20  in the bypass.. 
12b0: 20 20 20 20 2a 2f 0a 0a 20 20 65 72 72 6f 72 3a      */..  error:
12c0: 0a 20 20 20 20 69 66 20 28 21 54 63 6c 43 68 61  .    if (!TclCha
12d0: 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 61  nCaughtErrorBypa
12e0: 73 73 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  ss(interp, chan)
12f0: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ) {..Tcl_SetObjR
1300: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1310: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 65 72 72  l_ObjPrintf("err
1320: 6f 72 20 77 72 69 74 69 6e 67 20 5c 22 25 73 5c  or writing \"%s\
1330: 22 3a 20 25 73 22 2c 0a 09 09 54 63 6c 47 65 74  ": %s",...TclGet
1340: 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74  String(chanObjPt
1350: 72 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72  r), Tcl_PosixErr
1360: 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 20 20  or(interp)));.  
1370: 20 20 7d 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e    }.    TclChann
1380: 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29 3b  elRelease(chan);
1390: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13a0: 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ERROR;.}.../*. *
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
1400: 5f 46 6c 75 73 68 4f 62 6a 43 6d 64 20 2d 2d 0a  _FlushObjCmd --.
1410: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
1420: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1430: 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c   process the Tcl
1440: 20 22 66 6c 75 73 68 22 20 63 6f 6d 6d 61 6e 64   "flush" command
1450: 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65  . See the. *.use
1460: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  r documentation 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77  for details on w
1480: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a  hat it does.. *.
1490: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
14a0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
14b0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
14c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
14d0: 20 63 61 75 73 65 20 6f 75 74 70 75 74 20 74 6f   cause output to
14e0: 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 73   appear on the s
14f0: 70 65 63 69 66 69 65 64 20 63 68 61 6e 6e 65 6c  pecified channel
1500: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
1510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1550: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 46 6c 75 73 68  /..int.Tcl_Flush
1560: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
1570: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
1580: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
1590: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72  interp,../* Curr
15a0: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
15b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63   */.    int objc
15c0: 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ,.../* Number of
15d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20   arguments. */. 
15e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
15f0: 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67  t objv[])./* Arg
1600: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a  ument objects. *
1610: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.{.    Tcl_Obj 
1620: 2a 63 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20  *chanObjPtr;.   
1630: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
1640: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
1650: 65 6c 20 74 6f 20 66 6c 75 73 68 20 6f 6e 2e 20  el to flush on. 
1660: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b  */.    int mode;
1670: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
1680: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
1690: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
16b0: 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20  elId");..return 
16c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
16d0: 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20  .    chanObjPtr 
16e0: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 69  = objv[1];.    i
16f0: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c  f (TclGetChannel
1700: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1710: 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61  chanObjPtr, &cha
1720: 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20  n, &mode, 0) != 
1730: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
1740: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1750: 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64   }.    if (!(mod
1760: 65 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  e & TCL_WRITABLE
1770: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  )) {..Tcl_SetObj
1780: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1790: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09  cl_ObjPrintf(...
17a0: 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20  "channel \"%s\" 
17b0: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f  wasn't opened fo
17c0: 72 20 77 72 69 74 69 6e 67 22 2c 0a 09 09 54 63  r writing",...Tc
17d0: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f  lGetString(chanO
17e0: 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72  bjPtr)));..retur
17f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1800: 20 7d 0a 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e   }..    TclChann
1810: 65 6c 50 72 65 73 65 72 76 65 28 63 68 61 6e 29  elPreserve(chan)
1820: 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46 6c  ;.    if (Tcl_Fl
1830: 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54 43 4c  ush(chan) != TCL
1840: 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54  _OK) {../*.. * T
1850: 49 50 20 23 32 31 39 2e 0a 09 20 2a 20 43 61 70  IP #219... * Cap
1860: 74 75 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ture error messa
1870: 67 65 73 20 70 75 74 20 62 79 20 74 68 65 20 64  ges put by the d
1880: 72 69 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62  river into the b
1890: 79 70 61 73 73 20 61 72 65 61 20 61 6e 64 0a 09  ypass area and..
18a0: 20 2a 20 70 75 74 20 74 68 65 6d 20 69 6e 74 6f   * put them into
18b0: 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74   the regular int
18c0: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e  erpreter result.
18d0: 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   Fall back to th
18e0: 65 0a 09 20 2a 20 72 65 67 75 6c 61 72 20 6d 65  e.. * regular me
18f0: 73 73 61 67 65 20 69 66 20 6e 6f 74 68 69 6e 67  ssage if nothing
1900: 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 68   was found in th
1910: 65 20 62 79 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a  e bypass... */..
1920: 09 69 66 20 28 21 54 63 6c 43 68 61 6e 43 61 75  .if (!TclChanCau
1930: 67 68 74 45 72 72 6f 72 42 79 70 61 73 73 28 69  ghtErrorBypass(i
1940: 6e 74 65 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a  nterp, chan)) {.
1950: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1960: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1970: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20  l_ObjPrintf(... 
1980: 20 20 20 22 65 72 72 6f 72 20 66 6c 75 73 68 69     "error flushi
1990: 6e 67 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a  ng \"%s\": %s",.
19a0: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69  ..    TclGetStri
19b0: 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72 29 2c 20  ng(chanObjPtr), 
19c0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
19d0: 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63  nterp)));..}..Tc
19e0: 6c 43 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28  lChannelRelease(
19f0: 63 68 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54  chan);..return T
1a00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
1a10: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65      TclChannelRe
1a20: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20  lease(chan);.   
1a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a40: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a90: 20 2a 0a 20 2a 20 54 63 6c 5f 47 65 74 73 4f 62   *. * Tcl_GetsOb
1aa0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
1ab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1ac0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
1ad0: 20 74 68 65 20 54 63 6c 20 22 67 65 74 73 22 20   the Tcl "gets" 
1ae0: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65  command. See the
1af0: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e  . *.user documen
1b00: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  tation for detai
1b10: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f  ls on what it do
1b20: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
1b30: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
1b40: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
1b50: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
1b60: 0a 20 2a 09 4d 61 79 20 63 6f 6e 73 75 6d 65 20  . *.May consume 
1b70: 69 6e 70 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e  input from chann
1b80: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1bd0: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 47 65 74   */..int.Tcl_Get
1be0: 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  sObjCmd(.    TCL
1bf0: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
1c00: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
1c10: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72  *interp,../* Cur
1c20: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
1c30: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a  . */.    int obj
1c40: 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  c,.../* Number o
1c50: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  f arguments. */.
1c60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
1c70: 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72  st objv[])./* Ar
1c80: 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20  gument objects. 
1c90: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  */.{.    Tcl_Cha
1ca0: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
1cb0: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 72 65  he channel to re
1cc0: 61 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ad from. */.    
1cd0: 73 69 7a 65 5f 74 20 6c 69 6e 65 4c 65 6e 3b 09  size_t lineLen;.
1ce0: 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6c 69  ./* Length of li
1cf0: 6e 65 20 6a 75 73 74 20 72 65 61 64 2e 20 2a 2f  ne just read. */
1d00: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 09 09  .    int mode;..
1d10: 09 2f 2a 20 4d 6f 64 65 20 69 6e 20 77 68 69 63  ./* Mode in whic
1d20: 68 20 63 68 61 6e 6e 65 6c 20 69 73 20 6f 70 65  h channel is ope
1d30: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ned. */.    Tcl_
1d40: 4f 62 6a 20 2a 6c 69 6e 65 50 74 72 2c 20 2a 63  Obj *linePtr, *c
1d50: 68 61 6e 4f 62 6a 50 74 72 3b 0a 20 20 20 20 69  hanObjPtr;.    i
1d60: 6e 74 20 63 6f 64 65 20 3d 20 54 43 4c 5f 4f 4b  nt code = TCL_OK
1d70: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ;..    if ((objc
1d80: 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a 63 20   != 2) && (objc 
1d90: 21 3d 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57 72  != 3)) {..Tcl_Wr
1da0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1db0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
1dc0: 6e 6e 65 6c 49 64 20 3f 76 61 72 4e 61 6d 65 3f  nnelId ?varName?
1dd0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
1de0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1df0: 20 63 68 61 6e 4f 62 6a 50 74 72 20 3d 20 6f 62   chanObjPtr = ob
1e00: 6a 76 5b 31 5d 3b 0a 20 20 20 20 69 66 20 28 54  jv[1];.    if (T
1e10: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d  clGetChannelFrom
1e20: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  Obj(interp, chan
1e30: 4f 62 6a 50 74 72 2c 20 26 63 68 61 6e 2c 20 26  ObjPtr, &chan, &
1e40: 6d 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f  mode, 0) != TCL_
1e50: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
1e60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
1e70: 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20     if (!(mode & 
1e80: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b  TCL_READABLE)) {
1e90: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
1ea0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
1eb0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61  bjPrintf(..."cha
1ec0: 6e 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e  nnel \"%s\" wasn
1ed0: 27 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  't opened for re
1ee0: 61 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74  ading",...TclGet
1ef0: 53 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74  String(chanObjPt
1f00: 72 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  r)));..return TC
1f10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
1f20: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72      TclChannelPr
1f30: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20  eserve(chan);.  
1f40: 20 20 54 63 6c 4e 65 77 4f 62 6a 28 6c 69 6e 65    TclNewObj(line
1f50: 50 74 72 29 3b 0a 20 20 20 20 6c 69 6e 65 4c 65  Ptr);.    lineLe
1f60: 6e 20 3d 20 54 63 6c 5f 47 65 74 73 4f 62 6a 28  n = Tcl_GetsObj(
1f70: 63 68 61 6e 2c 20 6c 69 6e 65 50 74 72 29 3b 0a  chan, linePtr);.
1f80: 20 20 20 20 69 66 20 28 6c 69 6e 65 4c 65 6e 20      if (lineLen 
1f90: 3d 3d 20 54 43 4c 5f 49 4f 5f 46 41 49 4c 55 52  == TCL_IO_FAILUR
1fa0: 45 29 20 7b 0a 09 69 66 20 28 21 54 63 6c 5f 45  E) {..if (!Tcl_E
1fb0: 6f 66 28 63 68 61 6e 29 20 26 26 20 21 54 63 6c  of(chan) && !Tcl
1fc0: 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68  _InputBlocked(ch
1fd0: 61 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  an)) {..    Tcl_
1fe0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 6e  DecrRefCount(lin
1ff0: 65 50 74 72 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a  ePtr);...    /*.
2000: 09 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39  .     * TIP #219
2010: 2e 0a 09 20 20 20 20 20 2a 20 43 61 70 74 75 72  ...     * Captur
2020: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
2030: 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76   put by the driv
2040: 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61  er into the bypa
2050: 73 73 20 61 72 65 61 0a 09 20 20 20 20 20 2a 20  ss area..     * 
2060: 61 6e 64 20 70 75 74 20 74 68 65 6d 20 69 6e 74  and put them int
2070: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e  o the regular in
2080: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
2090: 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 09  . Fall back to..
20a0: 20 20 20 20 20 2a 20 74 68 65 20 72 65 67 75 6c       * the regul
20b0: 61 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f  ar message if no
20c0: 74 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20  thing was found 
20d0: 69 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09  in the bypass...
20e0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
20f0: 20 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74   (!TclChanCaught
2100: 45 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65  ErrorBypass(inte
2110: 72 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 09 54  rp, chan)) {...T
2120: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2130: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
2140: 72 69 6e 74 66 28 0a 09 09 09 22 65 72 72 6f 72  rintf(...."error
2150: 20 72 65 61 64 69 6e 67 20 5c 22 25 73 5c 22 3a   reading \"%s\":
2160: 20 25 73 22 2c 0a 09 09 09 54 63 6c 47 65 74 53   %s",....TclGetS
2170: 74 72 69 6e 67 28 63 68 61 6e 4f 62 6a 50 74 72  tring(chanObjPtr
2180: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f  ), Tcl_PosixErro
2190: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20  r(interp)));..  
21a0: 20 20 7d 0a 09 20 20 20 20 63 6f 64 65 20 3d 20    }..    code = 
21b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
21c0: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 6c  goto done;..}..l
21d0: 69 6e 65 4c 65 6e 20 3d 20 54 43 4c 5f 49 4f 5f  ineLen = TCL_IO_
21e0: 46 41 49 4c 55 52 45 3b 0a 20 20 20 20 7d 0a 20  FAILURE;.    }. 
21f0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33     if (objc == 3
2200: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 4f 62 6a  ) {..if (Tcl_Obj
2210: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
2220: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 2c 20 6c  objv[2], NULL, l
2230: 69 6e 65 50 74 72 2c 0a 09 09 54 43 4c 5f 4c 45  inePtr,...TCL_LE
2240: 41 56 45 5f 45 52 52 5f 4d 53 47 29 20 3d 3d 20  AVE_ERR_MSG) == 
2250: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 64  NULL) {..    cod
2260: 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  e = TCL_ERROR;..
2270: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09      goto done;..
2280: 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  }..Tcl_SetObjRes
2290: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
22a0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54  NewWideIntObj((T
22b0: 63 6c 5f 57 69 64 65 49 6e 74 29 28 28 54 63 6c  cl_WideInt)((Tcl
22c0: 5f 57 69 64 65 55 49 6e 74 29 28 6c 69 6e 65 4c  _WideUInt)(lineL
22d0: 65 6e 20 2b 20 31 55 29 29 20 2d 20 31 29 29 3b  en + 1U)) - 1));
22e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
22f0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2300: 69 6e 74 65 72 70 2c 20 6c 69 6e 65 50 74 72 29  interp, linePtr)
2310: 3b 0a 20 20 20 20 7d 0a 20 20 64 6f 6e 65 3a 0a  ;.    }.  done:.
2320: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65      TclChannelRe
2330: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20  lease(chan);.   
2340: 20 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 7d 0a   return code;.}.
2350: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
23a0: 0a 20 2a 20 54 63 6c 5f 52 65 61 64 4f 62 6a 43  . * Tcl_ReadObjC
23b0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
23c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
23d0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
23e0: 74 68 65 20 54 63 6c 20 22 72 65 61 64 22 20 63  the Tcl "read" c
23f0: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a  ommand. See the.
2400: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74   *.user document
2410: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ation for detail
2420: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65  s on what it doe
2430: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
2440: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
2450: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
2460: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2470: 20 2a 09 4d 61 79 20 63 6f 6e 73 75 6d 65 20 69   *.May consume i
2480: 6e 70 75 74 20 66 72 6f 6d 20 63 68 61 6e 6e 65  nput from channe
2490: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
24e0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 52 65 61 64  */..int.Tcl_Read
24f0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
2500: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
2510: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
2520: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72  interp,../* Curr
2530: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
2540: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63   */.    int objc
2550: 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ,.../* Number of
2560: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20   arguments. */. 
2570: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
2580: 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67  t objv[])./* Arg
2590: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a  ument objects. *
25a0: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  /.{.    Tcl_Chan
25b0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
25c0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 72 65 61  e channel to rea
25d0: 64 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 69  d from. */.    i
25e0: 6e 74 20 6e 65 77 6c 69 6e 65 2c 20 69 3b 09 09  nt newline, i;..
25f0: 2f 2a 20 44 69 73 63 61 72 64 20 6e 65 77 6c 69  /* Discard newli
2600: 6e 65 20 61 74 20 65 6e 64 3f 20 2a 2f 0a 20 20  ne at end? */.  
2610: 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 74 6f    Tcl_WideInt to
2620: 52 65 61 64 3b 09 09 09 2f 2a 20 48 6f 77 20 6d  Read;.../* How m
2630: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 72 65 61  any bytes to rea
2640: 64 3f 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74  d? */.    size_t
2650: 20 63 68 61 72 61 63 74 65 72 73 52 65 61 64 3b   charactersRead;
2660: 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 63 68  ../* How many ch
2670: 61 72 61 63 74 65 72 73 20 77 65 72 65 20 72 65  aracters were re
2680: 61 64 3f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  ad? */.    int m
2690: 6f 64 65 3b 09 09 09 2f 2a 20 4d 6f 64 65 20 69  ode;.../* Mode i
26a0: 6e 20 77 68 69 63 68 20 63 68 61 6e 6e 65 6c 20  n which channel 
26b0: 69 73 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  is opened. */.  
26c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
26d0: 74 50 74 72 2c 20 2a 63 68 61 6e 4f 62 6a 50 74  tPtr, *chanObjPt
26e0: 72 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a  r;..    if ((obj
26f0: 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a 63  c != 2) && (objc
2700: 20 21 3d 20 33 29 29 20 7b 0a 09 49 6e 74 65 72   != 3)) {..Inter
2710: 70 20 2a 69 50 74 72 3b 0a 0a 20 20 20 20 61 72  p *iPtr;..    ar
2720: 67 65 72 72 6f 72 3a 0a 09 69 50 74 72 20 3d 20  gerror:..iPtr = 
2730: 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72  (Interp *) inter
2740: 70 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  p;..Tcl_WrongNum
2750: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2760: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64  objv, "channelId
2770: 20 3f 6e 75 6d 43 68 61 72 73 3f 22 29 3b 0a 0a   ?numChars?");..
2780: 09 2f 2a 0a 09 20 2a 20 44 6f 20 6e 6f 74 20 61  ./*.. * Do not a
2790: 70 70 65 6e 64 20 64 69 72 65 63 74 6c 79 3b 20  ppend directly; 
27a0: 74 68 61 74 20 6d 61 6b 65 73 20 65 6e 73 65 6d  that makes ensem
27b0: 62 6c 65 73 20 75 73 69 6e 67 20 74 68 69 73 20  bles using this 
27c0: 63 6f 6d 6d 61 6e 64 20 61 73 0a 09 20 2a 20 61  command as.. * a
27d0: 20 73 75 62 63 6f 6d 6d 61 6e 64 20 70 72 6f 64   subcommand prod
27e0: 75 63 65 20 74 68 65 20 77 72 6f 6e 67 20 6d 65  uce the wrong me
27f0: 73 73 61 67 65 2e 0a 09 20 2a 2f 0a 0a 09 69 50  ssage... */...iP
2800: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 49 4e 54  tr->flags |= INT
2810: 45 52 50 5f 41 4c 54 45 52 4e 41 54 45 5f 57 52  ERP_ALTERNATE_WR
2820: 4f 4e 47 5f 41 52 47 53 3b 0a 09 54 63 6c 5f 57  ONG_ARGS;..Tcl_W
2830: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2840: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
2850: 6e 6f 6e 65 77 6c 69 6e 65 3f 20 63 68 61 6e 6e  nonewline? chann
2860: 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20  elId");..return 
2870: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
2880: 0a 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ..    i = 1;.   
2890: 20 6e 65 77 6c 69 6e 65 20 3d 20 30 3b 0a 20 20   newline = 0;.  
28a0: 20 20 69 66 20 28 73 74 72 63 6d 70 28 54 63 6c    if (strcmp(Tcl
28b0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28c0: 5d 29 2c 20 22 2d 6e 6f 6e 65 77 6c 69 6e 65 22  ]), "-nonewline"
28d0: 29 20 3d 3d 20 30 29 20 7b 0a 09 6e 65 77 6c 69  ) == 0) {..newli
28e0: 6e 65 20 3d 20 31 3b 0a 09 69 2b 2b 3b 0a 20 20  ne = 1;..i++;.  
28f0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 20 3d    }..    if (i =
2900: 3d 20 6f 62 6a 63 29 20 7b 0a 09 67 6f 74 6f 20  = objc) {..goto 
2910: 61 72 67 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  argerror;.    }.
2920: 0a 20 20 20 20 63 68 61 6e 4f 62 6a 50 74 72 20  .    chanObjPtr 
2930: 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 20 20 20 20 69  = objv[i];.    i
2940: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c  f (TclGetChannel
2950: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2960: 63 68 61 6e 4f 62 6a 50 74 72 2c 20 26 63 68 61  chanObjPtr, &cha
2970: 6e 2c 20 26 6d 6f 64 65 2c 20 30 29 20 21 3d 20  n, &mode, 0) != 
2980: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
2990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29a0: 20 7d 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64   }.    if (!(mod
29b0: 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  e & TCL_READABLE
29c0: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  )) {..Tcl_SetObj
29d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
29e0: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09  cl_ObjPrintf(...
29f0: 22 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 20  "channel \"%s\" 
2a00: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f  wasn't opened fo
2a10: 72 20 72 65 61 64 69 6e 67 22 2c 0a 09 09 54 63  r reading",...Tc
2a20: 6c 47 65 74 53 74 72 69 6e 67 28 63 68 61 6e 4f  lGetString(chanO
2a30: 62 6a 50 74 72 29 29 29 3b 0a 09 72 65 74 75 72  bjPtr)));..retur
2a40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2a50: 20 7d 0a 20 20 20 20 69 2b 2b 3b 09 09 09 2f 2a   }.    i++;.../*
2a60: 20 43 6f 6e 73 75 6d 65 64 20 63 68 61 6e 6e 65   Consumed channe
2a70: 6c 20 6e 61 6d 65 2e 20 2a 2f 0a 0a 20 20 20 20  l name. */..    
2a80: 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6d 70 75 74  /*.     * Comput
2a90: 65 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  e how many bytes
2aa0: 20 74 6f 20 72 65 61 64 2e 0a 20 20 20 20 20 2a   to read..     *
2ab0: 2f 0a 0a 20 20 20 20 74 6f 52 65 61 64 20 3d 20  /..    toRead = 
2ac0: 2d 31 3b 0a 20 20 20 20 69 66 20 28 69 20 3c 20  -1;.    if (i < 
2ad0: 6f 62 6a 63 29 20 7b 0a 09 69 66 20 28 28 54 63  objc) {..if ((Tc
2ae0: 6c 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  lGetWideIntFromO
2af0: 62 6a 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 69 5d  bj(NULL, objv[i]
2b00: 2c 20 26 74 6f 52 65 61 64 29 20 21 3d 20 54 43  , &toRead) != TC
2b10: 4c 5f 4f 4b 29 0a 09 09 7c 7c 20 28 74 6f 52 65  L_OK)...|| (toRe
2b20: 61 64 20 3c 20 30 29 29 20 7b 0a 09 09 54 63 6c  ad < 0)) {...Tcl
2b30: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2b40: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69  terp, Tcl_ObjPri
2b50: 6e 74 66 28 0a 09 09 09 22 65 78 70 65 63 74 65  ntf(...."expecte
2b60: 64 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  d non-negative i
2b70: 6e 74 65 67 65 72 20 62 75 74 20 67 6f 74 20 5c  nteger but got \
2b80: 22 25 73 5c 22 22 2c 0a 09 09 09 54 63 6c 47 65  "%s\"",....TclGe
2b90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
2ba0: 29 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72  ));...Tcl_SetErr
2bb0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
2bc0: 54 43 4c 22 2c 20 22 56 41 4c 55 45 22 2c 20 22  TCL", "VALUE", "
2bd0: 4e 55 4d 42 45 52 22 2c 20 4e 55 4c 4c 29 3b 0a  NUMBER", NULL);.
2be0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
2bf0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
2c00: 20 20 54 63 6c 4e 65 77 4f 62 6a 28 72 65 73 75    TclNewObj(resu
2c10: 6c 74 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  ltPtr);.    Tcl_
2c20: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73  IncrRefCount(res
2c30: 75 6c 74 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  ultPtr);.    Tcl
2c40: 43 68 61 6e 6e 65 6c 50 72 65 73 65 72 76 65 28  ChannelPreserve(
2c50: 63 68 61 6e 29 3b 0a 20 20 20 20 63 68 61 72 61  chan);.    chara
2c60: 63 74 65 72 73 52 65 61 64 20 3d 20 54 63 6c 5f  ctersRead = Tcl_
2c70: 52 65 61 64 43 68 61 72 73 28 63 68 61 6e 2c 20  ReadChars(chan, 
2c80: 72 65 73 75 6c 74 50 74 72 2c 20 74 6f 52 65 61  resultPtr, toRea
2c90: 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 63  d, 0);.    if (c
2ca0: 68 61 72 61 63 74 65 72 73 52 65 61 64 20 3d 3d  haractersRead ==
2cb0: 20 54 43 4c 5f 49 4f 5f 46 41 49 4c 55 52 45 29   TCL_IO_FAILURE)
2cc0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 23   {../*.. * TIP #
2cd0: 32 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 65  219... * Capture
2ce0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
2cf0: 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65  put by the drive
2d00: 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73  r into the bypas
2d10: 73 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 70  s area and.. * p
2d20: 75 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65  ut them into the
2d30: 20 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72   regular interpr
2d40: 65 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61 6c  eter result. Fal
2d50: 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 20  l back to the.. 
2d60: 2a 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67  * regular messag
2d70: 65 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73  e if nothing was
2d80: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79   found in the by
2d90: 70 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  pass... */...if 
2da0: 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45  (!TclChanCaughtE
2db0: 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72  rrorBypass(inter
2dc0: 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 20  p, chan)) {..   
2dd0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2de0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
2df0: 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22  jPrintf(...    "
2e00: 65 72 72 6f 72 20 72 65 61 64 69 6e 67 20 5c 22  error reading \"
2e10: 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 20 20 20  %s\": %s",...   
2e20: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 63 68   TclGetString(ch
2e30: 61 6e 4f 62 6a 50 74 72 29 2c 20 54 63 6c 5f 50  anObjPtr), Tcl_P
2e40: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
2e50: 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43 68 61 6e  )));..}..TclChan
2e60: 6e 65 6c 52 65 6c 65 61 73 65 28 63 68 61 6e 29  nelRelease(chan)
2e70: 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  ;..Tcl_DecrRefCo
2e80: 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a  unt(resultPtr);.
2e90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
2ea0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
2eb0: 0a 20 20 20 20 20 2a 20 49 66 20 72 65 71 75 65  .     * If reque
2ec0: 73 74 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  sted, remove the
2ed0: 20 6c 61 73 74 20 6e 65 77 6c 69 6e 65 20 69 6e   last newline in
2ee0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 66 20   the channel if 
2ef0: 61 74 20 45 4f 46 2e 0a 20 20 20 20 20 2a 2f 0a  at EOF..     */.
2f00: 0a 20 20 20 20 69 66 20 28 28 63 68 61 72 61 63  .    if ((charac
2f10: 74 65 72 73 52 65 61 64 20 3e 20 30 29 20 26 26  tersRead > 0) &&
2f20: 20 28 6e 65 77 6c 69 6e 65 20 21 3d 20 30 29 29   (newline != 0))
2f30: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
2f40: 72 65 73 75 6c 74 3b 0a 09 73 69 7a 65 5f 74 20  result;..size_t 
2f50: 6c 65 6e 67 74 68 3b 0a 0a 09 72 65 73 75 6c 74  length;...result
2f60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2f70: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 50 74  FromObj(resultPt
2f80: 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09 69 66  r, &length);..if
2f90: 20 28 72 65 73 75 6c 74 5b 6c 65 6e 67 74 68 20   (result[length 
2fa0: 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a  - 1] == '\n') {.
2fb0: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 4c  .    Tcl_SetObjL
2fc0: 65 6e 67 74 68 28 72 65 73 75 6c 74 50 74 72 2c  ength(resultPtr,
2fd0: 20 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a 09 7d   length - 1);..}
2fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
2ff0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3000: 72 70 2c 20 72 65 73 75 6c 74 50 74 72 29 3b 0a  rp, resultPtr);.
3010: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65      TclChannelRe
3020: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20  lease(chan);.   
3030: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3040: 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 20 20  t(resultPtr);.  
3050: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3060: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 53 65 65 6b 4f  . *. * Tcl_SeekO
30c0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
30d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
30f0: 73 73 20 74 68 65 20 54 63 6c 20 22 73 65 65 6b  ss the Tcl "seek
3100: 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74  " command. See t
3110: 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d  he. *.user docum
3120: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74  entation for det
3130: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20  ails on what it 
3140: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  does.. *. * Resu
3150: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
3160: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
3170: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3180: 73 3a 0a 20 2a 09 4d 6f 76 65 73 20 74 68 65 20  s:. *.Moves the 
3190: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
31a0: 61 63 63 65 73 73 20 70 6f 69 6e 74 20 6f 6e 20  access point on 
31b0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 63 68  the specified ch
31c0: 61 6e 6e 65 6c 2e 20 20 4d 61 79 0a 20 2a 09 66  annel.  May. *.f
31d0: 6c 75 73 68 20 71 75 65 75 65 64 20 6f 75 74 70  lush queued outp
31e0: 75 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ut.. *. *-------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3230: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 53 65 65   */..int.Tcl_See
3240: 6b 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  kObjCmd(.    TCL
3250: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
3260: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
3270: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72  *interp,../* Cur
3280: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
3290: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a  . */.    int obj
32a0: 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  c,.../* Number o
32b0: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  f arguments. */.
32c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
32d0: 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72  st objv[])./* Ar
32e0: 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20  gument objects. 
32f0: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  */.{.    Tcl_Cha
3300: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
3310: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 74 65  he channel to te
3320: 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 54 63  ll on. */.    Tc
3330: 6c 5f 57 69 64 65 49 6e 74 20 6f 66 66 73 65 74  l_WideInt offset
3340: 3b 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73  ;../* Where to s
3350: 65 65 6b 3f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eek? */.    int 
3360: 6d 6f 64 65 3b 09 09 09 2f 2a 20 48 6f 77 20 74  mode;.../* How t
3370: 6f 20 73 65 65 6b 3f 20 2a 2f 0a 20 20 20 20 54  o seek? */.    T
3380: 63 6c 5f 57 69 64 65 49 6e 74 20 72 65 73 75 6c  cl_WideInt resul
3390: 74 3b 09 09 2f 2a 20 4f 66 20 63 61 6c 6c 69 6e  t;../* Of callin
33a0: 67 20 54 63 6c 5f 53 65 65 6b 2e 20 2a 2f 0a 20  g Tcl_Seek. */. 
33b0: 20 20 20 69 6e 74 20 6f 70 74 69 6f 6e 49 6e 64     int optionInd
33c0: 65 78 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  ex;.    static c
33d0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
33e0: 20 6f 72 69 67 69 6e 4f 70 74 69 6f 6e 73 5b 5d   originOptions[]
33f0: 20 3d 20 7b 0a 09 22 73 74 61 72 74 22 2c 20 22   = {.."start", "
3400: 63 75 72 72 65 6e 74 22 2c 20 22 65 6e 64 22 2c  current", "end",
3410: 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20   NULL.    };.   
3420: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
3430: 74 20 6d 6f 64 65 41 72 72 61 79 5b 5d 20 3d 20  t modeArray[] = 
3440: 7b 53 45 45 4b 5f 53 45 54 2c 20 53 45 45 4b 5f  {SEEK_SET, SEEK_
3450: 43 55 52 2c 20 53 45 45 4b 5f 45 4e 44 7d 3b 0a  CUR, SEEK_END};.
3460: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 21  .    if ((objc !
3470: 3d 20 33 29 20 26 26 20 28 6f 62 6a 63 20 21 3d  = 3) && (objc !=
3480: 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   4)) {..Tcl_Wron
3490: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
34a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
34b0: 65 6c 49 64 20 6f 66 66 73 65 74 20 3f 6f 72 69  elId offset ?ori
34c0: 67 69 6e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  gin?");..return 
34d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
34e0: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43  .    if (TclGetC
34f0: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e  hannelFromObj(in
3500: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
3510: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21  chan, NULL, 0) !
3520: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
3530: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3540: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
3550: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
3560: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
3570: 32 5d 2c 20 26 6f 66 66 73 65 74 29 20 21 3d 20  2], &offset) != 
3580: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
3590: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
35a0: 20 7d 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 45   }.    mode = SE
35b0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 69 66 20 28  EK_SET;.    if (
35c0: 6f 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09 69 66  objc == 4) {..if
35d0: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
35e0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
35f0: 6a 76 5b 33 5d 2c 20 6f 72 69 67 69 6e 4f 70 74  jv[3], originOpt
3600: 69 6f 6e 73 2c 20 22 6f 72 69 67 69 6e 22 2c 20  ions, "origin", 
3610: 30 2c 0a 09 09 26 6f 70 74 69 6f 6e 49 6e 64 65  0,...&optionInde
3620: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  x) != TCL_OK) {.
3630: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3640: 45 52 52 4f 52 3b 0a 09 7d 0a 09 6d 6f 64 65 20  ERROR;..}..mode 
3650: 3d 20 6d 6f 64 65 41 72 72 61 79 5b 6f 70 74 69  = modeArray[opti
3660: 6f 6e 49 6e 64 65 78 5d 3b 0a 20 20 20 20 7d 0a  onIndex];.    }.
3670: 0a 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50  .    TclChannelP
3680: 72 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20  reserve(chan);. 
3690: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f     result = Tcl_
36a0: 53 65 65 6b 28 63 68 61 6e 2c 20 6f 66 66 73 65  Seek(chan, offse
36b0: 74 2c 20 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66  t, mode);.    if
36c0: 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31 29 20   (result == -1) 
36d0: 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50 20 23 32  {../*.. * TIP #2
36e0: 31 39 2e 0a 09 20 2a 20 43 61 70 74 75 72 65 20  19... * Capture 
36f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 70  error messages p
3700: 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65 72  ut by the driver
3710: 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73 73   into the bypass
3720: 20 61 72 65 61 20 61 6e 64 0a 09 20 2a 20 70 75   area and.. * pu
3730: 74 20 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20  t them into the 
3740: 72 65 67 75 6c 61 72 20 69 6e 74 65 72 70 72 65  regular interpre
3750: 74 65 72 20 72 65 73 75 6c 74 2e 20 46 61 6c 6c  ter result. Fall
3760: 20 62 61 63 6b 20 74 6f 20 74 68 65 0a 09 20 2a   back to the.. *
3770: 20 72 65 67 75 6c 61 72 20 6d 65 73 73 61 67 65   regular message
3780: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 61 73 20   if nothing was 
3790: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 62 79 70  found in the byp
37a0: 61 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  ass... */...if (
37b0: 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 72  !TclChanCaughtEr
37c0: 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72 70  rorBypass(interp
37d0: 2c 20 63 68 61 6e 29 29 20 7b 0a 09 20 20 20 20  , chan)) {..    
37e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
37f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
3800: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 65  Printf(...    "e
3810: 72 72 6f 72 20 64 75 72 69 6e 67 20 73 65 65 6b  rror during seek
3820: 20 6f 6e 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c   on \"%s\": %s",
3830: 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72  ...    TclGetStr
3840: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 54 63  ing(objv[1]), Tc
3850: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
3860: 65 72 70 29 29 29 3b 0a 09 7d 0a 09 54 63 6c 43  erp)));..}..TclC
3870: 68 61 6e 6e 65 6c 52 65 6c 65 61 73 65 28 63 68  hannelRelease(ch
3880: 61 6e 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  an);..return TCL
3890: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
38a0: 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65 6c 65    TclChannelRele
38b0: 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20 20 72  ase(chan);.    r
38c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
38d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3920: 0a 20 2a 20 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43  . * Tcl_TellObjC
3930: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
3940: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
3950: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
3960: 74 68 65 20 54 63 6c 20 22 74 65 6c 6c 22 20 63  the Tcl "tell" c
3970: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a  ommand. See the.
3980: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74   *.user document
3990: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ation for detail
39a0: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65  s on what it doe
39b0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
39c0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
39d0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
39e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
39f0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63  ----. */..int.Tc
3a50: 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 28 0a 20 20  l_TellObjCmd(.  
3a60: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
3a70: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
3a80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
3a90: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
3aa0: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  reter. */.    in
3ab0: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d  t objc,.../* Num
3ac0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3ad0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
3ae0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09   *const objv[]).
3af0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65  /* Argument obje
3b00: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  cts. */.{.    Tc
3b10: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
3b20: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
3b30: 74 6f 20 74 65 6c 6c 20 6f 6e 2e 20 2a 2f 0a 20  to tell on. */. 
3b40: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e     Tcl_WideInt n
3b50: 65 77 4c 6f 63 3b 0a 20 20 20 20 69 6e 74 20 63  ewLoc;.    int c
3b60: 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  ode;..    if (ob
3b70: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
3b80: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3b90: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
3ba0: 68 61 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74  hannelId");..ret
3bb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3bc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
3bd0: 20 20 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20    * Try to find 
3be0: 61 20 63 68 61 6e 6e 65 6c 20 77 69 74 68 20 74  a channel with t
3bf0: 68 65 20 72 69 67 68 74 20 6e 61 6d 65 20 61 6e  he right name an
3c00: 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 69 6e  d permissions in
3c10: 20 74 68 65 20 49 4f 0a 20 20 20 20 20 2a 20 63   the IO.     * c
3c20: 68 61 6e 6e 65 6c 20 74 61 62 6c 65 20 6f 66 20  hannel table of 
3c30: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
3c40: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
3c50: 66 20 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c  f (TclGetChannel
3c60: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
3c70: 6f 62 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20  objv[1], &chan, 
3c80: 4e 55 4c 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f  NULL, 0) != TCL_
3c90: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
3ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
3cb0: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 50 72      TclChannelPr
3cc0: 65 73 65 72 76 65 28 63 68 61 6e 29 3b 0a 20 20  eserve(chan);.  
3cd0: 20 20 6e 65 77 4c 6f 63 20 3d 20 54 63 6c 5f 54    newLoc = Tcl_T
3ce0: 65 6c 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ell(chan);..    
3cf0: 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20 23 32  /*.     * TIP #2
3d00: 31 39 2e 0a 20 20 20 20 20 2a 20 43 61 70 74 75  19..     * Captu
3d10: 72 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  re error message
3d20: 73 20 70 75 74 20 62 79 20 74 68 65 20 64 72 69  s put by the dri
3d30: 76 65 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70  ver into the byp
3d40: 61 73 73 20 61 72 65 61 20 61 6e 64 20 70 75 74  ass area and put
3d50: 0a 20 20 20 20 20 2a 20 74 68 65 6d 20 69 6e 74  .     * them int
3d60: 6f 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e  o the regular in
3d70: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
3d80: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 0a 20 20 20 20  ..     */...    
3d90: 63 6f 64 65 20 20 3d 20 54 63 6c 43 68 61 6e 43  code  = TclChanC
3da0: 61 75 67 68 74 45 72 72 6f 72 42 79 70 61 73 73  aughtErrorBypass
3db0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a  (interp, chan);.
3dc0: 20 20 20 20 54 63 6c 43 68 61 6e 6e 65 6c 52 65      TclChannelRe
3dd0: 6c 65 61 73 65 28 63 68 61 6e 29 3b 0a 20 20 20  lease(chan);.   
3de0: 20 69 66 20 28 63 6f 64 65 29 20 7b 0a 09 72 65   if (code) {..re
3df0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3e00: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
3e10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3e20: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
3e30: 6e 74 4f 62 6a 28 6e 65 77 4c 6f 63 29 29 3b 0a  ntObj(newLoc));.
3e40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
3e50: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 43 6c 6f  --. *. * Tcl_Clo
3eb0: 73 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  seObjCmd --. *. 
3ec0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
3ed0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
3ee0: 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 63  ocess the Tcl "c
3ef0: 6c 6f 73 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 53  lose" command. S
3f00: 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64  ee the. *.user d
3f10: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
3f20: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74   details on what
3f30: 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20   it does.. *. * 
3f40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
3f50: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
3f60: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
3f70: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 64 69  fects:. *.May di
3f80: 73 63 61 72 64 20 71 75 65 75 65 64 20 69 6e 70  scard queued inp
3f90: 75 74 3b 20 6d 61 79 20 66 6c 75 73 68 20 71 75  ut; may flush qu
3fa0: 65 75 65 64 20 6f 75 74 70 75 74 2e 0a 20 2a 0a  eued output.. *.
3fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e  --------. */..in
4000: 74 0a 54 63 6c 5f 43 6c 6f 73 65 4f 62 6a 43 6d  t.Tcl_CloseObjCm
4010: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
4020: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
4030: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4040: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
4050: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
4060: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
4070: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4080: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
4090: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
40a0: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  v[])./* Argument
40b0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
40c0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
40d0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
40e0: 6e 6e 65 6c 20 74 6f 20 63 6c 6f 73 65 2e 20 2a  nnel to close. *
40f0: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
4100: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 64  st char *const d
4110: 69 72 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a  irOptions[] = {.
4120: 09 22 72 65 61 64 22 2c 20 22 77 72 69 74 65 22  ."read", "write"
4130: 2c 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20  , NULL.    };.  
4140: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
4150: 6e 74 20 64 69 72 41 72 72 61 79 5b 5d 20 3d 20  nt dirArray[] = 
4160: 7b 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 2c  {TCL_CLOSE_READ,
4170: 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45   TCL_CLOSE_WRITE
4180: 7d 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a  };..    if ((obj
4190: 63 20 21 3d 20 32 29 20 26 26 20 28 6f 62 6a 63  c != 2) && (objc
41a0: 20 21 3d 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57   != 3)) {..Tcl_W
41b0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
41c0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
41d0: 61 6e 6e 65 6c 49 64 20 3f 64 69 72 65 63 74 69  annelId ?directi
41e0: 6f 6e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  on?");..return T
41f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4200: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43  .    if (TclGetC
4210: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e  hannelFromObj(in
4220: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
4230: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21  chan, NULL, 0) !
4240: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
4250: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4260: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f 62     }..    if (ob
4270: 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 69 6e 74 20  jc == 3) {..int 
4280: 69 6e 64 65 78 2c 20 64 69 72 3b 0a 0a 09 2f 2a  index, dir;.../*
4290: 0a 09 20 2a 20 47 65 74 20 64 69 72 65 63 74 69  .. * Get directi
42a0: 6f 6e 20 72 65 71 75 65 73 74 65 64 20 74 6f 20  on requested to 
42b0: 63 6c 6f 73 65 2c 20 61 6e 64 20 63 68 65 63 6b  close, and check
42c0: 20 73 79 6e 74 61 78 2e 0a 09 20 2a 2f 0a 0a 09   syntax... */...
42d0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
42e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
42f0: 6f 62 6a 76 5b 32 5d 2c 20 64 69 72 4f 70 74 69  objv[2], dirOpti
4300: 6f 6e 73 2c 20 22 64 69 72 65 63 74 69 6f 6e 22  ons, "direction"
4310: 2c 20 30 2c 0a 09 09 26 69 6e 64 65 78 29 20 21  , 0,...&index) !
4320: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
4330: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4340: 52 3b 0a 09 7d 0a 09 64 69 72 20 3d 20 64 69 72  R;..}..dir = dir
4350: 41 72 72 61 79 5b 69 6e 64 65 78 5d 3b 0a 0a 09  Array[index];...
4360: 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 64 69 72  /*.. * Check dir
4370: 65 63 74 69 6f 6e 20 61 67 61 69 6e 73 74 20 63  ection against c
4380: 68 61 6e 6e 65 6c 20 6d 6f 64 65 2e 20 49 74 20  hannel mode. It 
4390: 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77  is an error if w
43a0: 65 20 74 72 79 20 74 6f 0a 09 20 2a 20 63 6c 6f  e try to.. * clo
43b0: 73 65 20 61 20 64 69 72 65 63 74 69 6f 6e 20 6e  se a direction n
43c0: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
43d0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 28 61 6c 72  the channel (alr
43e0: 65 61 64 79 20 63 6c 6f 73 65 64 2c 20 6f 72 0a  eady closed, or.
43f0: 09 20 2a 20 6e 65 76 65 72 20 6f 70 65 6e 65 64  . * never opened
4400: 20 66 6f 72 20 74 68 61 74 20 64 69 72 65 63 74   for that direct
4410: 69 6f 6e 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  ion)... */...if 
4420: 28 21 28 64 69 72 20 26 20 54 63 6c 5f 47 65 74  (!(dir & Tcl_Get
4430: 43 68 61 6e 6e 65 6c 4d 6f 64 65 28 63 68 61 6e  ChannelMode(chan
4440: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  ))) {..    Tcl_S
4450: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
4460: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
4470: 66 28 0a 09 09 20 20 20 20 22 48 61 6c 66 2d 63  f(...    "Half-c
4480: 6c 6f 73 65 20 6f 66 20 25 73 2d 73 69 64 65 20  lose of %s-side 
4490: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 69  not possible, si
44a0: 64 65 20 6e 6f 74 20 6f 70 65 6e 65 64 22 0a 09  de not opened"..
44b0: 09 20 20 20 20 22 20 6f 72 20 61 6c 72 65 61 64  .    " or alread
44c0: 79 20 63 6c 6f 73 65 64 22 2c 20 64 69 72 4f 70  y closed", dirOp
44d0: 74 69 6f 6e 73 5b 69 6e 64 65 78 5d 29 29 3b 0a  tions[index]));.
44e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
44f0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  ERROR;..}.../*..
4500: 20 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c   * Special handl
4510: 69 6e 67 20 69 73 20 6e 65 65 64 65 64 20 69 66  ing is needed if
4520: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
4530: 20 63 68 61 6e 6e 65 6c 20 6d 6f 64 65 20 73 75   channel mode su
4540: 70 70 6f 72 74 73 0a 09 20 2a 20 6d 6f 72 65 20  pports.. * more 
4550: 74 68 61 6e 20 74 68 65 20 64 69 72 65 63 74 69  than the directi
4560: 6f 6e 20 74 6f 20 63 6c 6f 73 65 2e 20 42 65 63  on to close. Bec
4570: 61 75 73 65 20 69 66 20 74 68 65 20 63 6c 6f 73  ause if the clos
4580: 65 20 74 68 65 20 6c 61 73 74 0a 09 20 2a 20 64  e the last.. * d
4590: 69 72 65 63 74 69 6f 6e 20 73 75 70 70 6f 72 74  irection support
45a0: 65 64 20 77 65 20 63 61 6e 20 61 6e 64 20 77 69  ed we can and wi
45b0: 6c 6c 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ll go through th
45c0: 65 20 72 65 67 75 6c 61 72 0a 09 20 2a 20 70 72  e regular.. * pr
45d0: 6f 63 65 73 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66  ocess... */...if
45e0: 20 28 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   ((Tcl_GetChanne
45f0: 6c 4d 6f 64 65 28 63 68 61 6e 29 20 26 0a 09 09  lMode(chan) &...
4600: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 7c  (TCL_CLOSE_READ|
4610: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29  TCL_CLOSE_WRITE)
4620: 29 20 21 3d 20 64 69 72 29 20 7b 0a 09 20 20 20  ) != dir) {..   
4630: 20 72 65 74 75 72 6e 20 54 63 6c 5f 43 6c 6f 73   return Tcl_Clos
4640: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  eEx(interp, chan
4650: 2c 20 64 69 72 29 3b 0a 09 7d 0a 20 20 20 20 7d  , dir);..}.    }
4660: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  ..    if (Tcl_Un
4670: 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28  registerChannel(
4680: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 21 3d  interp, chan) !=
4690: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a 09   TCL_OK) {../*..
46a0: 20 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61   * If there is a
46b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
46c0: 61 6e 64 20 69 74 20 65 6e 64 73 20 77 69 74 68  and it ends with
46d0: 20 61 20 6e 65 77 6c 69 6e 65 2c 20 72 65 6d 6f   a newline, remo
46e0: 76 65 20 74 68 65 0a 09 20 2a 20 6e 65 77 6c 69  ve the.. * newli
46f0: 6e 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ne. This is done
4700: 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 20 70 69 70   for command pip
4710: 65 6c 69 6e 65 20 63 68 61 6e 6e 65 6c 73 20 77  eline channels w
4720: 68 65 72 65 20 74 68 65 20 65 72 72 6f 72 0a 09  here the error..
4730: 20 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74   * output from t
4740: 68 65 20 73 75 62 70 72 6f 63 65 73 73 65 73 20  he subprocesses 
4750: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 69 6e 74  is stored in int
4760: 65 72 70 27 73 20 72 65 73 75 6c 74 2e 0a 09 20  erp's result... 
4770: 2a 0a 09 20 2a 20 4e 4f 54 45 3a 20 54 68 69 73  *.. * NOTE: This
4780: 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 6e 6f   is likely to no
4790: 74 20 68 61 76 65 20 61 6e 79 20 65 66 66 65 63  t have any effec
47a0: 74 20 6f 6e 20 72 65 67 75 6c 61 72 20 65 72 72  t on regular err
47b0: 6f 72 0a 09 20 2a 20 6d 65 73 73 61 67 65 73 20  or.. * messages 
47c0: 70 72 6f 64 75 63 65 64 20 62 79 20 64 72 69 76  produced by driv
47d0: 65 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 63  ers during the c
47e0: 6c 6f 73 69 6e 67 20 6f 66 20 61 20 63 68 61 6e  losing of a chan
47f0: 6e 65 6c 2c 0a 09 20 2a 20 62 65 63 61 75 73 65  nel,.. * because
4800: 20 74 68 65 20 54 63 6c 20 63 6f 6e 76 65 6e 74   the Tcl convent
4810: 69 6f 6e 20 69 73 20 74 68 61 74 20 73 75 63 68  ion is that such
4820: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
4830: 64 6f 20 6e 6f 74 20 68 61 76 65 0a 09 20 2a 20  do not have.. * 
4840: 61 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 65  a terminating ne
4850: 77 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63  wline... */...Tc
4860: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74 72  l_Obj *resultPtr
4870: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
4880: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 63 6f  ult(interp);..co
4890: 6e 73 74 20 63 68 61 72 20 2a 73 74 72 69 6e 67  nst char *string
48a0: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 0a  ;..size_t len;..
48b0: 09 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65  .if (Tcl_IsShare
48c0: 64 28 72 65 73 75 6c 74 50 74 72 29 29 20 7b 0a  d(resultPtr)) {.
48d0: 09 20 20 20 20 72 65 73 75 6c 74 50 74 72 20 3d  .    resultPtr =
48e0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
48f0: 6a 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 09 20  j(resultPtr);.. 
4900: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
4910: 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ult(interp, resu
4920: 6c 74 50 74 72 29 3b 0a 09 7d 0a 09 73 74 72 69  ltPtr);..}..stri
4930: 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ng = Tcl_GetStri
4940: 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74  ngFromObj(result
4950: 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  Ptr, &len);..if 
4960: 28 28 6c 65 6e 20 3e 20 30 29 20 26 26 20 28 73  ((len > 0) && (s
4970: 74 72 69 6e 67 5b 6c 65 6e 20 2d 20 31 5d 20 3d  tring[len - 1] =
4980: 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 20 20 20 20  = '\n')) {..    
4990: 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 6e 67 74 68  Tcl_SetObjLength
49a0: 28 72 65 73 75 6c 74 50 74 72 2c 20 6c 65 6e 20  (resultPtr, len 
49b0: 2d 20 31 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e  - 1);..}..return
49c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
49d0: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  }..    return TC
49e0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f  -----. *. * Tcl_
4a40: 46 63 6f 6e 66 69 67 75 72 65 4f 62 6a 43 6d 64  FconfigureObjCmd
4a50: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
4a60: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
4a70: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
4a80: 65 20 54 63 6c 20 22 66 63 6f 6e 66 69 67 75 72  e Tcl "fconfigur
4a90: 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 0a  e" command. See.
4aa0: 20 2a 09 74 68 65 20 75 73 65 72 20 64 6f 63 75   *.the user docu
4ab0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65  mentation for de
4ac0: 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74  tails on what it
4ad0: 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73   does.. *. * Res
4ae0: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
4af0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
4b00: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4b10: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
4b20: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
4b30: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
4b40: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4b90: 0a 0a 69 6e 74 0a 54 63 6c 5f 46 63 6f 6e 66 69  ..int.Tcl_Fconfi
4ba0: 67 75 72 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20  gureObjCmd(.    
4bb0: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
4bc0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
4bd0: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
4be0: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65  Current interpre
4bf0: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ter. */.    int 
4c00: 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65  objc,.../* Numbe
4c10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
4c20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
4c30: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a  const objv[])./*
4c40: 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74   Argument object
4c50: 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73  s. */.{.    cons
4c60: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61  t char *optionNa
4c70: 6d 65 2c 20 2a 76 61 6c 75 65 4e 61 6d 65 3b 0a  me, *valueName;.
4c80: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
4c90: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
4ca0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
4cb0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ode on. */.    i
4cc0: 6e 74 20 69 3b 09 09 09 2f 2a 20 49 74 65 72 61  nt i;.../* Itera
4cd0: 74 65 20 6f 76 65 72 20 61 72 67 2d 76 61 6c 75  te over arg-valu
4ce0: 65 20 70 61 69 72 73 2e 20 2a 2f 0a 0a 20 20 20  e pairs. */..   
4cf0: 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20   if ((objc < 2) 
4d00: 7c 7c 20 28 28 28 6f 62 6a 63 20 25 20 32 29 20  || (((objc % 2) 
4d10: 3d 3d 20 31 29 20 26 26 20 28 6f 62 6a 63 20 21  == 1) && (objc !
4d20: 3d 20 33 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72  = 3))) {..Tcl_Wr
4d30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
4d40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
4d50: 6e 6e 65 6c 49 64 20 3f 2d 6f 70 74 69 6f 6e 20  nnelId ?-option 
4d60: 76 61 6c 75 65 20 2e 2e 2e 3f 22 29 3b 0a 09 72  value ...?");..r
4d70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4d80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4d90: 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f  TclGetChannelFro
4da0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
4db0: 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c  v[1], &chan, NUL
4dc0: 4c 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  L, 0) != TCL_OK)
4dd0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
4de0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
4df0: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
4e00: 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 64  {..Tcl_DString d
4e10: 73 3b 09 09 2f 2a 20 44 53 74 72 69 6e 67 20 74  s;../* DString t
4e20: 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 20 6f 66  o hold result of
4e30: 20 63 61 6c 6c 69 6e 67 0a 09 09 09 09 20 2a 20   calling..... * 
4e40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
4e50: 74 69 6f 6e 2e 20 2a 2f 0a 0a 09 54 63 6c 5f 44  tion. */...Tcl_D
4e60: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
4e70: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61  ..if (Tcl_GetCha
4e80: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
4e90: 70 2c 20 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 26  p, chan, NULL, &
4ea0: 64 73 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ds) != TCL_OK) {
4eb0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
4ec0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
4ed0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4ee0: 52 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69  R;..}..Tcl_DStri
4ef0: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ngResult(interp,
4f00: 20 26 64 73 29 3b 0a 09 72 65 74 75 72 6e 20 54   &ds);..return T
4f10: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  CL_OK;.    } els
4f20: 65 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29  e if (objc == 3)
4f30: 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20   {..Tcl_DString 
4f40: 64 73 3b 09 09 2f 2a 20 44 53 74 72 69 6e 67 20  ds;../* DString 
4f50: 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 20 6f  to hold result o
4f60: 66 20 63 61 6c 6c 69 6e 67 0a 09 09 09 09 20 2a  f calling..... *
4f70: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
4f80: 70 74 69 6f 6e 2e 20 2a 2f 0a 0a 09 54 63 6c 5f  ption. */...Tcl_
4f90: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
4fa0: 3b 0a 09 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 20  ;..optionName = 
4fb0: 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  TclGetString(obj
4fc0: 76 5b 32 5d 29 3b 0a 09 69 66 20 28 54 63 6c 5f  v[2]);..if (Tcl_
4fd0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
4fe0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 6f  (interp, chan, o
4ff0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 26 64 73 29 20  ptionName, &ds) 
5000: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
5010: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
5020: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 72 65 74  e(&ds);..    ret
5030: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
5040: 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 52 65  }..Tcl_DStringRe
5050: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26 64 73  sult(interp, &ds
5060: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  );..return TCL_O
5070: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  K;.    }..    fo
5080: 72 20 28 69 20 3d 20 33 3b 20 69 20 3c 20 6f 62  r (i = 3; i < ob
5090: 6a 63 3b 20 69 20 2b 3d 20 32 29 20 7b 0a 09 6f  jc; i += 2) {..o
50a0: 70 74 69 6f 6e 4e 61 6d 65 20 3d 20 54 63 6c 47  ptionName = TclG
50b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2d  etString(objv[i-
50c0: 31 5d 29 3b 0a 09 76 61 6c 75 65 4e 61 6d 65 20  1]);..valueName 
50d0: 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f  = TclGetString(o
50e0: 62 6a 76 5b 69 5d 29 3b 0a 09 69 66 20 28 54 63  bjv[i]);..if (Tc
50f0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
5100: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
5110: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 76 61 6c   optionName, val
5120: 75 65 4e 61 6d 65 29 0a 09 09 21 3d 20 54 43 4c  ueName)...!= TCL
5130: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75  _OK) {..    retu
5140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
5150: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
5160: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
5170: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
51c0: 20 2a 0a 20 2a 20 54 63 6c 5f 45 6f 66 4f 62 6a   *. * Tcl_EofObj
51d0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
51e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
51f0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
5200: 20 74 68 65 20 54 63 6c 20 22 65 6f 66 22 20 63   the Tcl "eof" c
5210: 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65 0a  ommand. See the.
5220: 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e 74   *.user document
5230: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c  ation for detail
5240: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65  s on what it doe
5250: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
5260: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
5270: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
5280: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5290: 20 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73   *.Sets interp's
52a0: 20 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65   result to boole
52b0: 61 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  an true or false
52c0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
52d0: 65 74 68 65 72 20 74 68 65 0a 20 2a 09 73 70 65  ether the. *.spe
52e0: 63 69 66 69 65 64 20 63 68 61 6e 6e 65 6c 20 68  cified channel h
52f0: 61 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74  as an EOF condit
5300: 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ion.. *. *------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
5360: 63 6c 5f 45 6f 66 4f 62 6a 43 6d 64 28 0a 20 20  cl_EofObjCmd(.  
5370: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
5380: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
5390: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
53a0: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
53b0: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  reter. */.    in
53c0: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d  t objc,.../* Num
53d0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
53e0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
53f0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09   *const objv[]).
5400: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65  /* Argument obje
5410: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  cts. */.{.    Tc
5420: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
5430: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
5440: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
5450: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
5460: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
5470: 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  lId");..return T
5480: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5490: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43  .    if (TclGetC
54a0: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e  hannelFromObj(in
54b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
54c0: 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20 30 29 20 21  chan, NULL, 0) !
54d0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
54e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
54f0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65     }..    Tcl_Se
5500: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5510: 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
5520: 6e 4f 62 6a 28 54 63 6c 5f 45 6f 66 28 63 68 61  nObj(Tcl_Eof(cha
5530: 6e 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n)));.    return
5540: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
5550: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
55a0: 63 6c 5f 45 78 65 63 4f 62 6a 43 6d 64 20 2d 2d  cl_ExecObjCmd --
55b0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
55c0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
55d0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
55e0: 65 78 65 63 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  exec" Tcl comman
55f0: 64 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73  d. See the. *.us
5600: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  er documentation
5610: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20   for details on 
5620: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a  what it does.. *
5630: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5640: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
5650: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
5660: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
5670: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d  e the user docum
5680: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d  entation.. *. *-
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
56e0: 63 6c 5f 45 78 65 63 4f 62 6a 43 6d 64 28 0a 20  cl_ExecObjCmd(. 
56f0: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
5700: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
5710: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
5720: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
5730: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69  preter. */.    i
5740: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75  nt objc,.../* Nu
5750: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5760: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  s. */.    Tcl_Ob
5770: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
5780: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a  ./* Argument obj
5790: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54  ects. */.{.    T
57a0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 74  cl_Obj *resultPt
57b0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
57c0: 72 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 6e  r **argv;../* An
57d0: 20 61 72 72 61 79 20 66 6f 72 20 74 68 65 20 73   array for the s
57e0: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 2e  tring arguments.
57f0: 20 53 74 6f 72 65 64 0a 09 09 09 09 20 2a 20 6f   Stored..... * o
5800: 6e 20 74 68 65 20 5f 54 63 6c 5f 20 73 74 61 63  n the _Tcl_ stac
5810: 6b 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  k. */.    const 
5820: 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20  char *string;.  
5830: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
5840: 61 6e 3b 0a 20 20 20 20 69 6e 74 20 61 72 67 63  an;.    int argc
5850: 2c 20 62 61 63 6b 67 72 6f 75 6e 64 2c 20 69 2c  , background, i,
5860: 20 69 6e 64 65 78 2c 20 6b 65 65 70 4e 65 77 6c   index, keepNewl
5870: 69 6e 65 2c 20 72 65 73 75 6c 74 2c 20 73 6b 69  ine, result, ski
5880: 70 2c 20 69 67 6e 6f 72 65 53 74 64 65 72 72 3b  p, ignoreStderr;
5890: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 67  .    size_t leng
58a0: 74 68 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  th;.    static c
58b0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
58c0: 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 09   options[] = {..
58d0: 22 2d 69 67 6e 6f 72 65 73 74 64 65 72 72 22 2c  "-ignorestderr",
58e0: 20 22 2d 6b 65 65 70 6e 65 77 6c 69 6e 65 22 2c   "-keepnewline",
58f0: 20 22 2d 2d 22 2c 20 4e 55 4c 4c 0a 20 20 20 20   "--", NULL.    
5900: 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 65 78 65 63  };.    enum exec
5910: 4f 70 74 69 6f 6e 73 45 6e 75 6d 20 7b 0a 09 45  OptionsEnum {..E
5920: 58 45 43 5f 49 47 4e 4f 52 45 53 54 44 45 52 52  XEC_IGNORESTDERR
5930: 2c 20 45 58 45 43 5f 4b 45 45 50 4e 45 57 4c 49  , EXEC_KEEPNEWLI
5940: 4e 45 2c 20 45 58 45 43 5f 4c 41 53 54 0a 20 20  NE, EXEC_LAST.  
5950: 20 20 7d 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    };..    /*.   
5960: 20 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6e    * Check for an
5970: 79 20 6c 65 61 64 69 6e 67 20 6f 70 74 69 6f 6e  y leading option
5980: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20   arguments..    
5990: 20 2a 2f 0a 0a 20 20 20 20 6b 65 65 70 4e 65 77   */..    keepNew
59a0: 6c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 69 67  line = 0;.    ig
59b0: 6e 6f 72 65 53 74 64 65 72 72 20 3d 20 30 3b 0a  noreStderr = 0;.
59c0: 20 20 20 20 66 6f 72 20 28 73 6b 69 70 20 3d 20      for (skip = 
59d0: 31 3b 20 73 6b 69 70 20 3c 20 6f 62 6a 63 3b 20  1; skip < objc; 
59e0: 73 6b 69 70 2b 2b 29 20 7b 0a 09 73 74 72 69 6e  skip++) {..strin
59f0: 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  g = TclGetString
5a00: 28 6f 62 6a 76 5b 73 6b 69 70 5d 29 3b 0a 09 69  (objv[skip]);..i
5a10: 66 20 28 73 74 72 69 6e 67 5b 30 5d 20 21 3d 20  f (string[0] != 
5a20: 27 2d 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61  '-') {..    brea
5a30: 6b 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47  k;..}..if (Tcl_G
5a40: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
5a50: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 73 6b 69 70  nterp, objv[skip
5a60: 5d 2c 20 6f 70 74 69 6f 6e 73 2c 20 22 6f 70 74  ], options, "opt
5a70: 69 6f 6e 22 2c 0a 09 09 54 43 4c 5f 45 58 41 43  ion",...TCL_EXAC
5a80: 54 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  T, &index) != TC
5a90: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74  L_OK) {..    ret
5aa0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
5ab0: 7d 0a 09 69 66 20 28 69 6e 64 65 78 20 3d 3d 20  }..if (index == 
5ac0: 45 58 45 43 5f 4b 45 45 50 4e 45 57 4c 49 4e 45  EXEC_KEEPNEWLINE
5ad0: 29 20 7b 0a 09 20 20 20 20 6b 65 65 70 4e 65 77  ) {..    keepNew
5ae0: 6c 69 6e 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73  line = 1;..} els
5af0: 65 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 45  e if (index == E
5b00: 58 45 43 5f 49 47 4e 4f 52 45 53 54 44 45 52 52  XEC_IGNORESTDERR
5b10: 29 20 7b 0a 09 20 20 20 20 69 67 6e 6f 72 65 53  ) {..    ignoreS
5b20: 74 64 65 72 72 20 3d 20 31 3b 0a 09 7d 20 65 6c  tderr = 1;..} el
5b30: 73 65 20 7b 0a 09 20 20 20 20 73 6b 69 70 2b 2b  se {..    skip++
5b40: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
5b50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f  .    }.    if (o
5b60: 62 6a 63 20 3c 3d 20 73 6b 69 70 29 20 7b 0a 09  bjc <= skip) {..
5b70: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
5b80: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
5b90: 2c 20 22 3f 2d 6f 70 74 69 6f 6e 20 2e 2e 2e 3f  , "?-option ...?
5ba0: 20 61 72 67 20 3f 61 72 67 20 2e 2e 2e 3f 22 29   arg ?arg ...?")
5bb0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
5bc0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
5bd0: 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 20 69 66  /*.     * See if
5be0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20   the command is 
5bf0: 74 6f 20 62 65 20 72 75 6e 20 69 6e 20 62 61 63  to be run in bac
5c00: 6b 67 72 6f 75 6e 64 2e 0a 20 20 20 20 20 2a 2f  kground..     */
5c10: 0a 0a 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64  ..    background
5c20: 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 69 6e 67   = 0;.    string
5c30: 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28   = TclGetString(
5c40: 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d 29 3b  objv[objc - 1]);
5c50: 0a 20 20 20 20 69 66 20 28 28 73 74 72 69 6e 67  .    if ((string
5c60: 5b 30 5d 20 3d 3d 20 27 26 27 29 20 26 26 20 28  [0] == '&') && (
5c70: 73 74 72 69 6e 67 5b 31 5d 20 3d 3d 20 27 5c 30  string[1] == '\0
5c80: 27 29 29 20 7b 0a 09 6f 62 6a 63 2d 2d 3b 0a 09  ')) {..objc--;..
5c90: 62 61 63 6b 67 72 6f 75 6e 64 20 3d 20 31 3b 0a  background = 1;.
5ca0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
5cb0: 20 20 20 2a 20 43 72 65 61 74 65 20 74 68 65 20     * Create the 
5cc0: 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  string argument 
5cd0: 61 72 72 61 79 20 22 61 72 67 76 22 2e 20 4d 61  array "argv". Ma
5ce0: 6b 65 20 73 75 72 65 20 61 72 67 76 20 69 73 20  ke sure argv is 
5cf0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 0a 20 20 20  large enough.   
5d00: 20 20 2a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20    * to hold the 
5d10: 61 72 67 63 20 61 72 67 75 6d 65 6e 74 73 20 70  argc arguments p
5d20: 6c 75 73 20 31 20 65 78 74 72 61 20 66 6f 72 20  lus 1 extra for 
5d30: 74 68 65 20 7a 65 72 6f 20 65 6e 64 2d 6f 66 2d  the zero end-of-
5d40: 61 72 67 76 20 77 6f 72 64 2e 0a 20 20 20 20 20  argv word..     
5d50: 2a 2f 0a 0a 20 20 20 20 61 72 67 63 20 3d 20 6f  */..    argc = o
5d60: 62 6a 63 20 2d 20 73 6b 69 70 3b 0a 20 20 20 20  bjc - skip;.    
5d70: 61 72 67 76 20 3d 20 28 63 6f 6e 73 74 20 63 68  argv = (const ch
5d80: 61 72 20 2a 2a 29 54 63 6c 53 74 61 63 6b 41 6c  ar **)TclStackAl
5d90: 6c 6f 63 28 69 6e 74 65 72 70 2c 20 28 61 72 67  loc(interp, (arg
5da0: 63 20 2b 20 31 29 20 2a 20 73 69 7a 65 6f 66 28  c + 1) * sizeof(
5db0: 63 68 61 72 20 2a 29 29 3b 0a 0a 20 20 20 20 2f  char *));..    /
5dc0: 2a 0a 20 20 20 20 20 2a 20 43 6f 70 79 20 74 68  *.     * Copy th
5dd0: 65 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  e string convers
5de0: 69 6f 6e 73 20 6f 66 20 65 61 63 68 20 28 70 6f  ions of each (po
5df0: 73 74 20 6f 70 74 69 6f 6e 29 20 6f 62 6a 65 63  st option) objec
5e00: 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  t into the.     
5e10: 2a 20 61 72 67 75 6d 65 6e 74 20 76 65 63 74 6f  * argument vecto
5e20: 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  r..     */..    
5e30: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
5e40: 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 09 61 72  argc; i++) {..ar
5e50: 67 76 5b 69 5d 20 3d 20 54 63 6c 47 65 74 53 74  gv[i] = TclGetSt
5e60: 72 69 6e 67 28 6f 62 6a 76 5b 69 20 2b 20 73 6b  ring(objv[i + sk
5e70: 69 70 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ip]);.    }.    
5e80: 61 72 67 76 5b 61 72 67 63 5d 20 3d 20 4e 55 4c  argv[argc] = NUL
5e90: 4c 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  L;.    chan = Tc
5ea0: 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64 43 68 61  l_OpenCommandCha
5eb0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 61 72 67  nnel(interp, arg
5ec0: 63 2c 20 61 72 67 76 2c 20 28 62 61 63 6b 67 72  c, argv, (backgr
5ed0: 6f 75 6e 64 20 3f 20 30 20 3a 0a 09 20 20 20 20  ound ? 0 :..    
5ee0: 69 67 6e 6f 72 65 53 74 64 65 72 72 20 3f 20 54  ignoreStderr ? T
5ef0: 43 4c 5f 53 54 44 4f 55 54 20 3a 20 54 43 4c 5f  CL_STDOUT : TCL_
5f00: 53 54 44 4f 55 54 7c 54 43 4c 5f 53 54 44 45 52  STDOUT|TCL_STDER
5f10: 52 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  R));..    /*.   
5f20: 20 20 2a 20 46 72 65 65 20 74 68 65 20 61 72 67    * Free the arg
5f30: 76 20 61 72 72 61 79 2e 0a 20 20 20 20 20 2a 2f  v array..     */
5f40: 0a 0a 20 20 20 20 54 63 6c 53 74 61 63 6b 46 72  ..    TclStackFr
5f50: 65 65 28 69 6e 74 65 72 70 2c 20 28 76 6f 69 64  ee(interp, (void
5f60: 20 2a 29 20 61 72 67 76 29 3b 0a 0a 20 20 20 20   *) argv);..    
5f70: 69 66 20 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c  if (chan == NULL
5f80: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
5f90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
5fa0: 20 20 69 66 20 28 62 61 63 6b 67 72 6f 75 6e 64    if (background
5fb0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74 6f 72  ) {../*.. * Stor
5fc0: 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 50 49  e the list of PI
5fd0: 44 73 20 66 72 6f 6d 20 74 68 65 20 70 69 70 65  Ds from the pipe
5fe0: 6c 69 6e 65 20 69 6e 20 69 6e 74 65 72 70 27 73  line in interp's
5ff0: 20 72 65 73 75 6c 74 20 61 6e 64 0a 09 20 2a 20   result and.. * 
6000: 64 65 74 61 63 68 20 74 68 65 20 50 49 44 73 20  detach the PIDs 
6010: 28 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74  (instead of wait
6020: 69 6e 67 20 66 6f 72 20 74 68 65 6d 29 2e 0a 09  ing for them)...
6030: 20 2a 2f 0a 0a 09 54 63 6c 47 65 74 41 6e 64 44   */...TclGetAndD
6040: 65 74 61 63 68 50 69 64 73 28 69 6e 74 65 72 70  etachPids(interp
6050: 2c 20 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63  , chan);..if (Tc
6060: 6c 5f 43 6c 6f 73 65 45 78 28 69 6e 74 65 72 70  l_CloseEx(interp
6070: 2c 20 63 68 61 6e 2c 20 30 29 20 21 3d 20 54 43  , chan, 0) != TC
6080: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74  L_OK) {..    ret
6090: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
60a0: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  }..return TCL_OK
60b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
60c0: 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74 50 74 72  NewObj(resultPtr
60d0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
60e0: 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28  etChannelHandle(
60f0: 63 68 61 6e 2c 20 54 43 4c 5f 52 45 41 44 41 42  chan, TCL_READAB
6100: 4c 45 2c 20 4e 55 4c 4c 29 20 3d 3d 20 54 43 4c  LE, NULL) == TCL
6110: 5f 4f 4b 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f  _OK) {..if (Tcl_
6120: 52 65 61 64 43 68 61 72 73 28 63 68 61 6e 2c 20  ReadChars(chan, 
6130: 72 65 73 75 6c 74 50 74 72 2c 20 2d 31 2c 20 30  resultPtr, -1, 0
6140: 29 20 3d 3d 20 54 43 4c 5f 49 4f 5f 46 41 49 4c  ) == TCL_IO_FAIL
6150: 55 52 45 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  URE) {..    /*..
6160: 20 20 20 20 20 2a 20 54 49 50 20 23 32 31 39 2e       * TIP #219.
6170: 0a 09 20 20 20 20 20 2a 20 43 61 70 74 75 72 65  ..     * Capture
6180: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
6190: 70 75 74 20 62 79 20 74 68 65 20 64 72 69 76 65  put by the drive
61a0: 72 20 69 6e 74 6f 20 74 68 65 20 62 79 70 61 73  r into the bypas
61b0: 73 20 61 72 65 61 0a 09 20 20 20 20 20 2a 20 61  s area..     * a
61c0: 6e 64 20 70 75 74 20 74 68 65 6d 20 69 6e 74 6f  nd put them into
61d0: 20 74 68 65 20 72 65 67 75 6c 61 72 20 69 6e 74   the regular int
61e0: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 2e  erpreter result.
61f0: 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 0a 09 20   Fall back to.. 
6200: 20 20 20 20 2a 20 74 68 65 20 72 65 67 75 6c 61      * the regula
6210: 72 20 6d 65 73 73 61 67 65 20 69 66 20 6e 6f 74  r message if not
6220: 68 69 6e 67 20 77 61 73 20 66 6f 75 6e 64 20 69  hing was found i
6230: 6e 20 74 68 65 20 62 79 70 61 73 73 2e 0a 09 20  n the bypass... 
6240: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20      */...    if 
6250: 28 21 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45  (!TclChanCaughtE
6260: 72 72 6f 72 42 79 70 61 73 73 28 69 6e 74 65 72  rrorBypass(inter
6270: 70 2c 20 63 68 61 6e 29 29 20 7b 0a 09 09 54 63  p, chan)) {...Tc
6280: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6290: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
62a0: 69 6e 74 66 28 0a 09 09 09 22 65 72 72 6f 72 20  intf(...."error 
62b0: 72 65 61 64 69 6e 67 20 6f 75 74 70 75 74 20 66  reading output f
62c0: 72 6f 6d 20 63 6f 6d 6d 61 6e 64 3a 20 25 73 22  rom command: %s"
62d0: 2c 0a 09 09 09 54 63 6c 5f 50 6f 73 69 78 45 72  ,....Tcl_PosixEr
62e0: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09  ror(interp)));..
62f0: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
6300: 74 28 72 65 73 75 6c 74 50 74 72 29 3b 0a 09 20  t(resultPtr);.. 
6310: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
6320: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
6330: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
6340: 20 20 2a 20 49 66 20 74 68 65 20 70 72 6f 63 65    * If the proce
6350: 73 73 20 70 72 6f 64 75 63 65 64 20 61 6e 79 74  ss produced anyt
6360: 68 69 6e 67 20 6f 6e 20 73 74 64 65 72 72 2c 20  hing on stderr, 
6370: 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  it will have bee
6380: 6e 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20  n returned.     
6390: 2a 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72  * in the interpr
63a0: 65 74 65 72 20 72 65 73 75 6c 74 2e 20 49 74 20  eter result. It 
63b0: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 70 70 65  needs to be appe
63c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 72 65 73 75  nded to the resu
63d0: 6c 74 0a 20 20 20 20 20 2a 20 73 74 72 69 6e 67  lt.     * string
63e0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72  ..     */..    r
63f0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 43 6c 6f 73  esult = Tcl_Clos
6400: 65 45 78 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  eEx(interp, chan
6410: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  , 0);.    Tcl_Ap
6420: 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 72 65 73  pendObjToObj(res
6430: 75 6c 74 50 74 72 2c 20 54 63 6c 5f 47 65 74 4f  ultPtr, Tcl_GetO
6440: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
6450: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
6460: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 68  * If the last ch
6470: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 72  aracter of the r
6480: 65 73 75 6c 74 20 69 73 20 61 20 6e 65 77 6c 69  esult is a newli
6490: 6e 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ne, then remove 
64a0: 74 68 65 0a 20 20 20 20 20 2a 20 6e 65 77 6c 69  the.     * newli
64b0: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 20 20  ne character..  
64c0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6b     */..    if (k
64d0: 65 65 70 4e 65 77 6c 69 6e 65 20 3d 3d 20 30 29  eepNewline == 0)
64e0: 20 7b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c   {..string = Tcl
64f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6500: 6a 28 72 65 73 75 6c 74 50 74 72 2c 20 26 6c 65  j(resultPtr, &le
6510: 6e 67 74 68 29 3b 0a 09 69 66 20 28 28 6c 65 6e  ngth);..if ((len
6520: 67 74 68 20 3e 20 30 29 20 26 26 20 28 73 74 72  gth > 0) && (str
6530: 69 6e 67 5b 6c 65 6e 67 74 68 20 2d 20 31 5d 20  ing[length - 1] 
6540: 3d 3d 20 27 5c 6e 27 29 29 20 7b 0a 09 20 20 20  == '\n')) {..   
6550: 20 54 63 6c 5f 53 65 74 4f 62 6a 4c 65 6e 67 74   Tcl_SetObjLengt
6560: 68 28 72 65 73 75 6c 74 50 74 72 2c 20 6c 65 6e  h(resultPtr, len
6570: 67 74 68 20 2d 20 31 29 3b 0a 09 7d 0a 20 20 20  gth - 1);..}.   
6580: 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   }.    Tcl_SetOb
6590: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
65a0: 72 65 73 75 6c 74 50 74 72 29 3b 0a 0a 20 20 20  resultPtr);..   
65b0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
65c0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46  ----. *. * Tcl_F
6620: 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64 20 2d 2d  blockedObjCmd --
6630: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
6640: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
6650: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 54  to process the T
6660: 63 6c 20 22 66 62 6c 6f 63 6b 65 64 22 20 63 6f  cl "fblocked" co
6670: 6d 6d 61 6e 64 2e 20 53 65 65 0a 20 2a 09 74 68  mmand. See. *.th
6680: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61  e user documenta
6690: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73  tion for details
66a0: 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73   on what it does
66b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
66c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
66d0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
66e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
66f0: 2a 09 53 65 74 73 20 69 6e 74 65 72 70 27 73 20  *.Sets interp's 
6700: 72 65 73 75 6c 74 20 74 6f 20 62 6f 6f 6c 65 61  result to boolea
6710: 6e 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20  n true or false 
6720: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
6730: 74 68 65 72 20 74 68 65 0a 20 2a 09 70 72 65 63  ther the. *.prec
6740: 65 65 64 69 6e 67 20 69 6e 70 75 74 20 6f 70 65  eeding input ope
6750: 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 68  ration on the ch
6760: 61 6e 6e 65 6c 20 77 6f 75 6c 64 20 68 61 76 65  annel would have
6770: 20 62 6c 6f 63 6b 65 64 2e 0a 20 2a 0a 20 2a 2d   blocked.. *. *-
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
67d0: 69 6e 74 0a 54 63 6c 5f 46 62 6c 6f 63 6b 65 64  int.Tcl_Fblocked
67e0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
67f0: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
6800: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
6810: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72  interp,../* Curr
6820: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ent interpreter.
6830: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63   */.    int objc
6840: 2c 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ,.../* Number of
6850: 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20   arguments. */. 
6860: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
6870: 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67  t objv[])./* Arg
6880: 75 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a  ument objects. *
6890: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  /.{.    Tcl_Chan
68a0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e  nel chan;.    in
68b0: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20  t mode;..    if 
68c0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
68d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
68e0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
68f0: 20 22 63 68 61 6e 6e 65 6c 49 64 22 29 3b 0a 09   "channelId");..
6900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
6920: 28 54 63 6c 47 65 74 43 68 61 6e 6e 65 6c 46 72  (TclGetChannelFr
6930: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
6940: 6a 76 5b 31 5d 2c 20 26 63 68 61 6e 2c 20 26 6d  jv[1], &chan, &m
6950: 6f 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f  ode, 0) != TCL_O
6960: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
6970: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6980: 20 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54    if (!(mode & T
6990: 43 4c 5f 52 45 41 44 41 42 4c 45 29 29 20 7b 0a  CL_READABLE)) {.
69a0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
69b0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
69c0: 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 6e  jPrintf(..."chan
69d0: 6e 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e 27  nel \"%s\" wasn'
69e0: 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  t opened for rea
69f0: 64 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 53  ding",...TclGetS
6a00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29  tring(objv[1])))
6a10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
6a20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
6a30: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
6a40: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
6a50: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 54 63 6c 5f 49  BooleanObj(Tcl_I
6a60: 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 61 6e  nputBlocked(chan
6a70: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
6a80: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
6a90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
6ae0: 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 20 2d 2d 0a  l_OpenObjCmd --.
6af0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
6b00: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ion is invoked t
6b10: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 6f  o process the "o
6b20: 70 65 6e 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  pen" Tcl command
6b30: 2e 20 53 65 65 20 74 68 65 0a 20 2a 09 75 73 65  . See the. *.use
6b40: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  r documentation 
6b50: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77  for details on w
6b60: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a  hat it does.. *.
6b70: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
6b80: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
6b90: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
6ba0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65   effects:. *.See
6bb0: 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65   the user docume
6bc0: 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d  ntation.. *. *--
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c10: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63  ----. */..int.Tc
6c20: 6c 5f 4f 70 65 6e 4f 62 6a 43 6d 64 28 0a 20 20  l_OpenObjCmd(.  
6c30: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
6c40: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
6c50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
6c60: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70  * Current interp
6c70: 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e  reter. */.    in
6c80: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d  t objc,.../* Num
6c90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6ca0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
6cb0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09   *const objv[]).
6cc0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65  /* Argument obje
6cd0: 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  cts. */.{.    in
6ce0: 74 20 70 69 70 65 6c 69 6e 65 2c 20 70 72 6f 74  t pipeline, prot
6cf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
6d00: 20 2a 6d 6f 64 65 53 74 72 69 6e 67 2c 20 2a 77   *modeString, *w
6d10: 68 61 74 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  hat;.    Tcl_Cha
6d20: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20  nnel chan;..    
6d30: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
6d40: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
6d50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
6d60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
6d70: 76 2c 20 22 66 69 6c 65 4e 61 6d 65 20 3f 61 63  v, "fileName ?ac
6d80: 63 65 73 73 3f 20 3f 70 65 72 6d 69 73 73 69 6f  cess? ?permissio
6d90: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ns?");..return T
6da0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6db0: 20 20 20 20 70 72 6f 74 20 3d 20 30 36 36 36 3b      prot = 0666;
6dc0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
6dd0: 20 32 29 20 7b 0a 09 6d 6f 64 65 53 74 72 69 6e   2) {..modeStrin
6de0: 67 20 3d 20 22 72 22 3b 0a 20 20 20 20 7d 20 65  g = "r";.    } e
6df0: 6c 73 65 20 7b 0a 09 6d 6f 64 65 53 74 72 69 6e  lse {..modeStrin
6e00: 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  g = TclGetString
6e10: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09 69 66 20 28  (objv[2]);..if (
6e20: 6f 62 6a 63 20 3d 3d 20 34 29 20 7b 0a 09 20 20  objc == 4) {..  
6e30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 65    const char *pe
6e40: 72 6d 53 74 72 69 6e 67 20 3d 20 54 63 6c 47 65  rmString = TclGe
6e50: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
6e60: 3b 0a 09 20 20 20 20 69 6e 74 20 63 6f 64 65 20  ;..    int code 
6e70: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  = TCL_ERROR;..  
6e80: 20 20 69 6e 74 20 73 63 61 6e 6e 65 64 20 3d 20    int scanned = 
6e90: 54 63 6c 50 61 72 73 65 41 6c 6c 57 68 69 74 65  TclParseAllWhite
6ea0: 53 70 61 63 65 28 70 65 72 6d 53 74 72 69 6e 67  Space(permString
6eb0: 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45  , TCL_INDEX_NONE
6ec0: 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  );...    /*..   
6ed0: 20 20 2a 20 53 75 70 70 6f 72 74 20 6c 65 67 61    * Support lega
6ee0: 63 79 20 6f 63 74 61 6c 20 6e 75 6d 62 65 72 73  cy octal numbers
6ef0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
6f00: 20 69 66 20 28 28 70 65 72 6d 53 74 72 69 6e 67   if ((permString
6f10: 5b 73 63 61 6e 6e 65 64 5d 20 3d 3d 20 27 30 27  [scanned] == '0'
6f20: 29 0a 09 09 20 20 20 20 26 26 20 28 70 65 72 6d  )...    && (perm
6f30: 53 74 72 69 6e 67 5b 73 63 61 6e 6e 65 64 2b 31  String[scanned+1
6f40: 5d 20 3e 3d 20 27 30 27 29 0a 09 09 20 20 20 20  ] >= '0')...    
6f50: 26 26 20 28 70 65 72 6d 53 74 72 69 6e 67 5b 73  && (permString[s
6f60: 63 61 6e 6e 65 64 2b 31 5d 20 3c 3d 20 27 37 27  canned+1] <= '7'
6f70: 29 29 20 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20 2a  )) {...Tcl_Obj *
6f80: 70 65 72 6d 4f 62 6a 3b 0a 0a 09 09 54 63 6c 4e  permObj;....TclN
6f90: 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f  ewLiteralStringO
6fa0: 62 6a 28 70 65 72 6d 4f 62 6a 2c 20 22 30 6f 22  bj(permObj, "0o"
6fb0: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 54  );...Tcl_AppendT
6fc0: 6f 4f 62 6a 28 70 65 72 6d 4f 62 6a 2c 20 70 65  oObj(permObj, pe
6fd0: 72 6d 53 74 72 69 6e 67 2b 73 63 61 6e 6e 65 64  rmString+scanned
6fe0: 2b 31 2c 20 2d 31 29 3b 0a 09 09 63 6f 64 65 20  +1, -1);...code 
6ff0: 3d 20 54 63 6c 47 65 74 49 6e 74 46 72 6f 6d 4f  = TclGetIntFromO
7000: 62 6a 28 4e 55 4c 4c 2c 20 70 65 72 6d 4f 62 6a  bj(NULL, permObj
7010: 2c 20 26 70 72 6f 74 29 3b 0a 09 09 54 63 6c 5f  , &prot);...Tcl_
7020: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 65 72  DecrRefCount(per
7030: 6d 4f 62 6a 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  mObj);..    }...
7040: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 3d      if ((code ==
7050: 20 54 43 4c 5f 45 52 52 4f 52 29 0a 09 09 20 20   TCL_ERROR)...  
7060: 20 20 26 26 20 54 63 6c 47 65 74 49 6e 74 46 72    && TclGetIntFr
7070: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
7080: 6a 76 5b 33 5d 2c 20 26 70 72 6f 74 29 20 21 3d  jv[3], &prot) !=
7090: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74   TCL_OK) {...ret
70a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
70b0: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a      }..}.    }..
70c0: 20 20 20 20 70 69 70 65 6c 69 6e 65 20 3d 20 30      pipeline = 0
70d0: 3b 0a 20 20 20 20 77 68 61 74 20 3d 20 54 63 6c  ;.    what = Tcl
70e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
70f0: 5d 29 3b 0a 20 20 20 20 69 66 20 28 77 68 61 74  ]);.    if (what
7100: 5b 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 70  [0] == '|') {..p
7110: 69 70 65 6c 69 6e 65 20 3d 20 31 3b 0a 20 20 20  ipeline = 1;.   
7120: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
7130: 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
7140: 6f 72 20 63 72 65 61 74 65 20 61 20 70 72 6f 63  or create a proc
7150: 65 73 73 20 70 69 70 65 6c 69 6e 65 2e 0a 20 20  ess pipeline..  
7160: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21     */..    if (!
7170: 70 69 70 65 6c 69 6e 65 29 20 7b 0a 09 63 68 61  pipeline) {..cha
7180: 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69  n = Tcl_FSOpenFi
7190: 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  leChannel(interp
71a0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 6d 6f 64 65 53  , objv[1], modeS
71b0: 74 72 69 6e 67 2c 20 70 72 6f 74 29 3b 0a 20 20  tring, prot);.  
71c0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20    } else {..int 
71d0: 6d 6f 64 65 2c 20 73 65 65 6b 46 6c 61 67 2c 20  mode, seekFlag, 
71e0: 62 69 6e 61 72 79 3b 0a 09 73 69 7a 65 5f 74 20  binary;..size_t 
71f0: 63 6d 64 4f 62 6a 63 3b 0a 09 63 6f 6e 73 74 20  cmdObjc;..const 
7200: 63 68 61 72 20 2a 2a 63 6d 64 41 72 67 76 3b 0a  char **cmdArgv;.
7210: 0a 09 69 66 20 28 54 63 6c 5f 53 70 6c 69 74 4c  ..if (Tcl_SplitL
7220: 69 73 74 28 69 6e 74 65 72 70 2c 20 77 68 61 74  ist(interp, what
7230: 2b 31 2c 20 26 63 6d 64 4f 62 6a 63 2c 20 26 63  +1, &cmdObjc, &c
7240: 6d 64 41 72 67 76 29 20 21 3d 20 54 43 4c 5f 4f  mdArgv) != TCL_O
7250: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
7260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
7270: 09 6d 6f 64 65 20 3d 20 54 63 6c 47 65 74 4f 70  .mode = TclGetOp
7280: 65 6e 4d 6f 64 65 45 78 28 69 6e 74 65 72 70 2c  enModeEx(interp,
7290: 20 6d 6f 64 65 53 74 72 69 6e 67 2c 20 26 73 65   modeString, &se
72a0: 65 6b 46 6c 61 67 2c 20 26 62 69 6e 61 72 79 29  ekFlag, &binary)
72b0: 3b 0a 09 69 66 20 28 6d 6f 64 65 20 3d 3d 20 2d  ;..if (mode == -
72c0: 31 29 20 7b 0a 09 20 20 20 20 63 68 61 6e 20 3d  1) {..    chan =
72d0: 20 4e 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20 7b   NULL;..} else {
72e0: 0a 09 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ..    int flags 
72f0: 3d 20 54 43 4c 5f 53 54 44 45 52 52 20 7c 20 54  = TCL_STDERR | T
7300: 43 4c 5f 45 4e 46 4f 52 43 45 5f 4d 4f 44 45 3b  CL_ENFORCE_MODE;
7310: 0a 0a 09 20 20 20 20 73 77 69 74 63 68 20 28 6d  ...    switch (m
7320: 6f 64 65 20 26 20 28 4f 5f 52 44 4f 4e 4c 59 20  ode & (O_RDONLY 
7330: 7c 20 4f 5f 57 52 4f 4e 4c 59 20 7c 20 4f 5f 52  | O_WRONLY | O_R
7340: 44 57 52 29 29 20 7b 0a 09 20 20 20 20 63 61 73  DWR)) {..    cas
7350: 65 20 4f 5f 52 44 4f 4e 4c 59 3a 0a 09 09 66 6c  e O_RDONLY:...fl
7360: 61 67 73 20 7c 3d 20 54 43 4c 5f 53 54 44 4f 55  ags |= TCL_STDOU
7370: 54 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  T;...break;..   
7380: 20 63 61 73 65 20 4f 5f 57 52 4f 4e 4c 59 3a 0a   case O_WRONLY:.
7390: 09 09 66 6c 61 67 73 20 7c 3d 20 54 43 4c 5f 53  ..flags |= TCL_S
73a0: 54 44 49 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  TDIN;...break;..
73b0: 20 20 20 20 63 61 73 65 20 4f 5f 52 44 57 52 3a      case O_RDWR:
73c0: 0a 09 09 66 6c 61 67 73 20 7c 3d 20 28 54 43 4c  ...flags |= (TCL
73d0: 5f 53 54 44 49 4e 20 7c 20 54 43 4c 5f 53 54 44  _STDIN | TCL_STD
73e0: 4f 55 54 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  OUT);...break;..
73f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 54      default:...T
7400: 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c 5f 4f 70  cl_Panic("Tcl_Op
7410: 65 6e 43 6d 64 3a 20 69 6e 76 61 6c 69 64 20 6d  enCmd: invalid m
7420: 6f 64 65 20 76 61 6c 75 65 22 29 3b 0a 09 09 62  ode value");...b
7430: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  reak;..    }..  
7440: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 4f 70 65    chan = Tcl_Ope
7450: 6e 43 6f 6d 6d 61 6e 64 43 68 61 6e 6e 65 6c 28  nCommandChannel(
7460: 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a 63 2c  interp, cmdObjc,
7470: 20 63 6d 64 41 72 67 76 2c 20 66 6c 61 67 73 29   cmdArgv, flags)
7480: 3b 0a 09 20 20 20 20 69 66 20 28 62 69 6e 61 72  ;..    if (binar
7490: 79 20 26 26 20 63 68 61 6e 29 20 7b 0a 09 09 54  y && chan) {...T
74a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
74b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
74c0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
74d0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 09 20 20  , "binary");..  
74e0: 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 46 72 65 65    }..}..Tcl_Free
74f0: 28 28 76 6f 69 64 20 2a 29 63 6d 64 41 72 67 76  ((void *)cmdArgv
7500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
7510: 28 63 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (chan == NULL) {
7520: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7530: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
7540: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
7550: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b  l(interp, chan);
7560: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
7570: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
7580: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
7590: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
75a0: 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a 20  e(chan), -1));. 
75b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
75c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7610: 2d 0a 20 2a 0a 20 2a 20 54 63 70 41 63 63 65 70  -. *. * TcpAccep
7620: 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65 74 65  tCallbacksDelete
7630: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 41 73  Proc --. *. *.As
7640: 73 6f 63 64 61 74 61 20 63 6c 65 61 6e 75 70 20  socdata cleanup 
7650: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 77  routine called w
7660: 68 65 6e 20 61 6e 20 69 6e 74 65 72 70 72 65 74  hen an interpret
7670: 65 72 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  er is being dele
7680: 74 65 64 0a 20 2a 09 74 6f 20 73 65 74 20 74 68  ted. *.to set th
7690: 65 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20 6f  e interp field o
76a0: 66 20 61 6c 6c 20 74 68 65 20 61 63 63 65 70 74  f all the accept
76b0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72 64   callback record
76c0: 73 20 72 65 67 69 73 74 65 72 65 64 0a 20 2a 09  s registered. *.
76d0: 77 69 74 68 20 74 68 65 20 69 6e 74 65 72 70 72  with the interpr
76e0: 65 74 65 72 20 74 6f 20 4e 55 4c 4c 2e 20 54 68  eter to NULL. Th
76f0: 69 73 20 77 69 6c 6c 20 70 72 65 76 65 6e 74 20  is will prevent 
7700: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
7710: 66 72 6f 6d 0a 20 2a 09 62 65 69 6e 67 20 75 73  from. *.being us
7720: 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ed in the future
7730: 20 74 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20   to eval accept 
7740: 73 63 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 20 52  scripts.. *. * R
7750: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
7760: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7770: 63 74 73 3a 0a 20 2a 09 44 65 61 6c 6c 6f 63 61  cts:. *.Dealloca
7780: 74 65 73 20 6d 65 6d 6f 72 79 20 61 6e 64 20 73  tes memory and s
7790: 65 74 73 20 74 68 65 20 69 6e 74 65 72 70 20 66  ets the interp f
77a0: 69 65 6c 64 20 6f 66 20 61 6c 6c 20 74 68 65 20  ield of all the 
77b0: 61 63 63 65 70 74 0a 20 2a 09 63 61 6c 6c 62 61  accept. *.callba
77c0: 63 6b 20 72 65 63 6f 72 64 73 20 74 6f 20 4e 55  ck records to NU
77d0: 4c 4c 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  LL to prevent th
77e0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 66  is interpreter f
77f0: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 0a 20  rom being used. 
7800: 2a 09 73 75 62 73 65 71 75 65 6e 74 6c 79 20 74  *.subsequently t
7810: 6f 20 65 76 61 6c 20 61 63 63 65 70 74 20 73 63  o eval accept sc
7820: 72 69 70 74 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ripts.. *. *----
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7870: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  --. */..static v
7880: 6f 69 64 0a 54 63 70 41 63 63 65 70 74 43 61 6c  oid.TcpAcceptCal
7890: 6c 62 61 63 6b 73 44 65 6c 65 74 65 50 72 6f 63  lbacksDeleteProc
78a0: 28 0a 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  (.    void *clie
78b0: 6e 74 44 61 74 61 2c 09 2f 2a 20 44 61 74 61 20  ntData,./* Data 
78c0: 77 68 69 63 68 20 77 61 73 20 70 61 73 73 65 64  which was passed
78d0: 20 77 68 65 6e 20 74 68 65 20 61 73 73 6f 63 64   when the assocd
78e0: 61 74 61 0a 09 09 09 09 20 2a 20 77 61 73 20 72  ata..... * was r
78f0: 65 67 69 73 74 65 72 65 64 2e 20 2a 2f 0a 20 20  egistered. */.  
7900: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c    TCL_UNUSED(Tcl
7910: 5f 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20  _Interp *)).{.  
7920: 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20    Tcl_HashTable 
7930: 2a 68 54 62 6c 50 74 72 20 3d 20 28 54 63 6c 5f  *hTblPtr = (Tcl_
7940: 48 61 73 68 54 61 62 6c 65 20 2a 29 63 6c 69 65  HashTable *)clie
7950: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f  ntData;.    Tcl_
7960: 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b  HashEntry *hPtr;
7970: 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 53 65 61  .    Tcl_HashSea
7980: 72 63 68 20 68 53 65 61 72 63 68 3b 0a 0a 20 20  rch hSearch;..  
7990: 20 20 66 6f 72 20 28 68 50 74 72 20 3d 20 54 63    for (hPtr = Tc
79a0: 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74 72 79  l_FirstHashEntry
79b0: 28 68 54 62 6c 50 74 72 2c 20 26 68 53 65 61 72  (hTblPtr, &hSear
79c0: 63 68 29 3b 0a 09 20 20 20 20 68 50 74 72 20 21  ch);..    hPtr !
79d0: 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20 3d 20 54  = NULL; hPtr = T
79e0: 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79  cl_NextHashEntry
79f0: 28 26 68 53 65 61 72 63 68 29 29 20 7b 0a 09 41  (&hSearch)) {..A
7a00: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61  cceptCallback *a
7a10: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72  cceptCallbackPtr
7a20: 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61   = (AcceptCallba
7a30: 63 6b 20 2a 29 54 63 6c 5f 47 65 74 48 61 73 68  ck *)Tcl_GetHash
7a40: 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 0a 09 61  Value(hPtr);...a
7a50: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72  cceptCallbackPtr
7a60: 2d 3e 69 6e 74 65 72 70 20 3d 20 4e 55 4c 4c 3b  ->interp = NULL;
7a70: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
7a80: 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28 68  eleteHashTable(h
7a90: 54 62 6c 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  TblPtr);.    Tcl
7aa0: 5f 46 72 65 65 28 68 54 62 6c 50 74 72 29 3b 0a  _Free(hTblPtr);.
7ab0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
7ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7b00: 20 2a 0a 20 2a 20 52 65 67 69 73 74 65 72 54 63   *. * RegisterTc
7b10: 70 53 65 72 76 65 72 49 6e 74 65 72 70 43 6c 65  pServerInterpCle
7b20: 61 6e 75 70 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  anup --. *. *.Re
7b30: 67 69 73 74 65 72 73 20 61 6e 20 61 63 63 65 70  gisters an accep
7b40: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72  t callback recor
7b50: 64 20 74 6f 20 68 61 76 65 20 69 74 73 20 69 6e  d to have its in
7b60: 74 65 72 70 20 66 69 65 6c 64 20 73 65 74 20 74  terp field set t
7b70: 6f 0a 20 2a 09 4e 55 4c 4c 20 77 68 65 6e 20 74  o. *.NULL when t
7b80: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
7b90: 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a  s deleted.. *. *
7ba0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
7bb0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
7bc0: 66 65 63 74 73 3a 0a 20 2a 09 57 68 65 6e 2c 20  fects:. *.When, 
7bd0: 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
7be0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
7bf0: 73 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 69  s deleted, the i
7c00: 6e 74 65 72 70 20 66 69 65 6c 64 20 6f 66 0a 20  nterp field of. 
7c10: 2a 09 74 68 65 20 61 63 63 65 70 74 20 63 61 6c  *.the accept cal
7c20: 6c 62 61 63 6b 20 64 61 74 61 20 73 74 72 75 63  lback data struc
7c30: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 73 65 74  ture will be set
7c40: 20 74 6f 20 4e 55 4c 4c 2e 20 54 68 69 73 20 77   to NULL. This w
7c50: 69 6c 6c 0a 20 2a 09 70 72 65 76 65 6e 74 20 61  ill. *.prevent a
7c60: 74 74 65 6d 70 74 73 20 74 6f 20 65 76 61 6c 20  ttempts to eval 
7c70: 74 68 65 20 61 63 63 65 70 74 20 73 63 72 69 70  the accept scrip
7c80: 74 20 69 6e 20 61 20 64 65 6c 65 74 65 64 20 69  t in a deleted i
7c90: 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20  nterpreter.. *. 
7ca0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
7cf0: 74 69 63 20 76 6f 69 64 0a 52 65 67 69 73 74 65  tic void.Registe
7d00: 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72 70  rTcpServerInterp
7d10: 43 6c 65 61 6e 75 70 28 0a 20 20 20 20 54 63 6c  Cleanup(.    Tcl
7d20: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7d30: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72  ../* Interpreter
7d40: 20 66 6f 72 20 77 68 69 63 68 20 77 65 20 77 61   for which we wa
7d50: 6e 74 20 74 6f 20 62 65 0a 09 09 09 09 20 2a 20  nt to be..... * 
7d60: 69 6e 66 6f 72 6d 65 64 20 6f 66 20 64 65 6c 65  informed of dele
7d70: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 41 63 63  tion. */.    Acc
7d80: 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61 63 63  eptCallback *acc
7d90: 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 0a  eptCallbackPtr).
7da0: 09 09 09 09 2f 2a 20 54 68 65 20 61 63 63 65 70  ..../* The accep
7db0: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72  t callback recor
7dc0: 64 20 77 68 6f 73 65 20 69 6e 74 65 72 70 0a 09  d whose interp..
7dd0: 09 09 09 20 2a 20 66 69 65 6c 64 20 77 65 20 77  ... * field we w
7de0: 61 6e 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ant set to NULL 
7df0: 77 68 65 6e 20 74 68 65 0a 09 09 09 09 20 2a 20  when the..... * 
7e00: 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 64  interpreter is d
7e10: 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20  eleted. */.{.   
7e20: 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 2a   Tcl_HashTable *
7e30: 68 54 62 6c 50 74 72 3b 09 2f 2a 20 48 61 73 68  hTblPtr;./* Hash
7e40: 20 74 61 62 6c 65 20 66 6f 72 20 61 63 63 65 70   table for accep
7e50: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72  t callback recor
7e60: 64 73 20 74 6f 0a 09 09 09 09 20 2a 20 73 6d 61  ds to..... * sma
7e70: 73 68 20 77 68 65 6e 20 74 68 65 20 69 6e 74 65  sh when the inte
7e80: 72 70 72 65 74 65 72 20 77 69 6c 6c 20 62 65 0a  rpreter will be.
7e90: 09 09 09 09 20 2a 20 64 65 6c 65 74 65 64 2e 20  .... * deleted. 
7ea0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45  */.    Tcl_HashE
7eb0: 6e 74 72 79 20 2a 68 50 74 72 3b 09 2f 2a 20 45  ntry *hPtr;./* E
7ec0: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 72 65  ntry for this re
7ed0: 63 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  cord. */.    int
7ee0: 20 69 73 4e 65 77 3b 09 09 09 2f 2a 20 49 73 20   isNew;.../* Is 
7ef0: 74 68 65 20 65 6e 74 72 79 20 6e 65 77 3f 20 2a  the entry new? *
7f00: 2f 0a 0a 20 20 20 20 68 54 62 6c 50 74 72 20 3d  /..    hTblPtr =
7f10: 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20   (Tcl_HashTable 
7f20: 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63 44 61  *)Tcl_GetAssocDa
7f30: 74 61 28 69 6e 74 65 72 70 2c 20 22 74 63 6c 54  ta(interp, "tclT
7f40: 43 50 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b  CPAcceptCallback
7f50: 73 22 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  s", NULL);..    
7f60: 69 66 20 28 68 54 62 6c 50 74 72 20 3d 3d 20 4e  if (hTblPtr == N
7f70: 55 4c 4c 29 20 7b 0a 09 68 54 62 6c 50 74 72 20  ULL) {..hTblPtr 
7f80: 3d 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65  = (Tcl_HashTable
7f90: 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a   *)Tcl_Alloc(siz
7fa0: 65 6f 66 28 54 63 6c 5f 48 61 73 68 54 61 62 6c  eof(Tcl_HashTabl
7fb0: 65 29 29 3b 0a 09 54 63 6c 5f 49 6e 69 74 48 61  e));..Tcl_InitHa
7fc0: 73 68 54 61 62 6c 65 28 68 54 62 6c 50 74 72 2c  shTable(hTblPtr,
7fd0: 20 54 43 4c 5f 4f 4e 45 5f 57 4f 52 44 5f 4b 45   TCL_ONE_WORD_KE
7fe0: 59 53 29 3b 0a 09 54 63 6c 5f 53 65 74 41 73 73  YS);..Tcl_SetAss
7ff0: 6f 63 44 61 74 61 28 69 6e 74 65 72 70 2c 20 22  ocData(interp, "
8000: 74 63 6c 54 43 50 41 63 63 65 70 74 43 61 6c 6c  tclTCPAcceptCall
8010: 62 61 63 6b 73 22 2c 0a 09 09 54 63 70 41 63 63  backs",...TcpAcc
8020: 65 70 74 43 61 6c 6c 62 61 63 6b 73 44 65 6c 65  eptCallbacksDele
8030: 74 65 50 72 6f 63 2c 20 68 54 62 6c 50 74 72 29  teProc, hTblPtr)
8040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 68 50 74  ;.    }..    hPt
8050: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61  r = Tcl_CreateHa
8060: 73 68 45 6e 74 72 79 28 68 54 62 6c 50 74 72 2c  shEntry(hTblPtr,
8070: 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50   acceptCallbackP
8080: 74 72 2c 20 26 69 73 4e 65 77 29 3b 0a 20 20 20  tr, &isNew);.   
8090: 20 69 66 20 28 21 69 73 4e 65 77 29 20 7b 0a 09   if (!isNew) {..
80a0: 54 63 6c 5f 50 61 6e 69 63 28 22 52 65 67 69 73  Tcl_Panic("Regis
80b0: 74 65 72 54 63 70 53 65 72 76 65 72 43 6c 65 61  terTcpServerClea
80c0: 6e 75 70 3a 20 64 61 6d 61 67 65 64 20 61 63 63  nup: damaged acc
80d0: 65 70 74 20 72 65 63 6f 72 64 20 74 61 62 6c 65  ept record table
80e0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ");.    }.    Tc
80f0: 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 68  l_SetHashValue(h
8100: 50 74 72 2c 20 61 63 63 65 70 74 43 61 6c 6c 62  Ptr, acceptCallb
8110: 61 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  ackPtr);.}.../*.
8120: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
8170: 6e 72 65 67 69 73 74 65 72 54 63 70 53 65 72 76  nregisterTcpServ
8180: 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75 70 50  erInterpCleanupP
8190: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 55 6e 72  roc --. *. *.Unr
81a0: 65 67 69 73 74 65 72 20 61 20 70 72 65 76 69 6f  egister a previo
81b0: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
81c0: 61 63 63 65 70 74 20 63 61 6c 6c 62 61 63 6b 20  accept callback 
81d0: 72 65 63 6f 72 64 2e 20 54 68 65 20 69 6e 74 65  record. The inte
81e0: 72 70 0a 20 2a 09 66 69 65 6c 64 20 6f 66 20 74  rp. *.field of t
81f0: 68 69 73 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  his record will 
8200: 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 73 65 74  no longer be set
8210: 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
8220: 66 75 74 75 72 65 20 77 68 65 6e 0a 20 2a 09 74  future when. *.t
8230: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
8240: 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a  s deleted.. *. *
8250: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
8260: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
8270: 66 65 63 74 73 3a 0a 20 2a 09 50 72 65 76 65 6e  fects:. *.Preven
8280: 74 73 20 74 68 65 20 69 6e 74 65 72 70 20 66 69  ts the interp fi
8290: 65 6c 64 20 6f 66 20 74 68 65 20 61 63 63 65 70  eld of the accep
82a0: 74 20 63 61 6c 6c 62 61 63 6b 20 72 65 63 6f 72  t callback recor
82b0: 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 73 65 74  d from being set
82c0: 0a 20 2a 09 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  . *.to NULL in t
82d0: 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 74  he future when t
82e0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
82f0: 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a  s deleted.. *. *
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8340: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
8350: 69 63 20 76 6f 69 64 0a 55 6e 72 65 67 69 73 74  ic void.Unregist
8360: 65 72 54 63 70 53 65 72 76 65 72 49 6e 74 65 72  erTcpServerInter
8370: 70 43 6c 65 61 6e 75 70 50 72 6f 63 28 0a 20 20  pCleanupProc(.  
8380: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8390: 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70  terp,../* Interp
83a0: 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  reter in which t
83b0: 68 65 20 61 63 63 65 70 74 20 63 61 6c 6c 62 61  he accept callba
83c0: 63 6b 0a 09 09 09 09 20 2a 20 72 65 63 6f 72 64  ck..... * record
83d0: 20 77 61 73 20 72 65 67 69 73 74 65 72 65 64 2e   was registered.
83e0: 20 2a 2f 0a 20 20 20 20 41 63 63 65 70 74 43 61   */.    AcceptCa
83f0: 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 74 43 61  llback *acceptCa
8400: 6c 6c 62 61 63 6b 50 74 72 29 0a 09 09 09 09 2f  llbackPtr)...../
8410: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6f 72  * The record for
8420: 20 77 68 69 63 68 20 74 6f 20 64 65 6c 65 74 65   which to delete
8430: 20 74 68 65 0a 09 09 09 09 20 2a 20 72 65 67 69   the..... * regi
8440: 73 74 72 61 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20  stration. */.{. 
8450: 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65     Tcl_HashTable
8460: 20 2a 68 54 62 6c 50 74 72 3b 0a 20 20 20 20 54   *hTblPtr;.    T
8470: 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50  cl_HashEntry *hP
8480: 74 72 3b 0a 0a 20 20 20 20 68 54 62 6c 50 74 72  tr;..    hTblPtr
8490: 20 3d 20 28 54 63 6c 5f 48 61 73 68 54 61 62 6c   = (Tcl_HashTabl
84a0: 65 20 2a 29 54 63 6c 5f 47 65 74 41 73 73 6f 63  e *)Tcl_GetAssoc
84b0: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 22 74 63  Data(interp, "tc
84c0: 6c 54 43 50 41 63 63 65 70 74 43 61 6c 6c 62 61  lTCPAcceptCallba
84d0: 63 6b 73 22 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  cks", NULL);.   
84e0: 20 69 66 20 28 68 54 62 6c 50 74 72 20 3d 3d 20   if (hTblPtr == 
84f0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b  NULL) {..return;
8500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 68 50 74 72  .    }..    hPtr
8510: 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45   = Tcl_FindHashE
8520: 6e 74 72 79 28 68 54 62 6c 50 74 72 2c 20 61 63  ntry(hTblPtr, ac
8530: 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 29  ceptCallbackPtr)
8540: 3b 0a 20 20 20 20 69 66 20 28 68 50 74 72 20 21  ;.    if (hPtr !
8550: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  = NULL) {..Tcl_D
8560: 65 6c 65 74 65 48 61 73 68 45 6e 74 72 79 28 68  eleteHashEntry(h
8570: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  Ptr);.    }.}...
8580: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
85d0: 2a 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b  * AcceptCallback
85e0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
85f0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  is callback is i
8600: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 54 43  nvoked by the TC
8610: 50 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72  P channel driver
8620: 20 77 68 65 6e 20 69 74 20 61 63 63 65 70 74 73   when it accepts
8630: 20 61 0a 20 2a 09 6e 65 77 20 63 6f 6e 6e 65 63   a. *.new connec
8640: 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6c 69 65  tion from a clie
8650: 6e 74 20 6f 6e 20 61 20 73 65 72 76 65 72 20 73  nt on a server s
8660: 6f 63 6b 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73  ocket.. *. * Res
8670: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
8680: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8690: 73 3a 0a 20 2a 09 57 68 61 74 65 76 65 72 20 74  s:. *.Whatever t
86a0: 68 65 20 73 63 72 69 70 74 20 64 6f 65 73 2e 0a  he script does..
86b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8700: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 41 63 63  .static void.Acc
8710: 65 70 74 43 61 6c 6c 62 61 63 6b 50 72 6f 63 28  eptCallbackProc(
8720: 0a 20 20 20 20 76 6f 69 64 20 2a 63 61 6c 6c 62  .    void *callb
8730: 61 63 6b 44 61 74 61 2c 09 2f 2a 20 54 68 65 20  ackData,./* The 
8740: 64 61 74 61 20 73 74 6f 72 65 64 20 77 68 65 6e  data stored when
8750: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 77 61   the callback wa
8760: 73 0a 09 09 09 09 20 2a 20 63 72 65 61 74 65 64  s..... * created
8770: 20 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a   in the call to.
8780: 09 09 09 09 20 2a 20 54 63 6c 5f 4f 70 65 6e 54  .... * Tcl_OpenT
8790: 63 70 53 65 72 76 65 72 2e 20 2a 2f 0a 20 20 20  cpServer. */.   
87a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
87b0: 6e 2c 09 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 66  n,../* Channel f
87c0: 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 61 63 63  or the newly acc
87d0: 65 70 74 65 64 0a 09 09 09 09 20 2a 20 63 6f 6e  epted..... * con
87e0: 6e 65 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  nection. */.    
87f0: 63 68 61 72 20 2a 61 64 64 72 65 73 73 2c 09 09  char *address,..
8800: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 63 6c  /* Address of cl
8810: 69 65 6e 74 20 74 68 61 74 20 77 61 73 20 61 63  ient that was ac
8820: 63 65 70 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  cepted. */.    i
8830: 6e 74 20 70 6f 72 74 29 09 09 09 2f 2a 20 50 6f  nt port).../* Po
8840: 72 74 20 6f 66 20 63 6c 69 65 6e 74 20 74 68 61  rt of client tha
8850: 74 20 77 61 73 20 61 63 63 65 70 74 65 64 2e 20  t was accepted. 
8860: 2a 2f 0a 7b 0a 20 20 20 20 41 63 63 65 70 74 43  */.{.    AcceptC
8870: 61 6c 6c 62 61 63 6b 20 2a 61 63 63 65 70 74 43  allback *acceptC
8880: 61 6c 6c 62 61 63 6b 50 74 72 20 3d 20 28 41 63  allbackPtr = (Ac
8890: 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 29 63  ceptCallback *)c
88a0: 61 6c 6c 62 61 63 6b 44 61 74 61 3b 0a 0a 20 20  allbackData;..  
88b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63    /*.     * Chec
88c0: 6b 20 69 66 20 74 68 65 20 63 61 6c 6c 62 61 63  k if the callbac
88d0: 6b 20 69 73 20 73 74 69 6c 6c 20 76 61 6c 69 64  k is still valid
88e0: 3b 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  ; the interprete
88f0: 72 20 6d 61 79 20 68 61 76 65 20 67 6f 6e 65 0a  r may have gone.
8900: 20 20 20 20 20 2a 20 61 77 61 79 2c 20 74 68 69       * away, thi
8910: 73 20 69 73 20 73 69 67 6e 61 6c 6c 65 64 20 62  s is signalled b
8920: 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 69 6e  y setting the in
8930: 74 65 72 70 20 66 69 65 6c 64 20 6f 66 20 74 68  terp field of th
8940: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e callback.     
8950: 2a 20 64 61 74 61 20 74 6f 20 4e 55 4c 4c 2e 0a  * data to NULL..
8960: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
8970: 28 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50  (acceptCallbackP
8980: 74 72 2d 3e 69 6e 74 65 72 70 20 21 3d 20 4e 55  tr->interp != NU
8990: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 49 6e 74 65 72  LL) {..Tcl_Inter
89a0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 61 63 63 65  p *interp = acce
89b0: 70 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69  ptCallbackPtr->i
89c0: 6e 74 65 72 70 3b 0a 09 54 63 6c 5f 4f 62 6a 20  nterp;..Tcl_Obj 
89d0: 2a 73 63 72 69 70 74 2c 20 2a 6f 62 6a 76 5b 32  *script, *objv[2
89e0: 5d 3b 0a 09 69 6e 74 20 72 65 73 75 6c 74 20 3d  ];..int result =
89f0: 20 54 43 4c 5f 4f 4b 3b 0a 0a 09 6f 62 6a 76 5b   TCL_OK;...objv[
8a00: 30 5d 20 3d 20 61 63 63 65 70 74 43 61 6c 6c 62  0] = acceptCallb
8a10: 61 63 6b 50 74 72 2d 3e 73 63 72 69 70 74 3b 0a  ackPtr->script;.
8a20: 09 6f 62 6a 76 5b 31 5d 20 3d 20 54 63 6c 5f 4e  .objv[1] = Tcl_N
8a30: 65 77 4c 69 73 74 4f 62 6a 28 33 2c 20 4e 55 4c  ewListObj(3, NUL
8a40: 4c 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  L);..Tcl_ListObj
8a50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55  AppendElement(NU
8a60: 4c 4c 2c 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c  LL, objv[1], Tcl
8a70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09  _NewStringObj(..
8a80: 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  .Tcl_GetChannelN
8a90: 61 6d 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b  ame(chan), -1));
8aa0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
8ab0: 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c  endElement(NULL,
8ac0: 20 6f 62 6a 76 5b 31 5d 2c 20 54 63 6c 5f 4e 65   objv[1], Tcl_Ne
8ad0: 77 53 74 72 69 6e 67 4f 62 6a 28 61 64 64 72 65  wStringObj(addre
8ae0: 73 73 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  ss, -1));..Tcl_L
8af0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8b00: 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31  ent(NULL, objv[1
8b10: 5d 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  ], Tcl_NewWideIn
8b20: 74 4f 62 6a 28 70 6f 72 74 29 29 3b 0a 0a 09 73  tObj(port));...s
8b30: 63 72 69 70 74 20 3d 20 54 63 6c 5f 43 6f 6e 63  cript = Tcl_Conc
8b40: 61 74 4f 62 6a 28 32 2c 20 6f 62 6a 76 29 3b 0a  atObj(2, objv);.
8b50: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e  .Tcl_IncrRefCoun
8b60: 74 28 73 63 72 69 70 74 29 3b 0a 09 54 63 6c 5f  t(script);..Tcl_
8b70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a  DecrRefCount(obj
8b80: 76 5b 31 5d 29 3b 0a 0a 09 54 63 6c 5f 50 72 65  v[1]);...Tcl_Pre
8b90: 73 65 72 76 65 28 69 6e 74 65 72 70 29 3b 0a 09  serve(interp);..
8ba0: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
8bb0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
8bc0: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41 72 74 69  );.../*.. * Arti
8bd0: 66 69 63 69 61 6c 6c 79 20 62 75 6d 70 20 74 68  ficially bump th
8be0: 65 20 72 65 66 63 6f 75 6e 74 20 74 6f 20 70 72  e refcount to pr
8bf0: 6f 74 65 63 74 20 74 68 65 20 63 68 61 6e 6e 65  otect the channe
8c00: 6c 20 66 72 6f 6d 20 62 65 69 6e 67 0a 09 20 2a  l from being.. *
8c10: 20 64 65 6c 65 74 65 64 20 77 68 69 6c 65 20 74   deleted while t
8c20: 68 65 20 73 63 72 69 70 74 20 69 73 20 62 65 69  he script is bei
8c30: 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 0a 09 20  ng evaluated... 
8c40: 2a 2f 0a 0a 09 54 63 6c 5f 52 65 67 69 73 74 65  */...Tcl_Registe
8c50: 72 43 68 61 6e 6e 65 6c 28 4e 55 4c 4c 2c 20 63  rChannel(NULL, c
8c60: 68 61 6e 29 3b 0a 0a 09 72 65 73 75 6c 74 20 3d  han);...result =
8c70: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
8c80: 6e 74 65 72 70 2c 20 73 63 72 69 70 74 2c 20 54  nterp, script, T
8c90: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54  CL_EVAL_DIRECT|T
8ca0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
8cb0: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
8cc0: 6e 74 28 73 63 72 69 70 74 29 3b 0a 0a 09 69 66  nt(script);...if
8cd0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f   (result != TCL_
8ce0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 42  OK) {..    Tcl_B
8cf0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69  ackgroundExcepti
8d00: 6f 6e 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c  on(interp, resul
8d10: 74 29 3b 0a 09 20 20 20 20 54 63 6c 5f 55 6e 72  t);..    Tcl_Unr
8d20: 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69  egisterChannel(i
8d30: 6e 74 65 72 70 2c 20 63 68 61 6e 29 3b 0a 09 7d  nterp, chan);..}
8d40: 0a 0a 09 2f 2a 0a 09 20 2a 20 44 65 63 72 65 6d  .../*.. * Decrem
8d50: 65 6e 74 20 74 68 65 20 61 72 74 69 66 69 63 69  ent the artifici
8d60: 61 6c 6c 79 20 62 75 6d 70 65 64 20 72 65 66 63  ally bumped refc
8d70: 6f 75 6e 74 2e 20 41 66 74 65 72 20 74 68 69 73  ount. After this
8d80: 20 69 74 20 69 73 20 6e 6f 74 0a 09 20 2a 20 73   it is not.. * s
8d90: 61 66 65 20 61 6e 79 6d 6f 72 65 20 74 6f 20 75  afe anymore to u
8da0: 73 65 20 22 63 68 61 6e 22 2c 20 62 65 63 61 75  se "chan", becau
8db0: 73 65 20 69 74 20 6d 61 79 20 6e 6f 77 20 62 65  se it may now be
8dc0: 20 64 65 6c 65 74 65 64 2e 0a 09 20 2a 2f 0a 0a   deleted... */..
8dd0: 09 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43  .Tcl_UnregisterC
8de0: 68 61 6e 6e 65 6c 28 4e 55 4c 4c 2c 20 63 68 61  hannel(NULL, cha
8df0: 6e 29 3b 0a 0a 09 54 63 6c 5f 52 65 6c 65 61 73  n);...Tcl_Releas
8e00: 65 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  e(interp);.    }
8e10: 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20   else {../*.. * 
8e20: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  The interpreter 
8e30: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
8e40: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
8e50: 20 75 73 65 66 75 6c 20 77 61 79 20 74 6f 20 75   useful way to u
8e60: 73 65 0a 09 20 2a 20 74 68 65 20 63 6c 69 65 6e  se.. * the clien
8e70: 74 20 73 6f 63 6b 65 74 20 2d 20 6a 75 73 74 20  t socket - just 
8e80: 63 6c 6f 73 65 20 69 74 2e 0a 09 20 2a 2f 0a 0a  close it... */..
8e90: 09 54 63 6c 5f 43 6c 6f 73 65 45 78 28 4e 55 4c  .Tcl_CloseEx(NUL
8ea0: 4c 2c 20 63 68 61 6e 2c 20 30 29 3b 0a 20 20 20  L, chan, 0);.   
8eb0: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f00: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 70 53 65 72 76  --. *. * TcpServ
8f10: 65 72 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20  erCloseProc --. 
8f20: 2a 0a 20 2a 09 54 68 69 73 20 63 61 6c 6c 62 61  *. *.This callba
8f30: 63 6b 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ck is called whe
8f40: 6e 20 74 68 65 20 54 43 50 20 73 65 72 76 65 72  n the TCP server
8f50: 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 77 68 69   channel for whi
8f60: 63 68 20 69 74 20 77 61 73 0a 20 2a 09 72 65 67  ch it was. *.reg
8f70: 69 73 74 65 72 65 64 20 69 73 20 62 65 69 6e 67  istered is being
8f80: 20 63 6c 6f 73 65 64 2e 20 49 74 20 69 6e 66 6f   closed. It info
8f90: 72 6d 73 20 74 68 65 20 69 6e 74 65 72 70 72 65  rms the interpre
8fa0: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
8fb0: 0a 20 2a 09 61 63 63 65 70 74 20 73 63 72 69 70  . *.accept scrip
8fc0: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 28  t is evaluated (
8fd0: 69 66 20 74 68 61 74 20 69 6e 74 65 72 70 72 65  if that interpre
8fe0: 74 65 72 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ter still exists
8ff0: 29 20 74 68 61 74 0a 20 2a 09 74 68 69 73 20 63  ) that. *.this c
9000: 68 61 6e 6e 65 6c 20 6e 6f 20 6c 6f 6e 67 65 72  hannel no longer
9010: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 66   needs to be inf
9020: 6f 72 6d 65 64 20 69 66 20 74 68 65 20 69 6e 74  ormed if the int
9030: 65 72 70 72 65 74 65 72 20 69 73 0a 20 2a 09 64  erpreter is. *.d
9040: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65  eleted.. *. * Re
9050: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
9060: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
9070: 74 73 3a 0a 20 2a 09 49 6e 20 74 68 65 20 66 75  ts:. *.In the fu
9080: 74 75 72 65 2c 20 69 66 20 74 68 65 20 69 6e 74  ture, if the int
9090: 65 72 70 72 65 74 65 72 20 69 73 20 64 65 6c 65  erpreter is dele
90a0: 74 65 64 20 74 68 69 73 20 63 68 61 6e 6e 65 6c  ted this channel
90b0: 20 77 69 6c 6c 20 6e 6f 0a 20 2a 09 6c 6f 6e 67   will no. *.long
90c0: 65 72 20 62 65 20 69 6e 66 6f 72 6d 65 64 2e 0a  er be informed..
90d0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9120: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 63 70  .static void.Tcp
9130: 53 65 72 76 65 72 43 6c 6f 73 65 50 72 6f 63 28  ServerCloseProc(
9140: 0a 20 20 20 20 76 6f 69 64 20 2a 63 61 6c 6c 62  .    void *callb
9150: 61 63 6b 44 61 74 61 29 09 2f 2a 20 54 68 65 20  ackData)./* The 
9160: 64 61 74 61 20 70 61 73 73 65 64 20 69 6e 20 74  data passed in t
9170: 68 65 20 63 61 6c 6c 20 74 6f 0a 09 09 09 09 20  he call to..... 
9180: 2a 20 54 63 6c 5f 43 72 65 61 74 65 43 6c 6f 73  * Tcl_CreateClos
9190: 65 48 61 6e 64 6c 65 72 2e 20 2a 2f 0a 7b 0a 20  eHandler. */.{. 
91a0: 20 20 20 41 63 63 65 70 74 43 61 6c 6c 62 61 63     AcceptCallbac
91b0: 6b 20 2a 61 63 63 65 70 74 43 61 6c 6c 62 61 63  k *acceptCallbac
91c0: 6b 50 74 72 20 3d 20 28 41 63 63 65 70 74 43 61  kPtr = (AcceptCa
91d0: 6c 6c 62 61 63 6b 20 2a 29 63 61 6c 6c 62 61 63  llback *)callbac
91e0: 6b 44 61 74 61 3b 0a 09 09 09 09 2f 2a 20 54 68  kData;...../* Th
91f0: 65 20 61 63 74 75 61 6c 20 64 61 74 61 2e 20 2a  e actual data. *
9200: 2f 0a 0a 20 20 20 20 69 66 20 28 61 63 63 65 70  /..    if (accep
9210: 74 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e  tCallbackPtr->in
9220: 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  terp != NULL) {.
9230: 09 55 6e 72 65 67 69 73 74 65 72 54 63 70 53 65  .UnregisterTcpSe
9240: 72 76 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75  rverInterpCleanu
9250: 70 50 72 6f 63 28 61 63 63 65 70 74 43 61 6c 6c  pProc(acceptCall
9260: 62 61 63 6b 50 74 72 2d 3e 69 6e 74 65 72 70 2c  backPtr->interp,
9270: 0a 09 09 61 63 63 65 70 74 43 61 6c 6c 62 61 63  ...acceptCallbac
9280: 6b 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  kPtr);.    }.   
9290: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
92a0: 74 28 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b  t(acceptCallback
92b0: 50 74 72 2d 3e 73 63 72 69 70 74 29 3b 0a 20 20  Ptr->script);.  
92c0: 20 20 54 63 6c 5f 46 72 65 65 28 61 63 63 65 70    Tcl_Free(accep
92d0: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 7d  tCallbackPtr);.}
92e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9330: 2a 0a 20 2a 20 54 63 6c 5f 53 6f 63 6b 65 74 4f  *. * Tcl_SocketO
9340: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
9350: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9360: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
9370: 73 73 20 74 68 65 20 22 73 6f 63 6b 65 74 22 20  ss the "socket" 
9380: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53 65 65  Tcl command. See
9390: 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64 6f 63   the. *.user doc
93a0: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64  umentation for d
93b0: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69  etails on what i
93c0: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65  t does.. *. * Re
93d0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
93e0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
93f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
9400: 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20  cts:. *.Creates 
9410: 61 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  a socket based c
9420: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9470: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
9480: 5f 53 6f 63 6b 65 74 4f 62 6a 43 6d 64 28 0a 20  _SocketObjCmd(. 
9490: 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
94a0: 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
94b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
94c0: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
94d0: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69  preter. */.    i
94e0: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75  nt objc,.../* Nu
94f0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9500: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  s. */.    Tcl_Ob
9510: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
9520: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a  ./* Argument obj
9530: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 73  ects. */.{.    s
9540: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9550: 20 2a 63 6f 6e 73 74 20 73 6f 63 6b 65 74 4f 70   *const socketOp
9560: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 09 22 2d 61  tions[] = {.."-a
9570: 73 79 6e 63 22 2c 20 22 2d 62 61 63 6b 6c 6f 67  sync", "-backlog
9580: 22 2c 20 22 2d 6d 79 61 64 64 72 22 2c 20 22 2d  ", "-myaddr", "-
9590: 6d 79 70 6f 72 74 22 2c 20 22 2d 72 65 75 73 65  myport", "-reuse
95a0: 61 64 64 72 22 2c 0a 09 22 2d 72 65 75 73 65 70  addr",.."-reusep
95b0: 6f 72 74 22 2c 20 22 2d 73 65 72 76 65 72 22 2c  ort", "-server",
95c0: 20 4e 55 4c 4c 0a 20 20 20 20 7d 3b 0a 20 20 20   NULL.    };.   
95d0: 20 65 6e 75 6d 20 73 6f 63 6b 65 74 4f 70 74 69   enum socketOpti
95e0: 6f 6e 73 45 6e 75 6d 20 7b 0a 09 53 4b 54 5f 41  onsEnum {..SKT_A
95f0: 53 59 4e 43 2c 20 53 4b 54 5f 42 41 43 4b 4c 4f  SYNC, SKT_BACKLO
9600: 47 2c 20 53 4b 54 5f 4d 59 41 44 44 52 2c 20 53  G, SKT_MYADDR, S
9610: 4b 54 5f 4d 59 50 4f 52 54 2c 20 53 4b 54 5f 52  KT_MYPORT, SKT_R
9620: 45 55 53 45 41 44 44 52 2c 0a 09 53 4b 54 5f 52  EUSEADDR,..SKT_R
9630: 45 55 53 45 50 4f 52 54 2c 20 53 4b 54 5f 53 45  EUSEPORT, SKT_SE
9640: 52 56 45 52 0a 20 20 20 20 7d 20 6f 70 74 69 6f  RVER.    } optio
9650: 6e 49 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20  nIndex;.    int 
9660: 61 2c 20 73 65 72 76 65 72 20 3d 20 30 2c 20 6d  a, server = 0, m
9670: 79 70 6f 72 74 20 3d 20 30 2c 20 61 73 79 6e 63  yport = 0, async
9680: 20 3d 20 30 2c 20 72 65 75 73 65 70 20 3d 20 2d   = 0, reusep = -
9690: 31 2c 0a 09 72 65 75 73 65 61 20 3d 20 2d 31 2c  1,..reusea = -1,
96a0: 20 62 61 63 6b 6c 6f 67 20 3d 20 2d 31 3b 0a 20   backlog = -1;. 
96b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
96c0: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 63  flags = 0;.    c
96d0: 6f 6e 73 74 20 63 68 61 72 20 2a 68 6f 73 74 2c  onst char *host,
96e0: 20 2a 70 6f 72 74 2c 20 2a 6d 79 61 64 64 72 20   *port, *myaddr 
96f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9700: 4f 62 6a 20 2a 73 63 72 69 70 74 20 3d 20 4e 55  Obj *script = NU
9710: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  LL;.    Tcl_Chan
9720: 6e 65 6c 20 63 68 61 6e 3b 0a 0a 20 20 20 20 54  nel chan;..    T
9730: 63 6c 49 6e 69 74 53 6f 63 6b 65 74 73 28 29 3b  clInitSockets();
9740: 0a 0a 20 20 20 20 66 6f 72 20 28 61 20 3d 20 31  ..    for (a = 1
9750: 3b 20 61 20 3c 20 6f 62 6a 63 3b 20 61 2b 2b 29  ; a < objc; a++)
9760: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
9770: 61 72 67 20 3d 20 54 63 6c 47 65 74 53 74 72 69  arg = TclGetStri
9780: 6e 67 28 6f 62 6a 76 5b 61 5d 29 3b 0a 0a 09 69  ng(objv[a]);...i
9790: 66 20 28 61 72 67 5b 30 5d 20 21 3d 20 27 2d 27  f (arg[0] != '-'
97a0: 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  ) {..    break;.
97b0: 09 7d 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49  .}..if (Tcl_GetI
97c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
97d0: 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 73 6f 63  rp, objv[a], soc
97e0: 6b 65 74 4f 70 74 69 6f 6e 73 2c 20 22 6f 70 74  ketOptions, "opt
97f0: 69 6f 6e 22 2c 0a 09 09 54 43 4c 5f 45 58 41 43  ion",...TCL_EXAC
9800: 54 2c 20 26 6f 70 74 69 6f 6e 49 6e 64 65 78 29  T, &optionIndex)
9810: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
9820: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9830: 52 4f 52 3b 0a 09 7d 0a 09 73 77 69 74 63 68 20  ROR;..}..switch 
9840: 28 6f 70 74 69 6f 6e 49 6e 64 65 78 29 20 7b 0a  (optionIndex) {.
9850: 09 63 61 73 65 20 53 4b 54 5f 41 53 59 4e 43 3a  .case SKT_ASYNC:
9860: 0a 09 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
9870: 20 3d 3d 20 31 29 20 7b 0a 09 09 54 63 6c 5f 53   == 1) {...Tcl_S
9880: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
9890: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
98a0: 67 4f 62 6a 28 0a 09 09 09 22 63 61 6e 6e 6f 74  gObj(...."cannot
98b0: 20 73 65 74 20 2d 61 73 79 6e 63 20 6f 70 74 69   set -async opti
98c0: 6f 6e 20 66 6f 72 20 73 65 72 76 65 72 20 73 6f  on for server so
98d0: 63 6b 65 74 73 22 2c 20 2d 31 29 29 3b 0a 09 09  ckets", -1));...
98e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
98f0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 61 73  ;..    }..    as
9900: 79 6e 63 20 3d 20 31 3b 0a 09 20 20 20 20 62 72  ync = 1;..    br
9910: 65 61 6b 3b 0a 09 63 61 73 65 20 53 4b 54 5f 4d  eak;..case SKT_M
9920: 59 41 44 44 52 3a 0a 09 20 20 20 20 61 2b 2b 3b  YADDR:..    a++;
9930: 0a 09 20 20 20 20 69 66 20 28 61 20 3e 3d 20 6f  ..    if (a >= o
9940: 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74  bjc) {...Tcl_Set
9950: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9960: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
9970: 62 6a 28 0a 09 09 09 22 6e 6f 20 61 72 67 75 6d  bj(...."no argum
9980: 65 6e 74 20 67 69 76 65 6e 20 66 6f 72 20 2d 6d  ent given for -m
9990: 79 61 64 64 72 20 6f 70 74 69 6f 6e 22 2c 20 2d  yaddr option", -
99a0: 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  1));...return TC
99b0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
99c0: 09 20 20 20 20 6d 79 61 64 64 72 20 3d 20 54 63  .    myaddr = Tc
99d0: 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  lGetString(objv[
99e0: 61 5d 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  a]);..    break;
99f0: 0a 09 63 61 73 65 20 53 4b 54 5f 4d 59 50 4f 52  ..case SKT_MYPOR
9a00: 54 3a 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20  T: {..    const 
9a10: 63 68 61 72 20 2a 6d 79 50 6f 72 74 4e 61 6d 65  char *myPortName
9a20: 3b 0a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20  ;...    a++;..  
9a30: 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29    if (a >= objc)
9a40: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
9a50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9a60: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
9a70: 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ..."no argument 
9a80: 67 69 76 65 6e 20 66 6f 72 20 2d 6d 79 70 6f 72  given for -mypor
9a90: 74 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b  t option", -1));
9aa0: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
9ab0: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
9ac0: 20 6d 79 50 6f 72 74 4e 61 6d 65 20 3d 20 54 63   myPortName = Tc
9ad0: 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  lGetString(objv[
9ae0: 61 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 54 63  a]);..    if (Tc
9af0: 6c 53 6f 63 6b 47 65 74 50 6f 72 74 28 69 6e 74  lSockGetPort(int
9b00: 65 72 70 2c 20 6d 79 50 6f 72 74 4e 61 6d 65 2c  erp, myPortName,
9b10: 20 22 74 63 70 22 2c 20 26 6d 79 70 6f 72 74 29   "tcp", &myport)
9b20: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
9b30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9b40: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
9b50: 65 61 6b 3b 0a 09 7d 0a 09 63 61 73 65 20 53 4b  eak;..}..case SK
9b60: 54 5f 53 45 52 56 45 52 3a 0a 09 20 20 20 20 69  T_SERVER:..    i
9b70: 66 20 28 61 73 79 6e 63 20 3d 3d 20 31 29 20 7b  f (async == 1) {
9b80: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
9b90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
9ba0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09  NewStringObj(...
9bb0: 09 22 63 61 6e 6e 6f 74 20 73 65 74 20 2d 61 73  ."cannot set -as
9bc0: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 73  ync option for s
9bd0: 65 72 76 65 72 20 73 6f 63 6b 65 74 73 22 2c 20  erver sockets", 
9be0: 2d 31 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  -1));...return T
9bf0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
9c00: 0a 09 20 20 20 20 73 65 72 76 65 72 20 3d 20 31  ..    server = 1
9c10: 3b 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20  ;..    a++;..   
9c20: 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20   if (a >= objc) 
9c30: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
9c40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
9c50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09  _NewStringObj(..
9c60: 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67  .."no argument g
9c70: 69 76 65 6e 20 66 6f 72 20 2d 73 65 72 76 65 72  iven for -server
9c80: 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a   option", -1));.
9c90: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9ca0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
9cb0: 73 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 61 5d  script = objv[a]
9cc0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
9cd0: 61 73 65 20 53 4b 54 5f 52 45 55 53 45 41 44 44  ase SKT_REUSEADD
9ce0: 52 3a 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20  R:..    a++;..  
9cf0: 20 20 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29    if (a >= objc)
9d00: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52   {...Tcl_SetObjR
9d10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
9d20: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
9d30: 09 09 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ..."no argument 
9d40: 67 69 76 65 6e 20 66 6f 72 20 2d 72 65 75 73 65  given for -reuse
9d50: 61 64 64 72 20 6f 70 74 69 6f 6e 22 2c 20 2d 31  addr option", -1
9d60: 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ));...return TCL
9d70: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
9d80: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 42      if (Tcl_GetB
9d90: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
9da0: 74 65 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 26  terp, objv[a], &
9db0: 72 65 75 73 65 61 29 20 21 3d 20 54 43 4c 5f 4f  reusea) != TCL_O
9dc0: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
9dd0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
9de0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
9df0: 65 20 53 4b 54 5f 52 45 55 53 45 50 4f 52 54 3a  e SKT_REUSEPORT:
9e00: 0a 09 20 20 20 20 61 2b 2b 3b 0a 09 20 20 20 20  ..    a++;..    
9e10: 69 66 20 28 61 20 3e 3d 20 6f 62 6a 63 29 20 7b  if (a >= objc) {
9e20: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  ...Tcl_SetObjRes
9e30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
9e40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09  NewStringObj(...
9e50: 09 22 6e 6f 20 61 72 67 75 6d 65 6e 74 20 67 69  ."no argument gi
9e60: 76 65 6e 20 66 6f 72 20 2d 72 65 75 73 65 70 6f  ven for -reusepo
9e70: 72 74 20 6f 70 74 69 6f 6e 22 2c 20 2d 31 29 29  rt option", -1))
9e80: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
9e90: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20  RROR;..    }..  
9ea0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 42 6f 6f    if (Tcl_GetBoo
9eb0: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
9ec0: 72 70 2c 20 6f 62 6a 76 5b 61 5d 2c 20 26 72 65  rp, objv[a], &re
9ed0: 75 73 65 70 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  usep) != TCL_OK)
9ee0: 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f   {...return TCL_
9ef0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
9f00: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
9f10: 53 4b 54 5f 42 41 43 4b 4c 4f 47 3a 0a 09 20 20  SKT_BACKLOG:..  
9f20: 20 20 61 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28    a++;..    if (
9f30: 61 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 09 54  a >= objc) {...T
9f40: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9f50: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
9f60: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 6e 6f  tringObj(...."no
9f70: 20 61 72 67 75 6d 65 6e 74 20 67 69 76 65 6e 20   argument given 
9f80: 66 6f 72 20 2d 62 61 63 6b 6c 6f 67 20 6f 70 74  for -backlog opt
9f90: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 09 72 65  ion", -1));...re
9fa0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9fb0: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28  .    }..    if (
9fc0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
9fd0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 61  j(interp, objv[a
9fe0: 5d 2c 20 26 62 61 63 6b 6c 6f 67 29 20 21 3d 20  ], &backlog) != 
9ff0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
a000: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
a010: 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b     }..    break;
a020: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20  ..default:..    
a030: 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c 5f 53  Tcl_Panic("Tcl_S
a040: 6f 63 6b 65 74 4f 62 6a 43 6d 64 3a 20 62 61 64  ocketObjCmd: bad
a050: 20 6f 70 74 69 6f 6e 20 69 6e 64 65 78 20 74 6f   option index to
a060: 20 53 6f 63 6b 65 74 4f 70 74 69 6f 6e 73 22 29   SocketOptions")
a070: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69  ;..}.    }.    i
a080: 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 68 6f  f (server) {..ho
a090: 73 74 20 3d 20 6d 79 61 64 64 72 3b 09 09 2f 2a  st = myaddr;../*
a0a0: 20 4e 55 4c 4c 20 69 6d 70 6c 69 65 73 20 49 4e   NULL implies IN
a0b0: 41 44 44 52 5f 41 4e 59 20 2a 2f 0a 09 69 66 20  ADDR_ANY */..if 
a0c0: 28 6d 79 70 6f 72 74 20 21 3d 20 30 29 20 7b 0a  (myport != 0) {.
a0d0: 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
a0e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
a0f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
a100: 09 09 20 20 20 20 22 6f 70 74 69 6f 6e 20 2d 6d  ..    "option -m
a110: 79 70 6f 72 74 20 69 73 20 6e 6f 74 20 76 61 6c  yport is not val
a120: 69 64 20 66 6f 72 20 73 65 72 76 65 72 73 22 2c  id for servers",
a130: 20 2d 31 29 29 3b 0a 09 20 20 20 20 72 65 74 75   -1));..    retu
a140: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a150: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
a160: 61 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 68 6f 73  a < objc) {..hos
a170: 74 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  t = TclGetString
a180: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 09 61 2b 2b 3b  (objv[a]);..a++;
a190: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 49  .    } else {..I
a1a0: 6e 74 65 72 70 20 2a 69 50 74 72 3b 0a 0a 20 20  nterp *iPtr;..  
a1b0: 20 20 77 72 6f 6e 67 4e 75 6d 41 72 67 73 3a 0a    wrongNumArgs:.
a1c0: 09 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20  .iPtr = (Interp 
a1d0: 2a 29 20 69 6e 74 65 72 70 3b 0a 09 54 63 6c 5f  *) interp;..Tcl_
a1e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a1f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 09 09  erp, 1, objv,...
a200: 22 3f 2d 61 73 79 6e 63 3f 20 3f 2d 6d 79 61 64  "?-async? ?-myad
a210: 64 72 20 61 64 64 72 3f 20 3f 2d 6d 79 70 6f 72  dr addr? ?-mypor
a220: 74 20 6d 79 70 6f 72 74 3f 20 68 6f 73 74 20 70  t myport? host p
a230: 6f 72 74 22 29 3b 0a 09 69 50 74 72 2d 3e 66 6c  ort");..iPtr->fl
a240: 61 67 73 20 7c 3d 20 49 4e 54 45 52 50 5f 41 4c  ags |= INTERP_AL
a250: 54 45 52 4e 41 54 45 5f 57 52 4f 4e 47 5f 41 52  TERNATE_WRONG_AR
a260: 47 53 3b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  GS;..Tcl_WrongNu
a270: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
a280: 20 6f 62 6a 76 2c 0a 09 09 22 2d 73 65 72 76 65   objv,..."-serve
a290: 72 20 63 6f 6d 6d 61 6e 64 20 3f 2d 62 61 63 6b  r command ?-back
a2a0: 6c 6f 67 20 63 6f 75 6e 74 3f 20 3f 2d 6d 79 61  log count? ?-mya
a2b0: 64 64 72 20 61 64 64 72 3f 20 22 0a 09 09 22 3f  ddr addr? "..."?
a2c0: 2d 72 65 75 73 65 61 64 64 72 20 62 6f 6f 6c 65  -reuseaddr boole
a2d0: 61 6e 3f 20 3f 2d 72 65 75 73 65 70 6f 72 74 20  an? ?-reuseport 
a2e0: 62 6f 6f 6c 65 61 6e 3f 20 70 6f 72 74 22 29 3b  boolean? port");
a2f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
a300: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
a310: 66 20 28 21 73 65 72 76 65 72 20 26 26 20 28 72  f (!server && (r
a320: 65 75 73 65 61 20 21 3d 20 2d 31 20 7c 7c 20 72  eusea != -1 || r
a330: 65 75 73 65 70 20 21 3d 20 2d 31 20 7c 7c 20 62  eusep != -1 || b
a340: 61 63 6b 6c 6f 67 20 21 3d 20 2d 31 29 29 20 7b  acklog != -1)) {
a350: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
a360: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
a370: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22  ewStringObj(..."
a380: 6f 70 74 69 6f 6e 73 20 2d 62 61 63 6b 6c 6f 67  options -backlog
a390: 2c 20 2d 72 65 75 73 65 61 64 64 72 2c 20 61 6e  , -reuseaddr, an
a3a0: 64 20 2d 72 65 75 73 65 70 6f 72 74 20 61 72 65  d -reuseport are
a3b0: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 22 0a 09 09   only valid "...
a3c0: 22 66 6f 72 20 73 65 72 76 65 72 73 22 2c 20 2d  "for servers", -
a3d0: 31 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  1));..return TCL
a3e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
a3f0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74     /*.     * Set
a400: 20 74 68 65 20 6f 70 74 69 6f 6e 73 20 74 6f 20   the options to 
a410: 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
a420: 6c 75 65 20 69 66 20 74 68 65 20 75 73 65 72 20  lue if the user 
a430: 64 69 64 6e 27 74 20 6f 76 65 72 72 69 64 65 0a  didn't override.
a440: 20 20 20 20 20 2a 20 74 68 65 69 72 20 76 61 6c       * their val
a450: 75 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ue..     */..   
a460: 20 69 66 20 28 72 65 75 73 65 70 20 3d 3d 20 2d   if (reusep == -
a470: 31 29 20 7b 0a 09 72 65 75 73 65 70 20 3d 20 30  1) {..reusep = 0
a480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
a490: 72 65 75 73 65 61 20 3d 3d 20 2d 31 29 20 7b 0a  reusea == -1) {.
a4a0: 09 72 65 75 73 65 61 20 3d 20 31 3b 0a 20 20 20  .reusea = 1;.   
a4b0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
a4c0: 2a 20 42 75 69 6c 64 20 74 68 65 20 62 69 74 73  * Build the bits
a4d0: 65 74 20 77 69 74 68 20 74 68 65 20 66 6c 61 67  et with the flag
a4e0: 73 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a  s values..     *
a4f0: 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 75 73 65  /..    if (reuse
a500: 61 29 20 7b 0a 09 66 6c 61 67 73 20 7c 3d 20 54  a) {..flags |= T
a510: 43 4c 5f 54 43 50 53 45 52 56 45 52 5f 52 45 55  CL_TCPSERVER_REU
a520: 53 45 41 44 44 52 3b 0a 20 20 20 20 7d 0a 20 20  SEADDR;.    }.  
a530: 20 20 69 66 20 28 72 65 75 73 65 70 29 20 7b 0a    if (reusep) {.
a540: 09 66 6c 61 67 73 20 7c 3d 20 54 43 4c 5f 54 43  .flags |= TCL_TC
a550: 50 53 45 52 56 45 52 5f 52 45 55 53 45 50 4f 52  PSERVER_REUSEPOR
a560: 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  T;.    }..    /*
a570: 0a 20 20 20 20 20 2a 20 41 6c 6c 20 74 68 65 20  .     * All the 
a580: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
a590: 20 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65   have been parse
a5a0: 64 20 62 79 20 6e 6f 77 2c 20 27 61 27 20 70 6f  d by now, 'a' po
a5b0: 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 20 20  ints to the.    
a5c0: 20 2a 20 6c 61 73 74 20 6f 6e 65 2c 20 74 68 65   * last one, the
a5d0: 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20   port number..  
a5e0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61     */..    if (a
a5f0: 20 21 3d 20 6f 62 6a 63 2d 31 29 20 7b 0a 09 67   != objc-1) {..g
a600: 6f 74 6f 20 77 72 6f 6e 67 4e 75 6d 41 72 67 73  oto wrongNumArgs
a610: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 6f 72  ;.    }..    por
a620: 74 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  t = TclGetString
a630: 28 6f 62 6a 76 5b 61 5d 29 3b 0a 0a 20 20 20 20  (objv[a]);..    
a640: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 41  if (server) {..A
a650: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 20 2a 61  cceptCallback *a
a660: 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50 74 72  cceptCallbackPtr
a670: 20 3d 20 28 41 63 63 65 70 74 43 61 6c 6c 62 61   = (AcceptCallba
a680: 63 6b 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73  ck *)Tcl_Alloc(s
a690: 69 7a 65 6f 66 28 41 63 63 65 70 74 43 61 6c 6c  izeof(AcceptCall
a6a0: 62 61 63 6b 29 29 3b 0a 0a 09 54 63 6c 5f 49 6e  back));...Tcl_In
a6b0: 63 72 52 65 66 43 6f 75 6e 74 28 73 63 72 69 70  crRefCount(scrip
a6c0: 74 29 3b 0a 09 61 63 63 65 70 74 43 61 6c 6c 62  t);..acceptCallb
a6d0: 61 63 6b 50 74 72 2d 3e 73 63 72 69 70 74 20 3d  ackPtr->script =
a6e0: 20 73 63 72 69 70 74 3b 0a 09 61 63 63 65 70 74   script;..accept
a6f0: 43 61 6c 6c 62 61 63 6b 50 74 72 2d 3e 69 6e 74  CallbackPtr->int
a700: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 09  erp = interp;...
a710: 63 68 61 6e 20 3d 20 54 63 6c 5f 4f 70 65 6e 54  chan = Tcl_OpenT
a720: 63 70 53 65 72 76 65 72 45 78 28 69 6e 74 65 72  cpServerEx(inter
a730: 70 2c 20 70 6f 72 74 2c 20 68 6f 73 74 2c 20 66  p, port, host, f
a740: 6c 61 67 73 2c 20 62 61 63 6b 6c 6f 67 2c 0a 09  lags, backlog,..
a750: 09 41 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50  .AcceptCallbackP
a760: 72 6f 63 2c 20 61 63 63 65 70 74 43 61 6c 6c 62  roc, acceptCallb
a770: 61 63 6b 50 74 72 29 3b 0a 09 69 66 20 28 63 68  ackPtr);..if (ch
a780: 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  an == NULL) {.. 
a790: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
a7a0: 75 6e 74 28 73 63 72 69 70 74 29 3b 0a 09 20 20  unt(script);..  
a7b0: 20 20 54 63 6c 5f 46 72 65 65 28 61 63 63 65 70    Tcl_Free(accep
a7c0: 74 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 09  tCallbackPtr);..
a7d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a7e0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  RROR;..}.../*.. 
a7f0: 2a 20 52 65 67 69 73 74 65 72 20 77 69 74 68 20  * Register with 
a800: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
a810: 74 6f 20 6c 65 74 20 75 73 20 6b 6e 6f 77 20 77  to let us know w
a820: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65  hen the interpre
a830: 74 65 72 0a 09 20 2a 20 69 73 20 64 65 6c 65 74  ter.. * is delet
a840: 65 64 20 28 62 79 20 68 61 76 69 6e 67 20 74 68  ed (by having th
a850: 65 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 74  e callback set t
a860: 68 65 20 69 6e 74 65 72 70 20 66 69 65 6c 64 20  he interp field 
a870: 6f 66 20 74 68 65 0a 09 20 2a 20 61 63 63 65 70  of the.. * accep
a880: 74 43 61 6c 6c 62 61 63 6b 50 74 72 27 73 20 73  tCallbackPtr's s
a890: 74 72 75 63 74 75 72 65 20 74 6f 20 4e 55 4c 4c  tructure to NULL
a8a0: 29 2e 20 54 68 69 73 20 69 73 20 74 6f 20 61 76  ). This is to av
a8b0: 6f 69 64 20 74 72 79 69 6e 67 20 74 6f 0a 09 20  oid trying to.. 
a8c0: 2a 20 65 76 61 6c 20 74 68 65 20 73 63 72 69 70  * eval the scrip
a8d0: 74 20 69 6e 20 61 20 64 65 6c 65 74 65 64 20 69  t in a deleted i
a8e0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 09 20 2a 2f  nterpreter... */
a8f0: 0a 0a 09 52 65 67 69 73 74 65 72 54 63 70 53 65  ...RegisterTcpSe
a900: 72 76 65 72 49 6e 74 65 72 70 43 6c 65 61 6e 75  rverInterpCleanu
a910: 70 28 69 6e 74 65 72 70 2c 20 61 63 63 65 70 74  p(interp, accept
a920: 43 61 6c 6c 62 61 63 6b 50 74 72 29 3b 0a 0a 09  CallbackPtr);...
a930: 2f 2a 0a 09 20 2a 20 52 65 67 69 73 74 65 72 20  /*.. * Register 
a940: 61 20 63 6c 6f 73 65 20 63 61 6c 6c 62 61 63 6b  a close callback
a950: 2e 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  . This callback 
a960: 77 69 6c 6c 20 69 6e 66 6f 72 6d 20 74 68 65 0a  will inform the.
a970: 09 20 2a 20 69 6e 74 65 72 70 72 65 74 65 72 20  . * interpreter 
a980: 28 69 66 20 69 74 20 73 74 69 6c 6c 20 65 78 69  (if it still exi
a990: 73 74 73 29 20 74 68 61 74 20 74 68 69 73 20 63  sts) that this c
a9a0: 68 61 6e 6e 65 6c 20 64 6f 65 73 20 6e 6f 74 20  hannel does not 
a9b0: 6e 65 65 64 20 74 6f 0a 09 20 2a 20 62 65 20 69  need to.. * be i
a9c0: 6e 66 6f 72 6d 65 64 20 77 68 65 6e 20 74 68 65  nformed when the
a9d0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20   interpreter is 
a9e0: 64 65 6c 65 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09  deleted... */...
a9f0: 54 63 6c 5f 43 72 65 61 74 65 43 6c 6f 73 65 48  Tcl_CreateCloseH
aa00: 61 6e 64 6c 65 72 28 63 68 61 6e 2c 20 54 63 70  andler(chan, Tcp
aa10: 53 65 72 76 65 72 43 6c 6f 73 65 50 72 6f 63 2c  ServerCloseProc,
aa20: 20 61 63 63 65 70 74 43 61 6c 6c 62 61 63 6b 50   acceptCallbackP
aa30: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  tr);.    } else 
aa40: 7b 0a 09 69 6e 74 20 70 6f 72 74 4e 75 6d 3b 0a  {..int portNum;.
aa50: 0a 09 69 66 20 28 54 63 6c 53 6f 63 6b 47 65 74  ..if (TclSockGet
aa60: 50 6f 72 74 28 69 6e 74 65 72 70 2c 20 70 6f 72  Port(interp, por
aa70: 74 2c 20 22 74 63 70 22 2c 20 26 70 6f 72 74 4e  t, "tcp", &portN
aa80: 75 6d 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  um) != TCL_OK) {
aa90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
aaa0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 63 68 61  _ERROR;..}...cha
aab0: 6e 20 3d 20 54 63 6c 5f 4f 70 65 6e 54 63 70 43  n = Tcl_OpenTcpC
aac0: 6c 69 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 6f  lient(interp, po
aad0: 72 74 4e 75 6d 2c 20 68 6f 73 74 2c 20 6d 79 61  rtNum, host, mya
aae0: 64 64 72 2c 20 6d 79 70 6f 72 74 2c 20 61 73 79  ddr, myport, asy
aaf0: 6e 63 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  nc);..if (chan =
ab00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72  = NULL) {..    r
ab10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ab20: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ..}.    }..    T
ab30: 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e  cl_RegisterChann
ab40: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29  el(interp, chan)
ab50: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
ab60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
ab70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
ab80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
ab90: 6d 65 28 63 68 61 6e 29 2c 20 2d 31 29 29 3b 0a  me(chan), -1));.
aba0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
abb0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
abc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac00: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 46 63 6f  --. *. * Tcl_Fco
ac10: 70 79 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  pyObjCmd --. *. 
ac20: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
ac30: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
ac40: 6f 63 65 73 73 20 74 68 65 20 22 66 63 6f 70 79  ocess the "fcopy
ac50: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 53  " Tcl command. S
ac60: 65 65 20 74 68 65 0a 20 2a 09 75 73 65 72 20 64  ee the. *.user d
ac70: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
ac80: 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74   details on what
ac90: 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20   it does.. *. * 
aca0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
acb0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
acc0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
acd0: 66 65 63 74 73 3a 0a 20 2a 09 4d 6f 76 65 73 20  fects:. *.Moves 
ace0: 64 61 74 61 20 62 65 74 77 65 65 6e 20 74 77 6f  data between two
acf0: 20 63 68 61 6e 6e 65 6c 73 20 61 6e 64 20 70 6f   channels and po
ad00: 73 73 69 62 6c 79 20 73 65 74 73 20 75 70 20 61  ssibly sets up a
ad10: 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 70 79   background copy
ad20: 0a 20 2a 09 68 61 6e 64 6c 65 72 2e 0a 20 2a 0a  . *.handler.. *.
ad30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
ad40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e  --------. */..in
ad80: 74 0a 54 63 6c 5f 46 63 6f 70 79 4f 62 6a 43 6d  t.Tcl_FcopyObjCm
ad90: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
ada0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
adb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
adc0: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
add0: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
ade0: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
adf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae00: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
ae10: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
ae20: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  v[])./* Argument
ae30: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
ae40: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 69     Tcl_Channel i
ae50: 6e 43 68 61 6e 2c 20 6f 75 74 43 68 61 6e 3b 0a  nChan, outChan;.
ae60: 20 20 20 20 69 6e 74 20 6d 6f 64 65 2c 20 69 2c      int mode, i,
ae70: 20 69 6e 64 65 78 3b 0a 20 20 20 20 54 63 6c 5f   index;.    Tcl_
ae80: 57 69 64 65 49 6e 74 20 74 6f 52 65 61 64 3b 0a  WideInt toRead;.
ae90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
aea0: 50 74 72 3b 0a 20 20 20 20 73 74 61 74 69 63 20  Ptr;.    static 
aeb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
aec0: 74 20 73 77 69 74 63 68 65 73 5b 5d 20 3d 20 7b  t switches[] = {
aed0: 20 22 2d 73 69 7a 65 22 2c 20 22 2d 63 6f 6d 6d   "-size", "-comm
aee0: 61 6e 64 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  and", NULL };.  
aef0: 20 20 65 6e 75 6d 20 7b 20 46 63 6f 70 79 53 69    enum { FcopySi
af00: 7a 65 2c 20 46 63 6f 70 79 43 6f 6d 6d 61 6e 64  ze, FcopyCommand
af10: 20 7d 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62   };..    if ((ob
af20: 6a 63 20 3c 20 33 29 20 7c 7c 20 28 6f 62 6a 63  jc < 3) || (objc
af30: 20 3e 20 37 29 20 7c 7c 20 28 6f 62 6a 63 20 3d   > 7) || (objc =
af40: 3d 20 34 29 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d  = 4) || (objc ==
af50: 20 36 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   6)) {..Tcl_Wron
af60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
af70: 20 31 2c 20 6f 62 6a 76 2c 0a 09 09 22 69 6e 70   1, objv,..."inp
af80: 75 74 20 6f 75 74 70 75 74 20 3f 2d 73 69 7a 65  ut output ?-size
af90: 20 73 69 7a 65 3f 20 3f 2d 63 6f 6d 6d 61 6e 64   size? ?-command
afa0: 20 63 61 6c 6c 62 61 63 6b 3f 22 29 3b 0a 09 72   callback?");..r
afb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
afc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
afd0: 20 20 20 20 2a 20 50 61 72 73 65 20 74 68 65 20      * Parse the 
afe0: 63 68 61 6e 6e 65 6c 20 61 72 67 75 6d 65 6e 74  channel argument
aff0: 73 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 61  s and verify tha
b000: 74 20 74 68 65 79 20 61 72 65 20 72 65 61 64 61  t they are reada
b010: 62 6c 65 20 6f 72 0a 20 20 20 20 20 2a 20 77 72  ble or.     * wr
b020: 69 74 61 62 6c 65 2c 20 61 73 20 61 70 70 72 6f  itable, as appro
b030: 70 72 69 61 74 65 2e 0a 20 20 20 20 20 2a 2f 0a  priate..     */.
b040: 0a 20 20 20 20 69 66 20 28 54 63 6c 47 65 74 43  .    if (TclGetC
b050: 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a 28 69 6e  hannelFromObj(in
b060: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
b070: 69 6e 43 68 61 6e 2c 20 26 6d 6f 64 65 2c 20 30  inChan, &mode, 0
b080: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
b090: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b0a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
b0b0: 21 28 6d 6f 64 65 20 26 20 54 43 4c 5f 52 45 41  !(mode & TCL_REA
b0c0: 44 41 42 4c 45 29 29 20 7b 0a 09 54 63 6c 5f 53  DABLE)) {..Tcl_S
b0d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b0e0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
b0f0: 66 28 0a 09 09 22 63 68 61 6e 6e 65 6c 20 5c 22  f(..."channel \"
b100: 25 73 5c 22 20 77 61 73 6e 27 74 20 6f 70 65 6e  %s\" wasn't open
b110: 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c  ed for reading",
b120: 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28  ...TclGetString(
b130: 6f 62 6a 76 5b 31 5d 29 29 29 3b 0a 09 72 65 74  objv[1])));..ret
b140: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b150: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
b160: 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62  GetChannelFromOb
b170: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
b180: 5d 2c 20 26 6f 75 74 43 68 61 6e 2c 20 26 6d 6f  ], &outChan, &mo
b190: 64 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  de, 0) != TCL_OK
b1a0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
b1b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
b1c0: 20 69 66 20 28 21 28 6d 6f 64 65 20 26 20 54 43   if (!(mode & TC
b1d0: 4c 5f 57 52 49 54 41 42 4c 45 29 29 20 7b 0a 09  L_WRITABLE)) {..
b1e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b1f0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
b200: 50 72 69 6e 74 66 28 0a 09 09 22 63 68 61 6e 6e  Printf(..."chann
b210: 65 6c 20 5c 22 25 73 5c 22 20 77 61 73 6e 27 74  el \"%s\" wasn't
b220: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
b230: 69 6e 67 22 2c 0a 09 09 54 63 6c 47 65 74 53 74  ing",...TclGetSt
b240: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 29 3b  ring(objv[2])));
b250: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b260: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  OR;.    }..    t
b270: 6f 52 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  oRead = -1;.    
b280: 63 6d 64 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  cmdPtr = NULL;. 
b290: 20 20 20 66 6f 72 20 28 69 20 3d 20 33 3b 20 69     for (i = 3; i
b2a0: 20 3c 20 6f 62 6a 63 3b 20 69 20 2b 3d 20 32 29   < objc; i += 2)
b2b0: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49   {..if (Tcl_GetI
b2c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
b2d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 73 77 69  rp, objv[i], swi
b2e0: 74 63 68 65 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  tches, "option",
b2f0: 20 30 2c 0a 09 09 26 69 6e 64 65 78 29 20 21 3d   0,...&index) !=
b300: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
b310: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b320: 3b 0a 09 7d 0a 09 73 77 69 74 63 68 20 28 69 6e  ;..}..switch (in
b330: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 46 63 6f  dex) {..case Fco
b340: 70 79 53 69 7a 65 3a 0a 09 20 20 20 20 69 66 20  pySize:..    if 
b350: 28 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46  (Tcl_GetWideIntF
b360: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b370: 62 6a 76 5b 69 2b 31 5d 2c 20 26 74 6f 52 65 61  bjv[i+1], &toRea
b380: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  d) != TCL_OK) {.
b390: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b3a0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
b3b0: 69 66 20 28 74 6f 52 65 61 64 20 3c 20 30 29 20  if (toRead < 0) 
b3c0: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 48 61 6e 64  {.../*... * Hand
b3d0: 6c 65 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20  le all negative 
b3e0: 73 69 7a 65 73 20 6c 69 6b 65 20 2d 31 2c 20 6d  sizes like -1, m
b3f0: 65 61 6e 69 6e 67 20 27 63 6f 70 79 20 61 6c 6c  eaning 'copy all
b400: 27 2e 20 42 79 0a 09 09 20 2a 20 72 65 73 65 74  '. By... * reset
b410: 74 69 6e 67 20 74 6f 52 65 61 64 20 77 65 20 61  ting toRead we a
b420: 76 6f 69 64 20 63 68 61 6e 67 65 73 20 69 6e 20  void changes in 
b430: 74 68 65 20 63 6f 72 65 20 63 6f 70 79 69 6e 67  the core copying
b440: 0a 09 09 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20  ... * functions 
b450: 28 77 68 69 63 68 20 65 78 70 6c 69 63 69 74 6c  (which explicitl
b460: 79 20 63 68 65 63 6b 20 66 6f 72 20 2d 31 20 61  y check for -1 a
b470: 6e 64 20 63 72 61 73 68 20 6f 6e 20 61 6e 79 0a  nd crash on any.
b480: 09 09 20 2a 20 6f 74 68 65 72 20 6e 65 67 61 74  .. * other negat
b490: 69 76 65 20 76 61 6c 75 65 29 2e 0a 09 09 20 2a  ive value).... *
b4a0: 2f 0a 0a 09 09 74 6f 52 65 61 64 20 3d 20 2d 31  /....toRead = -1
b4b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
b4c0: 65 61 6b 3b 0a 09 63 61 73 65 20 46 63 6f 70 79  eak;..case Fcopy
b4d0: 43 6f 6d 6d 61 6e 64 3a 0a 09 20 20 20 20 63 6d  Command:..    cm
b4e0: 64 50 74 72 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  dPtr = objv[i+1]
b4f0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
b500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
b510: 72 6e 20 54 63 6c 43 6f 70 79 43 68 61 6e 6e 65  rn TclCopyChanne
b520: 6c 28 69 6e 74 65 72 70 2c 20 69 6e 43 68 61 6e  l(interp, inChan
b530: 2c 20 6f 75 74 43 68 61 6e 2c 20 74 6f 52 65 61  , outChan, toRea
b540: 64 2c 20 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a  d, cmdPtr);.}...
b550: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
b560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5a0: 0a 20 2a 0a 20 2a 20 43 68 61 6e 50 65 6e 64 69  . *. * ChanPendi
b5b0: 6e 67 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  ngObjCmd --. *. 
b5c0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
b5d0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
b5e0: 6f 63 65 73 73 20 74 68 65 20 54 63 6c 20 22 63  ocess the Tcl "c
b5f0: 68 61 6e 20 70 65 6e 64 69 6e 67 22 20 63 6f 6d  han pending" com
b600: 6d 61 6e 64 0a 20 2a 09 28 54 49 50 20 23 32 38  mand. *.(TIP #28
b610: 37 29 2e 20 53 65 65 20 74 68 65 20 75 73 65 72  7). See the user
b620: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
b630: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68  or details on wh
b640: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20  at it does.. *. 
b650: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
b660: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
b670: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
b680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
b690: 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74   interp's result
b6a0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
b6b0: 66 20 62 79 74 65 73 20 6f 66 20 62 75 66 66 65  f bytes of buffe
b6c0: 72 65 64 20 69 6e 70 75 74 20 6f 72 0a 20 2a 09  red input or. *.
b6d0: 6f 75 74 70 75 74 20 28 64 65 70 65 6e 64 69 6e  output (dependin
b6e0: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65  g on whether the
b6f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
b700: 69 73 20 22 69 6e 70 75 74 22 20 6f 72 0a 20 2a  is "input" or. *
b710: 09 22 6f 75 74 70 75 74 22 29 2c 20 6f 72 20 2d  ."output"), or -
b720: 31 20 69 66 20 74 68 65 20 63 68 61 6e 6e 65 6c  1 if the channel
b730: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66   wasn't opened f
b740: 6f 72 20 74 68 61 74 20 6d 6f 64 65 2e 0a 20 2a  or that mode.. *
b750: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
b760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b7a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43  */..static int.C
b7b0: 68 61 6e 50 65 6e 64 69 6e 67 4f 62 6a 43 6d 64  hanPendingObjCmd
b7c0: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
b7d0: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
b7e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b7f0: 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e  ,../* Current in
b800: 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20  terpreter. */.  
b810: 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a    int objc,.../*
b820: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
b830: 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  ents. */.    Tcl
b840: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
b850: 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20  [])./* Argument 
b860: 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20  objects. */.{.  
b870: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
b880: 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  an;.    int mode
b890: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
b8a0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 6f  st char *const o
b8b0: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 22 69 6e 70  ptions[] = {"inp
b8c0: 75 74 22 2c 20 22 6f 75 74 70 75 74 22 2c 20 4e  ut", "output", N
b8d0: 55 4c 4c 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 70  ULL};.    enum p
b8e0: 65 6e 64 69 6e 67 4f 70 74 69 6f 6e 73 45 6e 75  endingOptionsEnu
b8f0: 6d 20 7b 50 45 4e 44 49 4e 47 5f 49 4e 50 55 54  m {PENDING_INPUT
b900: 2c 20 50 45 4e 44 49 4e 47 5f 4f 55 54 50 55 54  , PENDING_OUTPUT
b910: 7d 20 69 6e 64 65 78 3b 0a 0a 20 20 20 20 69 66  } index;..    if
b920: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09   (objc != 3) {..
b930: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b940: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b950: 2c 20 22 6d 6f 64 65 20 63 68 61 6e 6e 65 6c 49  , "mode channelI
b960: 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  d");..return TCL
b970: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
b980: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
b990: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
b9a0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 6f 70 74 69  p, objv[1], opti
b9b0: 6f 6e 73 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 0a  ons, "mode", 0,.
b9c0: 09 20 20 20 20 26 69 6e 64 65 78 29 20 21 3d 20  .    &index) != 
b9d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
b9e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b9f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 47   }..    if (TclG
ba00: 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62 6a  etChannelFromObj
ba10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
ba20: 2c 20 26 63 68 61 6e 2c 20 26 6d 6f 64 65 2c 20  , &chan, &mode, 
ba30: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
ba40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ba50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  R;.    }..    sw
ba60: 69 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 20  itch (index) {. 
ba70: 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f     case PENDING_
ba80: 49 4e 50 55 54 3a 0a 09 69 66 20 28 21 28 6d 6f  INPUT:..if (!(mo
ba90: 64 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c  de & TCL_READABL
baa0: 45 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  E)) {..    Tcl_S
bab0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
bac0: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
bad0: 6e 74 4f 62 6a 28 2d 31 29 29 3b 0a 09 7d 20 65  ntObj(-1));..} e
bae0: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  lse {..    Tcl_S
baf0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
bb00: 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
bb10: 6e 74 4f 62 6a 28 54 63 6c 5f 49 6e 70 75 74 42  ntObj(Tcl_InputB
bb20: 75 66 66 65 72 65 64 28 63 68 61 6e 29 29 29 3b  uffered(chan)));
bb30: 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  ..}..break;.    
bb40: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4f 55 54  case PENDING_OUT
bb50: 50 55 54 3a 0a 09 69 66 20 28 21 28 6d 6f 64 65  PUT:..if (!(mode
bb60: 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   & TCL_WRITABLE)
bb70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  ) {..    Tcl_Set
bb80: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
bb90: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
bba0: 4f 62 6a 28 2d 31 29 29 3b 0a 09 7d 20 65 6c 73  Obj(-1));..} els
bbb0: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  e {..    Tcl_Set
bbc0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
bbd0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
bbe0: 4f 62 6a 28 54 63 6c 5f 4f 75 74 70 75 74 42 75  Obj(Tcl_OutputBu
bbf0: 66 66 65 72 65 64 28 63 68 61 6e 29 29 29 3b 0a  ffered(chan)));.
bc00: 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  .}..break;.    }
bc10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
bc20: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 68 61 6e 54 72  ---. *. * ChanTr
bc80: 75 6e 63 61 74 65 4f 62 6a 43 6d 64 20 2d 2d 0a  uncateObjCmd --.
bc90: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
bca0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ion is invoked t
bcb0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 63  o process the "c
bcc0: 68 61 6e 20 74 72 75 6e 63 61 74 65 22 20 54 63  han truncate" Tc
bcd0: 6c 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65  l command.. *.Se
bce0: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d  e the user docum
bcf0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74  entation for det
bd00: 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20  ails on what it 
bd10: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  does.. *. * Resu
bd20: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
bd30: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
bd40: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
bd50: 73 3a 0a 20 2a 09 54 72 75 6e 63 61 74 65 73 20  s:. *.Truncates 
bd60: 61 20 63 68 61 6e 6e 65 6c 20 28 6f 72 20 72 61  a channel (or ra
bd70: 74 68 65 72 20 61 20 66 69 6c 65 20 75 6e 64 65  ther a file unde
bd80: 72 6c 79 69 6e 67 20 61 20 63 68 61 6e 6e 65 6c  rlying a channel
bd90: 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ).. *. *--------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
bde0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43  */..static int.C
bdf0: 68 61 6e 54 72 75 6e 63 61 74 65 4f 62 6a 43 6d  hanTruncateObjCm
be00: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
be10: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
be20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
be30: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
be40: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
be50: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
be60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
be70: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
be80: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
be90: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  v[])./* Argument
bea0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
beb0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
bec0: 68 61 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  han;.    Tcl_Wid
bed0: 65 49 6e 74 20 6c 65 6e 67 74 68 3b 0a 0a 20 20  eInt length;..  
bee0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29    if ((objc < 2)
bef0: 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 33 29 29 20   || (objc > 3)) 
bf00: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
bf10: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
bf20: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64 20  bjv, "channelId 
bf30: 3f 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 65 74  ?length?");..ret
bf40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bf50: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
bf60: 47 65 74 43 68 61 6e 6e 65 6c 46 72 6f 6d 4f 62  GetChannelFromOb
bf70: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
bf80: 5d 2c 20 26 63 68 61 6e 2c 20 4e 55 4c 4c 2c 20  ], &chan, NULL, 
bf90: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
bfa0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
bfb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
bfc0: 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09   (objc == 3) {..
bfd0: 2f 2a 0a 09 20 2a 20 55 73 65 72 20 69 73 20 73  /*.. * User is s
bfe0: 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 78 70 6c  upplying an expl
bff0: 69 63 69 74 20 6c 65 6e 67 74 68 2e 0a 09 20 2a  icit length... *
c000: 2f 0a 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 57  /...if (Tcl_GetW
c010: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
c020: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c030: 6c 65 6e 67 74 68 29 20 21 3d 20 54 43 4c 5f 4f  length) != TCL_O
c040: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
c050: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
c060: 69 66 20 28 6c 65 6e 67 74 68 20 3c 20 30 29 20  if (length < 0) 
c070: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  {..    Tcl_SetOb
c080: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
c090: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c0a0: 28 0a 09 09 20 20 20 20 22 63 61 6e 6e 6f 74 20  (...    "cannot 
c0b0: 74 72 75 6e 63 61 74 65 20 74 6f 20 6e 65 67 61  truncate to nega
c0c0: 74 69 76 65 20 6c 65 6e 67 74 68 20 6f 66 20 66  tive length of f
c0d0: 69 6c 65 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20  ile", -1));..   
c0e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c0f0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  R;..}.    } else
c100: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 55 73 65 72 20   {../*.. * User 
c110: 77 61 6e 74 73 20 74 6f 20 74 72 75 6e 63 61 74  wants to truncat
c120: 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
c130: 20 66 69 6c 65 20 70 6f 73 69 74 69 6f 6e 2e 0a   file position..
c140: 09 20 2a 2f 0a 0a 09 6c 65 6e 67 74 68 20 3d 20  . */...length = 
c150: 54 63 6c 5f 54 65 6c 6c 28 63 68 61 6e 29 3b 0a  Tcl_Tell(chan);.
c160: 09 69 66 20 28 6c 65 6e 67 74 68 20 3d 3d 20 2d  .if (length == -
c170: 31 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  1) {..    Tcl_Se
c180: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
c190: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
c1a0: 28 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 20 6e  (...    "could n
c1b0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 63 75 72  ot determine cur
c1c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
c1d0: 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09   \"%s\": %s",...
c1e0: 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67      TclGetString
c1f0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 54 63 6c 5f 50  (objv[1]), Tcl_P
c200: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
c210: 29 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  )));..    return
c220: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
c230: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
c240: 6c 5f 54 72 75 6e 63 61 74 65 43 68 61 6e 6e 65  l_TruncateChanne
c250: 6c 28 63 68 61 6e 2c 20 6c 65 6e 67 74 68 29 20  l(chan, length) 
c260: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
c270: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c280: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
c290: 69 6e 74 66 28 0a 09 09 22 65 72 72 6f 72 20 64  intf(..."error d
c2a0: 75 72 69 6e 67 20 74 72 75 6e 63 61 74 65 20 6f  uring truncate o
c2b0: 6e 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09  n \"%s\": %s",..
c2c0: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62  .TclGetString(ob
c2d0: 6a 76 5b 31 5d 29 2c 20 54 63 6c 5f 50 6f 73 69  jv[1]), Tcl_Posi
c2e0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 29 29  xError(interp)))
c2f0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
c300: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
c310: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c320: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
c330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
c370: 2a 0a 20 2a 20 43 68 61 6e 50 69 70 65 4f 62 6a  *. * ChanPipeObj
c380: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
c390: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
c3a0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
c3b0: 20 74 68 65 20 22 63 68 61 6e 20 70 69 70 65 22   the "chan pipe"
c3c0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a   Tcl command.. *
c3d0: 09 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f  .See the user do
c3e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
c3f0: 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20  details on what 
c400: 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52  it does.. *. * R
c410: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
c420: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
c430: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
c440: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73  ects:. *.Creates
c450: 20 61 20 70 61 69 72 20 6f 66 20 54 63 6c 20 63   a pair of Tcl c
c460: 68 61 6e 6e 65 6c 73 20 77 72 61 70 70 69 6e 67  hannels wrapping
c470: 20 62 6f 74 68 20 65 6e 64 73 20 6f 66 20 61 20   both ends of a 
c480: 6e 65 77 0a 20 2a 09 61 6e 6f 6e 79 6d 6f 75 73  new. *.anonymous
c490: 20 70 69 70 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   pipe.. *. *----
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4e0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
c4f0: 6e 74 0a 43 68 61 6e 50 69 70 65 4f 62 6a 43 6d  nt.ChanPipeObjCm
c500: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
c510: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
c520: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c530: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
c540: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
c550: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
c560: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c570: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
c580: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
c590: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  v[])./* Argument
c5a0: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
c5b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 72     Tcl_Channel r
c5c0: 63 68 61 6e 2c 20 77 63 68 61 6e 3b 0a 20 20 20  chan, wchan;.   
c5d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61   const char *cha
c5e0: 6e 6e 65 6c 4e 61 6d 65 73 5b 32 5d 3b 0a 20 20  nnelNames[2];.  
c5f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c    Tcl_Obj *resul
c600: 74 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 6f  tPtr;..    if (o
c610: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
c620: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
c630: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
c640: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
c650: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
c660: 20 20 69 66 20 28 54 63 6c 5f 43 72 65 61 74 65    if (Tcl_Create
c670: 50 69 70 65 28 69 6e 74 65 72 70 2c 20 26 72 63  Pipe(interp, &rc
c680: 68 61 6e 2c 20 26 77 63 68 61 6e 2c 20 30 29 20  han, &wchan, 0) 
c690: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
c6a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c6b0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 6e      }..    chann
c6c0: 65 6c 4e 61 6d 65 73 5b 30 5d 20 3d 20 54 63 6c  elNames[0] = Tcl
c6d0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c6e0: 72 63 68 61 6e 29 3b 0a 20 20 20 20 63 68 61 6e  rchan);.    chan
c6f0: 6e 65 6c 4e 61 6d 65 73 5b 31 5d 20 3d 20 54 63  nelNames[1] = Tc
c700: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
c710: 28 77 63 68 61 6e 29 3b 0a 0a 20 20 20 20 54 63  (wchan);..    Tc
c720: 6c 4e 65 77 4f 62 6a 28 72 65 73 75 6c 74 50 74  lNewObj(resultPt
c730: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  r);.    Tcl_List
c740: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c750: 28 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 50 74 72  (NULL, resultPtr
c760: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
c770: 72 69 6e 67 4f 62 6a 28 63 68 61 6e 6e 65 6c 4e  ringObj(channelN
c780: 61 6d 65 73 5b 30 5d 2c 20 2d 31 29 29 3b 0a 20  ames[0], -1));. 
c790: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
c7a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c  pendElement(NULL
c7b0: 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a 09 20 20  , resultPtr,..  
c7c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
c7d0: 62 6a 28 63 68 61 6e 6e 65 6c 4e 61 6d 65 73 5b  bj(channelNames[
c7e0: 31 5d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  1], -1));.    Tc
c7f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
c800: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72  nterp, resultPtr
c810: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
c820: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
c880: 43 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 20  ChannelNamesCmd 
c890: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
c8a0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
c8b0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
c8c0: 20 22 63 68 61 6e 20 6e 61 6d 65 73 22 20 61 6e   "chan names" an
c8d0: 64 20 22 66 69 6c 65 0a 20 2a 09 63 68 61 6e 6e  d "file. *.chann
c8e0: 65 6c 73 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  els" Tcl command
c8f0: 73 2e 20 20 53 65 65 20 74 68 65 20 75 73 65 72  s.  See the user
c900: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
c910: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 0a 20 2a  or details on. *
c920: 09 77 68 61 74 20 74 68 65 79 20 64 6f 2e 0a 20  .what they do.. 
c930: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
c940: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
c950: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
c960: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
c970: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9c0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68 61  . */..int.TclCha
c9d0: 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 28 0a 20 20  nnelNamesCmd(.  
c9e0: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
c9f0: 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
ca00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ca10: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
ca20: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
ca30: 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 69 66 20  bjv[]).{.    if 
ca40: 28 6f 62 6a 63 20 3c 20 31 20 7c 7c 20 6f 62 6a  (objc < 1 || obj
ca50: 63 20 3e 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c > 2) {..Tcl_Wr
ca60: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ca70: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70 61  p, 1, objv, "?pa
ca80: 74 74 65 72 6e 3f 22 29 3b 0a 09 72 65 74 75 72  ttern?");..retur
ca90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
caa0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63   }.    return Tc
cab0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
cac0: 73 45 78 28 69 6e 74 65 72 70 2c 0a 09 20 20 20  sEx(interp,..   
cad0: 20 28 28 6f 62 6a 63 20 3d 3d 20 31 29 20 3f 20   ((objc == 1) ? 
cae0: 4e 55 4c 4c 20 3a 20 54 63 6c 47 65 74 53 74 72  NULL : TclGetStr
caf0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29 3b 0a  ing(objv[1])));.
cb00: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
cb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cb50: 20 2a 0a 20 2a 20 54 63 6c 49 6e 69 74 43 68 61   *. * TclInitCha
cb60: 6e 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  nCmd --. *. *.Th
cb70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
cb80: 6e 76 6f 6b 65 64 20 74 6f 20 63 72 65 61 74 65  nvoked to create
cb90: 20 74 68 65 20 22 63 68 61 6e 22 20 54 63 6c 20   the "chan" Tcl 
cba0: 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65  command. See the
cbb0: 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e  . *.user documen
cbc0: 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  tation for detai
cbd0: 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f  ls on what it do
cbe0: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
cbf0: 73 3a 0a 20 2a 09 41 20 54 63 6c 20 63 6f 6d 6d  s:. *.A Tcl comm
cc00: 61 6e 64 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  and handle.. *. 
cc10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
cc20: 20 2a 09 4e 6f 6e 65 20 28 73 69 6e 63 65 20 6e   *.None (since n
cc30: 6f 74 68 69 6e 67 20 69 73 20 62 79 74 65 2d 63  othing is byte-c
cc40: 6f 6d 70 69 6c 65 64 29 2e 0a 20 2a 0a 20 2a 2d  ompiled).. *. *-
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43  -----. */..Tcl_C
cca0: 6f 6d 6d 61 6e 64 0a 54 63 6c 49 6e 69 74 43 68  ommand.TclInitCh
ccb0: 61 6e 43 6d 64 28 0a 20 20 20 20 54 63 6c 5f 49  anCmd(.    Tcl_I
ccc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0a 7b  nterp *interp).{
ccd0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
cce0: 6f 73 74 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65  ost commands are
ccf0: 20 70 6c 75 67 67 65 64 20 64 69 72 65 63 74 6c   plugged directl
cd00: 79 20 74 6f 67 65 74 68 65 72 2c 20 62 75 74 20  y together, but 
cd10: 73 6f 6d 65 20 61 72 65 20 64 6f 6e 65 20 76 69  some are done vi
cd20: 61 0a 20 20 20 20 20 2a 20 61 6c 69 61 73 2d 6c  a.     * alias-l
cd30: 69 6b 65 20 72 65 77 72 69 74 69 6e 67 3b 20 5b  ike rewriting; [
cd40: 63 68 61 6e 20 63 6f 6e 66 69 67 75 72 65 5d 20  chan configure] 
cd50: 69 73 20 74 68 69 73 20 77 61 79 20 66 6f 72 20  is this way for 
cd60: 73 65 63 75 72 69 74 79 20 72 65 61 73 6f 6e 73  security reasons
cd70: 0a 20 20 20 20 20 2a 20 28 77 61 6e 74 20 6f 76  .     * (want ov
cd80: 65 72 77 72 69 74 69 6e 67 20 6f 66 20 5b 66 63  erwriting of [fc
cd90: 6f 6e 66 69 67 75 72 65 5d 20 74 6f 20 63 6f 6e  onfigure] to con
cda0: 74 72 6f 6c 20 74 68 61 74 20 6e 69 63 65 6c 79  trol that nicely
cdb0: 29 2c 20 61 6e 64 20 5b 63 68 61 6e 0a 20 20 20  ), and [chan.   
cdc0: 20 20 2a 20 6e 61 6d 65 73 5d 20 62 65 63 61 75    * names] becau
cdd0: 73 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61  se the functiona
cde0: 6c 69 74 79 20 69 73 6e 27 74 20 61 76 61 69 6c  lity isn't avail
cdf0: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
ce00: 74 65 20 63 6f 6d 6d 61 6e 64 0a 20 20 20 20 20  te command.     
ce10: 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68  * function at th
ce20: 65 20 6d 6f 6d 65 6e 74 2e 0a 20 20 20 20 20 2a  e moment..     *
ce30: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
ce40: 73 74 20 45 6e 73 65 6d 62 6c 65 49 6d 70 6c 4d  st EnsembleImplM
ce50: 61 70 20 69 6e 69 74 4d 61 70 5b 5d 20 3d 20 7b  ap initMap[] = {
ce60: 0a 09 7b 22 62 6c 6f 63 6b 65 64 22 2c 09 54 63  ..{"blocked",.Tc
ce70: 6c 5f 46 62 6c 6f 63 6b 65 64 4f 62 6a 43 6d 64  l_FblockedObjCmd
ce80: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69  ,.TclCompileBasi
ce90: 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20  c1ArgCmd, NULL, 
cea0: 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 63 6c 6f  NULL, 0},..{"clo
ceb0: 73 65 22 2c 09 54 63 6c 5f 43 6c 6f 73 65 4f 62  se",.Tcl_CloseOb
cec0: 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65  jCmd,.TclCompile
ced0: 42 61 73 69 63 31 4f 72 32 41 72 67 43 6d 64 2c  Basic1Or2ArgCmd,
cee0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c   NULL, NULL, 0},
cef0: 0a 09 7b 22 63 6f 70 79 22 2c 09 54 63 6c 5f 46  ..{"copy",.Tcl_F
cf00: 63 6f 70 79 4f 62 6a 43 6d 64 2c 09 4e 55 4c 4c  copyObjCmd,.NULL
cf10: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d  , NULL, NULL, 0}
cf20: 2c 0a 09 7b 22 63 72 65 61 74 65 22 2c 09 54 63  ,..{"create",.Tc
cf30: 6c 43 68 61 6e 43 72 65 61 74 65 4f 62 6a 43 6d  lChanCreateObjCm
cf40: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73  d,.TclCompileBas
cf50: 69 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c  ic2ArgCmd, NULL,
cf60: 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54   NULL, 0},../* T
cf70: 49 50 20 23 32 31 39 20 2a 2f 0a 09 7b 22 65 6f  IP #219 */..{"eo
cf80: 66 22 2c 09 09 54 63 6c 5f 45 6f 66 4f 62 6a 43  f",..Tcl_EofObjC
cf90: 6d 64 2c 09 09 54 63 6c 43 6f 6d 70 69 6c 65 42  md,..TclCompileB
cfa0: 61 73 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c  asic1ArgCmd, NUL
cfb0: 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22  L, NULL, 0},..{"
cfc0: 65 76 65 6e 74 22 2c 09 54 63 6c 5f 46 69 6c 65  event",.Tcl_File
cfd0: 45 76 65 6e 74 4f 62 6a 43 6d 64 2c 09 54 63 6c  EventObjCmd,.Tcl
cfe0: 43 6f 6d 70 69 6c 65 42 61 73 69 63 32 4f 72 33  CompileBasic2Or3
cff0: 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55  ArgCmd, NULL, NU
d000: 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 66 6c 75 73 68  LL, 0},..{"flush
d010: 22 2c 09 54 63 6c 5f 46 6c 75 73 68 4f 62 6a 43  ",.Tcl_FlushObjC
d020: 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61  md,.TclCompileBa
d030: 73 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c  sic1ArgCmd, NULL
d040: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 67  , NULL, 0},..{"g
d050: 65 74 73 22 2c 09 54 63 6c 5f 47 65 74 73 4f 62  ets",.Tcl_GetsOb
d060: 6a 43 6d 64 2c 09 09 54 63 6c 43 6f 6d 70 69 6c  jCmd,..TclCompil
d070: 65 42 61 73 69 63 31 4f 72 32 41 72 67 43 6d 64  eBasic1Or2ArgCmd
d080: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d  , NULL, NULL, 0}
d090: 2c 0a 09 7b 22 6e 61 6d 65 73 22 2c 09 54 63 6c  ,..{"names",.Tcl
d0a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 73 43 6d 64 2c  ChannelNamesCmd,
d0b0: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63  .TclCompileBasic
d0c0: 30 4f 72 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c  0Or1ArgCmd, NULL
d0d0: 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 70  , NULL, 0},..{"p
d0e0: 65 6e 64 69 6e 67 22 2c 09 43 68 61 6e 50 65 6e  ending",.ChanPen
d0f0: 64 69 6e 67 4f 62 6a 43 6d 64 2c 09 54 63 6c 43  dingObjCmd,.TclC
d100: 6f 6d 70 69 6c 65 42 61 73 69 63 32 41 72 67 43  ompileBasic2ArgC
d110: 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  md, NULL, NULL, 
d120: 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32 38 37  0},../* TIP #287
d130: 20 2a 2f 0a 09 7b 22 70 69 70 65 22 2c 09 43 68   */..{"pipe",.Ch
d140: 61 6e 50 69 70 65 4f 62 6a 43 6d 64 2c 09 09 54  anPipeObjCmd,..T
d150: 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63 30 41  clCompileBasic0A
d160: 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  rgCmd, NULL, NUL
d170: 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23  L, 0},../* TIP #
d180: 33 30 34 20 2a 2f 0a 09 7b 22 70 6f 70 22 2c 09  304 */..{"pop",.
d190: 09 54 63 6c 43 68 61 6e 50 6f 70 4f 62 6a 43 6d  .TclChanPopObjCm
d1a0: 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73  d,.TclCompileBas
d1b0: 69 63 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c  ic1ArgCmd, NULL,
d1c0: 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f 2a 20 54   NULL, 0},../* T
d1d0: 49 50 20 23 32 33 30 20 2a 2f 0a 09 7b 22 70 6f  IP #230 */..{"po
d1e0: 73 74 65 76 65 6e 74 22 2c 09 54 63 6c 43 68 61  stevent",.TclCha
d1f0: 6e 50 6f 73 74 45 76 65 6e 74 4f 62 6a 43 6d 64  nPostEventObjCmd
d200: 2c 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69  ,.TclCompileBasi
d210: 63 32 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20  c2ArgCmd, NULL, 
d220: 4e 55 4c 4c 2c 20 30 7d 2c 09 2f 2a 20 54 49 50  NULL, 0},./* TIP
d230: 20 23 32 31 39 20 2a 2f 0a 09 7b 22 70 75 73 68   #219 */..{"push
d240: 22 2c 09 54 63 6c 43 68 61 6e 50 75 73 68 4f 62  ",.TclChanPushOb
d250: 6a 43 6d 64 2c 09 54 63 6c 43 6f 6d 70 69 6c 65  jCmd,.TclCompile
d260: 42 61 73 69 63 32 41 72 67 43 6d 64 2c 20 4e 55  Basic2ArgCmd, NU
d270: 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 09 09 2f  LL, NULL, 0},../
d280: 2a 20 54 49 50 20 23 32 33 30 20 2a 2f 0a 09 7b  * TIP #230 */..{
d290: 22 70 75 74 73 22 2c 09 54 63 6c 5f 50 75 74 73  "puts",.Tcl_Puts
d2a0: 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c 20 4e  ObjCmd,..NULL, N
d2b0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a 09  ULL, NULL, 0},..
d2c0: 7b 22 72 65 61 64 22 2c 09 54 63 6c 5f 52 65 61  {"read",.Tcl_Rea
d2d0: 64 4f 62 6a 43 6d 64 2c 09 09 4e 55 4c 4c 2c 20  dObjCmd,..NULL, 
d2e0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 2c 0a  NULL, NULL, 0},.
d2f0: 09 7b 22 73 65 65 6b 22 2c 09 54 63 6c 5f 53 65  .{"seek",.Tcl_Se
d300: 65 6b 4f 62 6a 43 6d 64 2c 09 09 54 63 6c 43 6f  ekObjCmd,..TclCo
d310: 6d 70 69 6c 65 42 61 73 69 63 32 4f 72 33 41 72  mpileBasic2Or3Ar
d320: 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  gCmd, NULL, NULL
d330: 2c 20 30 7d 2c 0a 09 7b 22 74 65 6c 6c 22 2c 09  , 0},..{"tell",.
d340: 54 63 6c 5f 54 65 6c 6c 4f 62 6a 43 6d 64 2c 09  Tcl_TellObjCmd,.
d350: 09 54 63 6c 43 6f 6d 70 69 6c 65 42 61 73 69 63  .TclCompileBasic
d360: 31 41 72 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e  1ArgCmd, NULL, N
d370: 55 4c 4c 2c 20 30 7d 2c 0a 09 7b 22 74 72 75 6e  ULL, 0},..{"trun
d380: 63 61 74 65 22 2c 09 43 68 61 6e 54 72 75 6e 63  cate",.ChanTrunc
d390: 61 74 65 4f 62 6a 43 6d 64 2c 09 54 63 6c 43 6f  ateObjCmd,.TclCo
d3a0: 6d 70 69 6c 65 42 61 73 69 63 31 4f 72 32 41 72  mpileBasic1Or2Ar
d3b0: 67 43 6d 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  gCmd, NULL, NULL
d3c0: 2c 20 30 7d 2c 09 09 2f 2a 20 54 49 50 20 23 32  , 0},../* TIP #2
d3d0: 30 38 20 2a 2f 0a 09 7b 4e 55 4c 4c 2c 20 4e 55  08 */..{NULL, NU
d3e0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  LL, NULL, NULL, 
d3f0: 4e 55 4c 4c 2c 20 30 7d 0a 20 20 20 20 7d 3b 0a  NULL, 0}.    };.
d400: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d410: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 65 78 74   char *const ext
d420: 72 61 73 5b 5d 20 3d 20 7b 0a 09 22 63 6f 6e 66  ras[] = {.."conf
d430: 69 67 75 72 65 22 2c 09 22 3a 3a 66 63 6f 6e 66  igure",."::fconf
d440: 69 67 75 72 65 22 2c 0a 09 4e 55 4c 4c 0a 20 20  igure",..NULL.  
d450: 20 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 43 6f 6d    };.    Tcl_Com
d460: 6d 61 6e 64 20 65 6e 73 65 6d 62 6c 65 3b 0a 20  mand ensemble;. 
d470: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 70 4f     Tcl_Obj *mapO
d480: 62 6a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a  bj;.    int i;..
d490: 20 20 20 20 65 6e 73 65 6d 62 6c 65 20 3d 20 54      ensemble = T
d4a0: 63 6c 4d 61 6b 65 45 6e 73 65 6d 62 6c 65 28 69  clMakeEnsemble(i
d4b0: 6e 74 65 72 70 2c 20 22 63 68 61 6e 22 2c 20 69  nterp, "chan", i
d4c0: 6e 69 74 4d 61 70 29 3b 0a 20 20 20 20 54 63 6c  nitMap);.    Tcl
d4d0: 5f 47 65 74 45 6e 73 65 6d 62 6c 65 4d 61 70 70  _GetEnsembleMapp
d4e0: 69 6e 67 44 69 63 74 28 4e 55 4c 4c 2c 20 65 6e  ingDict(NULL, en
d4f0: 73 65 6d 62 6c 65 2c 20 26 6d 61 70 4f 62 6a 29  semble, &mapObj)
d500: 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 20 3b  ;.    for (i=0 ;
d510: 20 65 78 74 72 61 73 5b 69 5d 20 3b 20 69 2b 3d   extras[i] ; i+=
d520: 32 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 61 6e  2) {../*.. * Can
d530: 20 61 73 73 75 6d 65 20 74 68 61 74 20 72 65 66   assume that ref
d540: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 72  erence counts ar
d550: 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 65  e all incremente
d560: 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 69  d... */...Tcl_Di
d570: 63 74 4f 62 6a 50 75 74 28 4e 55 4c 4c 2c 20 6d  ctObjPut(NULL, m
d580: 61 70 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 53 74  apObj, Tcl_NewSt
d590: 72 69 6e 67 4f 62 6a 28 65 78 74 72 61 73 5b 69  ringObj(extras[i
d5a0: 5d 2c 20 2d 31 29 2c 0a 09 09 54 63 6c 5f 4e 65  ], -1),...Tcl_Ne
d5b0: 77 53 74 72 69 6e 67 4f 62 6a 28 65 78 74 72 61  wStringObj(extra
d5c0: 73 5b 69 2b 31 5d 2c 20 2d 31 29 29 3b 0a 20 20  s[i+1], -1));.  
d5d0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 45    }.    Tcl_SetE
d5e0: 6e 73 65 6d 62 6c 65 4d 61 70 70 69 6e 67 44 69  nsembleMappingDi
d5f0: 63 74 28 69 6e 74 65 72 70 2c 20 65 6e 73 65 6d  ct(interp, ensem
d600: 62 6c 65 2c 20 6d 61 70 4f 62 6a 29 3b 0a 20 20  ble, mapObj);.  
d610: 20 20 72 65 74 75 72 6e 20 65 6e 73 65 6d 62 6c    return ensembl
d620: 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63  e;.}.../*. * Loc
d630: 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a  al Variables:. *
d640: 20 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61   mode: c. * c-ba
d650: 73 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a  sic-offset: 4. *
d660: 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38   fill-column: 78
d670: 0a 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a           . * End:. */.