Tcl Source Code

Hex Artifact Content
Login

Artifact d0f1daac754e8554f1d746a65f1ed1e6b424ce82:


0000: 2f 2a 0a 20 2a 20 74 63 6c 46 43 6d 64 2e 63 0a  /*. * tclFCmd.c.
0010: 20 2a 0a 20 2a 20 20 20 20 20 20 54 68 69 73 20   *. *      This 
0020: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0030: 74 68 65 20 67 65 6e 65 72 69 63 20 70 6f 72 74  the generic port
0040: 69 6f 6e 20 6f 66 20 66 69 6c 65 20 6d 61 6e 69  ion of file mani
0050: 70 75 6c 61 74 69 6f 6e 20 0a 20 2a 20 20 20 20  pulation . *    
0060: 20 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20 6f 66    subcommands of
0070: 20 74 68 65 20 22 66 69 6c 65 22 20 63 6f 6d 6d   the "file" comm
0080: 61 6e 64 2e 20 0a 20 2a 0a 20 2a 20 43 6f 70 79  and. . *. * Copy
0090: 72 69 67 68 74 20 28 63 29 20 31 39 39 36 2d 31  right (c) 1996-1
00a0: 39 39 38 20 53 75 6e 20 4d 69 63 72 6f 73 79 73  998 Sun Microsys
00b0: 74 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a 0a 20 2a  tems, Inc.. *. *
00c0: 20 53 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c   See the file "l
00d0: 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f  icense.terms" fo
00e0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  r information on
00f0: 20 75 73 61 67 65 20 61 6e 64 20 72 65 64 69 73   usage and redis
0100: 74 72 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66 20  tribution. * of 
0110: 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66  this file, and f
0120: 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20  or a DISCLAIMER 
0130: 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45  OF ALL WARRANTIE
0140: 53 2e 0a 20 2a 0a 20 2a 20 52 43 53 3a 20 40 28  S.. *. * RCS: @(
0150: 23 29 20 24 49 64 3a 20 74 63 6c 46 43 6d 64 2e  #) $Id: tclFCmd.
0160: 63 2c 76 20 31 2e 33 33 20 32 30 30 35 2f 30 36  c,v 1.33 2005/06
0170: 2f 30 39 20 31 36 3a 32 34 3a 34 37 20 76 69 6e  /09 16:24:47 vin
0180: 63 65 6e 74 64 61 72 6c 65 79 20 45 78 70 20 24  centdarley Exp $
0190: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  . */..#include "
01a0: 74 63 6c 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a  tclInt.h"../*. *
01b0: 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   Declarations fo
01c0: 72 20 6c 6f 63 61 6c 20 70 72 6f 63 65 64 75 72  r local procedur
01d0: 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  es defined in th
01e0: 69 73 20 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74  is file:. */..st
01f0: 61 74 69 63 20 69 6e 74 09 09 43 6f 70 79 52 65  atic int..CopyRe
0200: 6e 61 6d 65 4f 6e 65 46 69 6c 65 20 5f 41 4e 53  nameOneFile _ANS
0210: 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74  I_ARGS_((Tcl_Int
0220: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09  erp *interp,....
0230: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 72 63      Tcl_Obj *src
0240: 50 61 74 68 50 74 72 2c 20 54 63 6c 5f 4f 62 6a  PathPtr, Tcl_Obj
0250: 20 2a 64 65 73 74 50 61 74 68 50 74 72 2c 20 0a   *destPathPtr, .
0260: 09 09 09 20 20 20 20 69 6e 74 20 63 6f 70 79 46  ...    int copyF
0270: 6c 61 67 2c 20 69 6e 74 20 66 6f 72 63 65 29 29  lag, int force))
0280: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ;.static Tcl_Obj
0290: 20 2a 09 46 69 6c 65 42 61 73 65 6e 61 6d 65 20   *.FileBasename 
02a0: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c  _ANSI_ARGS_((Tcl
02b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
02c0: 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ....    Tcl_Obj 
02d0: 2a 70 61 74 68 50 74 72 29 29 3b 0a 73 74 61 74  *pathPtr));.stat
02e0: 69 63 20 69 6e 74 09 09 46 69 6c 65 43 6f 70 79  ic int..FileCopy
02f0: 52 65 6e 61 6d 65 20 5f 41 4e 53 49 5f 41 52 47  Rename _ANSI_ARG
0300: 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  S_((Tcl_Interp *
0310: 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 69  interp,....    i
0320: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
0330: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 2c 20   *CONST objv[], 
0340: 69 6e 74 20 63 6f 70 79 46 6c 61 67 29 29 3b 0a  int copyFlag));.
0350: 73 74 61 74 69 63 20 69 6e 74 09 09 46 69 6c 65  static int..File
0360: 46 6f 72 63 65 4f 70 74 69 6f 6e 20 5f 41 4e 53  ForceOption _ANS
0370: 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f 49 6e 74  I_ARGS_((Tcl_Int
0380: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09  erp *interp,....
0390: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63      int objc, Tc
03a0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
03b0: 76 5b 5d 2c 20 69 6e 74 20 2a 66 6f 72 63 65 50  v[], int *forceP
03c0: 74 72 29 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tr));.../*. *---
03d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
0420: 63 6c 46 69 6c 65 52 65 6e 61 6d 65 43 6d 64 0a  clFileRenameCmd.
0430: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
0440: 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dure implements 
0450: 74 68 65 20 22 72 65 6e 61 6d 65 22 20 73 75 62  the "rename" sub
0460: 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 22  command of the "
0470: 66 69 6c 65 22 0a 20 2a 20 20 20 20 20 20 63 6f  file". *      co
0480: 6d 6d 61 6e 64 2e 20 20 46 69 6c 65 6e 61 6d 65  mmand.  Filename
0490: 20 61 72 67 75 6d 65 6e 74 73 20 6e 65 65 64 20   arguments need 
04a0: 74 6f 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64  to be translated
04b0: 20 74 6f 20 6e 61 74 69 76 65 0a 20 2a 09 66 6f   to native. *.fo
04c0: 72 6d 61 74 20 62 65 66 6f 72 65 20 62 65 69 6e  rmat before bein
04d0: 67 20 70 61 73 73 65 64 20 74 6f 20 70 6c 61 74  g passed to plat
04e0: 66 6f 72 6d 2d 73 70 65 63 69 66 69 63 20 63 6f  form-specific co
04f0: 64 65 20 74 68 61 74 0a 20 2a 09 69 6d 70 6c 65  de that. *.imple
0500: 6d 65 6e 74 73 20 72 65 6e 61 6d 65 20 66 75 6e  ments rename fun
0510: 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20 2a 0a 20  ctionality.. *. 
0520: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
0530: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
0540: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
0550: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20  effects:. *.See 
0560: 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e  the user documen
0570: 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tation.. *. *---
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 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 0a 20 2a 2f 0a 0a 69 6e  --------. */..in
05d0: 74 0a 54 63 6c 46 69 6c 65 52 65 6e 61 6d 65 43  t.TclFileRenameC
05e0: 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c  md(interp, objc,
05f0: 20 6f 62 6a 76 29 0a 20 20 20 20 54 63 6c 5f 49   objv).    Tcl_I
0600: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09  nterp *interp;..
0610: 2f 2a 20 49 6e 74 65 72 70 20 66 6f 72 20 65 72  /* Interp for er
0620: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a  ror reporting. *
0630: 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 09  /.    int objc;.
0640: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61  ../* Number of a
0650: 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20  rguments. */.   
0660: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
0670: 6f 62 6a 76 5b 5d 3b 09 2f 2a 20 41 72 67 75 6d  objv[];./* Argum
0680: 65 6e 74 20 73 74 72 69 6e 67 73 20 70 61 73 73  ent strings pass
0690: 65 64 20 74 6f 20 54 63 6c 5f 46 69 6c 65 43 6d  ed to Tcl_FileCm
06a0: 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 74 75  d. */.{.    retu
06b0: 72 6e 20 46 69 6c 65 43 6f 70 79 52 65 6e 61 6d  rn FileCopyRenam
06c0: 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  e(interp, objc, 
06d0: 6f 62 6a 76 2c 20 30 29 3b 0a 7d 0a 0c 0a 2f 2a  objv, 0);.}.../*
06e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0730: 2a 0a 20 2a 20 54 63 6c 46 69 6c 65 43 6f 70 79  *. * TclFileCopy
0740: 43 6d 64 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  Cmd. *. *.This p
0750: 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65  rocedure impleme
0760: 6e 74 73 20 74 68 65 20 22 63 6f 70 79 22 20 73  nts the "copy" s
0770: 75 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65  ubcommand of the
0780: 20 22 66 69 6c 65 22 0a 20 2a 09 63 6f 6d 6d 61   "file". *.comma
0790: 6e 64 2e 20 20 46 69 6c 65 6e 61 6d 65 20 61 72  nd.  Filename ar
07a0: 67 75 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  guments need to 
07b0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 74 6f  be translated to
07c0: 20 6e 61 74 69 76 65 0a 20 2a 09 66 6f 72 6d 61   native. *.forma
07d0: 74 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 70  t before being p
07e0: 61 73 73 65 64 20 74 6f 20 70 6c 61 74 66 6f 72  assed to platfor
07f0: 6d 2d 73 70 65 63 69 66 69 63 20 63 6f 64 65 20  m-specific code 
0800: 74 68 61 74 0a 20 2a 09 69 6d 70 6c 65 6d 65 6e  that. *.implemen
0810: 74 73 20 63 6f 70 79 20 66 75 6e 63 74 69 6f 6e  ts copy function
0820: 61 6c 69 74 79 2e 0a 20 2a 0a 20 2a 20 52 65 73  ality.. *. * Res
0830: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
0840: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
0850: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0860: 74 73 3a 0a 20 2a 09 53 65 65 20 74 68 65 20 75  ts:. *.See the u
0870: 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ser documentatio
0880: 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  n.. *. *--------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08d0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
08e0: 46 69 6c 65 43 6f 70 79 43 6d 64 28 69 6e 74 65  FileCopyCmd(inte
08f0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a  rp, objc, objv).
0900: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
0910: 69 6e 74 65 72 70 3b 09 09 2f 2a 20 55 73 65 64  interp;../* Used
0920: 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72   for error repor
0930: 74 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ting */.    int 
0940: 6f 62 6a 63 3b 09 09 09 2f 2a 20 4e 75 6d 62 65  objc;.../* Numbe
0950: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
0960: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
0970: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 09 2f 2a  CONST objv[];./*
0980: 20 41 72 67 75 6d 65 6e 74 20 73 74 72 69 6e 67   Argument string
0990: 73 20 70 61 73 73 65 64 20 74 6f 20 54 63 6c 5f  s passed to Tcl_
09a0: 46 69 6c 65 43 6d 64 2e 20 2a 2f 0a 7b 0a 20 20  FileCmd. */.{.  
09b0: 20 20 72 65 74 75 72 6e 20 46 69 6c 65 43 6f 70    return FileCop
09c0: 79 52 65 6e 61 6d 65 28 69 6e 74 65 72 70 2c 20  yRename(interp, 
09d0: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 31 29 3b 0a  objc, objv, 1);.
09e0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 69 6c 65 43  ----. *. * FileC
0a40: 6f 70 79 52 65 6e 61 6d 65 20 2d 2d 0a 20 2a 0a  opyRename --. *.
0a50: 20 2a 09 50 65 72 66 6f 72 6d 73 20 74 68 65 20   *.Performs the 
0a60: 77 6f 72 6b 20 6f 66 20 54 63 6c 46 69 6c 65 52  work of TclFileR
0a70: 65 6e 61 6d 65 43 6d 64 20 61 6e 64 20 54 63 6c  enameCmd and Tcl
0a80: 46 69 6c 65 43 6f 70 79 43 6d 64 2e 0a 20 2a 09  FileCopyCmd.. *.
0a90: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
0aa0: 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65   those procedure
0ab0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
0ac0: 3a 0a 20 2a 09 53 65 65 20 61 62 6f 76 65 2e 0a  :. *.See above..
0ad0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0ae0: 74 73 3a 0a 20 2a 09 53 65 65 20 61 62 6f 76 65  ts:. *.See above
0af0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
0b50: 6e 74 0a 46 69 6c 65 43 6f 70 79 52 65 6e 61 6d  nt.FileCopyRenam
0b60: 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  e(interp, objc, 
0b70: 6f 62 6a 76 2c 20 63 6f 70 79 46 6c 61 67 29 0a  objv, copyFlag).
0b80: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
0b90: 69 6e 74 65 72 70 3b 09 09 2f 2a 20 55 73 65 64  interp;../* Used
0ba0: 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72   for error repor
0bb0: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ting. */.    int
0bc0: 20 6f 62 6a 63 3b 09 09 09 2f 2a 20 4e 75 6d 62   objc;.../* Numb
0bd0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
0be0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
0bf0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 3b 09 2f  *CONST objv[];./
0c00: 2a 20 41 72 67 75 6d 65 6e 74 20 73 74 72 69 6e  * Argument strin
0c10: 67 73 20 70 61 73 73 65 64 20 74 6f 20 54 63 6c  gs passed to Tcl
0c20: 5f 46 69 6c 65 43 6d 64 2e 20 2a 2f 0a 20 20 20  _FileCmd. */.   
0c30: 20 69 6e 74 20 63 6f 70 79 46 6c 61 67 3b 09 09   int copyFlag;..
0c40: 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
0c50: 63 6f 70 79 20 73 6f 75 72 63 65 28 73 29 2e 20  copy source(s). 
0c60: 20 4f 74 68 65 72 77 69 73 65 2c 0a 09 09 09 09   Otherwise,.....
0c70: 20 2a 20 72 65 6e 61 6d 65 20 74 68 65 6d 2e 20   * rename them. 
0c80: 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  */.{.    int i, 
0c90: 72 65 73 75 6c 74 2c 20 66 6f 72 63 65 3b 0a 20  result, force;. 
0ca0: 20 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 73     Tcl_StatBuf s
0cb0: 74 61 74 42 75 66 3b 20 0a 20 20 20 20 54 63 6c  tatBuf; .    Tcl
0cc0: 5f 4f 62 6a 20 2a 74 61 72 67 65 74 3b 0a 0a 20  _Obj *target;.. 
0cd0: 20 20 20 69 20 3d 20 46 69 6c 65 46 6f 72 63 65     i = FileForce
0ce0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f  Option(interp, o
0cf0: 62 6a 63 20 2d 20 32 2c 20 6f 62 6a 76 20 2b 20  bjc - 2, objv + 
0d00: 32 2c 20 26 66 6f 72 63 65 29 3b 0a 20 20 20 20  2, &force);.    
0d10: 69 66 20 28 69 20 3c 20 30 29 20 7b 0a 09 72 65  if (i < 0) {..re
0d20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0d30: 20 20 20 20 7d 0a 20 20 20 20 69 20 2b 3d 20 32      }.    i += 2
0d40: 3b 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  ;.    if ((objc 
0d50: 2d 20 69 29 20 3c 20 32 29 20 7b 0a 09 54 63 6c  - i) < 2) {..Tcl
0d60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0d70: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
0d80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
0d90: 22 22 2c 20 0a 09 09 54 63 6c 5f 47 65 74 53 74  "", ...Tcl_GetSt
0da0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
0db0: 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
0dc0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 0a 09 09 22  g(objv[1]), ..."
0dd0: 20 3f 6f 70 74 69 6f 6e 73 3f 20 73 6f 75 72 63   ?options? sourc
0de0: 65 20 3f 73 6f 75 72 63 65 20 2e 2e 2e 3f 20 74  e ?source ...? t
0df0: 61 72 67 65 74 5c 22 22 2c 20 0a 09 09 28 63 68  arget\"", ...(ch
0e00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
0e10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0e20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
0e30: 20 20 20 2a 20 49 66 20 74 61 72 67 65 74 20 64     * If target d
0e40: 6f 65 73 6e 27 74 20 65 78 69 73 74 20 6f 72 20  oesn't exist or 
0e50: 69 73 6e 27 74 20 61 20 64 69 72 65 63 74 6f 72  isn't a director
0e60: 79 2c 20 74 72 79 20 74 68 65 20 63 6f 70 79 2f  y, try the copy/
0e70: 72 65 6e 61 6d 65 2e 0a 20 20 20 20 20 2a 20 4d  rename..     * M
0e80: 6f 72 65 20 74 68 61 6e 20 32 20 61 72 67 75 6d  ore than 2 argum
0e90: 65 6e 74 73 20 69 73 20 6f 6e 6c 79 20 76 61 6c  ents is only val
0ea0: 69 64 20 69 66 20 74 68 65 20 74 61 72 67 65 74  id if the target
0eb0: 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 0a   is an existing.
0ec0: 20 20 20 20 20 2a 20 64 69 72 65 63 74 6f 72 79       * directory
0ed0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 74  ..     */..    t
0ee0: 61 72 67 65 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  arget = objv[obj
0ef0: 63 20 2d 20 31 5d 3b 0a 20 20 20 20 69 66 20 28  c - 1];.    if (
0f00: 54 63 6c 5f 46 53 43 6f 6e 76 65 72 74 54 6f 50  Tcl_FSConvertToP
0f10: 61 74 68 54 79 70 65 28 69 6e 74 65 72 70 2c 20  athType(interp, 
0f20: 74 61 72 67 65 74 29 20 21 3d 20 54 43 4c 5f 4f  target) != TCL_O
0f30: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
0f40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
0f50: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f     result = TCL_
0f60: 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  OK;..    /*.    
0f70: 20 2a 20 43 61 6c 6c 20 54 63 6c 5f 46 53 53 74   * Call Tcl_FSSt
0f80: 61 74 28 29 20 73 6f 20 74 68 61 74 20 69 66 20  at() so that if 
0f90: 74 61 72 67 65 74 20 69 73 20 61 20 73 79 6d 6c  target is a syml
0fa0: 69 6e 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20  ink that points 
0fb0: 74 6f 20 61 0a 20 20 20 20 20 2a 20 64 69 72 65  to a.     * dire
0fc0: 63 74 6f 72 79 20 77 65 20 77 69 6c 6c 20 70 75  ctory we will pu
0fd0: 74 20 74 68 65 20 73 6f 75 72 63 65 73 20 69 6e  t the sources in
0fe0: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0ff0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 20  instead of.     
1000: 2a 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  * overwriting th
1010: 65 20 73 79 6d 6c 69 6e 6b 2e 0a 20 20 20 20 20  e symlink..     
1020: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28 54 63 6c  */..    if ((Tcl
1030: 5f 46 53 53 74 61 74 28 74 61 72 67 65 74 2c 20  _FSStat(target, 
1040: 26 73 74 61 74 42 75 66 29 20 21 3d 20 30 29 20  &statBuf) != 0) 
1050: 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61 74  || !S_ISDIR(stat
1060: 42 75 66 2e 73 74 5f 6d 6f 64 65 29 29 20 7b 0a  Buf.st_mode)) {.
1070: 09 69 66 20 28 28 6f 62 6a 63 20 2d 20 69 29 20  .if ((objc - i) 
1080: 3e 20 32 29 20 7b 0a 09 20 20 20 20 65 72 72 6e  > 2) {..    errn
1090: 6f 20 3d 20 45 4e 4f 54 44 49 52 3b 0a 09 20 20  o = ENOTDIR;..  
10a0: 20 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72    Tcl_PosixError
10b0: 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 54  (interp);..    T
10c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10d0: 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 20 22  interp, "error "
10e0: 2c 0a 09 09 20 20 20 20 28 28 63 6f 70 79 46 6c  ,...    ((copyFl
10f0: 61 67 29 20 3f 20 22 63 6f 70 79 69 6e 67 22 20  ag) ? "copying" 
1100: 3a 20 22 72 65 6e 61 6d 69 6e 67 22 29 2c 20 22  : "renaming"), "
1110: 3a 20 74 61 72 67 65 74 20 5c 22 22 2c 0a 09 09  : target \"",...
1120: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1130: 67 28 74 61 72 67 65 74 29 2c 20 22 5c 22 20 69  g(target), "\" i
1140: 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74 6f 72  s not a director
1150: 79 22 2c 20 0a 09 09 20 20 20 20 28 63 68 61 72  y", ...    (char
1160: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
1170: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52  result = TCL_ERR
1180: 4f 52 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  OR;..} else {.. 
1190: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45 76     /*..     * Ev
11a0: 65 6e 20 74 68 6f 75 67 68 20 61 6c 72 65 61 64  en though alread
11b0: 79 20 68 61 76 65 20 74 61 72 67 65 74 20 3d 3d  y have target ==
11c0: 20 74 72 61 6e 73 6c 61 74 65 64 28 6f 62 6a 76   translated(objv
11d0: 5b 69 2b 31 5d 29 2c 0a 09 20 20 20 20 20 2a 20  [i+1]),..     * 
11e0: 70 61 73 73 20 74 68 65 20 6f 72 69 67 69 6e 61  pass the origina
11f0: 6c 20 61 72 67 75 6d 65 6e 74 20 64 6f 77 6e 2c  l argument down,
1200: 20 73 6f 20 69 66 20 74 68 65 72 65 27 73 20 61   so if there's a
1210: 6e 20 65 72 72 6f 72 2c 20 74 68 65 0a 09 20 20  n error, the..  
1220: 20 20 20 2a 20 65 72 72 6f 72 20 6d 65 73 73 61     * error messa
1230: 67 65 20 77 69 6c 6c 20 72 65 66 6c 65 63 74 20  ge will reflect 
1240: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 61 72 67  the original arg
1250: 75 6d 65 6e 74 73 2e 0a 09 20 20 20 20 20 2a 2f  uments...     */
1260: 0a 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20  ...    result = 
1270: 43 6f 70 79 52 65 6e 61 6d 65 4f 6e 65 46 69 6c  CopyRenameOneFil
1280: 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  e(interp, objv[i
1290: 5d 2c 20 6f 62 6a 76 5b 69 20 2b 20 31 5d 2c 20  ], objv[i + 1], 
12a0: 63 6f 70 79 46 6c 61 67 2c 0a 09 09 20 20 20 20  copyFlag,...    
12b0: 66 6f 72 63 65 29 3b 0a 09 7d 0a 09 72 65 74 75  force);..}..retu
12c0: 72 6e 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 7d  rn result;.    }
12d0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  .    .    /*.   
12e0: 20 20 2a 20 4d 6f 76 65 20 65 61 63 68 20 73 6f    * Move each so
12f0: 75 72 63 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  urce file into t
1300: 61 72 67 65 74 20 64 69 72 65 63 74 6f 72 79 2e  arget directory.
1310: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 62 61    Extract the ba
1320: 73 65 6e 61 6d 65 0a 20 20 20 20 20 2a 20 66 72  sename.     * fr
1330: 6f 6d 20 65 61 63 68 20 73 6f 75 72 63 65 2c 20  om each source, 
1340: 61 6e 64 20 61 70 70 65 6e 64 20 69 74 20 74 6f  and append it to
1350: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1360: 74 61 72 67 65 74 20 70 61 74 68 2e 0a 20 20 20  target path..   
1370: 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 20    */..    for ( 
1380: 3b 20 69 20 3c 20 6f 62 6a 63 20 2d 20 31 3b 20  ; i < objc - 1; 
1390: 69 2b 2b 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  i++) {..Tcl_Obj 
13a0: 2a 6a 61 72 67 76 5b 32 5d 3b 0a 09 54 63 6c 5f  *jargv[2];..Tcl_
13b0: 4f 62 6a 20 2a 73 6f 75 72 63 65 2c 20 2a 6e 65  Obj *source, *ne
13c0: 77 46 69 6c 65 4e 61 6d 65 3b 0a 09 54 63 6c 5f  wFileName;..Tcl_
13d0: 4f 62 6a 20 2a 74 65 6d 70 3b 0a 09 0a 09 73 6f  Obj *temp;....so
13e0: 75 72 63 65 20 3d 20 46 69 6c 65 42 61 73 65 6e  urce = FileBasen
13f0: 61 6d 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ame(interp, objv
1400: 5b 69 5d 29 3b 0a 09 69 66 20 28 73 6f 75 72 63  [i]);..if (sourc
1410: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e == NULL) {..  
1420: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45    result = TCL_E
1430: 52 52 4f 52 3b 0a 09 20 20 20 20 62 72 65 61 6b  RROR;..    break
1440: 3b 0a 09 7d 0a 09 6a 61 72 67 76 5b 30 5d 20 3d  ;..}..jargv[0] =
1450: 20 6f 62 6a 76 5b 6f 62 6a 63 20 2d 20 31 5d 3b   objv[objc - 1];
1460: 0a 09 6a 61 72 67 76 5b 31 5d 20 3d 20 73 6f 75  ..jargv[1] = sou
1470: 72 63 65 3b 0a 09 74 65 6d 70 20 3d 20 54 63 6c  rce;..temp = Tcl
1480: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 32 2c 20 6a  _NewListObj(2, j
1490: 61 72 67 76 29 3b 0a 09 6e 65 77 46 69 6c 65 4e  argv);..newFileN
14a0: 61 6d 65 20 3d 20 54 63 6c 5f 46 53 4a 6f 69 6e  ame = Tcl_FSJoin
14b0: 50 61 74 68 28 74 65 6d 70 2c 20 2d 31 29 3b 0a  Path(temp, -1);.
14c0: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e  .Tcl_IncrRefCoun
14d0: 74 28 6e 65 77 46 69 6c 65 4e 61 6d 65 29 3b 0a  t(newFileName);.
14e0: 09 72 65 73 75 6c 74 20 3d 20 43 6f 70 79 52 65  .result = CopyRe
14f0: 6e 61 6d 65 4f 6e 65 46 69 6c 65 28 69 6e 74 65  nameOneFile(inte
1500: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 6e 65 77  rp, objv[i], new
1510: 46 69 6c 65 4e 61 6d 65 2c 20 63 6f 70 79 46 6c  FileName, copyFl
1520: 61 67 2c 0a 09 09 66 6f 72 63 65 29 3b 0a 09 54  ag,...force);..T
1530: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1540: 6e 65 77 46 69 6c 65 4e 61 6d 65 29 3b 0a 09 54  newFileName);..T
1550: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1560: 74 65 6d 70 29 3b 0a 09 54 63 6c 5f 44 65 63 72  temp);..Tcl_Decr
1570: 52 65 66 43 6f 75 6e 74 28 73 6f 75 72 63 65 29  RefCount(source)
1580: 3b 0a 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  ;...if (result =
1590: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
15a0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20      break;..}.  
15b0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15c0: 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  esult;.}.../*. *
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
1620: 2a 20 54 63 6c 46 69 6c 65 4d 61 6b 65 44 69 72  * TclFileMakeDir
1630: 73 43 6d 64 0a 20 2a 0a 20 2a 09 54 68 69 73 20  sCmd. *. *.This 
1640: 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d  procedure implem
1650: 65 6e 74 73 20 74 68 65 20 22 6d 6b 64 69 72 22  ents the "mkdir"
1660: 20 73 75 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 74   subcommand of t
1670: 68 65 20 22 66 69 6c 65 22 0a 20 2a 20 20 20 20  he "file". *    
1680: 20 20 63 6f 6d 6d 61 6e 64 2e 20 20 46 69 6c 65    command.  File
1690: 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 73 20 6e  name arguments n
16a0: 65 65 64 20 74 6f 20 62 65 20 74 72 61 6e 73 6c  eed to be transl
16b0: 61 74 65 64 20 74 6f 20 6e 61 74 69 76 65 0a 20  ated to native. 
16c0: 2a 09 66 6f 72 6d 61 74 20 62 65 66 6f 72 65 20  *.format before 
16d0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
16e0: 70 6c 61 74 66 6f 72 6d 2d 73 70 65 63 69 66 69  platform-specifi
16f0: 63 20 63 6f 64 65 20 74 68 61 74 0a 20 2a 09 69  c code that. *.i
1700: 6d 70 6c 65 6d 65 6e 74 73 20 6d 6b 64 69 72 20  mplements mkdir 
1710: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20  functionality.. 
1720: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
1730: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
1740: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
1750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
1760: 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75  ee the user docu
1770: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  mentation.. *. *
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 54  ------. */.int.T
17d0: 63 6c 46 69 6c 65 4d 61 6b 65 44 69 72 73 43 6d  clFileMakeDirsCm
17e0: 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20  d(interp, objc, 
17f0: 6f 62 6a 76 29 0a 20 20 20 20 54 63 6c 5f 49 6e  objv).    Tcl_In
1800: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f  terp *interp;../
1810: 2a 20 55 73 65 64 20 66 6f 72 20 65 72 72 6f 72  * Used for error
1820: 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20   reporting. */. 
1830: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 09 09 09 2f     int objc;.../
1840: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1850: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 54 63 6c  ments */.    Tcl
1860: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1870: 5b 5d 3b 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20  [];./* Argument 
1880: 73 74 72 69 6e 67 73 20 70 61 73 73 65 64 20 74  strings passed t
1890: 6f 20 54 63 6c 5f 46 69 6c 65 43 6d 64 2e 20 2a  o Tcl_FileCmd. *
18a0: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.{.    Tcl_Obj 
18b0: 2a 65 72 72 66 69 6c 65 3b 0a 20 20 20 20 69 6e  *errfile;.    in
18c0: 74 20 72 65 73 75 6c 74 2c 20 69 2c 20 6a 2c 20  t result, i, j, 
18d0: 70 6f 62 6a 63 3b 0a 20 20 20 20 54 63 6c 5f 4f  pobjc;.    Tcl_O
18e0: 62 6a 20 2a 73 70 6c 69 74 20 3d 20 4e 55 4c 4c  bj *split = NULL
18f0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74  ;.    Tcl_Obj *t
1900: 61 72 67 65 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  arget = NULL;.  
1910: 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 73 74    Tcl_StatBuf st
1920: 61 74 42 75 66 3b 0a 0a 20 20 20 20 65 72 72 66  atBuf;..    errf
1930: 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  ile = NULL;..   
1940: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b   result = TCL_OK
1950: 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 32  ;.    for (i = 2
1960: 3b 20 69 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29  ; i < objc; i++)
1970: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 46 53 43 6f   {..if (Tcl_FSCo
1980: 6e 76 65 72 74 54 6f 50 61 74 68 54 79 70 65 28  nvertToPathType(
1990: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 29  interp, objv[i])
19a0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
19b0: 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f     result = TCL_
19c0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 62 72 65 61  ERROR;..    brea
19d0: 6b 3b 0a 09 7d 0a 0a 09 73 70 6c 69 74 20 3d 20  k;..}...split = 
19e0: 54 63 6c 5f 46 53 53 70 6c 69 74 50 61 74 68 28  Tcl_FSSplitPath(
19f0: 6f 62 6a 76 5b 69 5d 2c 26 70 6f 62 6a 63 29 3b  objv[i],&pobjc);
1a00: 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ..Tcl_IncrRefCou
1a10: 6e 74 28 73 70 6c 69 74 29 3b 0a 09 69 66 20 28  nt(split);..if (
1a20: 70 6f 62 6a 63 20 3d 3d 20 30 29 20 7b 0a 09 20  pobjc == 0) {.. 
1a30: 20 20 20 65 72 72 6e 6f 20 3d 20 45 4e 4f 45 4e     errno = ENOEN
1a40: 54 3b 0a 09 20 20 20 20 65 72 72 66 69 6c 65 20  T;..    errfile 
1a50: 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 09 20 20 20 20  = objv[i];..    
1a60: 62 72 65 61 6b 3b 0a 09 7d 0a 09 66 6f 72 20 28  break;..}..for (
1a70: 6a 20 3d 20 30 3b 20 6a 20 3c 20 70 6f 62 6a 63  j = 0; j < pobjc
1a80: 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 74 61  ; j++) {..    ta
1a90: 72 67 65 74 20 3d 20 54 63 6c 5f 46 53 4a 6f 69  rget = Tcl_FSJoi
1aa0: 6e 50 61 74 68 28 73 70 6c 69 74 2c 20 6a 20 2b  nPath(split, j +
1ab0: 20 31 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e   1);..    Tcl_In
1ac0: 63 72 52 65 66 43 6f 75 6e 74 28 74 61 72 67 65  crRefCount(targe
1ad0: 74 29 3b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  t);..    /*..   
1ae0: 20 20 2a 20 43 61 6c 6c 20 54 63 6c 5f 46 53 53    * Call Tcl_FSS
1af0: 74 61 74 28 29 20 73 6f 20 74 68 61 74 20 69 66  tat() so that if
1b00: 20 74 61 72 67 65 74 20 69 73 20 61 20 73 79 6d   target is a sym
1b10: 6c 69 6e 6b 20 74 68 61 74 0a 09 20 20 20 20 20  link that..     
1b20: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 69  * points to a di
1b30: 72 65 63 74 6f 72 79 20 77 65 20 77 69 6c 6c 20  rectory we will 
1b40: 63 72 65 61 74 65 20 73 75 62 64 69 72 65 63 74  create subdirect
1b50: 6f 72 69 65 73 20 69 6e 0a 09 20 20 20 20 20 2a  ories in..     *
1b60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 2e   that directory.
1b70: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
1b80: 69 66 20 28 54 63 6c 5f 46 53 53 74 61 74 28 74  if (Tcl_FSStat(t
1b90: 61 72 67 65 74 2c 20 26 73 74 61 74 42 75 66 29  arget, &statBuf)
1ba0: 20 3d 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 21   == 0) {...if (!
1bb0: 53 5f 49 53 44 49 52 28 73 74 61 74 42 75 66 2e  S_ISDIR(statBuf.
1bc0: 73 74 5f 6d 6f 64 65 29 29 20 7b 0a 09 09 20 20  st_mode)) {...  
1bd0: 20 20 65 72 72 6e 6f 20 3d 20 45 45 58 49 53 54    errno = EEXIST
1be0: 3b 0a 09 09 20 20 20 20 65 72 72 66 69 6c 65 20  ;...    errfile 
1bf0: 3d 20 74 61 72 67 65 74 3b 0a 09 09 20 20 20 20  = target;...    
1c00: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09 7d 0a 09  goto done;...}..
1c10: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 65      } else if (e
1c20: 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20  rrno != ENOENT) 
1c30: 7b 0a 09 09 65 72 72 66 69 6c 65 20 3d 20 74 61  {...errfile = ta
1c40: 72 67 65 74 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e  rget;...goto don
1c50: 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 0a  e;..    }..    .
1c60: 09 20 20 20 20 69 66 20 28 54 63 6c 5f 46 53 43  .    if (Tcl_FSC
1c70: 72 65 61 74 65 44 69 72 65 63 74 6f 72 79 28 74  reateDirectory(t
1c80: 61 72 67 65 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  arget) != TCL_OK
1c90: 29 20 7b 0a 09 09 2f 2a 20 0a 09 09 20 2a 20 43  ) {.../* ... * C
1ca0: 72 65 61 74 65 20 6d 69 67 68 74 20 68 61 76 65  reate might have
1cb0: 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20   failed because 
1cc0: 6f 66 20 62 65 69 6e 67 20 69 6e 20 61 20 72 61  of being in a ra
1cd0: 63 65 0a 09 09 20 2a 20 63 6f 6e 64 69 74 69 6f  ce... * conditio
1ce0: 6e 20 77 69 74 68 20 61 6e 6f 74 68 65 72 20 70  n with another p
1cf0: 72 6f 63 65 73 73 20 74 72 79 69 6e 67 20 74 6f  rocess trying to
1d00: 20 63 72 65 61 74 65 20 74 68 65 0a 09 09 20 2a   create the... *
1d10: 20 73 61 6d 65 20 73 75 62 64 69 72 65 63 74 6f   same subdirecto
1d20: 72 79 2e 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28  ry.... */...if (
1d30: 65 72 72 6e 6f 20 3d 3d 20 45 45 58 49 53 54 29  errno == EEXIST)
1d40: 20 7b 0a 09 09 20 20 20 20 69 66 20 28 28 54 63   {...    if ((Tc
1d50: 6c 5f 46 53 53 74 61 74 28 74 61 72 67 65 74 2c  l_FSStat(target,
1d60: 20 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29   &statBuf) == 0)
1d70: 0a 09 09 09 26 26 20 53 5f 49 53 44 49 52 28 73  ....&& S_ISDIR(s
1d80: 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 29 29  tatBuf.st_mode))
1d90: 20 7b 0a 09 09 09 2f 2a 20 0a 09 09 09 20 2a 20   {..../* .... * 
1da0: 49 74 20 69 73 20 61 20 64 69 72 65 63 74 6f 72  It is a director
1db0: 79 20 74 68 61 74 20 77 61 73 6e 27 74 20 74 68  y that wasn't th
1dc0: 65 72 65 20 62 65 66 6f 72 65 2c 0a 09 09 09 20  ere before,.... 
1dd0: 2a 20 73 6f 20 6b 65 65 70 20 67 6f 69 6e 67 20  * so keep going 
1de0: 77 69 74 68 6f 75 74 20 65 72 72 6f 72 2e 0a 09  without error...
1df0: 09 09 20 2a 2f 0a 09 09 09 54 63 6c 5f 52 65 73  .. */....Tcl_Res
1e00: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1e10: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;...    } else {
1e20: 0a 09 09 09 65 72 72 66 69 6c 65 20 3d 20 74 61  ....errfile = ta
1e30: 72 67 65 74 3b 0a 09 09 09 67 6f 74 6f 20 64 6f  rget;....goto do
1e40: 6e 65 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20  ne;...    }...} 
1e50: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 65 72 72  else {...    err
1e60: 66 69 6c 65 20 3d 20 74 61 72 67 65 74 3b 0a 09  file = target;..
1e70: 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a  .    goto done;.
1e80: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ..}..    }..    
1e90: 0a 09 20 20 20 20 2f 2a 20 46 6f 72 67 65 74 20  ..    /* Forget 
1ea0: 61 62 6f 75 74 20 74 68 69 73 20 73 75 62 2d 70  about this sub-p
1eb0: 61 74 68 20 2a 2f 0a 09 20 20 20 20 54 63 6c 5f  ath */..    Tcl_
1ec0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 61 72  DecrRefCount(tar
1ed0: 67 65 74 29 3b 0a 09 20 20 20 20 74 61 72 67 65  get);..    targe
1ee0: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63  t = NULL;..}..Tc
1ef0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
1f00: 70 6c 69 74 29 3b 0a 09 73 70 6c 69 74 20 3d 20  plit);..split = 
1f10: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 09 0a 20 20  NULL;.    }...  
1f20: 20 20 64 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28    done:.    if (
1f30: 65 72 72 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  errfile != NULL)
1f40: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
1f50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
1f60: 6e 27 74 20 63 72 65 61 74 65 20 64 69 72 65 63  n't create direc
1f70: 74 6f 72 79 20 5c 22 22 2c 0a 09 09 54 63 6c 5f  tory \"",...Tcl_
1f80: 47 65 74 53 74 72 69 6e 67 28 65 72 72 66 69 6c  GetString(errfil
1f90: 65 29 2c 20 22 5c 22 3a 20 22 2c 20 54 63 6c 5f  e), "\": ", Tcl_
1fa0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
1fb0: 70 29 2c 20 0a 09 09 28 63 68 61 72 20 2a 29 20  p), ...(char *) 
1fc0: 4e 55 4c 4c 29 3b 0a 09 72 65 73 75 6c 74 20 3d  NULL);..result =
1fd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1fe0: 7d 0a 20 20 20 20 69 66 20 28 73 70 6c 69 74 20  }.    if (split 
1ff0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
2000: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 70 6c  DecrRefCount(spl
2010: 69 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  it);.    }.    i
2020: 66 20 28 74 61 72 67 65 74 20 21 3d 20 4e 55 4c  f (target != NUL
2030: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  L) {..Tcl_DecrRe
2040: 66 43 6f 75 6e 74 28 74 61 72 67 65 74 29 3b 0a  fCount(target);.
2050: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2060: 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a   result;.}.../*.
2070: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
20c0: 63 6c 46 69 6c 65 44 65 6c 65 74 65 43 6d 64 0a  clFileDeleteCmd.
20d0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
20e0: 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dure implements 
20f0: 74 68 65 20 22 64 65 6c 65 74 65 22 20 73 75 62  the "delete" sub
2100: 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 22  command of the "
2110: 66 69 6c 65 22 0a 20 2a 20 20 20 20 20 20 63 6f  file". *      co
2120: 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  mmand.. *. * Res
2130: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
2140: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
2150: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2160: 74 73 3a 0a 20 2a 09 53 65 65 20 74 68 65 20 75  ts:. *.See the u
2170: 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ser documentatio
2180: 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  n.. *. *--------
2190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
21d0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 46 69 6c 65 44  */..int.TclFileD
21e0: 65 6c 65 74 65 43 6d 64 28 69 6e 74 65 72 70 2c  eleteCmd(interp,
21f0: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 0a 20 20 20   objc, objv).   
2200: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2210: 65 72 70 3b 09 09 2f 2a 20 55 73 65 64 20 66 6f  erp;../* Used fo
2220: 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  r error reportin
2230: 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a  g */.    int obj
2240: 63 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  c;.../* Number o
2250: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2260: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53     Tcl_Obj *CONS
2270: 54 20 6f 62 6a 76 5b 5d 3b 09 2f 2a 20 41 72 67  T objv[];./* Arg
2280: 75 6d 65 6e 74 20 73 74 72 69 6e 67 73 20 70 61  ument strings pa
2290: 73 73 65 64 20 74 6f 20 54 63 6c 5f 46 69 6c 65  ssed to Tcl_File
22a0: 43 6d 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  Cmd. */.{.    in
22b0: 74 20 69 2c 20 66 6f 72 63 65 2c 20 72 65 73 75  t i, force, resu
22c0: 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  lt;.    Tcl_Obj 
22d0: 2a 65 72 72 66 69 6c 65 3b 0a 20 20 20 20 54 63  *errfile;.    Tc
22e0: 6c 5f 4f 62 6a 20 2a 65 72 72 6f 72 42 75 66 66  l_Obj *errorBuff
22f0: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 0a  er = NULL;.    .
2300: 20 20 20 20 69 20 3d 20 46 69 6c 65 46 6f 72 63      i = FileForc
2310: 65 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  eOption(interp, 
2320: 6f 62 6a 63 20 2d 20 32 2c 20 6f 62 6a 76 20 2b  objc - 2, objv +
2330: 20 32 2c 20 26 66 6f 72 63 65 29 3b 0a 20 20 20   2, &force);.   
2340: 20 69 66 20 28 69 20 3c 20 30 29 20 7b 0a 09 72   if (i < 0) {..r
2350: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2360: 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 2b 3d 20  .    }.    i += 
2370: 32 3b 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63  2;.    if ((objc
2380: 20 2d 20 69 29 20 3c 20 31 29 20 7b 0a 09 54 63   - i) < 1) {..Tc
2390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23c0: 5c 22 22 2c 20 0a 09 09 54 63 6c 5f 47 65 74 53  \"", ...Tcl_GetS
23d0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
23e0: 22 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  " ", Tcl_GetStri
23f0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 0a 09 09  ng(objv[1]), ...
2400: 22 20 3f 6f 70 74 69 6f 6e 73 3f 20 66 69 6c 65  " ?options? file
2410: 20 3f 66 69 6c 65 20 2e 2e 2e 3f 5c 22 22 2c 20   ?file ...?\"", 
2420: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
2430: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
2440: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 72  R;.    }..    er
2450: 72 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rfile = NULL;.  
2460: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f    result = TCL_O
2470: 4b 3b 0a 0a 20 20 20 20 66 6f 72 20 28 20 3b 20  K;..    for ( ; 
2480: 69 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b  i < objc; i++) {
2490: 0a 09 54 63 6c 5f 53 74 61 74 42 75 66 20 73 74  ..Tcl_StatBuf st
24a0: 61 74 42 75 66 3b 0a 0a 09 65 72 72 66 69 6c 65  atBuf;...errfile
24b0: 20 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 09 69 66 20   = objv[i];..if 
24c0: 28 54 63 6c 5f 46 53 43 6f 6e 76 65 72 74 54 6f  (Tcl_FSConvertTo
24d0: 50 61 74 68 54 79 70 65 28 69 6e 74 65 72 70 2c  PathType(interp,
24e0: 20 6f 62 6a 76 5b 69 5d 29 20 21 3d 20 54 43 4c   objv[i]) != TCL
24f0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 73 75  _OK) {..    resu
2500: 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  lt = TCL_ERROR;.
2510: 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a  .    goto done;.
2520: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 61 6c 6c  .}.../*.. * Call
2530: 20 6c 73 74 61 74 28 29 20 74 6f 20 67 65 74 20   lstat() to get 
2540: 69 6e 66 6f 20 73 6f 20 63 61 6e 20 64 65 6c 65  info so can dele
2550: 74 65 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  te symbolic link
2560: 20 69 74 73 65 6c 66 2e 0a 09 20 2a 2f 0a 0a 09   itself... */...
2570: 69 66 20 28 54 63 6c 5f 46 53 4c 73 74 61 74 28  if (Tcl_FSLstat(
2580: 6f 62 6a 76 5b 69 5d 2c 20 26 73 74 61 74 42 75  objv[i], &statBu
2590: 66 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20  f) != 0) {..    
25a0: 2f 2a 0a 09 20 20 20 20 20 2a 20 54 72 79 69 6e  /*..     * Tryin
25b0: 67 20 74 6f 20 64 65 6c 65 74 65 20 61 20 66 69  g to delete a fi
25c0: 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
25d0: 20 65 78 69 73 74 20 69 73 20 6e 6f 74 0a 09 20   exist is not.. 
25e0: 20 20 20 20 2a 20 63 6f 6e 73 69 64 65 72 65 64      * considered
25f0: 20 61 6e 20 65 72 72 6f 72 2c 20 6a 75 73 74 20   an error, just 
2600: 61 20 6e 6f 2d 6f 70 0a 09 20 20 20 20 20 2a 2f  a no-op..     */
2610: 0a 0a 09 20 20 20 20 69 66 20 28 65 72 72 6e 6f  ...    if (errno
2620: 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 09 09   != ENOENT) {...
2630: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52  result = TCL_ERR
2640: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  OR;..    }..} el
2650: 73 65 20 69 66 20 28 53 5f 49 53 44 49 52 28 73  se if (S_ISDIR(s
2660: 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 29 29  tatBuf.st_mode))
2670: 20 7b 0a 09 20 20 20 20 2f 2a 20 0a 09 20 20 20   {..    /* ..   
2680: 20 20 2a 20 57 65 20 6f 77 6e 20 61 20 72 65 66    * We own a ref
2690: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
26a0: 65 72 72 6f 72 42 75 66 66 65 72 2c 20 69 66 20  errorBuffer, if 
26b0: 69 74 20 77 61 73 20 73 65 74 0a 09 20 20 20 20  it was set..    
26c0: 20 2a 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f   * as a result o
26d0: 66 20 74 68 69 73 20 63 61 6c 6c 2e 20 0a 09 20  f this call. .. 
26e0: 20 20 20 20 2a 2f 0a 09 20 20 20 20 72 65 73 75      */..    resu
26f0: 6c 74 20 3d 20 54 63 6c 5f 46 53 52 65 6d 6f 76  lt = Tcl_FSRemov
2700: 65 44 69 72 65 63 74 6f 72 79 28 6f 62 6a 76 5b  eDirectory(objv[
2710: 69 5d 2c 20 66 6f 72 63 65 2c 20 26 65 72 72 6f  i], force, &erro
2720: 72 42 75 66 66 65 72 29 3b 0a 09 20 20 20 20 69  rBuffer);..    i
2730: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c  f (result != TCL
2740: 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 66 6f  _OK) {...if ((fo
2750: 72 63 65 20 3d 3d 20 30 29 20 26 26 20 28 65 72  rce == 0) && (er
2760: 72 6e 6f 20 3d 3d 20 45 45 58 49 53 54 29 29 20  rno == EEXIST)) 
2770: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
2780: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2790: 20 22 65 72 72 6f 72 20 64 65 6c 65 74 69 6e 67   "error deleting
27a0: 20 5c 22 22 2c 20 0a 09 09 09 20 20 20 20 54 63   \"", ....    Tc
27b0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27c0: 5b 69 5d 29 2c 0a 09 09 09 20 20 20 20 22 5c 22  [i]),....    "\"
27d0: 3a 20 64 69 72 65 63 74 6f 72 79 20 6e 6f 74 20  : directory not 
27e0: 65 6d 70 74 79 22 2c 20 28 63 68 61 72 20 2a 29  empty", (char *)
27f0: 20 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 54 63   NULL);...    Tc
2800: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
2810: 65 72 70 29 3b 0a 09 09 20 20 20 20 67 6f 74 6f  erp);...    goto
2820: 20 64 6f 6e 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a   done;...}..../*
2830: 20 0a 09 09 20 2a 20 49 66 20 70 6f 73 73 69 62   ... * If possib
2840: 6c 65 2c 20 75 73 65 20 74 68 65 20 75 6e 74 72  le, use the untr
2850: 61 6e 73 6c 61 74 65 64 20 6e 61 6d 65 20 66 6f  anslated name fo
2860: 72 20 74 68 65 20 66 69 6c 65 2e 0a 09 09 20 2a  r the file.... *
2870: 2f 0a 09 09 20 0a 09 09 65 72 72 66 69 6c 65 20  /... ...errfile 
2880: 3d 20 65 72 72 6f 72 42 75 66 66 65 72 3b 0a 09  = errorBuffer;..
2890: 09 2f 2a 20 46 53 20 73 75 70 70 6f 73 65 64 20  ./* FS supposed 
28a0: 74 6f 20 63 68 65 63 6b 20 62 65 74 77 65 65 6e  to check between
28b0: 20 74 72 61 6e 73 6c 61 74 65 64 20 6f 62 6a 76   translated objv
28c0: 20 61 6e 64 20 65 72 72 66 69 6c 65 20 2a 2f 0a   and errfile */.
28d0: 09 09 69 66 20 28 54 63 6c 5f 46 53 45 71 75 61  ..if (Tcl_FSEqua
28e0: 6c 50 61 74 68 73 28 6f 62 6a 76 5b 69 5d 2c 20  lPaths(objv[i], 
28f0: 65 72 72 66 69 6c 65 29 29 20 7b 0a 09 09 20 20  errfile)) {...  
2900: 20 20 65 72 72 66 69 6c 65 20 3d 20 6f 62 6a 76    errfile = objv
2910: 5b 69 5d 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  [i];...}..    }.
2920: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
2930: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 46 53 44 65  esult = Tcl_FSDe
2940: 6c 65 74 65 46 69 6c 65 28 6f 62 6a 76 5b 69 5d  leteFile(objv[i]
2950: 29 3b 0a 09 7d 0a 09 0a 09 69 66 20 28 72 65 73  );..}....if (res
2960: 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ult != TCL_OK) {
2970: 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  ..    result = T
2980: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 2f  CL_ERROR;..    /
2990: 2a 20 0a 09 20 20 20 20 20 2a 20 49 74 20 69 73  * ..     * It is
29a0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
29b0: 77 65 20 62 72 65 61 6b 20 6f 6e 20 65 72 72 6f  we break on erro
29c0: 72 2c 20 6f 74 68 65 72 77 69 73 65 20 77 65 0a  r, otherwise we.
29d0: 09 20 20 20 20 20 2a 20 6d 69 67 68 74 20 65 6e  .     * might en
29e0: 64 20 75 70 20 6f 77 6e 69 6e 67 20 72 65 66 65  d up owning refe
29f0: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 6f 6e 20  rence counts on 
2a00: 6e 75 6d 65 72 6f 75 73 0a 09 20 20 20 20 20 2a  numerous..     *
2a10: 20 65 72 72 6f 72 42 75 66 66 65 72 73 2e 0a 09   errorBuffers...
2a20: 20 20 20 20 20 2a 2f 0a 09 20 20 20 20 62 72 65       */..    bre
2a30: 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  ak;..}.    }.   
2a40: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54   if (result != T
2a50: 43 4c 5f 4f 4b 29 20 7b 0a 09 69 66 20 28 65 72  CL_OK) {..if (er
2a60: 72 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  rfile == NULL) {
2a70: 0a 09 20 20 20 20 2f 2a 20 0a 09 20 20 20 20 20  ..    /* ..     
2a80: 2a 20 57 65 20 74 72 79 20 74 6f 20 61 63 63 6f  * We try to acco
2a90: 6d 6f 64 61 74 65 20 70 6f 6f 72 20 65 72 72 6f  modate poor erro
2aa0: 72 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 6f  r results from o
2ab0: 75 72 20 0a 09 20 20 20 20 20 2a 20 54 63 6c 5f  ur ..     * Tcl_
2ac0: 46 53 20 63 61 6c 6c 73 20 0a 09 20 20 20 20 20  FS calls ..     
2ad0: 2a 2f 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  */..    Tcl_Appe
2ae0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2af0: 20 22 65 72 72 6f 72 20 64 65 6c 65 74 69 6e 67   "error deleting
2b00: 20 75 6e 6b 6e 6f 77 6e 20 66 69 6c 65 3a 20 22   unknown file: "
2b10: 2c 20 0a 09 09 20 20 20 20 54 63 6c 5f 50 6f 73  , ...    Tcl_Pos
2b20: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 2c  ixError(interp),
2b30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
2b40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2b50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2b60: 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 20  (interp, "error 
2b70: 64 65 6c 65 74 69 6e 67 20 5c 22 22 2c 20 0a 09  deleting \"", ..
2b80: 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69  .    Tcl_GetStri
2b90: 6e 67 28 65 72 72 66 69 6c 65 29 2c 20 22 5c 22  ng(errfile), "\"
2ba0: 3a 20 22 2c 20 0a 09 09 20 20 20 20 54 63 6c 5f  : ", ...    Tcl_
2bb0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
2bc0: 70 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  p), (char *) NUL
2bd0: 4c 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 0a 20 20  L);..}.    } .  
2be0: 20 20 64 6f 6e 65 3a 0a 20 20 20 20 69 66 20 28    done:.    if (
2bf0: 65 72 72 6f 72 42 75 66 66 65 72 20 21 3d 20 4e  errorBuffer != N
2c00: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ULL) {..Tcl_Decr
2c10: 52 65 66 43 6f 75 6e 74 28 65 72 72 6f 72 42 75  RefCount(errorBu
2c20: 66 66 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ffer);.    }.   
2c30: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
2c40: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 70 79 52  ----. *. * CopyR
2ca0: 65 6e 61 6d 65 4f 6e 65 46 69 6c 65 0a 20 2a 0a  enameOneFile. *.
2cb0: 20 2a 09 43 6f 70 69 65 73 20 6f 72 20 72 65 6e   *.Copies or ren
2cc0: 61 6d 65 73 20 73 70 65 63 69 66 69 65 64 20 73  ames specified s
2cd0: 6f 75 72 63 65 20 66 69 6c 65 20 6f 72 20 64 69  ource file or di
2ce0: 72 65 63 74 6f 72 79 20 68 69 65 72 61 72 63 68  rectory hierarch
2cf0: 79 0a 20 2a 09 74 6f 20 74 68 65 20 73 70 65 63  y. *.to the spec
2d00: 69 66 69 65 64 20 74 61 72 67 65 74 2e 20 20 0a  ified target.  .
2d10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
2d20: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
2d30: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
2d40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
2d50: 54 61 72 67 65 74 20 69 73 20 6f 76 65 72 77 72  Target is overwr
2d60: 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 72  itten if the for
2d70: 63 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ce flag is set. 
2d80: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 0a 20   Attempting to. 
2d90: 2a 09 63 6f 70 79 2f 72 65 6e 61 6d 65 20 61 20  *.copy/rename a 
2da0: 66 69 6c 65 20 6f 6e 74 6f 20 61 20 64 69 72 65  file onto a dire
2db0: 63 74 6f 72 79 20 6f 72 20 61 20 64 69 72 65 63  ctory or a direc
2dc0: 74 6f 72 79 20 6f 6e 74 6f 20 61 20 66 69 6c 65  tory onto a file
2dd0: 0a 20 2a 09 77 69 6c 6c 20 61 6c 77 61 79 73 20  . *.will always 
2de0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
2df0: 6f 72 2e 20 20 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  or.  . *. *-----
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
2e50: 74 0a 43 6f 70 79 52 65 6e 61 6d 65 4f 6e 65 46  t.CopyRenameOneF
2e60: 69 6c 65 28 69 6e 74 65 72 70 2c 20 73 6f 75 72  ile(interp, sour
2e70: 63 65 2c 20 74 61 72 67 65 74 2c 20 63 6f 70 79  ce, target, copy
2e80: 46 6c 61 67 2c 20 66 6f 72 63 65 29 20 0a 20 20  Flag, force) .  
2e90: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ea0: 74 65 72 70 3b 09 09 2f 2a 20 55 73 65 64 20 66  terp;../* Used f
2eb0: 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  or error reporti
2ec0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  ng. */.    Tcl_O
2ed0: 62 6a 20 2a 73 6f 75 72 63 65 3b 09 09 2f 2a 20  bj *source;../* 
2ee0: 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
2ef0: 20 74 6f 20 63 6f 70 79 2e 20 20 4d 61 79 20 6e   to copy.  May n
2f00: 65 65 64 20 74 6f 0a 09 09 09 09 20 2a 20 62 65  eed to..... * be
2f10: 20 74 72 61 6e 73 6c 61 74 65 64 2e 20 2a 2f 0a   translated. */.
2f20: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 61 72      Tcl_Obj *tar
2f30: 67 65 74 3b 09 09 2f 2a 20 50 61 74 68 6e 61 6d  get;../* Pathnam
2f40: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 72 65  e of file to cre
2f50: 61 74 65 2f 6f 76 65 72 77 72 69 74 65 2e 0a 09  ate/overwrite...
2f60: 09 09 09 20 2a 20 4d 61 79 20 6e 65 65 64 20 74  ... * May need t
2f70: 6f 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 2e  o be translated.
2f80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 6f 70 79   */.    int copy
2f90: 46 6c 61 67 3b 09 09 2f 2a 20 49 66 20 6e 6f 6e  Flag;../* If non
2fa0: 2d 7a 65 72 6f 2c 20 63 6f 70 79 20 66 69 6c 65  -zero, copy file
2fb0: 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 09  s.  Otherwise,..
2fc0: 09 09 09 20 2a 20 72 65 6e 61 6d 65 20 74 68 65  ... * rename the
2fd0: 6d 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6f  m. */.    int fo
2fe0: 72 63 65 3b 09 09 09 2f 2a 20 49 66 20 6e 6f 6e  rce;.../* If non
2ff0: 2d 7a 65 72 6f 2c 20 6f 76 65 72 77 72 69 74 65  -zero, overwrite
3000: 20 74 61 72 67 65 74 20 66 69 6c 65 20 69 66 20   target file if 
3010: 69 74 0a 09 09 09 09 20 2a 20 65 78 69 73 74 73  it..... * exists
3020: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 65 72  .  Otherwise, er
3030: 72 6f 72 20 69 66 20 74 61 72 67 65 74 20 61 6c  ror if target al
3040: 72 65 61 64 79 0a 09 09 09 09 20 2a 20 65 78 69  ready..... * exi
3050: 73 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  sts. */.{.    in
3060: 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 54 63  t result;.    Tc
3070: 6c 5f 4f 62 6a 20 2a 65 72 72 66 69 6c 65 2c 20  l_Obj *errfile, 
3080: 2a 65 72 72 6f 72 42 75 66 66 65 72 3b 0a 20 20  *errorBuffer;.  
3090: 20 20 2f 2a 20 49 66 20 73 6f 75 72 63 65 20 69    /* If source i
30a0: 73 20 61 20 6c 69 6e 6b 2c 20 74 68 65 6e 20 74  s a link, then t
30b0: 68 69 73 20 69 73 20 74 68 65 20 72 65 61 6c 20  his is the real 
30c0: 66 69 6c 65 2f 64 69 72 65 63 74 6f 72 79 20 2a  file/directory *
30d0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  /.    Tcl_Obj *a
30e0: 63 74 75 61 6c 53 6f 75 72 63 65 20 3d 20 4e 55  ctualSource = NU
30f0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 74 61 74  LL;.    Tcl_Stat
3100: 42 75 66 20 73 6f 75 72 63 65 53 74 61 74 42 75  Buf sourceStatBu
3110: 66 2c 20 74 61 72 67 65 74 53 74 61 74 42 75 66  f, targetStatBuf
3120: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 46  ;..    if (Tcl_F
3130: 53 43 6f 6e 76 65 72 74 54 6f 50 61 74 68 54 79  SConvertToPathTy
3140: 70 65 28 69 6e 74 65 72 70 2c 20 73 6f 75 72 63  pe(interp, sourc
3150: 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  e) != TCL_OK) {.
3160: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
3170: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
3180: 28 54 63 6c 5f 46 53 43 6f 6e 76 65 72 74 54 6f  (Tcl_FSConvertTo
3190: 50 61 74 68 54 79 70 65 28 69 6e 74 65 72 70 2c  PathType(interp,
31a0: 20 74 61 72 67 65 74 29 20 21 3d 20 54 43 4c 5f   target) != TCL_
31b0: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
31c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
31d0: 20 20 20 0a 20 20 20 20 65 72 72 66 69 6c 65 20     .    errfile 
31e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 72 72 6f  = NULL;.    erro
31f0: 72 42 75 66 66 65 72 20 3d 20 4e 55 4c 4c 3b 0a  rBuffer = NULL;.
3200: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c      result = TCL
3210: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 0a 20 20 20  _ERROR;.    .   
3220: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 77 61   /*.     * We wa
3230: 6e 74 20 74 6f 20 63 6f 70 79 2f 72 65 6e 61 6d  nt to copy/renam
3240: 65 20 6c 69 6e 6b 73 20 61 6e 64 20 6e 6f 74 20  e links and not 
3250: 74 68 65 20 66 69 6c 65 73 20 74 68 65 79 20 70  the files they p
3260: 6f 69 6e 74 20 74 6f 2c 20 73 6f 20 77 65 0a 20  oint to, so we. 
3270: 20 20 20 20 2a 20 75 73 65 20 6c 73 74 61 74 28      * use lstat(
3280: 29 2e 20 49 66 20 74 61 72 67 65 74 20 69 73 20  ). If target is 
3290: 61 20 6c 69 6e 6b 2c 20 77 65 20 61 6c 73 6f 20  a link, we also 
32a0: 77 61 6e 74 20 74 6f 20 72 65 70 6c 61 63 65 20  want to replace 
32b0: 74 68 65 20 0a 20 20 20 20 20 2a 20 6c 69 6e 6b  the .     * link
32c0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 66 69 6c   and not the fil
32d0: 65 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 2c 20  e it points to, 
32e0: 73 6f 20 77 65 20 61 6c 73 6f 20 75 73 65 20 6c  so we also use l
32f0: 73 74 61 74 28 29 20 6f 6e 20 74 68 65 0a 20 20  stat() on the.  
3300: 20 20 20 2a 20 74 61 72 67 65 74 2e 0a 20 20 20     * target..   
3310: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 54 63    */..    if (Tc
3320: 6c 5f 46 53 4c 73 74 61 74 28 73 6f 75 72 63 65  l_FSLstat(source
3330: 2c 20 26 73 6f 75 72 63 65 53 74 61 74 42 75 66  , &sourceStatBuf
3340: 29 20 21 3d 20 30 29 20 7b 0a 09 65 72 72 66 69  ) != 0) {..errfi
3350: 6c 65 20 3d 20 73 6f 75 72 63 65 3b 0a 09 67 6f  le = source;..go
3360: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20  to done;.    }. 
3370: 20 20 20 69 66 20 28 54 63 6c 5f 46 53 4c 73 74     if (Tcl_FSLst
3380: 61 74 28 74 61 72 67 65 74 2c 20 26 74 61 72 67  at(target, &targ
3390: 65 74 53 74 61 74 42 75 66 29 20 21 3d 20 30 29  etStatBuf) != 0)
33a0: 20 7b 0a 09 69 66 20 28 65 72 72 6e 6f 20 21 3d   {..if (errno !=
33b0: 20 45 4e 4f 45 4e 54 29 20 7b 0a 09 20 20 20 20   ENOENT) {..    
33c0: 65 72 72 66 69 6c 65 20 3d 20 74 61 72 67 65 74  errfile = target
33d0: 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65  ;..    goto done
33e0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
33f0: 7b 0a 09 69 66 20 28 66 6f 72 63 65 20 3d 3d 20  {..if (force == 
3400: 30 29 20 7b 0a 09 20 20 20 20 65 72 72 6e 6f 20  0) {..    errno 
3410: 3d 20 45 45 58 49 53 54 3b 0a 09 20 20 20 20 65  = EEXIST;..    e
3420: 72 72 66 69 6c 65 20 3d 20 74 61 72 67 65 74 3b  rrfile = target;
3430: 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b  ..    goto done;
3440: 0a 09 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ..}..        /* 
3450: 0a 20 20 20 20 20 20 20 20 20 2a 20 50 72 65 76  .         * Prev
3460: 65 6e 74 20 63 6f 70 79 69 6e 67 20 6f 72 20 72  ent copying or r
3470: 65 6e 61 6d 69 6e 67 20 61 20 66 69 6c 65 20 6f  enaming a file o
3480: 6e 74 6f 20 69 74 73 65 6c 66 2e 20 20 55 6e 64  nto itself.  Und
3490: 65 72 20 57 69 6e 64 6f 77 73 2c 20 0a 20 20 20  er Windows, .   
34a0: 20 20 20 20 20 20 2a 20 73 74 61 74 20 61 6c 77        * stat alw
34b0: 61 79 73 20 72 65 74 75 72 6e 73 20 30 20 66 6f  ays returns 0 fo
34c0: 72 20 73 74 5f 69 6e 6f 2e 20 20 48 6f 77 65 76  r st_ino.  Howev
34d0: 65 72 2c 20 74 68 65 20 57 69 6e 64 6f 77 73 2d  er, the Windows-
34e0: 73 70 65 63 69 66 69 63 20 0a 20 20 20 20 20 20  specific .      
34f0: 20 20 20 2a 20 63 6f 64 65 20 6b 6e 6f 77 73 20     * code knows 
3500: 68 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  how to deal with
3510: 20 63 6f 70 79 69 6e 67 20 6f 72 20 72 65 6e 61   copying or rena
3520: 6d 69 6e 67 20 61 20 66 69 6c 65 20 6f 6e 20 74  ming a file on t
3530: 6f 70 20 6f 66 0a 20 20 20 20 20 20 20 20 20 2a  op of.         *
3540: 20 69 74 73 65 6c 66 2e 20 20 49 74 20 6d 69 67   itself.  It mig
3550: 68 74 20 62 65 20 61 20 67 6f 6f 64 20 69 64 65  ht be a good ide
3560: 61 20 74 6f 20 77 72 69 74 65 20 61 20 73 74 61  a to write a sta
3570: 74 20 74 68 61 74 20 77 6f 72 6b 65 64 2e 0a 20  t that worked.. 
3580: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3590: 0a 20 20 20 20 20 20 20 20 69 66 20 28 28 73 6f  .        if ((so
35a0: 75 72 63 65 53 74 61 74 42 75 66 2e 73 74 5f 69  urceStatBuf.st_i
35b0: 6e 6f 20 21 3d 20 30 29 20 26 26 20 28 74 61 72  no != 0) && (tar
35c0: 67 65 74 53 74 61 74 42 75 66 2e 73 74 5f 69 6e  getStatBuf.st_in
35d0: 6f 20 21 3d 20 30 29 29 20 7b 0a 20 20 20 20 20  o != 0)) {.     
35e0: 20 20 20 20 20 20 20 69 66 20 28 28 73 6f 75 72         if ((sour
35f0: 63 65 53 74 61 74 42 75 66 2e 73 74 5f 69 6e 6f  ceStatBuf.st_ino
3600: 20 3d 3d 20 74 61 72 67 65 74 53 74 61 74 42 75   == targetStatBu
3610: 66 2e 73 74 5f 69 6e 6f 29 20 26 26 0a 20 20 20  f.st_ino) &&.   
3620: 20 20 20 20 20 20 20 20 20 09 20 20 20 20 28 73           .    (s
3630: 6f 75 72 63 65 53 74 61 74 42 75 66 2e 73 74 5f  ourceStatBuf.st_
3640: 64 65 76 20 3d 3d 20 74 61 72 67 65 74 53 74 61  dev == targetSta
3650: 74 42 75 66 2e 73 74 5f 64 65 76 29 29 20 7b 0a  tBuf.st_dev)) {.
3660: 20 20 20 20 20 20 20 20 20 20 20 20 09 72 65 73              .res
3670: 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20  ult = TCL_OK;.  
3680: 20 20 20 20 20 20 20 20 20 20 09 67 6f 74 6f 20            .goto 
3690: 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  done;.          
36a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09    }.        }...
36b0: 2f 2a 0a 09 20 2a 20 50 72 65 76 65 6e 74 20 63  /*.. * Prevent c
36c0: 6f 70 79 69 6e 67 2f 72 65 6e 61 6d 69 6e 67 20  opying/renaming 
36d0: 61 20 66 69 6c 65 20 6f 6e 74 6f 20 61 20 64 69  a file onto a di
36e0: 72 65 63 74 6f 72 79 20 61 6e 64 0a 09 20 2a 20  rectory and.. * 
36f0: 76 69 63 65 2d 76 65 72 73 61 2e 20 20 54 68 69  vice-versa.  Thi
3700: 73 20 69 73 20 61 20 70 6f 6c 69 63 79 20 64 65  s is a policy de
3710: 63 69 73 69 6f 6e 20 62 61 73 65 64 20 6f 6e 20  cision based on 
3720: 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 09 20  the fact that.. 
3730: 2a 20 65 78 69 73 74 69 6e 67 20 69 6d 70 6c 65  * existing imple
3740: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 63 6f  mentations of co
3750: 70 79 20 61 6e 64 20 72 65 6e 61 6d 65 20 6f 6e  py and rename on
3760: 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 0a 09   all platforms..
3770: 20 2a 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 20   * also prevent 
3780: 74 68 69 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  this... */...if 
3790: 28 53 5f 49 53 44 49 52 28 73 6f 75 72 63 65 53  (S_ISDIR(sourceS
37a0: 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 29 0a  tatBuf.st_mode).
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 26 26 20 21 53 5f 49 53 44 49 52 28 74 61 72 67  && !S_ISDIR(targ
37d0: 65 74 53 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64  etStatBuf.st_mod
37e0: 65 29 29 20 7b 0a 09 20 20 20 20 65 72 72 6e 6f  e)) {..    errno
37f0: 20 3d 20 45 49 53 44 49 52 3b 0a 09 20 20 20 20   = EISDIR;..    
3800: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3810: 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 27 74 20  (interp, "can't 
3820: 6f 76 65 72 77 72 69 74 65 20 66 69 6c 65 20 5c  overwrite file \
3830: 22 22 2c 20 0a 09 09 20 20 20 20 54 63 6c 5f 47  "", ...    Tcl_G
3840: 65 74 53 74 72 69 6e 67 28 74 61 72 67 65 74 29  etString(target)
3850: 2c 20 22 5c 22 20 77 69 74 68 20 64 69 72 65 63  , "\" with direc
3860: 74 6f 72 79 20 5c 22 22 2c 20 0a 09 09 20 20 20  tory \"", ...   
3870: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 73   Tcl_GetString(s
3880: 6f 75 72 63 65 29 2c 20 22 5c 22 22 2c 20 28 63  ource), "\"", (c
3890: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
38a0: 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d     goto done;..}
38b0: 0a 09 69 66 20 28 21 53 5f 49 53 44 49 52 28 73  ..if (!S_ISDIR(s
38c0: 6f 75 72 63 65 53 74 61 74 42 75 66 2e 73 74 5f  ourceStatBuf.st_
38d0: 6d 6f 64 65 29 0a 09 20 20 20 20 20 20 20 20 26  mode)..        &
38e0: 26 20 53 5f 49 53 44 49 52 28 74 61 72 67 65 74  & S_ISDIR(target
38f0: 53 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 29  StatBuf.st_mode)
3900: 29 20 7b 0a 09 20 20 20 20 65 72 72 6e 6f 20 3d  ) {..    errno =
3910: 20 45 49 53 44 49 52 3b 0a 09 20 20 20 20 54 63   EISDIR;..    Tc
3920: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3930: 6e 74 65 72 70 2c 20 22 63 61 6e 27 74 20 6f 76  nterp, "can't ov
3940: 65 72 77 72 69 74 65 20 64 69 72 65 63 74 6f 72  erwrite director
3950: 79 20 5c 22 22 2c 20 0a 09 09 20 20 20 20 54 63  y \"", ...    Tc
3960: 6c 5f 47 65 74 53 74 72 69 6e 67 28 74 61 72 67  l_GetString(targ
3970: 65 74 29 2c 20 22 5c 22 20 77 69 74 68 20 66 69  et), "\" with fi
3980: 6c 65 20 5c 22 22 2c 20 0a 09 09 20 20 20 20 54  le \"", ...    T
3990: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 73 6f 75  cl_GetString(sou
39a0: 72 63 65 29 2c 20 22 5c 22 22 2c 20 28 63 68 61  rce), "\"", (cha
39b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
39c0: 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09   goto done;..}..
39d0: 0a 09 2f 2a 20 0a 09 20 2a 20 54 68 65 20 64 65  ../* .. * The de
39e0: 73 74 69 6e 61 74 69 6f 6e 20 65 78 69 73 74 73  stination exists
39f0: 2c 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  , but appears to
3a00: 20 62 65 20 6f 6b 20 74 6f 20 6f 76 65 72 2d 77   be ok to over-w
3a10: 72 69 74 65 2c 0a 09 20 2a 20 61 6e 64 20 2d 66  rite,.. * and -f
3a20: 6f 72 63 65 20 69 73 20 67 69 76 65 6e 2e 20 20  orce is given.  
3a30: 57 65 20 6e 6f 77 20 74 72 79 20 74 6f 20 61 64  We now try to ad
3a40: 6a 75 73 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  just permissions
3a50: 20 74 6f 0a 09 20 2a 20 65 6e 73 75 72 65 20 74   to.. * ensure t
3a60: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 75 63  he operation suc
3a70: 63 65 65 64 73 2e 20 20 49 66 20 77 65 20 63 61  ceeds.  If we ca
3a80: 6e 27 74 20 61 64 6a 75 73 74 0a 09 20 2a 20 70  n't adjust.. * p
3a90: 65 72 6d 69 73 73 69 6f 6e 73 2c 20 77 65 27 6c  ermissions, we'l
3aa0: 6c 20 6c 65 74 20 74 68 65 20 61 63 74 75 61 6c  l let the actual
3ab0: 20 63 6f 70 79 2f 72 65 6e 61 6d 65 20 72 65 74   copy/rename ret
3ac0: 75 72 6e 0a 09 20 2a 20 61 6e 20 65 72 72 6f 72  urn.. * an error
3ad0: 20 6c 61 74 65 72 2e 0a 09 20 2a 2f 0a 09 7b 0a   later... */..{.
3ae0: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 2a 20 70 65  .    Tcl_Obj* pe
3af0: 72 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  rm = Tcl_NewStri
3b00: 6e 67 4f 62 6a 28 22 75 2b 77 22 2c 2d 31 29 3b  ngObj("u+w",-1);
3b10: 0a 09 20 20 20 20 69 6e 74 20 69 6e 64 65 78 3b  ..    int index;
3b20: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
3b30: 66 43 6f 75 6e 74 28 70 65 72 6d 29 3b 0a 09 20  fCount(perm);.. 
3b40: 20 20 20 69 66 20 28 54 63 6c 46 53 46 69 6c 65     if (TclFSFile
3b50: 41 74 74 72 49 6e 64 65 78 28 74 61 72 67 65 74  AttrIndex(target
3b60: 2c 20 22 2d 70 65 72 6d 69 73 73 69 6f 6e 73 22  , "-permissions"
3b70: 2c 20 26 69 6e 64 65 78 29 20 3d 3d 20 54 43 4c  , &index) == TCL
3b80: 5f 4f 4b 29 20 7b 0a 09 09 54 63 6c 5f 46 53 46  _OK) {...Tcl_FSF
3b90: 69 6c 65 41 74 74 72 73 53 65 74 28 4e 55 4c 4c  ileAttrsSet(NULL
3ba0: 2c 20 69 6e 64 65 78 2c 20 74 61 72 67 65 74 2c  , index, target,
3bb0: 20 70 65 72 6d 29 3b 0a 09 20 20 20 20 7d 0a 09   perm);..    }..
3bc0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3bd0: 6f 75 6e 74 28 70 65 72 6d 29 3b 0a 09 7d 0a 20  ount(perm);..}. 
3be0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 6f     }..    if (co
3bf0: 70 79 46 6c 61 67 20 3d 3d 20 30 29 20 7b 0a 09  pyFlag == 0) {..
3c00: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 46 53 52  result = Tcl_FSR
3c10: 65 6e 61 6d 65 46 69 6c 65 28 73 6f 75 72 63 65  enameFile(source
3c20: 2c 20 74 61 72 67 65 74 29 3b 0a 09 69 66 20 28  , target);..if (
3c30: 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b  result == TCL_OK
3c40: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f  ) {..    goto do
3c50: 6e 65 3b 0a 09 7d 0a 09 20 20 20 20 0a 09 69 66  ne;..}..    ..if
3c60: 20 28 65 72 72 6e 6f 20 3d 3d 20 45 49 4e 56 41   (errno == EINVA
3c70: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  L) {..    Tcl_Ap
3c80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3c90: 70 2c 20 22 65 72 72 6f 72 20 72 65 6e 61 6d 69  p, "error renami
3ca0: 6e 67 20 5c 22 22 2c 20 0a 09 09 20 20 20 20 54  ng \"", ...    T
3cb0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 73 6f 75  cl_GetString(sou
3cc0: 72 63 65 29 2c 20 22 5c 22 20 74 6f 20 5c 22 22  rce), "\" to \""
3cd0: 2c 0a 09 09 20 20 20 20 54 63 6c 5f 47 65 74 53  ,...    Tcl_GetS
3ce0: 74 72 69 6e 67 28 74 61 72 67 65 74 29 2c 20 22  tring(target), "
3cf0: 5c 22 3a 20 74 72 79 69 6e 67 20 74 6f 20 72 65  \": trying to re
3d00: 6e 61 6d 65 20 61 20 76 6f 6c 75 6d 65 20 6f 72  name a volume or
3d10: 20 22 2c 0a 09 09 20 20 20 20 22 6d 6f 76 65 20   ",...    "move 
3d20: 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 74 6f  a directory into
3d30: 20 69 74 73 65 6c 66 22 2c 20 28 63 68 61 72 20   itself", (char 
3d40: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 67  *) NULL);..    g
3d50: 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 20 65 6c 73  oto done;..} els
3d60: 65 20 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45  e if (errno != E
3d70: 58 44 45 56 29 20 7b 0a 09 20 20 20 20 65 72 72  XDEV) {..    err
3d80: 66 69 6c 65 20 3d 20 74 61 72 67 65 74 3b 0a 09  file = target;..
3d90: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09      goto done;..
3da0: 7d 0a 09 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20  }..../*.. * The 
3db0: 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 62 65  rename failed be
3dc0: 63 61 75 73 65 20 74 68 65 20 6d 6f 76 65 20 77  cause the move w
3dd0: 61 73 20 61 63 72 6f 73 73 20 66 69 6c 65 20 73  as across file s
3de0: 79 73 74 65 6d 73 2e 0a 09 20 2a 20 46 61 6c 6c  ystems... * Fall
3df0: 20 74 68 72 6f 75 67 68 20 74 6f 20 63 6f 70 79   through to copy
3e00: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 72   file and then r
3e10: 65 6d 6f 76 65 20 6f 72 69 67 69 6e 61 6c 2e 20  emove original. 
3e20: 20 4e 6f 74 65 20 74 68 61 74 0a 09 20 2a 20 74   Note that.. * t
3e30: 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 54 63 6c  he low-level Tcl
3e40: 5f 46 53 52 65 6e 61 6d 65 46 69 6c 65 50 72 6f  _FSRenameFilePro
3e50: 63 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  c in the filesys
3e60: 74 65 6d 20 69 73 20 61 6c 6c 6f 77 65 64 20 0a  tem is allowed .
3e70: 09 20 2a 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  . * to implement
3e80: 20 63 72 6f 73 73 2d 66 69 6c 65 73 79 73 74 65   cross-filesyste
3e90: 6d 20 6d 6f 76 65 73 20 69 74 73 65 6c 66 2c 20  m moves itself, 
3ea0: 69 66 20 69 74 20 64 65 73 69 72 65 73 2e 0a 09  if it desires...
3eb0: 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   */.    }..    a
3ec0: 63 74 75 61 6c 53 6f 75 72 63 65 20 3d 20 73 6f  ctualSource = so
3ed0: 75 72 63 65 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  urce;.    Tcl_In
3ee0: 63 72 52 65 66 43 6f 75 6e 74 28 61 63 74 75 61  crRefCount(actua
3ef0: 6c 53 6f 75 72 63 65 29 3b 0a 20 20 20 20 2f 2a  lSource);.    /*
3f00: 20 0a 20 20 20 20 20 2a 20 41 63 74 69 76 61 74   .     * Activat
3f10: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
3f20: 62 6c 6f 63 6b 20 74 6f 20 63 6f 70 79 20 66 69  block to copy fi
3f30: 6c 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  les instead of l
3f40: 69 6e 6b 73 2e 0a 20 20 20 20 20 2a 20 48 6f 77  inks..     * How
3f50: 65 76 65 72 20 54 63 6c 27 73 20 73 65 6d 61 6e  ever Tcl's seman
3f60: 74 69 63 73 20 63 75 72 72 65 6e 74 6c 79 20 73  tics currently s
3f70: 61 79 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 70  ay we should cop
3f80: 79 20 6c 69 6e 6b 73 2c 20 73 6f 0a 20 20 20 20  y links, so.    
3f90: 20 2a 20 61 6e 79 20 73 75 63 68 20 63 68 61 6e   * any such chan
3fa0: 67 65 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ge should be the
3fb0: 20 73 75 62 6a 65 63 74 20 6f 66 20 63 61 72 65   subject of care
3fc0: 66 75 6c 20 73 74 75 64 79 20 6f 6e 20 0a 20 20  ful study on .  
3fd0: 20 20 20 2a 20 74 68 65 20 63 6f 6e 73 65 71 75     * the consequ
3fe0: 65 6e 63 65 73 2e 0a 20 20 20 20 20 2a 20 0a 20  ences..     * . 
3ff0: 20 20 20 20 2a 20 50 65 72 68 61 70 73 20 74 68      * Perhaps th
4000: 65 72 65 20 63 6f 75 6c 64 20 62 65 20 61 6e 20  ere could be an 
4010: 6f 70 74 69 6f 6e 61 6c 20 66 6c 61 67 20 74 6f  optional flag to
4020: 20 27 66 69 6c 65 20 63 6f 70 79 27 20 74 6f 0a   'file copy' to.
4030: 20 20 20 20 20 2a 20 64 69 63 74 61 74 65 20 77       * dictate w
4040: 68 69 63 68 20 61 70 70 72 6f 61 63 68 20 74 6f  hich approach to
4050: 20 75 73 65 2c 20 77 69 74 68 20 74 68 65 20 64   use, with the d
4060: 65 66 61 75 6c 74 20 62 65 69 6e 67 20 5f 6e 6f  efault being _no
4070: 74 5f 0a 20 20 20 20 20 2a 20 74 6f 20 68 61 76  t_.     * to hav
4080: 65 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 63 74  e this block act
4090: 69 76 65 2e 0a 20 20 20 20 20 2a 2f 0a 23 69 66  ive..     */.#if
40a0: 20 30 0a 23 69 66 64 65 66 20 53 5f 49 53 4c 4e   0.#ifdef S_ISLN
40b0: 4b 0a 20 20 20 20 69 66 20 28 63 6f 70 79 46 6c  K.    if (copyFl
40c0: 61 67 20 26 26 20 53 5f 49 53 4c 4e 4b 28 73 6f  ag && S_ISLNK(so
40d0: 75 72 63 65 53 74 61 74 42 75 66 2e 73 74 5f 6d  urceStatBuf.st_m
40e0: 6f 64 65 29 29 20 7b 0a 09 2f 2a 20 0a 09 20 2a  ode)) {../* .. *
40f0: 20 57 65 20 77 61 6e 74 20 74 6f 20 63 6f 70 79   We want to copy
4100: 20 66 69 6c 65 73 20 6e 6f 74 20 6c 69 6e 6b 73   files not links
4110: 2e 20 20 54 68 65 72 65 66 6f 72 65 20 77 65 20  .  Therefore we 
4120: 6d 75 73 74 20 66 6f 6c 6c 6f 77 20 74 68 65 0a  must follow the.
4130: 09 20 2a 20 6c 69 6e 6b 2e 20 20 54 68 65 72 65  . * link.  There
4140: 20 61 72 65 20 74 77 6f 20 70 75 72 70 6f 73 65   are two purpose
4150: 73 20 74 6f 20 74 68 69 73 20 27 73 74 61 74 27  s to this 'stat'
4160: 20 63 61 6c 6c 20 68 65 72 65 2e 20 20 46 69 72   call here.  Fir
4170: 73 74 0a 09 20 2a 20 77 65 20 77 61 6e 74 20 74  st.. * we want t
4180: 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20 6c 69  o know if the li
4190: 6e 6b 65 64 2d 66 69 6c 65 2f 64 69 72 20 61 63  nked-file/dir ac
41a0: 74 75 61 6c 6c 79 20 65 78 69 73 74 73 2c 20 61  tually exists, a
41b0: 6e 64 0a 09 20 2a 20 73 65 63 6f 6e 64 2c 20 69  nd.. * second, i
41c0: 6e 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 63  n the block of c
41d0: 6f 64 65 20 77 68 69 63 68 20 66 6f 6c 6c 6f 77  ode which follow
41e0: 73 2c 20 73 6f 6d 65 20 32 30 20 6c 69 6e 65 73  s, some 20 lines
41f0: 0a 09 20 2a 20 64 6f 77 6e 2c 20 77 65 20 77 61  .. * down, we wa
4200: 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  nt to check if t
4210: 68 65 20 74 68 69 6e 67 20 69 73 20 61 20 66 69  he thing is a fi
4220: 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 2e  le or directory.
4230: 0a 09 20 2a 2f 0a 09 69 66 20 28 54 63 6c 5f 46  .. */..if (Tcl_F
4240: 53 53 74 61 74 28 73 6f 75 72 63 65 2c 20 26 73  SStat(source, &s
4250: 6f 75 72 63 65 53 74 61 74 42 75 66 29 20 21 3d  ourceStatBuf) !=
4260: 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 20 41 63   0) {..    /* Ac
4270: 74 75 61 6c 20 66 69 6c 65 20 64 6f 65 73 6e 27  tual file doesn'
4280: 74 20 65 78 69 73 74 20 2a 2f 0a 09 20 20 20 20  t exist */..    
4290: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
42a0: 28 69 6e 74 65 72 70 2c 20 0a 09 09 20 20 20 20  (interp, ...    
42b0: 22 65 72 72 6f 72 20 63 6f 70 79 69 6e 67 20 5c  "error copying \
42c0: 22 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  "", Tcl_GetStrin
42d0: 67 28 73 6f 75 72 63 65 29 2c 20 0a 09 09 20 20  g(source), ...  
42e0: 20 20 22 5c 22 3a 20 74 68 65 20 74 61 72 67 65    "\": the targe
42f0: 74 20 6f 66 20 74 68 69 73 20 6c 69 6e 6b 20 64  t of this link d
4300: 6f 65 73 6e 27 74 20 65 78 69 73 74 22 2c 0a 09  oesn't exist",..
4310: 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55  .    (char *) NU
4320: 4c 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64  LL);..    goto d
4330: 6f 6e 65 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  one;..} else {..
4340: 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 65 72 20      int counter 
4350: 3d 20 30 3b 0a 09 20 20 20 20 77 68 69 6c 65 20  = 0;..    while 
4360: 28 31 29 20 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20  (1) {...Tcl_Obj 
4370: 2a 70 61 74 68 20 3d 20 54 63 6c 5f 46 53 4c 69  *path = Tcl_FSLi
4380: 6e 6b 28 61 63 74 75 61 6c 53 6f 75 72 63 65 2c  nk(actualSource,
4390: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 09 69 66 20   NULL, 0);...if 
43a0: 28 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (path == NULL) {
43b0: 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  ...    break;...
43c0: 7d 0a 09 09 2f 2a 20 0a 09 09 20 2a 20 4e 6f 77  }.../* ... * Now
43d0: 20 77 65 20 77 61 6e 74 20 74 6f 20 63 68 65 63   we want to chec
43e0: 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
43f0: 65 6c 61 74 69 76 65 20 70 61 74 68 2c 0a 09 09  elative path,...
4400: 20 2a 20 61 6e 64 20 69 66 20 73 6f 2c 20 74 6f   * and if so, to
4410: 20 6d 61 6b 65 20 69 74 20 61 62 73 6f 6c 75 74   make it absolut
4420: 65 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 54 63  e... */...if (Tc
4430: 6c 5f 46 53 47 65 74 50 61 74 68 54 79 70 65 28  l_FSGetPathType(
4440: 70 61 74 68 29 20 3d 3d 20 54 43 4c 5f 50 41 54  path) == TCL_PAT
4450: 48 5f 52 45 4c 41 54 49 56 45 29 20 7b 0a 09 09  H_RELATIVE) {...
4460: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 62 73      Tcl_Obj *abs
4470: 20 3d 20 54 63 6c 5f 46 53 4a 6f 69 6e 54 6f 50   = Tcl_FSJoinToP
4480: 61 74 68 28 61 63 74 75 61 6c 53 6f 75 72 63 65  ath(actualSource
4490: 2c 20 31 2c 20 26 70 61 74 68 29 3b 0a 09 09 20  , 1, &path);... 
44a0: 20 20 20 69 66 20 28 61 62 73 20 3d 3d 20 4e 55     if (abs == NU
44b0: 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  LL) {....break;.
44c0: 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20 54 63  ..    }...    Tc
44d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
44e0: 62 73 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44  bs);...    Tcl_D
44f0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 61 74 68  ecrRefCount(path
4500: 29 3b 0a 09 09 20 20 20 20 70 61 74 68 20 3d 20  );...    path = 
4510: 61 62 73 3b 0a 09 09 7d 0a 09 09 54 63 6c 5f 44  abs;...}...Tcl_D
4520: 65 63 72 52 65 66 43 6f 75 6e 74 28 61 63 74 75  ecrRefCount(actu
4530: 61 6c 53 6f 75 72 63 65 29 3b 0a 09 09 61 63 74  alSource);...act
4540: 75 61 6c 53 6f 75 72 63 65 20 3d 20 70 61 74 68  ualSource = path
4550: 3b 0a 09 09 63 6f 75 6e 74 65 72 2b 2b 3b 0a 09  ;...counter++;..
4560: 09 2f 2a 20 41 72 62 69 74 72 61 72 79 20 6c 69  ./* Arbitrary li
4570: 6d 69 74 20 6f 66 20 32 30 20 6c 69 6e 6b 73 20  mit of 20 links 
4580: 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 09 09 69  to follow */...i
4590: 66 20 28 63 6f 75 6e 74 65 72 20 3e 20 32 30 29  f (counter > 20)
45a0: 20 7b 0a 09 09 20 20 20 20 2f 2a 20 54 6f 6f 20   {...    /* Too 
45b0: 6d 61 6e 79 20 6c 69 6e 6b 73 20 2a 2f 0a 09 09  many links */...
45c0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f      Tcl_SetErrno
45d0: 28 45 4d 4c 49 4e 4b 29 3b 0a 09 09 20 20 20 20  (EMLINK);...    
45e0: 65 72 72 66 69 6c 65 20 3d 20 73 6f 75 72 63 65  errfile = source
45f0: 3b 0a 09 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e  ;...    goto don
4600: 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20  e;...}..    }.. 
4610: 20 20 20 2f 2a 20 4e 6f 77 20 27 61 63 74 75 61     /* Now 'actua
4620: 6c 53 6f 75 72 63 65 27 20 69 73 20 74 68 65 20  lSource' is the 
4630: 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a  correct file */.
4640: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
4650: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
4660: 53 5f 49 53 44 49 52 28 73 6f 75 72 63 65 53 74  S_ISDIR(sourceSt
4670: 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 29 29 20  atBuf.st_mode)) 
4680: 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f  {..result = Tcl_
4690: 46 53 43 6f 70 79 44 69 72 65 63 74 6f 72 79 28  FSCopyDirectory(
46a0: 61 63 74 75 61 6c 53 6f 75 72 63 65 2c 20 74 61  actualSource, ta
46b0: 72 67 65 74 2c 20 26 65 72 72 6f 72 42 75 66 66  rget, &errorBuff
46c0: 65 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74  er);..if (result
46d0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
46e0: 20 20 20 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20     if (errno == 
46f0: 45 58 44 45 56 29 20 7b 0a 09 09 2f 2a 20 0a 09  EXDEV) {.../* ..
4700: 09 20 2a 20 54 68 65 20 63 6f 70 79 20 66 61 69  . * The copy fai
4710: 6c 65 64 20 62 65 63 61 75 73 65 20 77 65 27 72  led because we'r
4720: 65 20 74 72 79 69 6e 67 20 74 6f 20 64 6f 20 61  e trying to do a
4730: 0a 09 09 20 2a 20 63 72 6f 73 73 2d 66 69 6c 65  ... * cross-file
4740: 73 79 73 74 65 6d 20 63 6f 70 79 2e 20 20 57 65  system copy.  We
4750: 20 64 6f 20 74 68 69 73 20 74 68 72 6f 75 67 68   do this through
4760: 20 6f 75 72 20 54 63 6c 0a 09 09 20 2a 20 6c 69   our Tcl... * li
4770: 62 72 61 72 79 2e 0a 09 09 20 2a 2f 0a 09 09 54  brary.... */...T
4780: 63 6c 5f 4f 62 6a 20 2a 63 6f 70 79 43 6f 6d 6d  cl_Obj *copyComm
4790: 61 6e 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  and = Tcl_NewLis
47a0: 74 4f 62 6a 28 30 2c 4e 55 4c 4c 29 3b 0a 09 09  tObj(0,NULL);...
47b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
47c0: 28 63 6f 70 79 43 6f 6d 6d 61 6e 64 29 3b 0a 09  (copyCommand);..
47d0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
47f0: 2c 20 63 6f 70 79 43 6f 6d 6d 61 6e 64 2c 20 0a  , copyCommand, .
4800: 09 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ...Tcl_NewString
4810: 4f 62 6a 28 22 3a 3a 74 63 6c 3a 3a 43 6f 70 79  Obj("::tcl::Copy
4820: 44 69 72 65 63 74 6f 72 79 22 2c 2d 31 29 29 3b  Directory",-1));
4830: 0a 09 09 69 66 20 28 63 6f 70 79 46 6c 61 67 29  ...if (copyFlag)
4840: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 73   {...    Tcl_Lis
4850: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4860: 74 28 69 6e 74 65 72 70 2c 20 63 6f 70 79 43 6f  t(interp, copyCo
4870: 6d 6d 61 6e 64 2c 20 0a 09 09 09 09 09 20 20 20  mmand, ......   
4880: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
4890: 62 6a 28 22 63 6f 70 79 69 6e 67 22 2c 2d 31 29  bj("copying",-1)
48a0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
48b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
48c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
48d0: 65 72 70 2c 20 63 6f 70 79 43 6f 6d 6d 61 6e 64  erp, copyCommand
48e0: 2c 20 0a 09 09 09 09 09 20 20 20 20 20 54 63 6c  , ......     Tcl
48f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72  _NewStringObj("r
4900: 65 6e 61 6d 69 6e 67 22 2c 2d 31 29 29 3b 0a 09  enaming",-1));..
4910: 09 7d 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  .}...Tcl_ListObj
4920: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4930: 74 65 72 70 2c 20 63 6f 70 79 43 6f 6d 6d 61 6e  terp, copyComman
4940: 64 2c 20 73 6f 75 72 63 65 29 3b 0a 09 09 54 63  d, source);...Tc
4950: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4960: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4970: 6f 70 79 43 6f 6d 6d 61 6e 64 2c 20 74 61 72 67  opyCommand, targ
4980: 65 74 29 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20  et);...result = 
4990: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
49a0: 74 65 72 70 2c 20 63 6f 70 79 43 6f 6d 6d 61 6e  terp, copyComman
49b0: 64 2c 20 0a 09 09 09 09 20 20 20 20 20 20 20 54  d, .....       T
49c0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 20 7c  CL_EVAL_GLOBAL |
49d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
49e0: 29 3b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66  );...Tcl_DecrRef
49f0: 43 6f 75 6e 74 28 63 6f 70 79 43 6f 6d 6d 61 6e  Count(copyComman
4a00: 64 29 3b 0a 09 09 69 66 20 28 72 65 73 75 6c 74  d);...if (result
4a10: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
4a20: 20 20 20 20 2f 2a 20 0a 09 09 20 20 20 20 20 2a      /* ...     *
4a30: 20 54 68 65 72 65 20 77 61 73 20 61 6e 20 65 72   There was an er
4a40: 72 6f 72 20 69 6e 20 74 68 65 20 54 63 6c 2d 6c  ror in the Tcl-l
4a50: 65 76 65 6c 20 63 6f 70 79 2e 0a 09 09 20 20 20  evel copy....   
4a60: 20 20 2a 20 57 65 20 77 69 6c 6c 20 70 61 73 73    * We will pass
4a70: 20 6f 6e 20 74 68 65 20 54 63 6c 20 65 72 72 6f   on the Tcl erro
4a80: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 0a 09 09  r message and...
4a90: 20 20 20 20 20 2a 20 63 61 6e 20 65 6e 73 75 72       * can ensur
4aa0: 65 20 74 68 69 73 20 62 79 20 73 65 74 74 69 6e  e this by settin
4ab0: 67 20 65 72 72 66 69 6c 65 20 74 6f 20 4e 55 4c  g errfile to NUL
4ac0: 4c 0a 09 09 20 20 20 20 20 2a 2f 0a 09 09 20 20  L...     */...  
4ad0: 20 20 65 72 72 66 69 6c 65 20 3d 20 4e 55 4c 4c    errfile = NULL
4ae0: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73  ;...}..    } els
4af0: 65 20 7b 0a 09 09 65 72 72 66 69 6c 65 20 3d 20  e {...errfile = 
4b00: 65 72 72 6f 72 42 75 66 66 65 72 3b 0a 09 09 69  errorBuffer;...i
4b10: 66 20 28 54 63 6c 5f 46 53 45 71 75 61 6c 50 61  f (Tcl_FSEqualPa
4b20: 74 68 73 28 65 72 72 66 69 6c 65 2c 20 73 6f 75  ths(errfile, sou
4b30: 72 63 65 29 29 20 7b 0a 09 09 20 20 20 20 65 72  rce)) {...    er
4b40: 72 66 69 6c 65 20 3d 20 73 6f 75 72 63 65 3b 0a  rfile = source;.
4b50: 09 09 7d 20 65 6c 73 65 20 69 66 20 28 54 63 6c  ..} else if (Tcl
4b60: 5f 46 53 45 71 75 61 6c 50 61 74 68 73 28 65 72  _FSEqualPaths(er
4b70: 72 66 69 6c 65 2c 20 74 61 72 67 65 74 29 29 20  rfile, target)) 
4b80: 7b 0a 09 09 20 20 20 20 65 72 72 66 69 6c 65 20  {...    errfile 
4b90: 3d 20 74 61 72 67 65 74 3b 0a 09 09 7d 0a 09 20  = target;...}.. 
4ba0: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 20 65 6c     }..}.    } el
4bb0: 73 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54  se {..result = T
4bc0: 63 6c 5f 46 53 43 6f 70 79 46 69 6c 65 28 61 63  cl_FSCopyFile(ac
4bd0: 74 75 61 6c 53 6f 75 72 63 65 2c 20 74 61 72 67  tualSource, targ
4be0: 65 74 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c  et);..if ((resul
4bf0: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 26 26 20  t != TCL_OK) && 
4c00: 28 65 72 72 6e 6f 20 3d 3d 20 45 58 44 45 56 29  (errno == EXDEV)
4c10: 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 20  ) {..    result 
4c20: 3d 20 54 63 6c 43 72 6f 73 73 46 69 6c 65 73 79  = TclCrossFilesy
4c30: 73 74 65 6d 43 6f 70 79 28 69 6e 74 65 72 70 2c  stemCopy(interp,
4c40: 20 73 6f 75 72 63 65 2c 20 74 61 72 67 65 74 29   source, target)
4c50: 3b 0a 09 7d 0a 09 69 66 20 28 72 65 73 75 6c 74  ;..}..if (result
4c60: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
4c70: 20 20 20 2f 2a 20 0a 09 20 20 20 20 20 2a 20 57     /* ..     * W
4c80: 65 20 63 6f 75 6c 64 20 65 78 61 6d 69 6e 65 20  e could examine 
4c90: 27 65 72 72 6e 6f 27 20 74 6f 20 64 6f 75 62 6c  'errno' to doubl
4ca0: 65 2d 63 68 65 63 6b 20 69 66 20 74 68 65 20 70  e-check if the p
4cb0: 72 6f 62 6c 65 6d 0a 09 20 20 20 20 20 2a 20 77  roblem..     * w
4cc0: 61 73 20 77 69 74 68 20 74 68 65 20 74 61 72 67  as with the targ
4cd0: 65 74 2c 20 62 75 74 20 77 65 20 63 68 65 63 6b  et, but we check
4ce0: 65 64 20 74 68 65 20 73 6f 75 72 63 65 20 61 62  ed the source ab
4cf0: 6f 76 65 2c 0a 09 20 20 20 20 20 2a 20 73 6f 20  ove,..     * so 
4d00: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 71 75 69  it should be qui
4d10: 74 65 20 63 6c 65 61 72 20 0a 09 20 20 20 20 20  te clear ..     
4d20: 2a 2f 0a 09 20 20 20 20 65 72 72 66 69 6c 65 20  */..    errfile 
4d30: 3d 20 74 61 72 67 65 74 3b 0a 09 20 20 20 20 2f  = target;..    /
4d40: 2a 20 0a 09 20 20 20 20 20 2a 20 57 65 20 6e 6f  * ..     * We no
4d50: 77 20 6e 65 65 64 20 74 6f 20 72 65 73 65 74 20  w need to reset 
4d60: 74 68 65 20 72 65 73 75 6c 74 2c 20 62 65 63 61  the result, beca
4d70: 75 73 65 20 74 68 65 20 61 62 6f 76 65 20 63 61  use the above ca
4d80: 6c 6c 2c 0a 09 20 20 20 20 20 2a 20 69 66 20 69  ll,..     * if i
4d90: 74 20 66 61 69 6c 65 64 2c 20 6d 61 79 20 68 61  t failed, may ha
4da0: 76 65 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ve put an error 
4db0: 6d 65 73 73 61 67 65 20 69 6e 20 70 6c 61 63 65  message in place
4dc0: 2e 0a 09 20 20 20 20 20 2a 20 28 49 64 65 61 6c  ...     * (Ideal
4dd0: 6c 79 20 77 65 20 77 6f 75 6c 64 20 70 72 65 66  ly we would pref
4de0: 65 72 20 6e 6f 74 20 74 6f 20 70 61 73 73 20 61  er not to pass a
4df0: 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e  n interpreter in
4e00: 0a 09 20 20 20 20 20 2a 20 61 62 6f 76 65 2c 20  ..     * above, 
4e10: 62 75 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  but the channel 
4e20: 49 4f 20 63 6f 64 65 20 75 73 65 64 20 62 79 0a  IO code used by.
4e30: 09 20 20 20 20 20 2a 20 54 63 6c 43 72 6f 73 73  .     * TclCross
4e40: 46 69 6c 65 73 79 73 74 65 6d 43 6f 70 79 20 63  FilesystemCopy c
4e50: 75 72 72 65 6e 74 6c 79 20 72 65 71 75 69 72 65  urrently require
4e60: 73 20 6f 6e 65 29 0a 09 20 20 20 20 20 2a 2f 0a  s one)..     */.
4e70: 09 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
4e80: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 7d  sult(interp);..}
4e90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
4ea0: 63 6f 70 79 46 6c 61 67 20 3d 3d 20 30 29 20 26  copyFlag == 0) &
4eb0: 26 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c  & (result == TCL
4ec0: 5f 4f 4b 29 29 20 7b 0a 09 69 66 20 28 53 5f 49  _OK)) {..if (S_I
4ed0: 53 44 49 52 28 73 6f 75 72 63 65 53 74 61 74 42  SDIR(sourceStatB
4ee0: 75 66 2e 73 74 5f 6d 6f 64 65 29 29 20 7b 0a 09  uf.st_mode)) {..
4ef0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c      result = Tcl
4f00: 5f 46 53 52 65 6d 6f 76 65 44 69 72 65 63 74 6f  _FSRemoveDirecto
4f10: 72 79 28 73 6f 75 72 63 65 2c 20 31 2c 20 26 65  ry(source, 1, &e
4f20: 72 72 6f 72 42 75 66 66 65 72 29 3b 0a 09 20 20  rrorBuffer);..  
4f30: 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20    if (result != 
4f40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  TCL_OK) {...if (
4f50: 54 63 6c 5f 46 53 45 71 75 61 6c 50 61 74 68 73  Tcl_FSEqualPaths
4f60: 28 65 72 72 66 69 6c 65 2c 20 73 6f 75 72 63 65  (errfile, source
4f70: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) == 0) {...    
4f80: 65 72 72 66 69 6c 65 20 3d 20 73 6f 75 72 63 65  errfile = source
4f90: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 20  ;...}..    }..} 
4fa0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 73 75  else {..    resu
4fb0: 6c 74 20 3d 20 54 63 6c 5f 46 53 44 65 6c 65 74  lt = Tcl_FSDelet
4fc0: 65 46 69 6c 65 28 73 6f 75 72 63 65 29 3b 0a 09  eFile(source);..
4fd0: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21      if (result !
4fe0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 65 72  = TCL_OK) {...er
4ff0: 72 66 69 6c 65 20 3d 20 73 6f 75 72 63 65 3b 0a  rfile = source;.
5000: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 72  .    }..}..if (r
5010: 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  esult != TCL_OK)
5020: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
5030: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5040: 20 22 63 61 6e 27 74 20 75 6e 6c 69 6e 6b 20 5c   "can't unlink \
5050: 22 22 2c 20 0a 09 09 54 63 6c 5f 47 65 74 53 74  "", ...Tcl_GetSt
5060: 72 69 6e 67 28 65 72 72 66 69 6c 65 29 2c 20 22  ring(errfile), "
5070: 5c 22 3a 20 22 2c 0a 09 09 54 63 6c 5f 50 6f 73  \": ",...Tcl_Pos
5080: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 2c  ixError(interp),
5090: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
50a0: 0a 09 20 20 20 20 65 72 72 66 69 6c 65 20 3d 20  ..    errfile = 
50b0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  NULL;..}.    }. 
50c0: 20 20 20 0a 20 20 20 20 64 6f 6e 65 3a 0a 20 20     .    done:.  
50d0: 20 20 69 66 20 28 65 72 72 66 69 6c 65 20 21 3d    if (errfile !=
50e0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
50f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5100: 70 2c 20 0a 09 09 28 28 63 6f 70 79 46 6c 61 67  p, ...((copyFlag
5110: 29 20 3f 20 22 65 72 72 6f 72 20 63 6f 70 79 69  ) ? "error copyi
5120: 6e 67 20 5c 22 22 20 3a 20 22 65 72 72 6f 72 20  ng \"" : "error 
5130: 72 65 6e 61 6d 69 6e 67 20 5c 22 22 29 2c 0a 09  renaming \""),..
5140: 09 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  . Tcl_GetString(
5150: 73 6f 75 72 63 65 29 2c 20 28 63 68 61 72 20 2a  source), (char *
5160: 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 65 72  ) NULL);..if (er
5170: 72 66 69 6c 65 20 21 3d 20 73 6f 75 72 63 65 29  rfile != source)
5180: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
5190: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
51a0: 20 22 5c 22 20 74 6f 20 5c 22 22 2c 20 54 63 6c   "\" to \"", Tcl
51b0: 5f 47 65 74 53 74 72 69 6e 67 28 74 61 72 67 65  _GetString(targe
51c0: 74 29 2c 20 0a 09 09 09 20 20 20 20 20 28 63 68  t), ....     (ch
51d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
51e0: 20 20 69 66 20 28 65 72 72 66 69 6c 65 20 21 3d    if (errfile !=
51f0: 20 74 61 72 67 65 74 29 20 7b 0a 09 09 54 63 6c   target) {...Tcl
5200: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5210: 74 65 72 70 2c 20 22 5c 22 3a 20 5c 22 22 2c 20  terp, "\": \"", 
5220: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 65 72  Tcl_GetString(er
5230: 72 66 69 6c 65 29 2c 20 0a 09 09 09 09 20 28 63  rfile), ..... (c
5240: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
5250: 20 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 41 70 70     }..}..Tcl_App
5260: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5270: 2c 20 22 5c 22 3a 20 22 2c 20 54 63 6c 5f 50 6f  , "\": ", Tcl_Po
5280: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29  sixError(interp)
5290: 2c 0a 09 09 28 63 68 61 72 20 2a 29 20 4e 55 4c  ,...(char *) NUL
52a0: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  L);.    }.    if
52b0: 20 28 65 72 72 6f 72 42 75 66 66 65 72 20 21 3d   (errorBuffer !=
52c0: 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20   NULL) {.       
52d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
52e0: 74 28 65 72 72 6f 72 42 75 66 66 65 72 29 3b 0a  t(errorBuffer);.
52f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 63      }.    if (ac
5300: 74 75 61 6c 53 6f 75 72 63 65 20 21 3d 20 4e 55  tualSource != NU
5310: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  LL) {..Tcl_DecrR
5320: 65 66 43 6f 75 6e 74 28 61 63 74 75 61 6c 53 6f  efCount(actualSo
5330: 75 72 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  urce);.    }.   
5340: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
5350: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 69 6c 65 46  ----. *. * FileF
53b0: 6f 72 63 65 4f 70 74 69 6f 6e 20 2d 2d 0a 20 2a  orceOption --. *
53c0: 0a 20 2a 09 48 65 6c 70 73 20 70 61 72 73 65 20  . *.Helps parse 
53d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
53e0: 69 6f 6e 73 20 66 6f 72 20 66 69 6c 65 20 63 6f  ions for file co
53f0: 6d 6d 61 6e 64 73 20 74 68 61 74 20 74 61 6b 65  mmands that take
5400: 0a 20 2a 09 74 68 65 20 22 2d 66 6f 72 63 65 22  . *.the "-force"
5410: 20 61 6e 64 20 22 2d 2d 22 20 6f 70 74 69 6f 6e   and "--" option
5420: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
5430: 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20  :. *.The return 
5440: 76 61 6c 75 65 20 69 73 20 68 6f 77 20 6d 61 6e  value is how man
5450: 79 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  y arguments from
5460: 20 61 72 67 76 20 77 65 72 65 20 63 6f 6e 73 75   argv were consu
5470: 6d 65 64 0a 20 2a 09 62 79 20 74 68 69 73 20 66  med. *.by this f
5480: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 2d 31 20 69  unction, or -1 i
5490: 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 65  f there was an e
54a0: 72 72 6f 72 20 70 61 72 73 69 6e 67 20 74 68 65  rror parsing the
54b0: 0a 20 2a 09 6f 70 74 69 6f 6e 73 2e 20 20 49 66  . *.options.  If
54c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
54d0: 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ed, an error mes
54e0: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
54f0: 74 68 65 0a 20 2a 09 69 6e 74 65 72 70 27 73 20  the. *.interp's 
5500: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
5510: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
5520: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
5580: 63 20 69 6e 74 0a 46 69 6c 65 46 6f 72 63 65 4f  c int.FileForceO
5590: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 62  ption(interp, ob
55a0: 6a 63 2c 20 6f 62 6a 76 2c 20 66 6f 72 63 65 50  jc, objv, forceP
55b0: 74 72 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  tr).    Tcl_Inte
55c0: 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20  rp *interp;../* 
55d0: 49 6e 74 65 72 70 2c 20 66 6f 72 20 65 72 72 6f  Interp, for erro
55e0: 72 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 20  r return. */.   
55f0: 20 69 6e 74 20 6f 62 6a 63 3b 09 09 09 2f 2a 20   int objc;.../* 
5600: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
5610: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nts. */.    Tcl_
5620: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
5630: 5d 3b 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 73  ];./* Argument s
5640: 74 72 69 6e 67 73 2e 20 20 46 69 72 73 74 20 63  trings.  First c
5650: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 09 09 09 09  ommand line.....
5660: 20 2a 20 6f 70 74 69 6f 6e 2c 20 69 66 20 69 74   * option, if it
5670: 20 65 78 69 73 74 73 2c 20 62 65 67 69 6e 73 20   exists, begins 
5680: 61 74 20 30 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  at 0. */.    int
5690: 20 2a 66 6f 72 63 65 50 74 72 3b 09 09 2f 2a 20   *forcePtr;../* 
56a0: 49 66 20 74 68 65 20 22 2d 66 6f 72 63 65 22 20  If the "-force" 
56b0: 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 2a  was specified, *
56c0: 66 6f 72 63 65 50 74 72 0a 09 09 09 09 20 2a 20  forcePtr..... * 
56d0: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 31  is filled with 1
56e0: 2c 20 6f 74 68 65 72 77 69 73 65 20 77 69 74 68  , otherwise with
56f0: 20 30 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74   0. */.{.    int
5700: 20 66 6f 72 63 65 2c 20 69 3b 0a 20 20 20 20 0a   force, i;.    .
5710: 20 20 20 20 66 6f 72 63 65 20 3d 20 30 3b 0a 20      force = 0;. 
5720: 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69     for (i = 0; i
5730: 20 3c 20 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b 0a   < objc; i++) {.
5740: 09 69 66 20 28 54 63 6c 5f 47 65 74 53 74 72 69  .if (Tcl_GetStri
5750: 6e 67 28 6f 62 6a 76 5b 69 5d 29 5b 30 5d 20 21  ng(objv[i])[0] !
5760: 3d 20 27 2d 27 29 20 7b 0a 09 20 20 20 20 62 72  = '-') {..    br
5770: 65 61 6b 3b 0a 09 7d 0a 09 69 66 20 28 73 74 72  eak;..}..if (str
5780: 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
5790: 67 28 6f 62 6a 76 5b 69 5d 29 2c 20 22 2d 66 6f  g(objv[i]), "-fo
57a0: 72 63 65 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20  rce") == 0) {.. 
57b0: 20 20 20 66 6f 72 63 65 20 3d 20 31 3b 0a 09 7d     force = 1;..}
57c0: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
57d0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
57e0: 62 6a 76 5b 69 5d 29 2c 20 22 2d 2d 22 29 20 3d  bjv[i]), "--") =
57f0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 2b 2b 3b  = 0) {..    i++;
5800: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 20  ..    break;..} 
5810: 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f  else {..    Tcl_
5820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
5830: 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e  erp, "bad option
5840: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 53 74 72   \"", Tcl_GetStr
5850: 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 2c 20 0a 09  ing(objv[i]), ..
5860: 09 20 20 20 20 22 5c 22 3a 20 73 68 6f 75 6c 64  .    "\": should
5870: 20 62 65 20 2d 66 6f 72 63 65 20 6f 72 20 2d 2d   be -force or --
5880: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
5890: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  ;..    return -1
58a0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a  ;..}.    }.    *
58b0: 66 6f 72 63 65 50 74 72 20 3d 20 66 6f 72 63 65  forcePtr = force
58c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a  ;.    return i;.
58d0: 7d 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  }./*. *---------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5920: 2d 2d 0a 20 2a 0a 20 2a 20 46 69 6c 65 42 61 73  --. *. * FileBas
5930: 65 6e 61 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47  ename --. *. *.G
5940: 69 76 65 6e 20 61 20 70 61 74 68 20 69 6e 20 65  iven a path in e
5950: 69 74 68 65 72 20 74 63 6c 20 66 6f 72 6d 61 74  ither tcl format
5960: 20 28 77 69 74 68 20 2f 20 73 65 70 61 72 61 74   (with / separat
5970: 6f 72 73 29 2c 20 6f 72 20 69 6e 20 74 68 65 0a  ors), or in the.
5980: 20 2a 09 70 6c 61 74 66 6f 72 6d 2d 73 70 65 63   *.platform-spec
5990: 69 66 69 63 20 66 6f 72 6d 61 74 20 66 6f 72 20  ific format for 
59a0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 74  the current plat
59b0: 66 6f 72 6d 2c 20 72 65 74 75 72 6e 20 61 6c 6c  form, return all
59c0: 20 74 68 65 0a 20 2a 09 63 68 61 72 61 63 74 65   the. *.characte
59d0: 72 73 20 69 6e 20 74 68 65 20 70 61 74 68 20 61  rs in the path a
59e0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 64 69  fter the last di
59f0: 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
5a00: 72 2e 20 20 42 75 74 2c 0a 20 2a 09 69 66 20 70  r.  But,. *.if p
5a10: 61 74 68 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ath is the root 
5a20: 64 69 72 65 63 74 6f 72 79 2c 20 72 65 74 75 72  directory, retur
5a30: 6e 73 20 6e 6f 20 63 68 61 72 61 63 74 65 72 73  ns no characters
5a40: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5a50: 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20  . *.Returns the 
5a60: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 20 74 68  string object th
5a70: 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
5a80: 65 20 62 61 73 65 6e 61 6d 65 2e 20 20 49 66 20  e basename.  If 
5a90: 74 68 65 72 65 20 0a 20 2a 09 69 73 20 61 6e 20  there . *.is an 
5aa0: 65 72 72 6f 72 2c 20 61 6e 20 65 72 72 6f 72 20  error, an error 
5ab0: 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
5ac0: 69 6e 20 69 6e 74 65 72 70 2c 20 61 6e 64 20 4e  in interp, and N
5ad0: 55 4c 4c 20 69 73 20 0a 20 2a 09 72 65 74 75 72  ULL is . *.retur
5ae0: 6e 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ned.. *. * Side 
5af0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
5b00: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b50: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54  --. */..static T
5b60: 63 6c 5f 4f 62 6a 20 2a 0a 46 69 6c 65 42 61 73  cl_Obj *.FileBas
5b70: 65 6e 61 6d 65 28 69 6e 74 65 72 70 2c 20 70 61  ename(interp, pa
5b80: 74 68 50 74 72 29 0a 20 20 20 20 54 63 6c 5f 49  thPtr).    Tcl_I
5b90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09  nterp *interp;..
5ba0: 2f 2a 20 49 6e 74 65 72 70 2c 20 66 6f 72 20 65  /* Interp, for e
5bb0: 72 72 6f 72 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  rror return. */.
5bc0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74      Tcl_Obj *pat
5bd0: 68 50 74 72 3b 09 09 2f 2a 20 50 61 74 68 20 77  hPtr;../* Path w
5be0: 68 6f 73 65 20 62 61 73 65 6e 61 6d 65 20 74 6f  hose basename to
5bf0: 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 7b 0a 20   extract. */.{. 
5c00: 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a 20 20 20     int objc;.   
5c10: 20 54 63 6c 5f 4f 62 6a 20 2a 73 70 6c 69 74 50   Tcl_Obj *splitP
5c20: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  tr;.    Tcl_Obj 
5c30: 2a 72 65 73 75 6c 74 50 74 72 20 3d 20 4e 55 4c  *resultPtr = NUL
5c40: 4c 3b 0a 20 20 20 20 0a 20 20 20 20 73 70 6c 69  L;.    .    spli
5c50: 74 50 74 72 20 3d 20 54 63 6c 5f 46 53 53 70 6c  tPtr = Tcl_FSSpl
5c60: 69 74 50 61 74 68 28 70 61 74 68 50 74 72 2c 20  itPath(pathPtr, 
5c70: 26 6f 62 6a 63 29 3b 0a 20 20 20 20 54 63 6c 5f  &objc);.    Tcl_
5c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 70 6c  IncrRefCount(spl
5c90: 69 74 50 74 72 29 3b 0a 20 20 20 20 0a 20 20 20  itPtr);.    .   
5ca0: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 30 29 20   if (objc != 0) 
5cb0: 7b 0a 09 69 66 20 28 28 6f 62 6a 63 20 3d 3d 20  {..if ((objc == 
5cc0: 31 29 20 26 26 20 28 2a 54 63 6c 5f 47 65 74 53  1) && (*Tcl_GetS
5cd0: 74 72 69 6e 67 28 70 61 74 68 50 74 72 29 20 3d  tring(pathPtr) =
5ce0: 3d 20 27 7e 27 29 29 20 7b 0a 09 20 20 20 20 54  = '~')) {..    T
5cf0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5d00: 73 70 6c 69 74 50 74 72 29 3b 0a 09 20 20 20 20  splitPtr);..    
5d10: 69 66 20 28 54 63 6c 5f 46 53 43 6f 6e 76 65 72  if (Tcl_FSConver
5d20: 74 54 6f 50 61 74 68 54 79 70 65 28 69 6e 74 65  tToPathType(inte
5d30: 72 70 2c 20 70 61 74 68 50 74 72 29 20 21 3d 20  rp, pathPtr) != 
5d40: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
5d50: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
5d60: 09 20 20 20 20 73 70 6c 69 74 50 74 72 20 3d 20  .    splitPtr = 
5d70: 54 63 6c 5f 46 53 53 70 6c 69 74 50 61 74 68 28  Tcl_FSSplitPath(
5d80: 70 61 74 68 50 74 72 2c 20 26 6f 62 6a 63 29 3b  pathPtr, &objc);
5d90: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
5da0: 66 43 6f 75 6e 74 28 73 70 6c 69 74 50 74 72 29  fCount(splitPtr)
5db0: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65  ;..}.../*.. * Re
5dc0: 74 75 72 6e 20 74 68 65 20 6c 61 73 74 20 63 6f  turn the last co
5dd0: 6d 70 6f 6e 65 6e 74 2c 20 75 6e 6c 65 73 73 20  mponent, unless 
5de0: 69 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63  it is the only c
5df0: 6f 6d 70 6f 6e 65 6e 74 2c 20 61 6e 64 20 69 74  omponent, and it
5e00: 0a 09 20 2a 20 69 73 20 74 68 65 20 72 6f 6f 74  .. * is the root
5e10: 20 6f 66 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   of an absolute 
5e20: 70 61 74 68 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  path... */...if 
5e30: 28 6f 62 6a 63 20 3e 20 30 29 20 7b 0a 09 20 20  (objc > 0) {..  
5e40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64    Tcl_ListObjInd
5e50: 65 78 28 4e 55 4c 4c 2c 20 73 70 6c 69 74 50 74  ex(NULL, splitPt
5e60: 72 2c 20 6f 62 6a 63 2d 31 2c 20 26 72 65 73 75  r, objc-1, &resu
5e70: 6c 74 50 74 72 29 3b 0a 09 20 20 20 20 69 66 20  ltPtr);..    if 
5e80: 28 28 6f 62 6a 63 20 3d 3d 20 31 29 20 26 26 0a  ((objc == 1) &&.
5e90: 09 20 20 20 20 20 20 28 54 63 6c 5f 46 53 47 65  .      (Tcl_FSGe
5ea0: 74 50 61 74 68 54 79 70 65 28 72 65 73 75 6c 74  tPathType(result
5eb0: 50 74 72 29 20 21 3d 20 54 43 4c 5f 50 41 54 48  Ptr) != TCL_PATH
5ec0: 5f 52 45 4c 41 54 49 56 45 29 29 20 7b 0a 09 09  _RELATIVE)) {...
5ed0: 72 65 73 75 6c 74 50 74 72 20 3d 20 4e 55 4c 4c  resultPtr = NULL
5ee0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
5ef0: 7d 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  }.    if (result
5f00: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr == NULL) {..
5f10: 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c 5f  resultPtr = Tcl_
5f20: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 7d 0a  NewObj();.    }.
5f30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5f40: 6f 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b  ount(resultPtr);
5f50: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5f60: 43 6f 75 6e 74 28 73 70 6c 69 74 50 74 72 29 3b  Count(splitPtr);
5f70: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75  .    return resu
5f80: 6c 74 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ltPtr;.}.../*. *
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
5fe0: 46 69 6c 65 41 74 74 72 73 43 6d 64 20 2d 2d 0a  FileAttrsCmd --.
5ff0: 20 2a 0a 20 2a 20 20 20 20 20 20 53 65 74 73 20   *. *      Sets 
6000: 6f 72 20 67 65 74 73 20 74 68 65 20 70 6c 61 74  or gets the plat
6010: 66 6f 72 6d 2d 73 70 65 63 69 66 69 63 20 61 74  form-specific at
6020: 74 72 69 62 75 74 65 73 20 6f 66 20 61 20 66 69  tributes of a fi
6030: 6c 65 2e 20 20 54 68 65 0a 20 2a 20 20 20 20 20  le.  The. *     
6040: 20 6f 62 6a 63 2d 6f 62 6a 76 20 70 6f 69 6e 74   objc-objv point
6050: 73 20 74 6f 20 74 68 65 20 66 69 6c 65 20 6e 61  s to the file na
6060: 6d 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  me with the rest
6070: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 0a   of the command.
6080: 20 2a 20 20 20 20 20 20 6c 69 6e 65 20 66 6f 6c   *      line fol
6090: 6c 6f 77 69 6e 67 2e 20 20 54 68 69 73 20 72 6f  lowing.  This ro
60a0: 75 74 69 6e 65 20 75 73 65 73 20 70 6c 61 74 66  utine uses platf
60b0: 6f 72 6d 2d 73 70 65 63 69 66 69 63 20 74 61 62  orm-specific tab
60c0: 6c 65 73 20 6f 66 0a 20 2a 20 20 20 20 20 20 6f  les of. *      o
60d0: 70 74 69 6f 6e 20 73 74 72 69 6e 67 73 20 61 6e  ption strings an
60e0: 64 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 54 68  d callbacks.  Th
60f0: 65 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 67 65  e callback to ge
6100: 74 20 74 68 65 0a 20 2a 20 20 20 20 20 20 61 74  t the. *      at
6110: 74 72 69 62 75 74 65 73 20 74 61 6b 65 20 74 68  tributes take th
6120: 72 65 65 20 70 61 72 61 6d 65 74 65 72 73 3a 0a  ree parameters:.
6130: 20 2a 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   *.    Tcl_Inter
6140: 70 20 2a 69 6e 74 65 72 70 3b 09 20 20 20 20 54  p *interp;.    T
6150: 68 65 20 69 6e 74 65 72 70 20 74 6f 20 72 65 70  he interp to rep
6160: 6f 72 74 20 65 72 72 6f 72 73 20 77 69 74 68 2e  ort errors with.
6170: 0a 20 2a 09 09 09 09 20 20 20 20 53 69 6e 63 65  . *....    Since
6180: 20 74 68 69 73 20 69 73 20 61 6e 20 6f 62 6a 65   this is an obje
6190: 63 74 2d 62 61 73 65 64 20 41 50 49 2c 0a 20 2a  ct-based API,. *
61a0: 09 09 09 09 20 20 20 20 74 68 65 20 6f 62 6a 65  ....    the obje
61b0: 63 74 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 72  ct form of the r
61c0: 65 73 75 6c 74 20 73 68 6f 75 6c 64 20 0a 20 2a  esult should . *
61d0: 09 09 09 09 20 20 20 20 62 65 20 75 73 65 64 2e  ....    be used.
61e0: 0a 20 2a 09 20 20 20 20 43 4f 4e 53 54 20 63 68  . *.    CONST ch
61f0: 61 72 20 2a 66 69 6c 65 4e 61 6d 65 3b 20 20 20  ar *fileName;   
6200: 54 68 69 73 20 69 73 20 65 78 74 72 61 63 74 65  This is extracte
6210: 64 20 75 73 69 6e 67 0a 20 2a 09 09 09 09 20 20  d using. *....  
6220: 20 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46    Tcl_TranslateF
6230: 69 6c 65 4e 61 6d 65 2e 0a 20 2a 09 20 20 20 20  ileName.. *.    
6240: 54 63 6c 4f 62 6a 20 2a 2a 61 74 74 72 4f 62 6a  TclObj **attrObj
6250: 50 74 72 50 74 72 3b 20 41 20 6e 65 77 20 6f 62  PtrPtr; A new ob
6260: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 74 68 65  ject to hold the
6270: 20 61 74 74 72 69 62 75 74 65 0a 20 2a 09 09 09   attribute. *...
6280: 09 20 20 20 20 69 73 20 61 6c 6c 6f 63 61 74 65  .    is allocate
6290: 64 20 61 6e 64 20 70 75 74 20 68 65 72 65 2e 0a  d and put here..
62a0: 20 2a 09 54 68 65 20 66 69 72 73 74 20 74 77 6f   *.The first two
62b0: 20 70 61 72 61 6d 65 74 65 72 73 20 6f 66 20 74   parameters of t
62c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  he callback used
62d0: 20 74 6f 20 77 72 69 74 65 20 6f 75 74 20 74 68   to write out th
62e0: 65 0a 20 2a 09 61 74 74 72 69 62 75 74 65 73 20  e. *.attributes 
62f0: 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 54 68  are the same. Th
6300: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
6310: 72 20 69 73 3a 0a 20 2a 09 20 20 20 20 43 4f 4e  r is:. *.    CON
6320: 53 54 20 2a 61 74 74 72 4f 62 6a 50 74 72 3b 09  ST *attrObjPtr;.
6330: 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f      A pointer to
6340: 20 74 68 65 20 6f 62 6a 65 63 74 20 74 68 61 74   the object that
6350: 20 68 61 73 0a 20 2a 09 09 09 09 20 20 20 20 74   has. *....    t
6360: 68 65 20 6e 65 77 20 61 74 74 72 69 62 75 74 65  he new attribute
6370: 2e 0a 20 2a 09 54 68 65 79 20 62 6f 74 68 20 72  .. *.They both r
6380: 65 74 75 72 6e 20 73 74 61 6e 64 61 72 64 20 54  eturn standard T
6390: 43 4c 20 65 72 72 6f 72 73 3b 20 69 66 20 74 68  CL errors; if th
63a0: 65 20 72 6f 75 74 69 6e 65 20 74 6f 20 67 65 74  e routine to get
63b0: 0a 20 2a 09 61 6e 20 61 74 74 72 69 62 75 74 65  . *.an attribute
63c0: 20 66 61 69 6c 73 2c 20 6e 6f 20 6f 62 6a 65 63   fails, no objec
63d0: 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
63e0: 6e 64 20 2a 61 74 74 72 4f 62 6a 50 74 72 50 74  nd *attrObjPtrPt
63f0: 72 0a 20 2a 09 69 73 20 75 6e 63 68 61 6e 67 65  r. *.is unchange
6400: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
6410: 3a 0a 20 2a 20 20 20 20 20 20 53 74 61 6e 64 61  :. *      Standa
6420: 72 64 20 54 43 4c 20 65 72 72 6f 72 2e 0a 20 2a  rd TCL error.. *
6430: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6440: 3a 0a 20 2a 20 20 20 20 20 20 4d 61 79 20 73 65  :. *      May se
6450: 74 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  t file attribute
6460: 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 6e  s for the file n
6470: 61 6d 65 2e 0a 20 2a 20 20 20 20 20 20 0a 20 2a  ame.. *      . *
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a  ------. */..int.
64d0: 54 63 6c 46 69 6c 65 41 74 74 72 73 43 6d 64 28  TclFileAttrsCmd(
64e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62  interp, objc, ob
64f0: 6a 76 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  jv).    Tcl_Inte
6500: 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20  rp *interp;../* 
6510: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  The interpreter 
6520: 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74  for error report
6530: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ing. */.    int 
6540: 6f 62 6a 63 3b 09 09 09 2f 2a 20 4e 75 6d 62 65  objc;.../* Numbe
6550: 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  r of command lin
6560: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  e arguments. */.
6570: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e      Tcl_Obj *CON
6580: 53 54 20 6f 62 6a 76 5b 5d 3b 09 2f 2a 20 54 68  ST objv[];./* Th
6590: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  e command line o
65a0: 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20  bjects. */.{.   
65b0: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20   int result;.   
65c0: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 2a 20 61   CONST char ** a
65d0: 74 74 72 69 62 75 74 65 53 74 72 69 6e 67 73 3b  ttributeStrings;
65e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 2a 20 6f 62  .    Tcl_Obj* ob
65f0: 6a 53 74 72 69 6e 67 73 20 3d 20 4e 55 4c 4c 3b  jStrings = NULL;
6600: 0a 20 20 20 20 69 6e 74 20 6e 75 6d 4f 62 6a 53  .    int numObjS
6610: 74 72 69 6e 67 73 20 3d 20 2d 31 3b 0a 20 20 20  trings = -1;.   
6620: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 50 74   Tcl_Obj *filePt
6630: 72 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28  r;.    .    if (
6640: 6f 62 6a 63 20 3c 20 33 29 20 7b 0a 09 54 63 6c  objc < 3) {..Tcl
6650: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6660: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 0a 09  terp, 2, objv,..
6670: 09 22 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 3f 20  ."name ?option? 
6680: 3f 76 61 6c 75 65 3f 20 3f 6f 70 74 69 6f 6e 20  ?value? ?option 
6690: 76 61 6c 75 65 20 2e 2e 2e 3f 22 29 3b 0a 09 72  value ...?");..r
66a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
66b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 69 6c 65  .    }..    file
66c0: 50 74 72 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  Ptr = objv[2];. 
66d0: 20 20 20 69 66 20 28 54 63 6c 5f 46 53 43 6f 6e     if (Tcl_FSCon
66e0: 76 65 72 74 54 6f 50 61 74 68 54 79 70 65 28 69  vertToPathType(i
66f0: 6e 74 65 72 70 2c 20 66 69 6c 65 50 74 72 29 20  nterp, filePtr) 
6700: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 20 20 20  != TCL_OK) {.   
6710: 20 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52   .return TCL_ERR
6720: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  OR;.    }.    . 
6730: 20 20 20 6f 62 6a 63 20 2d 3d 20 33 3b 0a 20 20     objc -= 3;.  
6740: 20 20 6f 62 6a 76 20 2b 3d 20 33 3b 0a 20 20 20    objv += 3;.   
6750: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52   result = TCL_ER
6760: 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ROR;.    Tcl_Set
6770: 45 72 72 6e 6f 28 30 29 3b 0a 20 20 20 20 61 74  Errno(0);.    at
6780: 74 72 69 62 75 74 65 53 74 72 69 6e 67 73 20 3d  tributeStrings =
6790: 20 54 63 6c 5f 46 53 46 69 6c 65 41 74 74 72 53   Tcl_FSFileAttrS
67a0: 74 72 69 6e 67 73 28 66 69 6c 65 50 74 72 2c 20  trings(filePtr, 
67b0: 26 6f 62 6a 53 74 72 69 6e 67 73 29 3b 0a 20 20  &objStrings);.  
67c0: 20 20 69 66 20 28 61 74 74 72 69 62 75 74 65 53    if (attributeS
67d0: 74 72 69 6e 67 73 20 3d 3d 20 4e 55 4c 4c 29 20  trings == NULL) 
67e0: 7b 0a 09 69 6e 74 20 69 6e 64 65 78 3b 0a 09 54  {..int index;..T
67f0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
6800: 09 69 66 20 28 6f 62 6a 53 74 72 69 6e 67 73 20  .if (objStrings 
6810: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
6820: 69 66 20 28 54 63 6c 5f 47 65 74 45 72 72 6e 6f  if (Tcl_GetErrno
6830: 28 29 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  () != 0) {.../* 
6840: 0a 09 09 20 2a 20 54 68 65 72 65 20 77 61 73 20  ... * There was 
6850: 61 6e 20 65 72 72 6f 72 2c 20 70 72 6f 62 61 62  an error, probab
6860: 6c 79 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ly that the file
6870: 50 74 72 20 69 73 0a 09 09 20 2a 20 6e 6f 74 20  Ptr is... * not 
6880: 61 63 63 65 70 74 65 64 20 62 79 20 61 6e 79 20  accepted by any 
6890: 66 69 6c 65 73 79 73 74 65 6d 0a 09 09 20 2a 2f  filesystem... */
68a0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
68b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
68c0: 6c 64 20 6e 6f 74 20 72 65 61 64 20 5c 22 22 2c  ld not read \"",
68d0: 0a 09 09 09 54 63 6c 5f 47 65 74 53 74 72 69 6e  ....Tcl_GetStrin
68e0: 67 28 66 69 6c 65 50 74 72 29 2c 20 22 5c 22 3a  g(filePtr), "\":
68f0: 20 22 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72   ", Tcl_PosixErr
6900: 6f 72 28 69 6e 74 65 72 70 29 2c 20 0a 09 09 09  or(interp), ....
6910: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
6920: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
6930: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
6940: 67 6f 74 6f 20 65 6e 64 3b 0a 09 7d 0a 09 2f 2a  goto end;..}../*
6950: 20 57 65 20 6f 77 6e 20 74 68 65 20 6f 62 6a 65   We own the obje
6960: 63 74 20 6e 6f 77 20 2a 2f 0a 09 54 63 6c 5f 49  ct now */..Tcl_I
6970: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 53  ncrRefCount(objS
6980: 74 72 69 6e 67 73 29 3b 0a 20 20 20 20 20 20 20  trings);.       
6990: 20 2f 2a 20 55 73 65 20 6f 62 6a 53 74 72 69 6e   /* Use objStrin
69a0: 67 73 20 61 73 20 61 20 6c 69 73 74 20 6f 62 6a  gs as a list obj
69b0: 65 63 74 20 2a 2f 0a 09 69 66 20 28 54 63 6c 5f  ect */..if (Tcl_
69c0: 4c 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e  ListObjLength(in
69d0: 74 65 72 70 2c 20 6f 62 6a 53 74 72 69 6e 67 73  terp, objStrings
69e0: 2c 20 26 6e 75 6d 4f 62 6a 53 74 72 69 6e 67 73  , &numObjStrings
69f0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
6a00: 20 20 20 20 67 6f 74 6f 20 65 6e 64 3b 0a 09 7d      goto end;..}
6a10: 0a 09 61 74 74 72 69 62 75 74 65 53 74 72 69 6e  ..attributeStrin
6a20: 67 73 20 3d 20 28 43 4f 4e 53 54 20 63 68 61 72  gs = (CONST char
6a30: 20 2a 2a 29 0a 09 09 63 6b 61 6c 6c 6f 63 20 28   **)...ckalloc (
6a40: 28 31 2b 6e 75 6d 4f 62 6a 53 74 72 69 6e 67 73  (1+numObjStrings
6a50: 29 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ) * sizeof(char*
6a60: 29 29 3b 0a 09 66 6f 72 20 28 69 6e 64 65 78 20  ));..for (index 
6a70: 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20 6e 75 6d  = 0; index < num
6a80: 4f 62 6a 53 74 72 69 6e 67 73 3b 20 69 6e 64 65  ObjStrings; inde
6a90: 78 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  x++) {..    Tcl_
6aa0: 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28 69 6e 74  ListObjIndex(int
6ab0: 65 72 70 2c 20 6f 62 6a 53 74 72 69 6e 67 73 2c  erp, objStrings,
6ac0: 20 69 6e 64 65 78 2c 20 26 6f 62 6a 50 74 72 29   index, &objPtr)
6ad0: 3b 0a 09 20 20 20 20 61 74 74 72 69 62 75 74 65  ;..    attribute
6ae0: 53 74 72 69 6e 67 73 5b 69 6e 64 65 78 5d 20 3d  Strings[index] =
6af0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
6b00: 62 6a 50 74 72 29 3b 0a 09 7d 0a 09 61 74 74 72  bjPtr);..}..attr
6b10: 69 62 75 74 65 53 74 72 69 6e 67 73 5b 69 6e 64  ibuteStrings[ind
6b20: 65 78 5d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ex] = NULL;.    
6b30: 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  }.    if (objc =
6b40: 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 47  = 0) {../*.. * G
6b50: 65 74 20 61 6c 6c 20 61 74 74 72 69 62 75 74 65  et all attribute
6b60: 73 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20 69 6e  s... */...int in
6b70: 64 65 78 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f  dex, res = TCL_O
6b80: 4b 2c 20 6e 62 41 74 74 73 20 3d 20 30 3b 0a 09  K, nbAtts = 0;..
6b90: 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72  Tcl_Obj *listPtr
6ba0: 3b 0a 09 20 0a 09 6c 69 73 74 50 74 72 20 3d 20  ;.. ..listPtr = 
6bb0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
6bc0: 2c 20 4e 55 4c 4c 29 3b 0a 09 66 6f 72 20 28 69  , NULL);..for (i
6bd0: 6e 64 65 78 20 3d 20 30 3b 20 61 74 74 72 69 62  ndex = 0; attrib
6be0: 75 74 65 53 74 72 69 6e 67 73 5b 69 6e 64 65 78  uteStrings[index
6bf0: 5d 20 21 3d 20 4e 55 4c 4c 3b 20 69 6e 64 65 78  ] != NULL; index
6c00: 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4f  ++) {..    Tcl_O
6c10: 62 6a 20 2a 6f 62 6a 50 74 72 41 74 74 72 3b 0a  bj *objPtrAttr;.
6c20: 09 20 20 20 20 0a 09 20 20 20 20 69 66 20 28 72  .    ..    if (r
6c30: 65 73 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  es != TCL_OK) {.
6c40: 09 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 65 61  .        /* Clea
6c50: 72 20 74 68 65 20 65 72 72 6f 72 20 66 72 6f 6d  r the error from
6c60: 20 74 68 65 20 6c 61 73 74 20 69 74 65 72 61 74   the last iterat
6c70: 69 6f 6e 20 2a 2f 0a 09 20 20 20 20 20 20 20 20  ion */..        
6c80: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
6c90: 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 7d 0a  interp);..    }.
6ca0: 09 20 20 20 20 72 65 73 20 3d 20 54 63 6c 5f 46  .    res = Tcl_F
6cb0: 53 46 69 6c 65 41 74 74 72 73 47 65 74 28 69 6e  SFileAttrsGet(in
6cc0: 74 65 72 70 2c 20 69 6e 64 65 78 2c 20 66 69 6c  terp, index, fil
6cd0: 65 50 74 72 2c 20 26 6f 62 6a 50 74 72 41 74 74  ePtr, &objPtrAtt
6ce0: 72 29 3b 0a 09 20 20 20 20 69 66 20 28 72 65 73  r);..    if (res
6cf0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   == TCL_OK) {.. 
6d00: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
6d10: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
6d20: 53 74 72 69 6e 67 4f 62 6a 28 61 74 74 72 69 62  StringObj(attrib
6d30: 75 74 65 53 74 72 69 6e 67 73 5b 69 6e 64 65 78  uteStrings[index
6d40: 5d 2c 20 2d 31 29 3b 0a 09 20 20 20 20 20 20 20  ], -1);..       
6d50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6d60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6d70: 2c 20 6c 69 73 74 50 74 72 2c 20 6f 62 6a 50 74  , listPtr, objPt
6d80: 72 29 3b 0a 09 20 20 20 20 20 20 20 20 54 63 6c  r);..        Tcl
6d90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6da0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
6db0: 73 74 50 74 72 2c 20 6f 62 6a 50 74 72 41 74 74  stPtr, objPtrAtt
6dc0: 72 29 3b 0a 09 20 20 20 20 20 20 20 20 6e 62 41  r);..        nbA
6dd0: 74 74 73 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 7d  tts++;..    }..}
6de0: 0a 09 69 66 20 28 69 6e 64 65 78 20 3e 20 30 20  ..if (index > 0 
6df0: 26 26 20 6e 62 41 74 74 73 20 3d 3d 20 30 29 20  && nbAtts == 0) 
6e00: 7b 0a 09 20 20 20 20 2f 2a 20 45 72 72 6f 72 3a  {..    /* Error:
6e10: 20 6e 6f 20 76 61 6c 69 64 20 61 74 74 72 69 62   no valid attrib
6e20: 75 74 65 73 20 66 6f 75 6e 64 20 2a 2f 0a 09 20  utes found */.. 
6e30: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
6e40: 75 6e 74 28 6c 69 73 74 50 74 72 29 3b 0a 09 20  unt(listPtr);.. 
6e50: 20 20 20 67 6f 74 6f 20 65 6e 64 3b 0a 09 7d 0a     goto end;..}.
6e60: 20 20 20 20 09 54 63 6c 5f 53 65 74 4f 62 6a 52      .Tcl_SetObjR
6e70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69  esult(interp, li
6e80: 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c  stPtr);.    } el
6e90: 73 65 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 31  se if (objc == 1
6ea0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 20  ) {../*.. * Get 
6eb0: 6f 6e 65 20 61 74 74 72 69 62 75 74 65 2e 0a 09  one attribute...
6ec0: 20 2a 2f 0a 0a 09 69 6e 74 20 69 6e 64 65 78 3b   */...int index;
6ed0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74  ..Tcl_Obj *objPt
6ee0: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66 20 28  r = NULL;...if (
6ef0: 6e 75 6d 4f 62 6a 53 74 72 69 6e 67 73 20 3d 3d  numObjStrings ==
6f00: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41   0) {..    Tcl_A
6f10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6f20: 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20  rp, "bad option 
6f30: 5c 22 22 2c 0a 09 09 20 20 20 20 54 63 6c 5f 47  \"",...    Tcl_G
6f40: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
6f50: 29 2c 20 22 5c 22 2c 20 74 68 65 72 65 20 61 72  ), "\", there ar
6f60: 65 20 6e 6f 20 66 69 6c 65 20 61 74 74 72 69 62  e no file attrib
6f70: 75 74 65 73 22 0a 09 09 09 20 20 20 20 20 22 20  utes"....     " 
6f80: 69 6e 20 74 68 69 73 20 66 69 6c 65 73 79 73 74  in this filesyst
6f90: 65 6d 2e 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  em.", (char *) N
6fa0: 55 4c 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20  ULL);..    goto 
6fb0: 65 6e 64 3b 0a 09 7d 0a 0a 09 69 66 20 28 54 63  end;..}...if (Tc
6fc0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
6fd0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 30  j(interp, objv[0
6fe0: 5d 2c 20 61 74 74 72 69 62 75 74 65 53 74 72 69  ], attributeStri
6ff0: 6e 67 73 2c 0a 09 09 22 6f 70 74 69 6f 6e 22 2c  ngs,..."option",
7000: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
7010: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 67 6f  CL_OK) {..    go
7020: 74 6f 20 65 6e 64 3b 0a 09 7d 0a 09 69 66 20 28  to end;..}..if (
7030: 54 63 6c 5f 46 53 46 69 6c 65 41 74 74 72 73 47  Tcl_FSFileAttrsG
7040: 65 74 28 69 6e 74 65 72 70 2c 20 69 6e 64 65 78  et(interp, index
7050: 2c 20 66 69 6c 65 50 74 72 2c 0a 09 09 26 6f 62  , filePtr,...&ob
7060: 6a 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  jPtr) != TCL_OK)
7070: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65 6e 64   {..    goto end
7080: 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  ;..}..Tcl_SetObj
7090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
70a0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c  bjPtr);.    } el
70b0: 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 74  se {../*.. * Set
70c0: 20 6f 70 74 69 6f 6e 2f 76 61 6c 75 65 20 70 61   option/value pa
70d0: 69 72 73 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20  irs... */...int 
70e0: 69 2c 20 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  i, index;.      
70f0: 20 20 0a 09 69 66 20 28 6e 75 6d 4f 62 6a 53 74    ..if (numObjSt
7100: 72 69 6e 67 73 20 3d 3d 20 30 29 20 7b 0a 09 20  rings == 0) {.. 
7110: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
7130: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 0a 09 09 20   option \"",... 
7140: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
7150: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 5c 22 2c 20  (objv[0]), "\", 
7160: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 69 6c  there are no fil
7170: 65 20 61 74 74 72 69 62 75 74 65 73 22 0a 09 09  e attributes"...
7180: 09 20 20 20 20 20 22 20 69 6e 20 74 68 69 73 20  .     " in this 
7190: 66 69 6c 65 73 79 73 74 65 6d 2e 22 2c 20 28 63  filesystem.", (c
71a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
71b0: 20 20 20 67 6f 74 6f 20 65 6e 64 3b 0a 09 7d 0a     goto end;..}.
71c0: 0a 20 20 20 20 09 66 6f 72 20 28 69 20 3d 20 30  .    .for (i = 0
71d0: 3b 20 69 20 3c 20 6f 62 6a 63 20 3b 20 69 20 2b  ; i < objc ; i +
71e0: 3d 20 32 29 20 7b 0a 20 20 20 20 09 20 20 20 20  = 2) {.    .    
71f0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
7200: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7210: 6f 62 6a 76 5b 69 5d 2c 20 61 74 74 72 69 62 75  objv[i], attribu
7220: 74 65 53 74 72 69 6e 67 73 2c 0a 09 09 20 20 20  teStrings,...   
7230: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 69   "option", 0, &i
7240: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ndex) != TCL_OK)
7250: 20 7b 0a 09 09 67 6f 74 6f 20 65 6e 64 3b 0a 20   {...goto end;. 
7260: 20 20 20 09 20 20 20 20 7d 0a 09 20 20 20 20 69     .    }..    i
7270: 66 20 28 69 20 2b 20 31 20 3d 3d 20 6f 62 6a 63  f (i + 1 == objc
7280: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
7290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
72a0: 76 61 6c 75 65 20 66 6f 72 20 5c 22 22 2c 0a 09  value for \"",..
72b0: 09 09 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ..Tcl_GetString(
72c0: 6f 62 6a 76 5b 69 5d 29 2c 20 22 5c 22 20 6d 69  objv[i]), "\" mi
72d0: 73 73 69 6e 67 22 2c 0a 09 09 09 28 63 68 61 72  ssing",....(char
72e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 67 6f 74   *) NULL);...got
72f0: 6f 20 65 6e 64 3b 0a 09 20 20 20 20 7d 0a 20 20  o end;..    }.  
7300: 20 20 09 20 20 20 20 69 66 20 28 54 63 6c 5f 46    .    if (Tcl_F
7310: 53 46 69 6c 65 41 74 74 72 73 53 65 74 28 69 6e  SFileAttrsSet(in
7320: 74 65 72 70 2c 20 69 6e 64 65 78 2c 20 66 69 6c  terp, index, fil
7330: 65 50 74 72 2c 0a 20 20 20 20 09 20 20 20 20 09  ePtr,.    .    .
7340: 20 20 20 20 6f 62 6a 76 5b 69 20 2b 20 31 5d 29      objv[i + 1])
7350: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
7360: 67 6f 74 6f 20 65 6e 64 3b 0a 20 20 20 20 09 20  goto end;.    . 
7370: 20 20 20 7d 0a 20 20 20 20 09 7d 0a 20 20 20 20     }.    .}.    
7380: 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  }.    result = T
7390: 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 65 6e 64 3a  CL_OK;..    end:
73a0: 0a 20 20 20 20 69 66 20 28 6e 75 6d 4f 62 6a 53  .    if (numObjS
73b0: 74 72 69 6e 67 73 20 21 3d 20 2d 31 29 20 7b 0a  trings != -1) {.
73c0: 09 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20  ./* Free up the 
73d0: 61 72 72 61 79 20 77 65 20 61 6c 6c 6f 63 61 74  array we allocat
73e0: 65 64 20 2a 2f 0a 09 63 6b 66 72 65 65 28 28 63  ed */..ckfree((c
73f0: 68 61 72 2a 29 61 74 74 72 69 62 75 74 65 53 74  har*)attributeSt
7400: 72 69 6e 67 73 29 3b 0a 09 2f 2a 20 0a 09 20 2a  rings);../* .. *
7410: 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74   We don't need t
7420: 68 69 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20  his object that 
7430: 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 75 73  was passed to us
7440: 0a 09 20 2a 20 61 6e 79 20 6d 6f 72 65 2e 0a 09  .. * any more...
7450: 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 53 74 72 69   */..if (objStri
7460: 6e 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ngs != NULL) {..
7470: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
7480: 6f 75 6e 74 28 6f 62 6a 53 74 72 69 6e 67 73 29  ount(objStrings)
7490: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;..}.    }.    r
74a0: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a  eturn result;.}.