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;.}.