0000: 2f 2a 0a 20 2a 20 74 63 6c 55 6e 69 78 46 43 6d /*. * tclUnixFCm
0010: 64 2e 63 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 d.c. *. *.This f
0020: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 ile implements t
0030: 68 65 20 55 6e 69 78 20 73 70 65 63 69 66 69 63 he Unix specific
0040: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 66 69 6c 65 portion of file
0050: 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 0a 20 2a manipulation. *
0060: 09 73 75 62 63 6f 6d 6d 61 6e 64 73 20 6f 66 20 .subcommands of
0070: 74 68 65 20 22 66 69 6c 65 22 20 63 6f 6d 6d 61 the "file" comma
0080: 6e 64 2e 20 41 6c 6c 20 66 69 6c 65 6e 61 6d 65 nd. All filename
0090: 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c arguments shoul
00a0: 64 0a 20 2a 09 61 6c 72 65 61 64 79 20 62 65 20 d. *.already be
00b0: 74 72 61 6e 73 6c 61 74 65 64 20 74 6f 20 6e 61 translated to na
00c0: 74 69 76 65 20 66 6f 72 6d 61 74 2e 0a 20 2a 0a tive format.. *.
00d0: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 * Copyright (c)
00e0: 20 31 39 39 36 2d 31 39 39 38 20 53 75 6e 20 4d 1996-1998 Sun M
00f0: 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63 icrosystems, Inc
0100: 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 20 .. *. * See the
0110: 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 65 file "license.te
0120: 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d 61 rms" for informa
0130: 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 6e tion on usage an
0140: 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e d redistribution
0150: 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c 65 of. * this file
0160: 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 43 , and for a DISC
0170: 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 41 LAIMER OF ALL WA
0180: 52 52 41 4e 54 49 45 53 2e 0a 20 2a 0a 20 2a 20 RRANTIES.. *. *
0190: 50 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 69 73 Portions of this
01a0: 20 63 6f 64 65 20 77 65 72 65 20 64 65 72 69 76 code were deriv
01b0: 65 64 20 66 72 6f 6d 20 4e 65 74 42 53 44 20 73 ed from NetBSD s
01c0: 6f 75 72 63 65 20 63 6f 64 65 20 77 68 69 63 68 ource code which
01d0: 20 68 61 73 20 74 68 65 0a 20 2a 20 66 6f 6c 6c has the. * foll
01e0: 6f 77 69 6e 67 20 63 6f 70 79 72 69 67 68 74 20 owing copyright
01f0: 6e 6f 74 69 63 65 3a 0a 20 2a 0a 20 2a 20 43 6f notice:. *. * Co
0200: 70 79 72 69 67 68 74 20 28 63 29 20 31 39 38 38 pyright (c) 1988
0210: 2c 20 31 39 39 33 2c 20 31 39 39 34 0a 20 2a 20 , 1993, 1994. *
0220: 20 20 20 20 20 54 68 65 20 52 65 67 65 6e 74 73 The Regents
0230: 20 6f 66 20 74 68 65 20 55 6e 69 76 65 72 73 69 of the Universi
0240: 74 79 20 6f 66 20 43 61 6c 69 66 6f 72 6e 69 61 ty of California
0250: 2e 20 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 . All rights res
0260: 65 72 76 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 64 erved.. *. * Red
0270: 69 73 74 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 istribution and
0280: 75 73 65 20 69 6e 20 73 6f 75 72 63 65 20 61 6e use in source an
0290: 64 20 62 69 6e 61 72 79 20 66 6f 72 6d 73 2c 20 d binary forms,
02a0: 77 69 74 68 20 6f 72 20 77 69 74 68 6f 75 74 0a with or without.
02b0: 20 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c * modification,
02c0: 20 61 72 65 20 70 65 72 6d 69 74 74 65 64 20 70 are permitted p
02d0: 72 6f 76 69 64 65 64 20 74 68 61 74 20 74 68 65 rovided that the
02e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 following condi
02f0: 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 20 tions are met:.
0300: 2a 20 31 2e 20 52 65 64 69 73 74 72 69 62 75 74 * 1. Redistribut
0310: 69 6f 6e 73 20 6f 66 20 73 6f 75 72 63 65 20 63 ions of source c
0320: 6f 64 65 20 6d 75 73 74 20 72 65 74 61 69 6e 20 ode must retain
0330: 74 68 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 the above copyri
0340: 67 68 74 20 6e 6f 74 69 63 65 2c 0a 20 2a 20 20 ght notice,. *
0350: 20 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63 this list of c
0360: 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 onditions and th
0370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 e following disc
0380: 6c 61 69 6d 65 72 2e 0a 20 2a 20 32 2e 20 52 65 laimer.. * 2. Re
0390: 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 69 6e distributions in
03a0: 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d 75 73 binary form mus
03b0: 74 20 72 65 70 72 6f 64 75 63 65 20 74 68 65 20 t reproduce the
03c0: 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a above copyright.
03d0: 20 2a 20 20 20 20 6e 6f 74 69 63 65 2c 20 74 68 * notice, th
03e0: 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64 69 is list of condi
03f0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66 6f tions and the fo
0400: 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69 6d llowing disclaim
0410: 65 72 20 69 6e 20 74 68 65 0a 20 2a 20 20 20 20 er in the. *
0420: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 6e documentation an
0430: 64 2f 6f 72 20 6f 74 68 65 72 20 6d 61 74 65 72 d/or other mater
0440: 69 61 6c 73 20 70 72 6f 76 69 64 65 64 20 77 69 ials provided wi
0450: 74 68 20 74 68 65 20 64 69 73 74 72 69 62 75 74 th the distribut
0460: 69 6f 6e 2e 0a 20 2a 20 33 2e 20 4e 65 69 74 68 ion.. * 3. Neith
0470: 65 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 er the name of t
0480: 68 65 20 55 6e 69 76 65 72 73 69 74 79 20 6e 6f he University no
0490: 72 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 69 r the names of i
04a0: 74 73 20 63 6f 6e 74 72 69 62 75 74 6f 72 73 20 ts contributors
04b0: 6d 61 79 0a 20 2a 20 20 20 20 62 65 20 75 73 65 may. * be use
04c0: 64 20 74 6f 20 65 6e 64 6f 72 73 65 20 6f 72 20 d to endorse or
04d0: 70 72 6f 6d 6f 74 65 20 70 72 6f 64 75 63 74 73 promote products
04e0: 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 derived from th
04f0: 69 73 20 73 6f 66 74 77 61 72 65 0a 20 2a 20 20 is software. *
0500: 20 20 77 69 74 68 6f 75 74 20 73 70 65 63 69 66 without specif
0510: 69 63 20 70 72 69 6f 72 20 77 72 69 74 74 65 6e ic prior written
0520: 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a 20 2a 0a permission.. *.
0530: 20 2a 20 54 48 49 53 20 53 4f 46 54 57 41 52 45 * THIS SOFTWARE
0540: 20 49 53 20 50 52 4f 56 49 44 45 44 20 42 59 20 IS PROVIDED BY
0550: 54 48 45 20 52 45 47 45 4e 54 53 20 41 4e 44 20 THE REGENTS AND
0560: 43 4f 4e 54 52 49 42 55 54 4f 52 53 20 60 60 41 CONTRIBUTORS ``A
0570: 53 20 49 53 27 27 20 41 4e 44 20 41 4e 59 0a 20 S IS'' AND ANY.
0580: 2a 20 45 58 50 52 45 53 53 20 4f 52 20 49 4d 50 * EXPRESS OR IMP
0590: 4c 49 45 44 20 57 41 52 52 41 4e 54 49 45 53 2c LIED WARRANTIES,
05a0: 20 49 4e 43 4c 55 44 49 4e 47 2c 20 42 55 54 20 INCLUDING, BUT
05b0: 4e 4f 54 20 4c 49 4d 49 54 45 44 20 54 4f 2c 20 NOT LIMITED TO,
05c0: 54 48 45 20 49 4d 50 4c 49 45 44 0a 20 2a 20 57 THE IMPLIED. * W
05d0: 41 52 52 41 4e 54 49 45 53 20 4f 46 20 4d 45 52 ARRANTIES OF MER
05e0: 43 48 41 4e 54 41 42 49 4c 49 54 59 20 41 4e 44 CHANTABILITY AND
05f0: 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50 FITNESS FOR A P
0600: 41 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f 53 ARTICULAR PURPOS
0610: 45 20 41 52 45 0a 20 2a 20 44 49 53 43 4c 41 49 E ARE. * DISCLAI
0620: 4d 45 44 2e 20 49 4e 20 4e 4f 20 45 56 45 4e 54 MED. IN NO EVENT
0630: 20 53 48 41 4c 4c 20 54 48 45 20 52 45 47 45 4e SHALL THE REGEN
0640: 54 53 20 4f 52 20 43 4f 4e 54 52 49 42 55 54 4f TS OR CONTRIBUTO
0650: 52 53 20 42 45 20 4c 49 41 42 4c 45 20 46 4f 52 RS BE LIABLE FOR
0660: 20 41 4e 59 0a 20 2a 20 44 49 52 45 43 54 2c 20 ANY. * DIRECT,
0670: 49 4e 44 49 52 45 43 54 2c 20 49 4e 43 49 44 45 INDIRECT, INCIDE
0680: 4e 54 41 4c 2c 20 53 50 45 43 49 41 4c 2c 20 45 NTAL, SPECIAL, E
0690: 58 45 4d 50 4c 41 52 59 2c 20 4f 52 20 43 4f 4e XEMPLARY, OR CON
06a0: 53 45 51 55 45 4e 54 49 41 4c 20 44 41 4d 41 47 SEQUENTIAL DAMAG
06b0: 45 53 0a 20 2a 20 28 49 4e 43 4c 55 44 49 4e 47 ES. * (INCLUDING
06c0: 2c 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 , BUT NOT LIMITE
06d0: 44 20 54 4f 2c 20 50 52 4f 43 55 52 45 4d 45 4e D TO, PROCUREMEN
06e0: 54 20 4f 46 20 53 55 42 53 54 49 54 55 54 45 20 T OF SUBSTITUTE
06f0: 47 4f 4f 44 53 20 4f 52 0a 20 2a 20 53 45 52 56 GOODS OR. * SERV
0700: 49 43 45 53 3b 20 4c 4f 53 53 20 4f 46 20 55 53 ICES; LOSS OF US
0710: 45 2c 20 44 41 54 41 2c 20 4f 52 20 50 52 4f 46 E, DATA, OR PROF
0720: 49 54 53 3b 20 4f 52 20 42 55 53 49 4e 45 53 53 ITS; OR BUSINESS
0730: 20 49 4e 54 45 52 52 55 50 54 49 4f 4e 29 20 48 INTERRUPTION) H
0740: 4f 57 45 56 45 52 0a 20 2a 20 43 41 55 53 45 44 OWEVER. * CAUSED
0750: 20 41 4e 44 20 4f 4e 20 41 4e 59 20 54 48 45 4f AND ON ANY THEO
0760: 52 59 20 4f 46 20 4c 49 41 42 49 4c 49 54 59 2c RY OF LIABILITY,
0770: 20 57 48 45 54 48 45 52 20 49 4e 20 43 4f 4e 54 WHETHER IN CONT
0780: 52 41 43 54 2c 20 53 54 52 49 43 54 0a 20 2a 20 RACT, STRICT. *
0790: 4c 49 41 42 49 4c 49 54 59 2c 20 4f 52 20 54 4f LIABILITY, OR TO
07a0: 52 54 20 28 49 4e 43 4c 55 44 49 4e 47 20 4e 45 RT (INCLUDING NE
07b0: 47 4c 49 47 45 4e 43 45 20 4f 52 20 4f 54 48 45 GLIGENCE OR OTHE
07c0: 52 57 49 53 45 29 20 41 52 49 53 49 4e 47 20 49 RWISE) ARISING I
07d0: 4e 20 41 4e 59 20 57 41 59 0a 20 2a 20 4f 55 54 N ANY WAY. * OUT
07e0: 20 4f 46 20 54 48 45 20 55 53 45 20 4f 46 20 54 OF THE USE OF T
07f0: 48 49 53 20 53 4f 46 54 57 41 52 45 2c 20 45 56 HIS SOFTWARE, EV
0800: 45 4e 20 49 46 20 41 44 56 49 53 45 44 20 4f 46 EN IF ADVISED OF
0810: 20 54 48 45 20 50 4f 53 53 49 42 49 4c 49 54 59 THE POSSIBILITY
0820: 20 4f 46 20 53 55 43 48 0a 20 2a 20 44 41 4d 41 OF SUCH. * DAMA
0830: 47 45 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 GE.. */..#includ
0840: 65 20 22 74 63 6c 49 6e 74 2e 68 22 0a 23 69 6e e "tclInt.h".#in
0850: 63 6c 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a clude <utime.h>.
0860: 23 69 6e 63 6c 75 64 65 20 3c 67 72 70 2e 68 3e #include <grp.h>
0870: 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 53 54 .#ifndef HAVE_ST
0880: 52 55 43 54 5f 53 54 41 54 5f 53 54 5f 42 4c 4b RUCT_STAT_ST_BLK
0890: 53 49 5a 45 0a 23 69 66 6e 64 65 66 20 4e 4f 5f SIZE.#ifndef NO_
08a0: 46 53 54 41 54 46 53 0a 23 69 6e 63 6c 75 64 65 FSTATFS.#include
08b0: 20 3c 73 79 73 2f 73 74 61 74 66 73 2e 68 3e 0a <sys/statfs.h>.
08c0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a #endif.#endif /*
08d0: 20 21 48 41 56 45 5f 53 54 52 55 43 54 5f 53 54 !HAVE_STRUCT_ST
08e0: 41 54 5f 53 54 5f 42 4c 4b 53 49 5a 45 20 2a 2f AT_ST_BLKSIZE */
08f0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 46 54 53 .#ifdef HAVE_FTS
0900: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 74 73 2e 68 .#include <fts.h
0910: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 >.#endif../*. *
0920: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f The following co
0930: 6e 73 74 61 6e 74 73 20 73 70 65 63 69 66 79 20 nstants specify
0940: 74 68 65 20 74 79 70 65 20 6f 66 20 63 61 6c 6c the type of call
0950: 62 61 63 6b 20 77 68 65 6e 0a 20 2a 20 54 72 61 back when. * Tra
0960: 76 65 72 73 65 55 6e 69 78 54 72 65 65 28 29 20 verseUnixTree()
0970: 63 61 6c 6c 73 20 74 68 65 20 74 72 61 76 65 72 calls the traver
0980: 73 65 50 72 6f 63 28 29 0a 20 2a 2f 0a 0a 23 64 seProc(). */..#d
0990: 65 66 69 6e 65 20 44 4f 54 52 45 45 5f 50 52 45 efine DOTREE_PRE
09a0: 44 09 31 09 2f 2a 20 70 72 65 2d 6f 72 64 65 72 D.1./* pre-order
09b0: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 23 64 directory */.#d
09c0: 65 66 69 6e 65 20 44 4f 54 52 45 45 5f 50 4f 53 efine DOTREE_POS
09d0: 54 44 09 32 09 2f 2a 20 70 6f 73 74 2d 6f 72 64 TD.2./* post-ord
09e0: 65 72 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a er directory */.
09f0: 23 64 65 66 69 6e 65 20 44 4f 54 52 45 45 5f 46 #define DOTREE_F
0a00: 09 33 09 2f 2a 20 72 65 67 75 6c 61 72 20 66 69 .3./* regular fi
0a10: 6c 65 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 61 6c le */../*. * Fal
0a20: 6c 62 61 63 6b 20 74 65 6d 70 6f 72 61 72 79 20 lback temporary
0a30: 66 69 6c 65 20 6c 6f 63 61 74 69 6f 6e 20 74 68 file location th
0a40: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 e temporary file
0a50: 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 64 65 generation code
0a60: 2e 20 43 61 6e 20 62 65 0a 20 2a 20 6f 76 65 72 . Can be. * over
0a70: 72 69 64 64 65 6e 20 61 74 20 63 6f 6d 70 69 6c ridden at compil
0a80: 65 20 74 69 6d 65 20 66 6f 72 20 77 68 65 6e 20 e time for when
0a90: 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 it is known that
0aa0: 20 74 65 6d 70 20 66 69 6c 65 73 20 63 61 6e 27 temp files can'
0ab0: 74 20 62 65 0a 20 2a 20 77 72 69 74 74 65 6e 20 t be. * written
0ac0: 74 6f 20 2f 74 6d 70 20 28 68 65 6c 6c 6f 2c 20 to /tmp (hello,
0ad0: 69 4f 53 21 29 2e 0a 20 2a 2f 0a 0a 23 69 66 6e iOS!).. */..#ifn
0ae0: 64 65 66 20 54 43 4c 5f 54 45 4d 50 4f 52 41 52 def TCL_TEMPORAR
0af0: 59 5f 46 49 4c 45 5f 44 49 52 45 43 54 4f 52 59 Y_FILE_DIRECTORY
0b00: 0a 23 64 65 66 69 6e 65 20 54 43 4c 5f 54 45 4d .#define TCL_TEM
0b10: 50 4f 52 41 52 59 5f 46 49 4c 45 5f 44 49 52 45 PORARY_FILE_DIRE
0b20: 43 54 4f 52 59 09 22 2f 74 6d 70 22 0a 23 65 6e CTORY."/tmp".#en
0b30: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61 6c 6c 62 dif../*. * Callb
0b40: 61 63 6b 73 20 66 6f 72 20 66 69 6c 65 20 61 74 acks for file at
0b50: 74 72 69 62 75 74 65 73 20 63 6f 64 65 2e 0a 20 tributes code..
0b60: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09 */..static int..
0b70: 47 65 74 47 72 6f 75 70 41 74 74 72 69 62 75 74 GetGroupAttribut
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 49 6e 64 terp, int objInd
0ba0: 65 78 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f ex,.... Tcl_O
0bb0: 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 20 54 63 bj *fileName, Tc
0bc0: 6c 5f 4f 62 6a 20 2a 2a 61 74 74 72 69 62 75 74 l_Obj **attribut
0bd0: 65 50 74 72 50 74 72 29 3b 0a 73 74 61 74 69 63 ePtrPtr);.static
0be0: 20 69 6e 74 09 09 47 65 74 4f 77 6e 65 72 41 74 int..GetOwnerAt
0bf0: 74 72 69 62 75 74 65 28 54 63 6c 5f 49 6e 74 65 tribute(Tcl_Inte
0c00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
0c10: 6f 62 6a 49 6e 64 65 78 2c 0a 09 09 09 20 20 20 objIndex,....
0c20: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 Tcl_Obj *fileNa
0c30: 6d 65 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 74 me, Tcl_Obj **at
0c40: 74 72 69 62 75 74 65 50 74 72 50 74 72 29 3b 0a tributePtrPtr);.
0c50: 73 74 61 74 69 63 20 69 6e 74 09 09 47 65 74 50 static int..GetP
0c60: 65 72 6d 69 73 73 69 6f 6e 73 41 74 74 72 69 62 ermissionsAttrib
0c70: 75 74 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a ute(Tcl_Interp *
0c80: 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 69 interp,.... i
0c90: 6e 74 20 6f 62 6a 49 6e 64 65 78 2c 20 54 63 6c nt objIndex, Tcl
0ca0: 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 0a _Obj *fileName,.
0cb0: 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a ... Tcl_Obj *
0cc0: 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 74 72 *attributePtrPtr
0cd0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 53 );.static int..S
0ce0: 65 74 47 72 6f 75 70 41 74 74 72 69 62 75 74 65 etGroupAttribute
0cf0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
0d00: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 49 6e 64 65 erp, int objInde
0d10: 78 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 x,.... Tcl_Ob
0d20: 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 20 54 63 6c j *fileName, Tcl
0d30: 5f 4f 62 6a 20 2a 61 74 74 72 69 62 75 74 65 50 _Obj *attributeP
0d40: 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 tr);.static int.
0d50: 09 53 65 74 4f 77 6e 65 72 41 74 74 72 69 62 75 .SetOwnerAttribu
0d60: 74 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 te(Tcl_Interp *i
0d70: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 49 6e nterp, int objIn
0d80: 64 65 78 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f dex,.... Tcl_
0d90: 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 20 54 Obj *fileName, T
0da0: 63 6c 5f 4f 62 6a 20 2a 61 74 74 72 69 62 75 74 cl_Obj *attribut
0db0: 65 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e ePtr);.static in
0dc0: 74 09 09 53 65 74 50 65 72 6d 69 73 73 69 6f 6e t..SetPermission
0dd0: 73 41 74 74 72 69 62 75 74 65 28 54 63 6c 5f 49 sAttribute(Tcl_I
0de0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 nterp *interp,..
0df0: 09 09 20 20 20 20 69 6e 74 20 6f 62 6a 49 6e 64 .. int objInd
0e00: 65 78 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c ex, Tcl_Obj *fil
0e10: 65 4e 61 6d 65 2c 0a 09 09 09 20 20 20 20 54 63 eName,.... Tc
0e20: 6c 5f 4f 62 6a 20 2a 61 74 74 72 69 62 75 74 65 l_Obj *attribute
0e30: 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 Ptr);.static int
0e40: 09 09 47 65 74 4d 6f 64 65 46 72 6f 6d 50 65 72 ..GetModeFromPer
0e50: 6d 53 74 72 69 6e 67 28 54 63 6c 5f 49 6e 74 65 mString(Tcl_Inte
0e60: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 rp *interp,....
0e70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d const char *m
0e80: 6f 64 65 53 74 72 69 6e 67 50 74 72 2c 20 6d 6f odeStringPtr, mo
0e90: 64 65 5f 74 20 2a 6d 6f 64 65 50 74 72 29 3b 0a de_t *modePtr);.
0ea0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 #if defined(HAVE
0eb0: 5f 43 48 46 4c 41 47 53 29 20 26 26 20 64 65 66 _CHFLAGS) && def
0ec0: 69 6e 65 64 28 55 46 5f 49 4d 4d 55 54 41 42 4c ined(UF_IMMUTABL
0ed0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f E) || defined(__
0ee0: 43 59 47 57 49 4e 5f 5f 29 0a 73 74 61 74 69 63 CYGWIN__).static
0ef0: 20 69 6e 74 09 09 47 65 74 55 6e 69 78 46 69 6c int..GetUnixFil
0f00: 65 41 74 74 72 69 62 75 74 65 73 28 54 63 6c 5f eAttributes(Tcl_
0f10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
0f20: 69 6e 74 20 6f 62 6a 49 6e 64 65 78 2c 0a 09 09 int objIndex,...
0f30: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 . Tcl_Obj *fi
0f40: 6c 65 4e 61 6d 65 2c 20 54 63 6c 5f 4f 62 6a 20 leName, Tcl_Obj
0f50: 2a 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 74 **attributePtrPt
0f60: 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 r);.static int..
0f70: 53 65 74 55 6e 69 78 46 69 6c 65 41 74 74 72 69 SetUnixFileAttri
0f80: 62 75 74 65 73 28 54 63 6c 5f 49 6e 74 65 72 70 butes(Tcl_Interp
0f90: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
0fa0: 6a 49 6e 64 65 78 2c 0a 09 09 09 20 20 20 20 54 jIndex,.... T
0fb0: 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 cl_Obj *fileName
0fc0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 61 74 74 72 69 , Tcl_Obj *attri
0fd0: 62 75 74 65 50 74 72 29 3b 0a 23 65 6e 64 69 66 butePtr);.#endif
0fe0: 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 74 6f 74 79 70 ../*. * Prototyp
0ff0: 65 20 66 6f 72 20 74 68 65 20 54 72 61 76 65 72 e for the Traver
1000: 73 65 55 6e 69 78 54 72 65 65 20 63 61 6c 6c 62 seUnixTree callb
1010: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a ack function.. *
1020: 2f 0a 0a 74 79 70 65 64 65 66 20 69 6e 74 20 28 /..typedef int (
1030: 54 72 61 76 65 72 73 61 6c 50 72 6f 63 29 28 54 TraversalProc)(T
1040: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 72 63 50 cl_DString *srcP
1050: 74 72 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 tr, Tcl_DString
1060: 2a 64 73 74 50 74 72 2c 0a 09 63 6f 6e 73 74 20 *dstPtr,..const
1070: 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 Tcl_StatBuf *sta
1080: 74 42 75 66 50 74 72 2c 20 69 6e 74 20 74 79 70 tBufPtr, int typ
1090: 65 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a e, Tcl_DString *
10a0: 65 72 72 6f 72 50 74 72 29 3b 0a 0a 2f 2a 0a 20 errorPtr);../*.
10b0: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 * Constants and
10c0: 76 61 72 69 61 62 6c 65 73 20 6e 65 63 65 73 73 variables necess
10d0: 61 72 79 20 66 6f 72 20 66 69 6c 65 20 61 74 74 ary for file att
10e0: 72 69 62 75 74 65 73 20 73 75 62 63 6f 6d 6d 61 ributes subcomma
10f0: 6e 64 2e 0a 20 2a 0a 20 2a 20 49 4d 50 4f 52 54 nd.. *. * IMPORT
1100: 41 4e 54 3a 20 54 68 65 20 70 65 72 6d 69 73 73 ANT: The permiss
1110: 69 6f 6e 73 20 61 74 74 72 69 62 75 74 65 20 69 ions attribute i
1120: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 s assumed to be
1130: 74 68 65 20 74 68 69 72 64 20 69 74 65 6d 20 28 the third item (
1140: 69 2e 65 2e 0a 20 2a 20 74 6f 20 62 65 20 69 6e i.e.. * to be in
1150: 64 65 78 65 64 20 77 69 74 68 20 27 32 27 20 69 dexed with '2' i
1160: 6e 20 61 72 72 61 79 73 29 20 69 6e 20 63 6f 64 n arrays) in cod
1170: 65 20 69 6e 20 74 63 6c 49 4f 55 74 69 6c 2e 63 e in tclIOUtil.c
1180: 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 20 2a and possibly. *
1190: 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 54 63 elsewhere in Tc
11a0: 6c 27 73 20 63 6f 72 65 2e 0a 20 2a 2f 0a 0a 23 l's core.. */..#
11b0: 69 66 64 65 66 20 44 4a 47 50 50 0a 0a 2f 2a 0a ifdef DJGPP../*.
11c0: 20 2a 20 53 65 65 20 63 6f 6e 74 72 69 62 2f 64 * See contrib/d
11d0: 6a 67 70 70 2f 74 63 6c 44 6a 67 70 70 46 43 6d jgpp/tclDjgppFCm
11e0: 64 2e 63 20 66 6f 72 20 64 65 66 69 6e 69 74 69 d.c for definiti
11f0: 6f 6e 2e 0a 20 2a 2f 0a 0a 65 78 74 65 72 6e 20 on.. */..extern
1200: 54 63 6c 46 69 6c 65 41 74 74 72 50 72 6f 63 73 TclFileAttrProcs
1210: 20 74 63 6c 70 46 69 6c 65 41 74 74 72 50 72 6f tclpFileAttrPro
1220: 63 73 5b 5d 3b 0a 65 78 74 65 72 6e 20 63 6f 6e cs[];.extern con
1230: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 74 st char *const t
1240: 63 6c 70 46 69 6c 65 41 74 74 72 53 74 72 69 6e clpFileAttrStrin
1250: 67 73 5b 5d 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20 gs[];..#else /*
1260: 21 44 4a 47 50 50 20 2a 2f 0a 65 6e 75 6d 20 7b !DJGPP */.enum {
1270: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 .#if defined(__C
1280: 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 55 4e 49 YGWIN__). UNI
1290: 58 5f 41 52 43 48 49 56 45 5f 41 54 54 52 49 42 X_ARCHIVE_ATTRIB
12a0: 55 54 45 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 UTE,.#endif.
12b0: 55 4e 49 58 5f 47 52 4f 55 50 5f 41 54 54 52 49 UNIX_GROUP_ATTRI
12c0: 42 55 54 45 2c 0a 23 69 66 20 64 65 66 69 6e 65 BUTE,.#if define
12d0: 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 d(__CYGWIN__).
12e0: 20 20 55 4e 49 58 5f 48 49 44 44 45 4e 5f 41 54 UNIX_HIDDEN_AT
12f0: 54 52 49 42 55 54 45 2c 0a 23 65 6e 64 69 66 0a TRIBUTE,.#endif.
1300: 20 20 20 20 55 4e 49 58 5f 4f 57 4e 45 52 5f 41 UNIX_OWNER_A
1310: 54 54 52 49 42 55 54 45 2c 20 55 4e 49 58 5f 50 TTRIBUTE, UNIX_P
1320: 45 52 4d 49 53 53 49 4f 4e 53 5f 41 54 54 52 49 ERMISSIONS_ATTRI
1330: 42 55 54 45 2c 0a 23 69 66 20 64 65 66 69 6e 65 BUTE,.#if define
1340: 64 28 48 41 56 45 5f 43 48 46 4c 41 47 53 29 20 d(HAVE_CHFLAGS)
1350: 26 26 20 64 65 66 69 6e 65 64 28 55 46 5f 49 4d && defined(UF_IM
1360: 4d 55 54 41 42 4c 45 29 20 7c 7c 20 64 65 66 69 MUTABLE) || defi
1370: 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a ned(__CYGWIN__).
1380: 20 20 20 20 55 4e 49 58 5f 52 45 41 44 4f 4e 4c UNIX_READONL
1390: 59 5f 41 54 54 52 49 42 55 54 45 2c 0a 23 65 6e Y_ATTRIBUTE,.#en
13a0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
13b0: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 __CYGWIN__).
13c0: 55 4e 49 58 5f 53 59 53 54 45 4d 5f 41 54 54 52 UNIX_SYSTEM_ATTR
13d0: 49 42 55 54 45 2c 0a 23 65 6e 64 69 66 0a 23 69 IBUTE,.#endif.#i
13e0: 66 64 65 66 20 4d 41 43 5f 4f 53 58 5f 54 43 4c fdef MAC_OSX_TCL
13f0: 0a 20 20 20 20 4d 41 43 4f 53 58 5f 43 52 45 41 . MACOSX_CREA
1400: 54 4f 52 5f 41 54 54 52 49 42 55 54 45 2c 20 4d TOR_ATTRIBUTE, M
1410: 41 43 4f 53 58 5f 54 59 50 45 5f 41 54 54 52 49 ACOSX_TYPE_ATTRI
1420: 42 55 54 45 2c 20 4d 41 43 4f 53 58 5f 48 49 44 BUTE, MACOSX_HID
1430: 44 45 4e 5f 41 54 54 52 49 42 55 54 45 2c 0a 20 DEN_ATTRIBUTE,.
1440: 20 20 20 4d 41 43 4f 53 58 5f 52 53 52 43 4c 45 MACOSX_RSRCLE
1450: 4e 47 54 48 5f 41 54 54 52 49 42 55 54 45 2c 0a NGTH_ATTRIBUTE,.
1460: 23 65 6e 64 69 66 0a 20 20 20 20 55 4e 49 58 5f #endif. UNIX_
1470: 49 4e 56 41 4c 49 44 5f 41 54 54 52 49 42 55 54 INVALID_ATTRIBUT
1480: 45 20 2f 2a 20 6c 69 6e 74 20 2d 20 6c 61 73 74 E /* lint - last
1490: 20 65 6e 75 6d 20 76 61 6c 75 65 20 6e 65 65 64 enum value need
14a0: 73 20 6e 6f 20 74 72 61 69 6c 69 6e 67 20 2c 20 s no trailing ,
14b0: 2a 2f 0a 7d 3b 0a 0a 4d 4f 44 55 4c 45 5f 53 43 */.};..MODULE_SC
14c0: 4f 50 45 20 63 6f 6e 73 74 20 63 68 61 72 20 2a OPE const char *
14d0: 63 6f 6e 73 74 20 74 63 6c 70 46 69 6c 65 41 74 const tclpFileAt
14e0: 74 72 53 74 72 69 6e 67 73 5b 5d 3b 0a 63 6f 6e trStrings[];.con
14f0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 74 st char *const t
1500: 63 6c 70 46 69 6c 65 41 74 74 72 53 74 72 69 6e clpFileAttrStrin
1510: 67 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 64 65 66 gs[] = {.#if def
1520: 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 ined(__CYGWIN__)
1530: 0a 20 20 20 20 22 2d 61 72 63 68 69 76 65 22 2c . "-archive",
1540: 0a 23 65 6e 64 69 66 0a 20 20 20 20 22 2d 67 72 .#endif. "-gr
1550: 6f 75 70 22 2c 0a 23 69 66 20 64 65 66 69 6e 65 oup",.#if define
1560: 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 d(__CYGWIN__).
1570: 20 20 22 2d 68 69 64 64 65 6e 22 2c 0a 23 65 6e "-hidden",.#en
1580: 64 69 66 0a 20 20 20 20 22 2d 6f 77 6e 65 72 22 dif. "-owner"
1590: 2c 20 22 2d 70 65 72 6d 69 73 73 69 6f 6e 73 22 , "-permissions"
15a0: 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 ,.#if defined(HA
15b0: 56 45 5f 43 48 46 4c 41 47 53 29 20 26 26 20 64 VE_CHFLAGS) && d
15c0: 65 66 69 6e 65 64 28 55 46 5f 49 4d 4d 55 54 41 efined(UF_IMMUTA
15d0: 42 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 BLE) || defined(
15e0: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 __CYGWIN__).
15f0: 22 2d 72 65 61 64 6f 6e 6c 79 22 2c 0a 23 65 6e "-readonly",.#en
1600: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
1610: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 __CYGWIN__).
1620: 22 2d 73 79 73 74 65 6d 22 2c 0a 23 65 6e 64 69 "-system",.#endi
1630: 66 0a 23 69 66 64 65 66 20 4d 41 43 5f 4f 53 58 f.#ifdef MAC_OSX
1640: 5f 54 43 4c 0a 20 20 20 20 22 2d 63 72 65 61 74 _TCL. "-creat
1650: 6f 72 22 2c 20 22 2d 74 79 70 65 22 2c 20 22 2d or", "-type", "-
1660: 68 69 64 64 65 6e 22 2c 20 22 2d 72 73 72 63 6c hidden", "-rsrcl
1670: 65 6e 67 74 68 22 2c 0a 23 65 6e 64 69 66 0a 20 ength",.#endif.
1680: 20 20 20 4e 55 4c 4c 0a 7d 3b 0a 0a 4d 4f 44 55 NULL.};..MODU
1690: 4c 45 5f 53 43 4f 50 45 20 63 6f 6e 73 74 20 54 LE_SCOPE const T
16a0: 63 6c 46 69 6c 65 41 74 74 72 50 72 6f 63 73 20 clFileAttrProcs
16b0: 74 63 6c 70 46 69 6c 65 41 74 74 72 50 72 6f 63 tclpFileAttrProc
16c0: 73 5b 5d 3b 0a 63 6f 6e 73 74 20 54 63 6c 46 69 s[];.const TclFi
16d0: 6c 65 41 74 74 72 50 72 6f 63 73 20 74 63 6c 70 leAttrProcs tclp
16e0: 46 69 6c 65 41 74 74 72 50 72 6f 63 73 5b 5d 20 FileAttrProcs[]
16f0: 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 = {.#if defined(
1700: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 __CYGWIN__).
1710: 7b 47 65 74 55 6e 69 78 46 69 6c 65 41 74 74 72 {GetUnixFileAttr
1720: 69 62 75 74 65 73 2c 20 53 65 74 55 6e 69 78 46 ibutes, SetUnixF
1730: 69 6c 65 41 74 74 72 69 62 75 74 65 73 7d 2c 0a ileAttributes},.
1740: 23 65 6e 64 69 66 0a 20 20 20 20 7b 47 65 74 47 #endif. {GetG
1750: 72 6f 75 70 41 74 74 72 69 62 75 74 65 2c 20 53 roupAttribute, S
1760: 65 74 47 72 6f 75 70 41 74 74 72 69 62 75 74 65 etGroupAttribute
1770: 7d 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f },.#if defined(_
1780: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 20 20 7b _CYGWIN__). {
1790: 47 65 74 55 6e 69 78 46 69 6c 65 41 74 74 72 69 GetUnixFileAttri
17a0: 62 75 74 65 73 2c 20 53 65 74 55 6e 69 78 46 69 butes, SetUnixFi
17b0: 6c 65 41 74 74 72 69 62 75 74 65 73 7d 2c 0a 23 leAttributes},.#
17c0: 65 6e 64 69 66 0a 20 20 20 20 7b 47 65 74 4f 77 endif. {GetOw
17d0: 6e 65 72 41 74 74 72 69 62 75 74 65 2c 20 53 65 nerAttribute, Se
17e0: 74 4f 77 6e 65 72 41 74 74 72 69 62 75 74 65 7d tOwnerAttribute}
17f0: 2c 0a 20 20 20 20 7b 47 65 74 50 65 72 6d 69 73 ,. {GetPermis
1800: 73 69 6f 6e 73 41 74 74 72 69 62 75 74 65 2c 20 sionsAttribute,
1810: 53 65 74 50 65 72 6d 69 73 73 69 6f 6e 73 41 74 SetPermissionsAt
1820: 74 72 69 62 75 74 65 7d 2c 0a 23 69 66 20 64 65 tribute},.#if de
1830: 66 69 6e 65 64 28 48 41 56 45 5f 43 48 46 4c 41 fined(HAVE_CHFLA
1840: 47 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 55 GS) && defined(U
1850: 46 5f 49 4d 4d 55 54 41 42 4c 45 29 20 7c 7c 20 F_IMMUTABLE) ||
1860: 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e defined(__CYGWIN
1870: 5f 5f 29 0a 20 20 20 20 7b 47 65 74 55 6e 69 78 __). {GetUnix
1880: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 2c 20 FileAttributes,
1890: 53 65 74 55 6e 69 78 46 69 6c 65 41 74 74 72 69 SetUnixFileAttri
18a0: 62 75 74 65 73 7d 2c 0a 23 65 6e 64 69 66 0a 23 butes},.#endif.#
18b0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 if defined(__CYG
18c0: 57 49 4e 5f 5f 29 0a 20 20 20 20 7b 47 65 74 55 WIN__). {GetU
18d0: 6e 69 78 46 69 6c 65 41 74 74 72 69 62 75 74 65 nixFileAttribute
18e0: 73 2c 20 53 65 74 55 6e 69 78 46 69 6c 65 41 74 s, SetUnixFileAt
18f0: 74 72 69 62 75 74 65 73 7d 2c 0a 23 65 6e 64 69 tributes},.#endi
1900: 66 0a 23 69 66 64 65 66 20 4d 41 43 5f 4f 53 58 f.#ifdef MAC_OSX
1910: 5f 54 43 4c 0a 20 20 20 20 7b 54 63 6c 4d 61 63 _TCL. {TclMac
1920: 4f 53 58 47 65 74 46 69 6c 65 41 74 74 72 69 62 OSXGetFileAttrib
1930: 75 74 65 2c 09 54 63 6c 4d 61 63 4f 53 58 53 65 ute,.TclMacOSXSe
1940: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 7d 2c tFileAttribute},
1950: 0a 20 20 20 20 7b 54 63 6c 4d 61 63 4f 53 58 47 . {TclMacOSXG
1960: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 2c etFileAttribute,
1970: 09 54 63 6c 4d 61 63 4f 53 58 53 65 74 46 69 6c .TclMacOSXSetFil
1980: 65 41 74 74 72 69 62 75 74 65 7d 2c 0a 20 20 20 eAttribute},.
1990: 20 7b 54 63 6c 4d 61 63 4f 53 58 47 65 74 46 69 {TclMacOSXGetFi
19a0: 6c 65 41 74 74 72 69 62 75 74 65 2c 09 54 63 6c leAttribute,.Tcl
19b0: 4d 61 63 4f 53 58 53 65 74 46 69 6c 65 41 74 74 MacOSXSetFileAtt
19c0: 72 69 62 75 74 65 7d 2c 0a 20 20 20 20 7b 54 63 ribute},. {Tc
19d0: 6c 4d 61 63 4f 53 58 47 65 74 46 69 6c 65 41 74 lMacOSXGetFileAt
19e0: 74 72 69 62 75 74 65 2c 09 54 63 6c 4d 61 63 4f tribute,.TclMacO
19f0: 53 58 53 65 74 46 69 6c 65 41 74 74 72 69 62 75 SXSetFileAttribu
1a00: 74 65 7d 2c 0a 23 65 6e 64 69 66 0a 7d 3b 0a 23 te},.#endif.};.#
1a10: 65 6e 64 69 66 20 2f 2a 20 44 4a 47 50 50 20 2a endif /* DJGPP *
1a20: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 /../*. * This is
1a30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d the maximum num
1a40: 62 65 72 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 ber of consecuti
1a50: 76 65 20 72 65 61 64 64 69 72 2f 75 6e 6c 69 6e ve readdir/unlin
1a60: 6b 20 63 61 6c 6c 73 20 74 68 61 74 20 63 61 6e k calls that can
1a70: 20 62 65 0a 20 2a 20 6d 61 64 65 20 28 77 69 74 be. * made (wit
1a80: 68 20 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 h no intervening
1a90: 20 72 65 77 69 6e 64 64 69 72 20 6f 72 20 63 6c rewinddir or cl
1aa0: 6f 73 65 64 69 72 2f 6f 70 65 6e 64 69 72 29 20 osedir/opendir)
1ab0: 62 65 66 6f 72 65 20 74 72 69 67 67 65 72 69 6e before triggerin
1ac0: 67 0a 20 2a 20 61 20 62 75 67 20 74 68 61 74 20 g. * a bug that
1ad0: 6d 61 6b 65 73 20 72 65 61 64 64 69 72 20 72 65 makes readdir re
1ae0: 74 75 72 6e 20 4e 55 4c 4c 20 65 76 65 6e 20 74 turn NULL even t
1af0: 68 6f 75 67 68 20 73 6f 6d 65 20 64 69 72 65 63 hough some direc
1b00: 74 6f 72 79 20 65 6e 74 72 69 65 73 0a 20 2a 20 tory entries. *
1b10: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 70 72 have not been pr
1b20: 6f 63 65 73 73 65 64 2e 20 54 68 65 20 62 75 67 ocessed. The bug
1b30: 20 61 66 66 6c 69 63 74 73 20 53 75 6e 4f 53 27 afflicts SunOS'
1b40: 73 20 72 65 61 64 64 69 72 20 77 68 65 6e 20 61 s readdir when a
1b50: 70 70 6c 69 65 64 20 74 6f 0a 20 2a 20 75 66 73 pplied to. * ufs
1b60: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 6e file systems an
1b70: 64 20 44 61 72 77 69 6e 20 36 2e 35 27 73 20 28 d Darwin 6.5's (
1b80: 61 6e 64 20 4f 53 58 20 76 2e 31 30 2e 33 2e 38 and OSX v.10.3.8
1b90: 27 73 29 20 48 46 53 2b 2e 20 4a 48 20 66 6f 75 's) HFS+. JH fou
1ba0: 6e 64 20 74 68 65 0a 20 2a 20 44 61 72 77 69 6e nd the. * Darwin
1bb0: 20 72 65 61 64 64 69 72 20 74 6f 20 72 65 73 65 readdir to rese
1bc0: 74 20 61 74 20 31 34 37 2c 20 73 6f 20 31 33 30 t at 147, so 130
1bd0: 20 69 73 20 63 68 6f 73 65 6e 20 74 6f 20 62 65 is chosen to be
1be0: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 57 conservative. W
1bf0: 65 0a 20 2a 20 63 61 6e 27 74 20 64 6f 20 61 20 e. * can't do a
1c00: 67 65 6e 65 72 61 6c 20 72 65 77 69 6e 64 20 6f general rewind o
1c10: 6e 20 66 61 69 6c 75 72 65 20 61 73 20 4e 46 53 n failure as NFS
1c20: 20 63 61 6e 20 63 72 65 61 74 65 20 73 70 65 63 can create spec
1c30: 69 61 6c 20 66 69 6c 65 73 20 74 68 61 74 0a 20 ial files that.
1c40: 2a 20 72 65 63 72 65 61 74 65 20 74 68 65 6d 73 * recreate thems
1c50: 65 6c 76 65 73 20 77 68 65 6e 20 79 6f 75 20 74 elves when you t
1c60: 72 79 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 ry and delete th
1c70: 65 6d 2e 20 38 2e 34 2e 38 20 61 64 64 65 64 20 em. 8.4.8 added
1c80: 61 20 73 6f 6c 75 74 69 6f 6e 0a 20 2a 20 74 68 a solution. * th
1c90: 61 74 20 77 61 73 20 61 66 66 65 63 74 65 64 20 at was affected
1ca0: 62 79 20 61 20 73 69 6e 67 6c 65 20 73 75 63 68 by a single such
1cb0: 20 4e 46 53 20 66 69 6c 65 2c 20 74 68 69 73 20 NFS file, this
1cc0: 73 6f 6c 75 74 69 6f 6e 20 73 68 6f 75 6c 64 20 solution should
1cd0: 6e 6f 74 20 62 65 0a 20 2a 20 61 66 66 65 63 74 not be. * affect
1ce0: 65 64 20 62 79 20 6c 65 73 73 20 74 68 61 6e 20 ed by less than
1cf0: 54 48 52 45 53 48 4f 4c 44 20 73 75 63 68 20 66 THRESHOLD such f
1d00: 69 6c 65 73 2e 20 5b 42 75 67 20 31 30 33 34 33 iles. [Bug 10343
1d10: 33 37 5d 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 37]. */..#define
1d20: 20 4d 41 58 5f 52 45 41 44 44 49 52 5f 55 4e 4c MAX_READDIR_UNL
1d30: 49 4e 4b 5f 54 48 52 45 53 48 4f 4c 44 20 31 33 INK_THRESHOLD 13
1d40: 30 0a 0a 2f 2a 0a 20 2a 20 44 65 63 6c 61 72 61 0../*. * Declara
1d50: 74 69 6f 6e 73 20 66 6f 72 20 6c 6f 63 61 6c 20 tions for local
1d60: 70 72 6f 63 65 64 75 72 65 73 20 64 65 66 69 6e procedures defin
1d70: 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 3a ed in this file:
1d80: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
1d90: 09 09 43 6f 70 79 46 69 6c 65 41 74 74 73 28 63 ..CopyFileAtts(c
1da0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c 0a onst char *src,.
1db0: 09 09 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 ... const cha
1dc0: 72 20 2a 64 73 74 2c 20 63 6f 6e 73 74 20 54 63 r *dst, const Tc
1dd0: 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 42 l_StatBuf *statB
1de0: 75 66 50 74 72 29 3b 0a 73 74 61 74 69 63 20 63 ufPtr);.static c
1df0: 6f 6e 73 74 20 63 68 61 72 20 2a 09 44 65 66 61 onst char *.Defa
1e00: 75 6c 74 54 65 6d 70 44 69 72 28 76 6f 69 64 29 ultTempDir(void)
1e10: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 44 6f ;.static int..Do
1e20: 43 6f 70 79 46 69 6c 65 28 63 6f 6e 73 74 20 63 CopyFile(const c
1e30: 68 61 72 20 2a 73 72 63 50 74 72 2c 20 63 6f 6e har *srcPtr, con
1e40: 73 74 20 63 68 61 72 20 2a 64 73 74 50 74 72 2c st char *dstPtr,
1e50: 0a 09 09 09 20 20 20 20 63 6f 6e 73 74 20 54 63 .... const Tc
1e60: 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 42 l_StatBuf *statB
1e70: 75 66 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 ufPtr);.static i
1e80: 6e 74 09 09 44 6f 43 72 65 61 74 65 44 69 72 65 nt..DoCreateDire
1e90: 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 ctory(const char
1ea0: 20 2a 70 61 74 68 50 74 72 29 3b 0a 73 74 61 74 *pathPtr);.stat
1eb0: 69 63 20 69 6e 74 09 09 44 6f 52 65 6d 6f 76 65 ic int..DoRemove
1ec0: 44 69 72 65 63 74 6f 72 79 28 54 63 6c 5f 44 53 Directory(Tcl_DS
1ed0: 74 72 69 6e 67 20 2a 70 61 74 68 50 74 72 2c 0a tring *pathPtr,.
1ee0: 09 09 09 20 20 20 20 69 6e 74 20 72 65 63 75 72 ... int recur
1ef0: 73 69 76 65 2c 20 54 63 6c 5f 44 53 74 72 69 6e sive, Tcl_DStrin
1f00: 67 20 2a 65 72 72 6f 72 50 74 72 29 3b 0a 73 74 g *errorPtr);.st
1f10: 61 74 69 63 20 69 6e 74 09 09 44 6f 52 65 6e 61 atic int..DoRena
1f20: 6d 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 meFile(const cha
1f30: 72 20 2a 73 72 63 2c 20 63 6f 6e 73 74 20 63 68 r *src, const ch
1f40: 61 72 20 2a 64 73 74 29 3b 0a 73 74 61 74 69 63 ar *dst);.static
1f50: 20 69 6e 74 09 09 54 72 61 76 65 72 73 61 6c 43 int..TraversalC
1f60: 6f 70 79 28 54 63 6c 5f 44 53 74 72 69 6e 67 20 opy(Tcl_DString
1f70: 2a 73 72 63 50 74 72 2c 0a 09 09 09 20 20 20 20 *srcPtr,....
1f80: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 74 Tcl_DString *dst
1f90: 50 74 72 2c 0a 09 09 09 20 20 20 20 63 6f 6e 73 Ptr,.... cons
1fa0: 74 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 t Tcl_StatBuf *s
1fb0: 74 61 74 42 75 66 50 74 72 2c 20 69 6e 74 20 74 tatBufPtr, int t
1fc0: 79 70 65 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f ype,.... Tcl_
1fd0: 44 53 74 72 69 6e 67 20 2a 65 72 72 6f 72 50 74 DString *errorPt
1fe0: 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 r);.static int..
1ff0: 54 72 61 76 65 72 73 61 6c 44 65 6c 65 74 65 28 TraversalDelete(
2000: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 72 63 Tcl_DString *src
2010: 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f Ptr,.... Tcl_
2020: 44 53 74 72 69 6e 67 20 2a 64 73 74 50 74 72 2c DString *dstPtr,
2030: 0a 09 09 09 20 20 20 20 63 6f 6e 73 74 20 54 63 .... const Tc
2040: 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 42 l_StatBuf *statB
2050: 75 66 50 74 72 2c 20 69 6e 74 20 74 79 70 65 2c ufPtr, int type,
2060: 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 .... Tcl_DStr
2070: 69 6e 67 20 2a 65 72 72 6f 72 50 74 72 29 3b 0a ing *errorPtr);.
2080: 73 74 61 74 69 63 20 69 6e 74 09 09 54 72 61 76 static int..Trav
2090: 65 72 73 65 55 6e 69 78 54 72 65 65 28 54 72 61 erseUnixTree(Tra
20a0: 76 65 72 73 61 6c 50 72 6f 63 20 2a 74 72 61 76 versalProc *trav
20b0: 65 72 73 61 6c 50 72 6f 63 2c 0a 09 09 09 20 20 ersalProc,....
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 Tcl_DString *s
20d0: 6f 75 72 63 65 50 74 72 2c 20 54 63 6c 5f 44 53 ourcePtr, Tcl_DS
20e0: 74 72 69 6e 67 20 2a 64 65 73 74 50 74 72 2c 0a tring *destPtr,.
20f0: 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ... Tcl_DStri
2100: 6e 67 20 2a 65 72 72 6f 72 50 74 72 2c 20 69 6e ng *errorPtr, in
2110: 74 20 64 6f 52 65 77 69 6e 64 29 3b 0a 0a 23 69 t doRewind);..#i
2120: 66 64 65 66 20 50 55 52 49 46 59 0a 2f 2a 0a 20 fdef PURIFY./*.
2130: 2a 20 72 65 61 6c 70 61 74 68 20 61 6e 64 20 70 * realpath and p
2140: 75 72 69 66 79 20 64 6f 6e 27 74 20 6d 69 78 20 urify don't mix
2150: 68 61 70 70 69 6c 79 2e 20 49 74 20 68 61 73 20 happily. It has
2160: 62 65 65 6e 20 6e 6f 74 65 64 20 74 68 61 74 20 been noted that
2170: 72 65 61 6c 70 61 74 68 0a 20 2a 20 73 68 6f 75 realpath. * shou
2180: 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 ld not be used w
2190: 69 74 68 20 70 75 72 69 66 79 20 62 65 63 61 75 ith purify becau
21a0: 73 65 20 6f 66 20 62 6f 67 75 73 20 77 61 72 6e se of bogus warn
21b0: 69 6e 67 73 2c 20 62 75 74 20 6a 75 73 74 0a 20 ings, but just.
21c0: 2a 20 6d 65 6d 73 65 74 27 69 6e 67 20 74 68 65 * memset'ing the
21d0: 20 72 65 73 6f 6c 76 65 64 20 70 61 74 68 20 77 resolved path w
21e0: 69 6c 6c 20 73 71 75 65 6c 63 68 20 74 68 6f 73 ill squelch thos
21f0: 65 2e 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 e. This assumes
2200: 77 65 20 61 72 65 0a 20 2a 20 70 61 73 73 69 6e we are. * passin
2210: 67 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 4d g the standard M
2220: 41 58 50 41 54 48 4c 45 4e 20 73 69 7a 65 20 72 AXPATHLEN size r
2230: 65 73 6f 6c 76 65 64 20 61 72 67 2e 0a 20 2a 2f esolved arg.. */
2240: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 09 ..static char *.
2250: 09 52 65 61 6c 70 61 74 68 28 63 6f 6e 73 74 20 .Realpath(const
2260: 63 68 61 72 20 2a 70 61 74 68 2c 20 63 68 61 72 char *path, char
2270: 20 2a 72 65 73 6f 6c 76 65 64 29 3b 0a 0a 63 68 *resolved);..ch
2280: 61 72 20 2a 0a 52 65 61 6c 70 61 74 68 28 0a 20 ar *.Realpath(.
2290: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 const char *p
22a0: 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 72 ath,. char *r
22b0: 65 73 6f 6c 76 65 64 29 0a 7b 0a 20 20 20 20 6d esolved).{. m
22c0: 65 6d 73 65 74 28 72 65 73 6f 6c 76 65 64 2c 20 emset(resolved,
22d0: 30 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 0, MAXPATHLEN);.
22e0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 61 6c 70 return realp
22f0: 61 74 68 28 70 61 74 68 2c 20 72 65 73 6f 6c 76 ath(path, resolv
2300: 65 64 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 ed);.}.#else.#
2310: 20 64 65 66 69 6e 65 20 52 65 61 6c 70 61 74 68 define Realpath
2320: 09 72 65 61 6c 70 61 74 68 0a 23 65 6e 64 69 66 .realpath.#endif
2330: 20 2f 2a 20 50 55 52 49 46 59 20 2a 2f 0a 0a 23 /* PURIFY */..#
2340: 69 66 6e 64 65 66 20 4e 4f 5f 52 45 41 4c 50 41 ifndef NO_REALPA
2350: 54 48 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f TH.#if defined(_
2360: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 64 65 66 _APPLE__) && def
2370: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 ined(TCL_THREADS
2380: 29 20 26 26 20 5c 0a 09 64 65 66 69 6e 65 64 28 ) && \..defined(
2390: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e MAC_OS_X_VERSION
23a0: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 29 20 26 _MIN_REQUIRED) &
23b0: 26 20 5c 0a 09 4d 41 43 5f 4f 53 5f 58 5f 56 45 & \..MAC_OS_X_VE
23c0: 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 RSION_MIN_REQUIR
23d0: 45 44 20 3c 20 31 30 33 30 0a 2f 2a 0a 20 2a 20 ED < 1030./*. *
23e0: 50 72 69 6f 72 20 74 6f 20 44 61 72 77 69 6e 20 Prior to Darwin
23f0: 37 2c 20 72 65 61 6c 70 61 74 68 20 69 73 20 6e 7, realpath is n
2400: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 ot thread-safe,
2410: 63 2e 66 2e 20 42 75 67 20 37 31 31 32 33 32 3b c.f. Bug 711232;
2420: 20 69 66 20 77 65 0a 20 2a 20 6d 69 67 68 74 20 if we. * might
2430: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 72 potentially be r
2440: 75 6e 6e 69 6e 67 20 6f 6e 20 70 72 65 2d 31 30 unning on pre-10
2450: 2e 33 20 4f 53 58 2c 20 63 68 65 63 6b 20 44 61 .3 OSX, check Da
2460: 72 77 69 6e 20 72 65 6c 65 61 73 65 20 61 74 0a rwin release at.
2470: 20 2a 20 72 75 6e 74 69 6d 65 20 62 65 66 6f 72 * runtime befor
2480: 65 20 75 73 69 6e 67 20 72 65 61 6c 70 61 74 68 e using realpath
2490: 2e 0a 20 2a 2f 0a 0a 4d 4f 44 55 4c 45 5f 53 43 .. */..MODULE_SC
24a0: 4f 50 45 20 6c 6f 6e 67 20 74 63 6c 4d 61 63 4f OPE long tclMacO
24b0: 53 58 44 61 72 77 69 6e 52 65 6c 65 61 73 65 3b SXDarwinRelease;
24c0: 0a 23 20 20 20 64 65 66 69 6e 65 20 68 61 76 65 .# define have
24d0: 52 65 61 6c 70 61 74 68 09 28 74 63 6c 4d 61 63 Realpath.(tclMac
24e0: 4f 53 58 44 61 72 77 69 6e 52 65 6c 65 61 73 65 OSXDarwinRelease
24f0: 20 3e 3d 20 37 29 0a 23 65 6c 73 65 0a 23 20 20 >= 7).#else.#
2500: 20 64 65 66 69 6e 65 20 68 61 76 65 52 65 61 6c define haveReal
2510: 70 61 74 68 09 31 0a 23 65 6e 64 69 66 0a 23 65 path.1.#endif.#e
2520: 6e 64 69 66 20 2f 2a 20 4e 4f 5f 52 45 41 4c 50 ndif /* NO_REALP
2530: 41 54 48 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 ATH */..#ifdef H
2540: 41 56 45 5f 46 54 53 0a 23 69 66 20 64 65 66 69 AVE_FTS.#if defi
2550: 6e 65 64 28 48 41 56 45 5f 53 54 52 55 43 54 5f ned(HAVE_STRUCT_
2560: 53 54 41 54 36 34 29 20 26 26 20 21 64 65 66 69 STAT64) && !defi
2570: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f ned(__APPLE__)./
2580: 2a 20 66 74 73 20 64 6f 65 73 6e 27 74 20 64 6f * fts doesn't do
2590: 20 73 74 61 74 36 34 20 2a 2f 0a 23 20 20 20 64 stat64 */.# d
25a0: 65 66 69 6e 65 20 6e 6f 46 74 73 53 74 61 74 09 efine noFtsStat.
25b0: 31 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 1.#elif defined(
25c0: 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 64 65 __APPLE__) && de
25d0: 66 69 6e 65 64 28 5f 5f 4c 50 36 34 5f 5f 29 20 fined(__LP64__)
25e0: 26 26 20 5c 0a 09 64 65 66 69 6e 65 64 28 4d 41 && \..defined(MA
25f0: 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d C_OS_X_VERSION_M
2600: 49 4e 5f 52 45 51 55 49 52 45 44 29 20 26 26 20 IN_REQUIRED) &&
2610: 5c 0a 09 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 \..MAC_OS_X_VERS
2620: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 ION_MIN_REQUIRED
2630: 20 3c 20 31 30 35 30 0a 2f 2a 0a 20 2a 20 50 72 < 1050./*. * Pr
2640: 69 6f 72 20 74 6f 20 44 61 72 77 69 6e 20 39 2c ior to Darwin 9,
2650: 20 36 34 62 69 74 20 66 74 73 5f 6f 70 65 6e 28 64bit fts_open(
2660: 29 20 77 69 74 68 6f 75 74 20 46 54 53 5f 4e 4f ) without FTS_NO
2670: 53 54 41 54 20 6d 61 79 20 63 72 61 73 68 20 28 STAT may crash (
2680: 64 75 65 20 74 6f 20 61 0a 20 2a 20 36 34 62 69 due to a. * 64bi
2690: 74 2d 75 6e 73 61 66 65 20 41 4c 49 47 4e 20 6d t-unsafe ALIGN m
26a0: 61 63 72 6f 29 3b 20 69 66 20 77 65 20 63 6f 75 acro); if we cou
26b0: 6c 64 20 62 65 20 72 75 6e 6e 69 6e 67 20 6f 6e ld be running on
26c0: 20 70 72 65 2d 31 30 2e 35 20 4f 53 58 2c 20 63 pre-10.5 OSX, c
26d0: 68 65 63 6b 0a 20 2a 20 44 61 72 77 69 6e 20 72 heck. * Darwin r
26e0: 65 6c 65 61 73 65 20 61 74 20 72 75 6e 74 69 6d elease at runtim
26f0: 65 20 61 6e 64 20 64 6f 20 61 20 73 65 70 61 72 e and do a separ
2700: 61 74 65 20 73 74 61 74 28 29 20 69 66 20 6e 65 ate stat() if ne
2710: 63 65 73 73 61 72 79 2e 0a 20 2a 2f 0a 0a 4d 4f cessary.. */..MO
2720: 44 55 4c 45 5f 53 43 4f 50 45 20 6c 6f 6e 67 20 DULE_SCOPE long
2730: 74 63 6c 4d 61 63 4f 53 58 44 61 72 77 69 6e 52 tclMacOSXDarwinR
2740: 65 6c 65 61 73 65 3b 0a 23 20 20 20 64 65 66 69 elease;.# defi
2750: 6e 65 20 6e 6f 46 74 73 53 74 61 74 09 28 74 63 ne noFtsStat.(tc
2760: 6c 4d 61 63 4f 53 58 44 61 72 77 69 6e 52 65 6c lMacOSXDarwinRel
2770: 65 61 73 65 20 3c 20 39 29 0a 23 65 6c 73 65 0a ease < 9).#else.
2780: 23 20 20 20 64 65 66 69 6e 65 20 6e 6f 46 74 73 # define noFts
2790: 53 74 61 74 09 30 0a 23 65 6e 64 69 66 0a 23 65 Stat.0.#endif.#e
27a0: 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 46 54 53 ndif /* HAVE_FTS
27b0: 20 2a 2f 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d */.../*. *-----
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2800: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
2810: 70 4f 62 6a 52 65 6e 61 6d 65 46 69 6c 65 2c 20 pObjRenameFile,
2820: 44 6f 52 65 6e 61 6d 65 46 69 6c 65 20 2d 2d 0a DoRenameFile --.
2830: 20 2a 0a 20 2a 09 43 68 61 6e 67 65 73 20 74 68 *. *.Changes th
2840: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 65 78 69 e name of an exi
2850: 73 74 69 6e 67 20 66 69 6c 65 20 6f 72 20 64 69 sting file or di
2860: 72 65 63 74 6f 72 79 2c 20 66 72 6f 6d 20 73 72 rectory, from sr
2870: 63 20 74 6f 20 64 73 74 2e 20 49 66 0a 20 2a 09 c to dst. If. *.
2880: 73 72 63 20 61 6e 64 20 64 73 74 20 72 65 66 65 src and dst refe
2890: 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 r to the same fi
28a0: 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 2c le or directory,
28b0: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e does nothing an
28c0: 64 0a 20 2a 09 72 65 74 75 72 6e 73 20 73 75 63 d. *.returns suc
28d0: 63 65 73 73 2e 20 4f 74 68 65 72 77 69 73 65 20 cess. Otherwise
28e0: 69 66 20 64 73 74 20 61 6c 72 65 61 64 79 20 65 if dst already e
28f0: 78 69 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 xists, it will b
2900: 65 20 64 65 6c 65 74 65 64 0a 20 2a 09 61 6e 64 e deleted. *.and
2910: 20 72 65 70 6c 61 63 65 64 20 62 79 20 73 72 63 replaced by src
2920: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 subject to the
2930: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 following condit
2940: 69 6f 6e 73 3a 0a 20 2a 09 20 20 20 20 49 66 20 ions:. *. If
2950: 73 72 63 20 69 73 20 61 20 64 69 72 65 63 74 6f src is a directo
2960: 72 79 2c 20 64 73 74 20 6d 61 79 20 62 65 20 61 ry, dst may be a
2970: 6e 20 65 6d 70 74 79 20 64 69 72 65 63 74 6f 72 n empty director
2980: 79 2e 0a 20 2a 09 20 20 20 20 49 66 20 73 72 63 y.. *. If src
2990: 20 69 73 20 61 20 66 69 6c 65 2c 20 64 73 74 20 is a file, dst
29a0: 6d 61 79 20 62 65 20 61 20 66 69 6c 65 2e 0a 20 may be a file..
29b0: 2a 09 49 6e 20 61 6e 79 20 6f 74 68 65 72 20 73 *.In any other s
29c0: 69 74 75 61 74 69 6f 6e 20 77 68 65 72 65 20 64 ituation where d
29d0: 73 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 st already exist
29e0: 73 2c 20 74 68 65 20 72 65 6e 61 6d 65 20 77 69 s, the rename wi
29f0: 6c 6c 20 66 61 69 6c 2e 0a 20 2a 0a 20 2a 20 52 ll fail.. *. * R
2a00: 65 73 75 6c 74 73 3a 0a 20 2a 09 49 66 20 74 68 esults:. *.If th
2a10: 65 20 64 69 72 65 63 74 6f 72 79 20 77 61 73 20 e directory was
2a20: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 72 65 successfully cre
2a30: 61 74 65 64 2c 20 72 65 74 75 72 6e 73 20 54 43 ated, returns TC
2a40: 4c 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 0a L_OK. Otherwise.
2a50: 20 2a 09 74 68 65 20 72 65 74 75 72 6e 20 76 61 *.the return va
2a60: 6c 75 65 20 69 73 20 54 43 4c 5f 45 52 52 4f 52 lue is TCL_ERROR
2a70: 20 61 6e 64 20 65 72 72 6e 6f 20 69 73 20 73 65 and errno is se
2a80: 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 t to indicate th
2a90: 65 20 65 72 72 6f 72 2e 0a 20 2a 09 53 6f 6d 65 e error.. *.Some
2aa0: 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 possible values
2ab0: 20 66 6f 72 20 65 72 72 6e 6f 20 61 72 65 3a 0a for errno are:.
2ac0: 20 2a 0a 20 2a 09 45 41 43 43 45 53 3a 09 20 20 *. *.EACCES:.
2ad0: 20 20 73 72 63 20 6f 72 20 64 73 74 20 70 61 72 src or dst par
2ae0: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 63 61 ent directory ca
2af0: 6e 27 74 20 62 65 20 72 65 61 64 20 61 6e 64 2f n't be read and/
2b00: 6f 72 20 77 72 69 74 74 65 6e 2e 0a 20 2a 09 45 or written.. *.E
2b10: 45 58 49 53 54 3a 09 20 20 20 20 64 73 74 20 69 EXIST:. dst i
2b20: 73 20 61 20 6e 6f 6e 2d 65 6d 70 74 79 20 64 69 s a non-empty di
2b30: 72 65 63 74 6f 72 79 2e 0a 20 2a 09 45 49 4e 56 rectory.. *.EINV
2b40: 41 4c 3a 09 20 20 20 20 73 72 63 20 69 73 20 61 AL:. src is a
2b50: 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20 root directory
2b60: 6f 72 20 64 73 74 20 69 73 20 61 20 73 75 62 64 or dst is a subd
2b70: 69 72 65 63 74 6f 72 79 20 6f 66 20 73 72 63 2e irectory of src.
2b80: 0a 20 2a 09 45 49 53 44 49 52 3a 09 20 20 20 20 . *.EISDIR:.
2b90: 64 73 74 20 69 73 20 61 20 64 69 72 65 63 74 6f dst is a directo
2ba0: 72 79 2c 20 62 75 74 20 73 72 63 20 69 73 20 6e ry, but src is n
2bb0: 6f 74 2e 0a 20 2a 09 45 4e 4f 45 4e 54 3a 09 20 ot.. *.ENOENT:.
2bc0: 20 20 20 73 72 63 20 64 6f 65 73 6e 27 74 20 65 src doesn't e
2bd0: 78 69 73 74 2c 20 6f 72 20 73 72 63 20 6f 72 20 xist, or src or
2be0: 64 73 74 20 69 73 20 22 22 2e 0a 20 2a 09 45 4e dst is "".. *.EN
2bf0: 4f 54 44 49 52 3a 20 20 20 20 73 72 63 20 69 73 OTDIR: src is
2c00: 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 62 75 a directory, bu
2c10: 74 20 64 73 74 20 69 73 20 6e 6f 74 2e 0a 20 2a t dst is not.. *
2c20: 09 45 58 44 45 56 3a 09 20 20 20 20 73 72 63 20 .EXDEV:. src
2c30: 61 6e 64 20 64 73 74 20 61 72 65 20 6f 6e 20 64 and dst are on d
2c40: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 79 73 ifferent filesys
2c50: 74 65 6d 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 tems.. *. * Side
2c60: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 effects:. *.The
2c70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
2c80: 6f 66 20 72 65 6e 61 6d 65 20 6d 61 79 20 61 6c of rename may al
2c90: 6c 6f 77 20 63 72 6f 73 73 2d 66 69 6c 65 73 79 low cross-filesy
2ca0: 73 74 65 6d 20 72 65 6e 61 6d 65 73 2c 20 62 75 stem renames, bu
2cb0: 74 0a 20 2a 09 74 68 65 20 63 61 6c 6c 65 72 20 t. *.the caller
2cc0: 73 68 6f 75 6c 64 20 62 65 20 70 72 65 70 61 72 should be prepar
2cd0: 65 64 20 74 6f 20 65 6d 75 6c 61 74 65 20 69 74 ed to emulate it
2ce0: 20 77 69 74 68 20 63 6f 70 79 20 61 6e 64 20 64 with copy and d
2cf0: 65 6c 65 74 65 20 69 66 0a 20 2a 09 65 72 72 6e elete if. *.errn
2d00: 6f 20 69 73 20 45 58 44 45 56 2e 0a 20 2a 0a 20 o is EXDEV.. *.
2d10: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2d60: 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 52 65 6e ..int.TclpObjRen
2d70: 61 6d 65 46 69 6c 65 28 0a 20 20 20 20 54 63 6c ameFile(. Tcl
2d80: 5f 4f 62 6a 20 2a 73 72 63 50 61 74 68 50 74 72 _Obj *srcPathPtr
2d90: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 ,. Tcl_Obj *d
2da0: 65 73 74 50 61 74 68 50 74 72 29 0a 7b 0a 20 20 estPathPtr).{.
2db0: 20 20 72 65 74 75 72 6e 20 44 6f 52 65 6e 61 6d return DoRenam
2dc0: 65 46 69 6c 65 28 54 63 6c 5f 46 53 47 65 74 4e eFile(Tcl_FSGetN
2dd0: 61 74 69 76 65 50 61 74 68 28 73 72 63 50 61 74 ativePath(srcPat
2de0: 68 50 74 72 29 2c 0a 09 20 20 20 20 54 63 6c 5f hPtr),.. Tcl_
2df0: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 FSGetNativePath(
2e00: 64 65 73 74 50 61 74 68 50 74 72 29 29 3b 0a 7d destPathPtr));.}
2e10: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 44 6f 52 ..static int.DoR
2e20: 65 6e 61 6d 65 46 69 6c 65 28 0a 20 20 20 20 63 enameFile(. c
2e30: 6f 6e 73 74 20 63 68 61 72 20 2a 73 72 63 2c 09 onst char *src,.
2e40: 09 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 ./* Pathname of
2e50: 66 69 6c 65 20 6f 72 20 64 69 72 20 74 6f 20 62 file or dir to b
2e60: 65 20 72 65 6e 61 6d 65 64 0a 09 09 09 09 20 2a e renamed..... *
2e70: 20 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 20 20 (native). */.
2e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 73 const char *ds
2e90: 74 29 09 09 2f 2a 20 4e 65 77 20 70 61 74 68 6e t)../* New pathn
2ea0: 61 6d 65 20 6f 66 20 66 69 6c 65 20 6f 72 20 64 ame of file or d
2eb0: 69 72 65 63 74 6f 72 79 0a 09 09 09 09 20 2a 20 irectory..... *
2ec0: 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 7b 0a 20 (native). */.{.
2ed0: 20 20 20 69 66 20 28 72 65 6e 61 6d 65 28 73 72 if (rename(sr
2ee0: 63 2c 20 64 73 74 29 20 3d 3d 20 30 29 20 7b 09 c, dst) == 0) {.
2ef0: 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 ../* INTL: Nativ
2f00: 65 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 e. */..return TC
2f10: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 L_OK;. }.
2f20: 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45 4e 4f if (errno == ENO
2f30: 54 45 4d 50 54 59 29 20 7b 0a 09 65 72 72 6e 6f TEMPTY) {..errno
2f40: 20 3d 20 45 45 58 49 53 54 3b 0a 20 20 20 20 7d = EEXIST;. }
2f50: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
2f60: 49 52 49 58 20 72 65 74 75 72 6e 73 20 45 49 4f IRIX returns EIO
2f70: 20 77 68 65 6e 20 79 6f 75 20 61 74 74 65 6d 70 when you attemp
2f80: 74 20 74 6f 20 6d 6f 76 65 20 61 20 64 69 72 65 t to move a dire
2f90: 63 74 6f 72 79 20 69 6e 74 6f 20 69 74 73 65 6c ctory into itsel
2fa0: 66 2e 20 57 65 0a 20 20 20 20 20 2a 20 6a 75 73 f. We. * jus
2fb0: 74 20 6d 61 70 20 45 49 4f 20 74 6f 20 45 49 4e t map EIO to EIN
2fc0: 56 41 4c 20 67 65 74 20 74 68 65 20 72 69 67 68 VAL get the righ
2fd0: 74 20 6d 65 73 73 61 67 65 20 6f 6e 20 53 47 49 t message on SGI
2fe0: 2e 20 4d 6f 73 74 20 70 6c 61 74 66 6f 72 6d 73 . Most platforms
2ff0: 0a 20 20 20 20 20 2a 20 64 6f 6e 27 74 20 72 65 . * don't re
3000: 74 75 72 6e 20 45 49 4f 20 65 78 63 65 70 74 20 turn EIO except
3010: 69 6e 20 72 65 61 6c 6c 79 20 73 74 72 61 6e 67 in really strang
3020: 65 20 63 61 73 65 73 2e 0a 20 20 20 20 20 2a 2f e cases.. */
3030: 0a 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f 20 .. if (errno
3040: 3d 3d 20 45 49 4f 29 20 7b 0a 09 65 72 72 6e 6f == EIO) {..errno
3050: 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 7d = EINVAL;. }
3060: 0a 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 52 45 41 ..#ifndef NO_REA
3070: 4c 50 41 54 48 0a 20 20 20 20 2f 2a 0a 20 20 20 LPATH. /*.
3080: 20 20 2a 20 53 75 6e 4f 53 20 34 2e 31 2e 34 20 * SunOS 4.1.4
3090: 72 65 70 6f 72 74 73 20 6f 76 65 72 77 72 69 74 reports overwrit
30a0: 69 6e 67 20 61 20 6e 6f 6e 2d 65 6d 70 74 79 20 ing a non-empty
30b0: 64 69 72 65 63 74 6f 72 79 20 77 69 74 68 20 61 directory with a
30c0: 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 20 directory.
30d0: 2a 20 61 73 20 45 49 4e 56 41 4c 20 69 6e 73 74 * as EINVAL inst
30e0: 65 61 64 20 6f 66 20 45 45 58 49 53 54 20 28 66 ead of EEXIST (f
30f0: 69 72 73 74 20 72 75 6c 65 20 6f 75 74 20 74 68 irst rule out th
3100: 65 20 63 6f 72 72 65 63 74 20 45 49 4e 56 41 4c e correct EINVAL
3110: 20 72 65 73 75 6c 74 0a 20 20 20 20 20 2a 20 63 result. * c
3120: 6f 64 65 20 66 6f 72 20 6d 6f 76 69 6e 67 20 61 ode for moving a
3130: 20 64 69 72 65 63 74 6f 72 79 20 69 6e 74 6f 20 directory into
3140: 69 74 73 65 6c 66 29 2e 20 4d 75 73 74 20 62 65 itself). Must be
3150: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 0a 20 conditionally.
3160: 20 20 20 20 2a 20 63 6f 6d 70 69 6c 65 64 20 62 * compiled b
3170: 65 63 61 75 73 65 20 72 65 61 6c 70 61 74 68 28 ecause realpath(
3180: 29 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e ) not defined on
3190: 20 61 6c 6c 20 73 79 73 74 65 6d 73 2e 0a 20 20 all systems..
31a0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 65 */.. if (e
31b0: 72 72 6e 6f 20 3d 3d 20 45 49 4e 56 41 4c 20 26 rrno == EINVAL &
31c0: 26 20 68 61 76 65 52 65 61 6c 70 61 74 68 29 20 & haveRealpath)
31d0: 7b 0a 09 63 68 61 72 20 73 72 63 50 61 74 68 5b {..char srcPath[
31e0: 4d 41 58 50 41 54 48 4c 45 4e 5d 2c 20 64 73 74 MAXPATHLEN], dst
31f0: 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d Path[MAXPATHLEN]
3200: 3b 0a 09 54 63 6c 44 49 52 20 2a 64 69 72 50 74 ;..TclDIR *dirPt
3210: 72 3b 0a 09 54 63 6c 5f 44 69 72 45 6e 74 72 79 r;..Tcl_DirEntry
3220: 20 2a 64 69 72 45 6e 74 50 74 72 3b 0a 0a 09 69 *dirEntPtr;...i
3230: 66 20 28 28 52 65 61 6c 70 61 74 68 28 28 63 68 f ((Realpath((ch
3240: 61 72 20 2a 29 20 73 72 63 2c 20 73 72 63 50 61 ar *) src, srcPa
3250: 74 68 29 20 21 3d 20 4e 55 4c 4c 29 09 2f 2a 20 th) != NULL)./*
3260: 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f INTL: Native. */
3270: 0a 09 09 26 26 20 28 52 65 61 6c 70 61 74 68 28 ...&& (Realpath(
3280: 28 63 68 61 72 20 2a 29 20 64 73 74 2c 20 64 73 (char *) dst, ds
3290: 74 50 61 74 68 29 20 21 3d 20 4e 55 4c 4c 29 20 tPath) != NULL)
32a0: 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 20 /* INTL: Native
32b0: 2a 2f 0a 09 09 26 26 20 28 73 74 72 6e 63 6d 70 */...&& (strncmp
32c0: 28 73 72 63 50 61 74 68 2c 20 64 73 74 50 61 74 (srcPath, dstPat
32d0: 68 2c 20 73 74 72 6c 65 6e 28 73 72 63 50 61 74 h, strlen(srcPat
32e0: 68 29 29 20 21 3d 20 30 29 29 20 7b 0a 09 20 20 h)) != 0)) {..
32f0: 20 20 64 69 72 50 74 72 20 3d 20 54 63 6c 4f 53 dirPtr = TclOS
3300: 6f 70 65 6e 64 69 72 28 64 73 74 29 3b 09 09 09 opendir(dst);...
3310: 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e /* INTL: Native.
3320: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 64 69 72 */.. if (dir
3330: 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Ptr != NULL) {..
3340: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 20 .while (1) {...
3350: 20 20 20 64 69 72 45 6e 74 50 74 72 20 3d 20 54 dirEntPtr = T
3360: 63 6c 4f 53 72 65 61 64 64 69 72 28 64 69 72 50 clOSreaddir(dirP
3370: 74 72 29 3b 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 tr);./* INTL: Na
3380: 74 69 76 65 2e 20 2a 2f 0a 09 09 20 20 20 20 69 tive. */... i
3390: 66 20 28 64 69 72 45 6e 74 50 74 72 20 3d 3d 20 f (dirEntPtr ==
33a0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61 6b NULL) {....break
33b0: 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20 ;... }...
33c0: 69 66 20 28 28 73 74 72 63 6d 70 28 64 69 72 45 if ((strcmp(dirE
33d0: 6e 74 50 74 72 2d 3e 64 5f 6e 61 6d 65 2c 20 22 ntPtr->d_name, "
33e0: 2e 22 29 20 21 3d 20 30 29 20 26 26 0a 09 09 09 .") != 0) &&....
33f0: 20 20 20 20 28 73 74 72 63 6d 70 28 64 69 72 45 (strcmp(dirE
3400: 6e 74 50 74 72 2d 3e 64 5f 6e 61 6d 65 2c 20 22 ntPtr->d_name, "
3410: 2e 2e 22 29 20 21 3d 20 30 29 29 20 7b 0a 09 09 ..") != 0)) {...
3420: 09 65 72 72 6e 6f 20 3d 20 45 45 58 49 53 54 3b .errno = EEXIST;
3430: 0a 09 09 09 54 63 6c 4f 53 63 6c 6f 73 65 64 69 ....TclOSclosedi
3440: 72 28 64 69 72 50 74 72 29 3b 0a 09 09 09 72 65 r(dirPtr);....re
3450: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3460: 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 54 63 .. }...}...Tc
3470: 6c 4f 53 63 6c 6f 73 65 64 69 72 28 64 69 72 50 lOSclosedir(dirP
3480: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 tr);.. }..}..
3490: 65 72 72 6e 6f 20 3d 20 45 49 4e 56 41 4c 3b 0a errno = EINVAL;.
34a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 09 2f 2a 20 }.#endif./*
34b0: 21 4e 4f 5f 52 45 41 4c 50 41 54 48 20 2a 2f 0a !NO_REALPATH */.
34c0: 0a 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 . if (strcmp(
34d0: 73 72 63 2c 20 22 2f 22 29 20 3d 3d 20 30 29 20 src, "/") == 0)
34e0: 7b 0a 09 2f 2a 0a 09 20 2a 20 41 6c 70 68 61 20 {../*.. * Alpha
34f0: 72 65 70 6f 72 74 73 20 72 65 6e 61 6d 69 6e 67 reports renaming
3500: 20 2f 20 61 73 20 45 42 55 53 59 20 61 6e 64 20 / as EBUSY and
3510: 4c 69 6e 75 78 20 72 65 70 6f 72 74 73 20 69 74 Linux reports it
3520: 20 61 73 20 45 41 43 43 45 53 2c 0a 09 20 2a 20 as EACCES,.. *
3530: 69 6e 73 74 65 61 64 20 6f 66 20 45 49 4e 56 41 instead of EINVA
3540: 4c 2e 0a 09 20 2a 2f 0a 0a 09 65 72 72 6e 6f 20 L... */...errno
3550: 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 7d 0a = EINVAL;. }.
3560: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 . /*. * D
3570: 45 43 20 41 6c 70 68 61 20 4f 53 46 31 20 56 33 EC Alpha OSF1 V3
3580: 2e 30 20 72 65 74 75 72 6e 73 20 45 41 43 43 45 .0 returns EACCE
3590: 53 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e S when attemptin
35a0: 67 20 74 6f 20 6d 6f 76 65 20 61 20 66 69 6c 65 g to move a file
35b0: 0a 20 20 20 20 20 2a 20 61 63 72 6f 73 73 20 66 . * across f
35c0: 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 74 ilesystems and t
35d0: 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 he parent direct
35e0: 6f 72 79 20 6f 66 20 74 68 61 74 20 66 69 6c 65 ory of that file
35f0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 2a 20 77 is not. * w
3600: 72 69 74 61 62 6c 65 2e 20 4d 6f 73 74 20 6f 74 ritable. Most ot
3610: 68 65 72 20 73 79 73 74 65 6d 73 20 72 65 74 75 her systems retu
3620: 72 6e 20 45 58 44 45 56 2e 20 44 6f 65 73 20 6e rn EXDEV. Does n
3630: 6f 74 68 69 6e 67 20 74 6f 20 63 6f 72 72 65 63 othing to correc
3640: 74 20 74 68 69 73 0a 20 20 20 20 20 2a 20 62 65 t this. * be
3650: 68 61 76 69 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a havior.. */.
3660: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
3670: 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a ERROR;.}.../*. *
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
36d0: 2a 20 54 63 6c 70 4f 62 6a 43 6f 70 79 46 69 6c * TclpObjCopyFil
36e0: 65 2c 20 44 6f 43 6f 70 79 46 69 6c 65 20 2d 2d e, DoCopyFile --
36f0: 0a 20 2a 0a 20 2a 09 43 6f 70 79 20 61 20 73 69 . *. *.Copy a si
3700: 6e 67 6c 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 ngle file (not a
3710: 20 64 69 72 65 63 74 6f 72 79 29 2e 20 49 66 20 directory). If
3720: 64 73 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 dst already exis
3730: 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 0a 20 2a ts and is not. *
3740: 09 61 20 64 69 72 65 63 74 6f 72 79 2c 20 69 74 .a directory, it
3750: 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 20 2a 0a is removed.. *.
3760: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49 * Results:. *.I
3770: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 f the file was s
3780: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 70 69 uccessfully copi
3790: 65 64 2c 20 72 65 74 75 72 6e 73 20 54 43 4c 5f ed, returns TCL_
37a0: 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 OK. Otherwise th
37b0: 65 0a 20 2a 09 72 65 74 75 72 6e 20 76 61 6c 75 e. *.return valu
37c0: 65 20 69 73 20 54 43 4c 5f 45 52 52 4f 52 20 61 e is TCL_ERROR a
37d0: 6e 64 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 nd errno is set
37e0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 to indicate the
37f0: 65 72 72 6f 72 2e 20 53 6f 6d 65 0a 20 2a 09 70 error. Some. *.p
3800: 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66 ossible values f
3810: 6f 72 20 65 72 72 6e 6f 20 61 72 65 3a 0a 20 2a or errno are:. *
3820: 0a 20 2a 09 45 41 43 43 45 53 3a 09 20 20 20 20 . *.EACCES:.
3830: 73 72 63 20 6f 72 20 64 73 74 20 70 61 72 65 6e src or dst paren
3840: 74 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 27 t directory can'
3850: 74 20 62 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 t be read and/or
3860: 20 77 72 69 74 74 65 6e 2e 0a 20 2a 09 45 49 53 written.. *.EIS
3870: 44 49 52 3a 09 20 20 20 20 73 72 63 20 6f 72 20 DIR:. src or
3880: 64 73 74 20 69 73 20 61 20 64 69 72 65 63 74 6f dst is a directo
3890: 72 79 2e 0a 20 2a 09 45 4e 4f 45 4e 54 3a 09 20 ry.. *.ENOENT:.
38a0: 20 20 20 73 72 63 20 64 6f 65 73 6e 27 74 20 65 src doesn't e
38b0: 78 69 73 74 2e 20 73 72 63 20 6f 72 20 64 73 74 xist. src or dst
38c0: 20 69 73 20 22 22 2e 0a 20 2a 0a 20 2a 20 53 69 is "".. *. * Si
38d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 de effects:. *.T
38e0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 his procedure wi
38f0: 6c 6c 20 61 6c 73 6f 20 63 6f 70 79 20 73 79 6d ll also copy sym
3900: 62 6f 6c 69 63 20 6c 69 6e 6b 73 2c 20 62 6c 6f bolic links, blo
3910: 63 6b 2c 20 61 6e 64 20 63 68 61 72 61 63 74 65 ck, and characte
3920: 72 0a 20 2a 09 64 65 76 69 63 65 73 2c 20 61 6e r. *.devices, an
3930: 64 20 66 69 66 6f 73 2e 20 46 6f 72 20 73 79 6d d fifos. For sym
3940: 62 6f 6c 69 63 20 6c 69 6e 6b 73 2c 20 74 68 65 bolic links, the
3950: 20 6c 69 6e 6b 73 20 74 68 65 6d 73 65 6c 76 65 links themselve
3960: 73 20 77 69 6c 6c 20 62 65 0a 20 2a 09 63 6f 70 s will be. *.cop
3970: 69 65 64 20 61 6e 64 20 6e 6f 74 20 77 68 61 74 ied and not what
3980: 20 74 68 65 79 20 70 6f 69 6e 74 20 74 6f 2e 20 they point to.
3990: 46 6f 72 20 74 68 65 20 6f 74 68 65 72 20 73 70 For the other sp
39a0: 65 63 69 61 6c 20 66 69 6c 65 20 74 79 70 65 73 ecial file types
39b0: 2c 0a 20 2a 09 74 68 65 20 64 69 72 65 63 74 6f ,. *.the directo
39c0: 72 79 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 ry entry will be
39d0: 20 63 6f 70 69 65 64 20 61 6e 64 20 6e 6f 74 20 copied and not
39e0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 the contents of
39f0: 74 68 65 20 64 65 76 69 63 65 0a 20 2a 09 74 68 the device. *.th
3a00: 61 74 20 69 74 20 72 65 66 65 72 73 20 74 6f 2e at it refers to.
3a10: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a60: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f -. */..int.TclpO
3a70: 62 6a 43 6f 70 79 46 69 6c 65 28 0a 20 20 20 20 bjCopyFile(.
3a80: 54 63 6c 5f 4f 62 6a 20 2a 73 72 63 50 61 74 68 Tcl_Obj *srcPath
3a90: 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a Ptr,. Tcl_Obj
3aa0: 20 2a 64 65 73 74 50 61 74 68 50 74 72 29 0a 7b *destPathPtr).{
3ab0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
3ac0: 2a 73 72 63 20 3d 20 54 63 6c 5f 46 53 47 65 74 *src = Tcl_FSGet
3ad0: 4e 61 74 69 76 65 50 61 74 68 28 73 72 63 50 61 NativePath(srcPa
3ae0: 74 68 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f thPtr);. Tcl_
3af0: 53 74 61 74 42 75 66 20 73 72 63 53 74 61 74 42 StatBuf srcStatB
3b00: 75 66 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c uf;.. if (Tcl
3b10: 4f 53 6c 73 74 61 74 28 73 72 63 2c 20 26 73 72 OSlstat(src, &sr
3b20: 63 53 74 61 74 42 75 66 29 20 21 3d 20 30 29 20 cStatBuf) != 0)
3b30: 7b 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 {../* INTL: Nati
3b40: 76 65 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 ve. */..return T
3b50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
3b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 6f 43 6f . return DoCo
3b70: 70 79 46 69 6c 65 28 73 72 63 2c 20 54 63 6c 5f pyFile(src, Tcl_
3b80: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 FSGetNativePath(
3b90: 64 65 73 74 50 61 74 68 50 74 72 29 2c 20 26 73 destPathPtr), &s
3ba0: 72 63 53 74 61 74 42 75 66 29 3b 0a 7d 0a 0a 73 rcStatBuf);.}..s
3bb0: 74 61 74 69 63 20 69 6e 74 0a 44 6f 43 6f 70 79 tatic int.DoCopy
3bc0: 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 File(. const
3bd0: 63 68 61 72 20 2a 73 72 63 2c 09 09 2f 2a 20 50 char *src,../* P
3be0: 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 athname of file
3bf0: 74 6f 20 62 65 20 63 6f 70 69 65 64 20 28 6e 61 to be copied (na
3c00: 74 69 76 65 29 2e 20 2a 2f 0a 20 20 20 20 63 6f tive). */. co
3c10: 6e 73 74 20 63 68 61 72 20 2a 64 73 74 2c 09 09 nst char *dst,..
3c20: 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 /* Pathname of f
3c30: 69 6c 65 20 74 6f 20 63 6f 70 79 20 74 6f 20 28 ile to copy to (
3c40: 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 20 20 20 20 native). */.
3c50: 63 6f 6e 73 74 20 54 63 6c 5f 53 74 61 74 42 75 const Tcl_StatBu
3c60: 66 20 2a 73 74 61 74 42 75 66 50 74 72 29 0a 09 f *statBufPtr)..
3c70: 09 09 09 2f 2a 20 55 73 65 64 20 74 6f 20 64 65 .../* Used to de
3c80: 74 65 72 6d 69 6e 65 20 66 69 6c 65 74 79 70 65 termine filetype
3c90: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 53 . */.{. Tcl_S
3ca0: 74 61 74 42 75 66 20 64 73 74 53 74 61 74 42 75 tatBuf dstStatBu
3cb0: 66 3b 0a 0a 20 20 20 20 69 66 20 28 53 5f 49 53 f;.. if (S_IS
3cc0: 44 49 52 28 73 74 61 74 42 75 66 50 74 72 2d 3e DIR(statBufPtr->
3cd0: 73 74 5f 6d 6f 64 65 29 29 20 7b 0a 09 65 72 72 st_mode)) {..err
3ce0: 6e 6f 20 3d 20 45 49 53 44 49 52 3b 0a 09 72 65 no = EISDIR;..re
3cf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
3d00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
3d10: 20 20 20 2a 20 53 79 6d 6c 69 6e 6b 2c 20 61 6e * Symlink, an
3d20: 64 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6f 74 d some of the ot
3d30: 68 65 72 20 63 61 6c 6c 73 20 77 69 6c 6c 20 66 her calls will f
3d40: 61 69 6c 20 69 66 20 74 68 65 20 74 61 72 67 65 ail if the targe
3d50: 74 20 65 78 69 73 74 73 2c 20 73 6f 0a 20 20 20 t exists, so.
3d60: 20 20 2a 20 77 65 20 72 65 6d 6f 76 65 20 69 74 * we remove it
3d70: 20 66 69 72 73 74 2e 0a 20 20 20 20 20 2a 2f 0a first.. */.
3d80: 0a 20 20 20 20 69 66 20 28 54 63 6c 4f 53 6c 73 . if (TclOSls
3d90: 74 61 74 28 64 73 74 2c 20 26 64 73 74 53 74 61 tat(dst, &dstSta
3da0: 74 42 75 66 29 20 3d 3d 20 30 29 20 7b 09 09 2f tBuf) == 0) {../
3db0: 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 * INTL: Native.
3dc0: 2a 2f 0a 09 69 66 20 28 53 5f 49 53 44 49 52 28 */..if (S_ISDIR(
3dd0: 64 73 74 53 74 61 74 42 75 66 2e 73 74 5f 6d 6f dstStatBuf.st_mo
3de0: 64 65 29 29 20 7b 0a 09 20 20 20 20 65 72 72 6e de)) {.. errn
3df0: 6f 20 3d 20 45 49 53 44 49 52 3b 0a 09 20 20 20 o = EISDIR;..
3e00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f return TCL_ERRO
3e10: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 R;..}. }.
3e20: 69 66 20 28 75 6e 6c 69 6e 6b 28 64 73 74 29 20 if (unlink(dst)
3e30: 21 3d 20 30 29 20 7b 09 09 09 09 2f 2a 20 49 4e != 0) {..../* IN
3e40: 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f 0a 09 TL: Native. */..
3e50: 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e 4f if (errno != ENO
3e60: 45 4e 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ENT) {.. retu
3e70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
3e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 . }.. swit
3e90: 63 68 20 28 28 69 6e 74 29 20 28 73 74 61 74 42 ch ((int) (statB
3ea0: 75 66 50 74 72 2d 3e 73 74 5f 6d 6f 64 65 20 26 ufPtr->st_mode &
3eb0: 20 53 5f 49 46 4d 54 29 29 20 7b 0a 23 69 66 6e S_IFMT)) {.#ifn
3ec0: 64 65 66 20 44 4a 47 50 50 0a 20 20 20 20 63 61 def DJGPP. ca
3ed0: 73 65 20 53 5f 49 46 4c 4e 4b 3a 20 7b 0a 09 63 se S_IFLNK: {..c
3ee0: 68 61 72 20 6c 69 6e 6b 42 75 66 5b 4d 41 58 50 har linkBuf[MAXP
3ef0: 41 54 48 4c 45 4e 2b 31 5d 3b 0a 09 69 6e 74 20 ATHLEN+1];..int
3f00: 6c 65 6e 67 74 68 3b 0a 0a 09 6c 65 6e 67 74 68 length;...length
3f10: 20 3d 20 72 65 61 64 6c 69 6e 6b 28 73 72 63 2c = readlink(src,
3f20: 20 6c 69 6e 6b 42 75 66 2c 20 4d 41 58 50 41 54 linkBuf, MAXPAT
3f30: 48 4c 45 4e 29 3b 0a 09 09 09 09 09 09 09 2f 2a HLEN);......../*
3f40: 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a INTL: Native. *
3f50: 2f 0a 09 69 66 20 28 6c 65 6e 67 74 68 20 3d 3d /..if (length ==
3f60: 20 2d 31 29 20 7b 0a 09 20 20 20 20 72 65 74 75 -1) {.. retu
3f70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
3f80: 0a 09 6c 69 6e 6b 42 75 66 5b 6c 65 6e 67 74 68 ..linkBuf[length
3f90: 5d 20 3d 20 27 5c 30 27 3b 0a 09 69 66 20 28 73 ] = '\0';..if (s
3fa0: 79 6d 6c 69 6e 6b 28 6c 69 6e 6b 42 75 66 2c 20 ymlink(linkBuf,
3fb0: 64 73 74 29 20 3c 20 30 29 20 7b 09 09 2f 2a 20 dst) < 0) {../*
3fc0: 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f INTL: Native. */
3fd0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
3fe0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 23 69 66 64 65 _ERROR;..}.#ifde
3ff0: 66 20 4d 41 43 5f 4f 53 58 5f 54 43 4c 0a 09 54 f MAC_OSX_TCL..T
4000: 63 6c 4d 61 63 4f 53 58 43 6f 70 79 46 69 6c 65 clMacOSXCopyFile
4010: 41 74 74 72 69 62 75 74 65 73 28 73 72 63 2c 20 Attributes(src,
4020: 64 73 74 2c 20 73 74 61 74 42 75 66 50 74 72 29 dst, statBufPtr)
4030: 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b ;.#endif..break;
4040: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a . }.#endif /*
4050: 20 21 44 4a 47 50 50 20 2a 2f 0a 20 20 20 20 63 !DJGPP */. c
4060: 61 73 65 20 53 5f 49 46 42 4c 4b 3a 0a 20 20 20 ase S_IFBLK:.
4070: 20 63 61 73 65 20 53 5f 49 46 43 48 52 3a 0a 09 case S_IFCHR:..
4080: 69 66 20 28 6d 6b 6e 6f 64 28 64 73 74 2c 20 73 if (mknod(dst, s
4090: 74 61 74 42 75 66 50 74 72 2d 3e 73 74 5f 6d 6f tatBufPtr->st_mo
40a0: 64 65 2c 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 de,../* INTL: Na
40b0: 74 69 76 65 2e 20 2a 2f 0a 09 09 73 74 61 74 42 tive. */...statB
40c0: 75 66 50 74 72 2d 3e 73 74 5f 72 64 65 76 29 20 ufPtr->st_rdev)
40d0: 3c 20 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 < 0) {.. retu
40e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
40f0: 0a 09 72 65 74 75 72 6e 20 43 6f 70 79 46 69 6c ..return CopyFil
4100: 65 41 74 74 73 28 73 72 63 2c 20 64 73 74 2c 20 eAtts(src, dst,
4110: 73 74 61 74 42 75 66 50 74 72 29 3b 0a 20 20 20 statBufPtr);.
4120: 20 63 61 73 65 20 53 5f 49 46 49 46 4f 3a 0a 09 case S_IFIFO:..
4130: 69 66 20 28 6d 6b 66 69 66 6f 28 64 73 74 2c 20 if (mkfifo(dst,
4140: 73 74 61 74 42 75 66 50 74 72 2d 3e 73 74 5f 6d statBufPtr->st_m
4150: 6f 64 65 29 20 3c 20 30 29 20 7b 09 2f 2a 20 49 ode) < 0) {./* I
4160: 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f 0a NTL: Native. */.
4170: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
4180: 45 52 52 4f 52 3b 0a 09 7d 0a 09 72 65 74 75 72 ERROR;..}..retur
4190: 6e 20 43 6f 70 79 46 69 6c 65 41 74 74 73 28 73 n CopyFileAtts(s
41a0: 72 63 2c 20 64 73 74 2c 20 73 74 61 74 42 75 66 rc, dst, statBuf
41b0: 50 74 72 29 3b 0a 20 20 20 20 64 65 66 61 75 6c Ptr);. defaul
41c0: 74 3a 0a 09 72 65 74 75 72 6e 20 54 63 6c 55 6e t:..return TclUn
41d0: 69 78 43 6f 70 79 46 69 6c 65 28 73 72 63 2c 20 ixCopyFile(src,
41e0: 64 73 74 2c 20 73 74 61 74 42 75 66 50 74 72 2c dst, statBufPtr,
41f0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 0);. }. r
4200: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
4210: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4260: 0a 20 2a 20 54 63 6c 55 6e 69 78 43 6f 70 79 46 . * TclUnixCopyF
4270: 69 6c 65 20 2d 0a 20 2a 0a 20 2a 09 48 65 6c 70 ile -. *. *.Help
4280: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 er function for
4290: 54 63 6c 70 43 6f 70 79 46 69 6c 65 2e 20 43 6f TclpCopyFile. Co
42a0: 70 69 65 73 20 6f 6e 65 20 72 65 67 75 6c 61 72 pies one regular
42b0: 20 66 69 6c 65 2c 20 75 73 69 6e 67 0a 20 2a 09 file, using. *.
42c0: 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 read() and write
42d0: 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ().. *. * Result
42e0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
42f0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a Tcl result.. *.
4300: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4310: 0a 20 2a 09 41 20 66 69 6c 65 20 69 73 20 63 6f . *.A file is co
4320: 70 69 65 64 2e 20 44 73 74 20 77 69 6c 6c 20 62 pied. Dst will b
4330: 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 e overwritten if
4340: 20 69 74 20 65 78 69 73 74 73 2e 0a 20 2a 0a 20 it exists.. *.
4350: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
43a0: 0a 54 63 6c 55 6e 69 78 43 6f 70 79 46 69 6c 65 .TclUnixCopyFile
43b0: 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 (. const char
43c0: 20 2a 73 72 63 2c 09 09 2f 2a 20 50 61 74 68 6e *src,../* Pathn
43d0: 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 ame of file to c
43e0: 6f 70 79 20 28 6e 61 74 69 76 65 29 2e 20 2a 2f opy (native). */
43f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
4400: 2a 64 73 74 2c 09 09 2f 2a 20 50 61 74 68 6e 61 *dst,../* Pathna
4410: 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 72 me of file to cr
4420: 65 61 74 65 2f 6f 76 65 72 77 72 69 74 65 0a 09 eate/overwrite..
4430: 09 09 09 20 2a 20 28 6e 61 74 69 76 65 29 2e 20 ... * (native).
4440: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c */. const Tcl
4450: 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 42 75 _StatBuf *statBu
4460: 66 50 74 72 2c 0a 09 09 09 09 2f 2a 20 55 73 65 fPtr,...../* Use
4470: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6d d to determine m
4480: 6f 64 65 20 61 6e 64 20 62 6c 6f 63 6b 73 69 7a ode and blocksiz
4490: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 6f e. */. int do
44a0: 6e 74 43 6f 70 79 41 74 74 73 29 09 09 2f 2a 20 ntCopyAtts)../*
44b0: 49 66 20 66 6c 61 67 20 73 65 74 2c 20 64 6f 6e If flag set, don
44c0: 27 74 20 63 6f 70 79 20 61 74 74 72 69 62 75 74 't copy attribut
44d0: 65 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 es. */.{. int
44e0: 20 73 72 63 46 64 2c 20 64 73 74 46 64 3b 0a 20 srcFd, dstFd;.
44f0: 20 20 20 75 6e 73 69 67 6e 65 64 20 62 6c 6f 63 unsigned bloc
4500: 6b 53 69 7a 65 3b 09 09 2f 2a 20 4f 70 74 69 6d kSize;../* Optim
4510: 61 6c 20 49 2f 4f 20 62 6c 6f 63 6b 73 69 7a 65 al I/O blocksize
4520: 20 66 6f 72 20 66 69 6c 65 73 79 73 74 65 6d 20 for filesystem
4530: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 */. char *buf
4540: 66 65 72 3b 09 09 2f 2a 20 44 61 74 61 20 62 75 fer;../* Data bu
4550: 66 66 65 72 20 66 6f 72 20 63 6f 70 79 20 2a 2f ffer for copy */
4560: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 72 65 61 . size_t nrea
4570: 64 3b 0a 0a 23 69 66 64 65 66 20 44 4a 47 50 50 d;..#ifdef DJGPP
4580: 0a 23 64 65 66 69 6e 65 20 42 49 4e 4d 4f 44 45 .#define BINMODE
4590: 20 7c 4f 5f 42 49 4e 41 52 59 0a 23 65 6c 73 65 |O_BINARY.#else
45a0: 0a 23 64 65 66 69 6e 65 20 42 49 4e 4d 4f 44 45 .#define BINMODE
45b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 44 4a 47 50 50 .#endif /* DJGPP
45c0: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 44 45 46 */..#define DEF
45d0: 41 55 4c 54 5f 43 4f 50 59 5f 42 4c 4f 43 4b 5f AULT_COPY_BLOCK_
45e0: 53 49 5a 45 20 34 30 39 36 0a 0a 20 20 20 20 69 SIZE 4096.. i
45f0: 66 20 28 28 73 72 63 46 64 20 3d 20 54 63 6c 4f f ((srcFd = TclO
4600: 53 6f 70 65 6e 28 73 72 63 2c 20 4f 5f 52 44 4f Sopen(src, O_RDO
4610: 4e 4c 59 20 42 49 4e 4d 4f 44 45 2c 20 30 29 29 NLY BINMODE, 0))
4620: 20 3c 20 30 29 20 7b 20 2f 2a 20 49 4e 54 4c 3a < 0) { /* INTL:
4630: 20 4e 61 74 69 76 65 20 2a 2f 0a 09 72 65 74 75 Native */..retu
4640: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
4650: 20 20 7d 0a 0a 20 20 20 20 64 73 74 46 64 20 3d }.. dstFd =
4660: 20 54 63 6c 4f 53 6f 70 65 6e 28 64 73 74 2c 20 TclOSopen(dst,
4670: 4f 5f 43 52 45 41 54 7c 4f 5f 54 52 55 4e 43 7c O_CREAT|O_TRUNC|
4680: 4f 5f 57 52 4f 4e 4c 59 20 42 49 4e 4d 4f 44 45 O_WRONLY BINMODE
4690: 2c 20 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 , /* INTL: Nativ
46a0: 65 20 2a 2f 0a 09 20 20 20 20 73 74 61 74 42 75 e */.. statBu
46b0: 66 50 74 72 2d 3e 73 74 5f 6d 6f 64 65 29 3b 0a fPtr->st_mode);.
46c0: 20 20 20 20 69 66 20 28 64 73 74 46 64 20 3c 20 if (dstFd <
46d0: 30 29 20 7b 0a 09 63 6c 6f 73 65 28 73 72 63 46 0) {..close(srcF
46e0: 64 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f d);..return TCL_
46f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
4700: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 72 79 20 /*. * Try
4710: 74 6f 20 77 6f 72 6b 20 6f 75 74 20 74 68 65 20 to work out the
4720: 62 65 73 74 20 73 69 7a 65 20 6f 66 20 62 75 66 best size of buf
4730: 66 65 72 20 74 6f 20 75 73 65 20 66 6f 72 20 63 fer to use for c
4740: 6f 70 79 69 6e 67 2e 20 49 66 20 77 65 0a 20 20 opying. If we.
4750: 20 20 20 2a 20 63 61 6e 27 74 2c 20 69 74 27 73 * can't, it's
4760: 20 6e 6f 20 62 69 67 20 64 65 61 6c 20 61 73 20 no big deal as
4770: 77 65 20 63 61 6e 20 6a 75 73 74 20 75 73 65 20 we can just use
4780: 61 20 28 33 32 2d 62 69 74 29 20 70 61 67 65 2c a (32-bit) page,
4790: 20 73 69 6e 63 65 0a 20 20 20 20 20 2a 20 74 68 since. * th
47a0: 61 74 27 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 at's likely to b
47b0: 65 20 66 61 69 72 6c 79 20 65 66 66 69 63 69 65 e fairly efficie
47c0: 6e 74 20 61 6e 79 77 61 79 2e 0a 20 20 20 20 20 nt anyway..
47d0: 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f */..#ifdef HAVE_
47e0: 53 54 52 55 43 54 5f 53 54 41 54 5f 53 54 5f 42 STRUCT_STAT_ST_B
47f0: 4c 4b 53 49 5a 45 0a 20 20 20 20 62 6c 6f 63 6b LKSIZE. block
4800: 53 69 7a 65 20 3d 20 73 74 61 74 42 75 66 50 74 Size = statBufPt
4810: 72 2d 3e 73 74 5f 62 6c 6b 73 69 7a 65 3b 0a 23 r->st_blksize;.#
4820: 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f elif !defined(NO
4830: 5f 46 53 54 41 54 46 53 29 0a 20 20 20 20 7b 0a _FSTATFS). {.
4840: 09 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 .struct statfs f
4850: 73 3b 0a 0a 09 69 66 20 28 66 73 74 61 74 66 73 s;...if (fstatfs
4860: 28 73 72 63 46 64 2c 20 26 66 73 29 20 3d 3d 20 (srcFd, &fs) ==
4870: 30 29 20 7b 0a 09 20 20 20 20 62 6c 6f 63 6b 53 0) {.. blockS
4880: 69 7a 65 20 3d 20 66 73 2e 66 5f 62 73 69 7a 65 ize = fs.f_bsize
4890: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
48a0: 20 62 6c 6f 63 6b 53 69 7a 65 20 3d 20 44 45 46 blockSize = DEF
48b0: 41 55 4c 54 5f 43 4f 50 59 5f 42 4c 4f 43 4b 5f AULT_COPY_BLOCK_
48c0: 53 49 5a 45 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 SIZE;..}. }.#
48d0: 65 6c 73 65 0a 20 20 20 20 62 6c 6f 63 6b 53 69 else. blockSi
48e0: 7a 65 20 3d 20 44 45 46 41 55 4c 54 5f 43 4f 50 ze = DEFAULT_COP
48f0: 59 5f 42 4c 4f 43 4b 5f 53 49 5a 45 3b 0a 23 65 Y_BLOCK_SIZE;.#e
4900: 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 53 54 52 ndif /* HAVE_STR
4910: 55 43 54 5f 53 54 41 54 5f 53 54 5f 42 4c 4b 53 UCT_STAT_ST_BLKS
4920: 49 5a 45 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 IZE */.. /*.
4930: 20 20 20 20 2a 20 5b 53 46 20 54 63 6c 20 42 75 * [SF Tcl Bu
4940: 67 20 31 35 38 36 34 37 30 5d 20 45 76 65 6e 20 g 1586470] Even
4950: 69 66 20 77 65 20 48 41 56 45 5f 53 54 52 55 43 if we HAVE_STRUC
4960: 54 5f 53 54 41 54 5f 53 54 5f 42 4c 4b 53 49 5a T_STAT_ST_BLKSIZ
4970: 45 2c 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 E, there are.
4980: 20 20 2a 20 66 69 6c 65 73 79 73 74 65 6d 73 20 * filesystems
4990: 77 68 69 63 68 20 72 65 70 6f 72 74 20 61 20 62 which report a b
49a0: 6f 67 75 73 20 76 61 6c 75 65 20 66 6f 72 20 74 ogus value for t
49b0: 68 65 20 62 6c 6f 63 6b 73 69 7a 65 2e 20 41 6e he blocksize. An
49c0: 20 65 78 61 6d 70 6c 65 0a 20 20 20 20 20 2a 20 example. *
49d0: 69 73 20 74 68 65 20 41 6e 64 72 65 77 20 46 69 is the Andrew Fi
49e0: 6c 65 73 79 73 74 65 6d 20 28 61 66 73 29 2c 20 lesystem (afs),
49f0: 72 65 70 6f 72 74 69 6e 67 20 61 20 62 6c 6f 63 reporting a bloc
4a00: 6b 73 69 7a 65 20 6f 66 20 30 2e 20 57 68 65 6e ksize of 0. When
4a10: 0a 20 20 20 20 20 2a 20 64 65 74 65 63 74 69 6e . * detectin
4a20: 67 20 73 75 63 68 20 61 20 73 69 74 75 61 74 69 g such a situati
4a30: 6f 6e 20 77 65 20 6e 6f 77 20 73 69 6d 70 6c 79 on we now simply
4a40: 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 20 fall back to a
4a50: 68 61 72 64 77 69 72 65 64 0a 20 20 20 20 20 2a hardwired. *
4a60: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 2e 0a 20 default size..
4a70: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
4a80: 62 6c 6f 63 6b 53 69 7a 65 20 3c 3d 20 30 29 20 blockSize <= 0)
4a90: 7b 0a 09 62 6c 6f 63 6b 53 69 7a 65 20 3d 20 44 {..blockSize = D
4aa0: 45 46 41 55 4c 54 5f 43 4f 50 59 5f 42 4c 4f 43 EFAULT_COPY_BLOC
4ab0: 4b 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 K_SIZE;. }.
4ac0: 20 20 62 75 66 66 65 72 20 3d 20 63 6b 61 6c 6c buffer = ckall
4ad0: 6f 63 28 62 6c 6f 63 6b 53 69 7a 65 29 3b 0a 20 oc(blockSize);.
4ae0: 20 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 while (1) {..
4af0: 6e 72 65 61 64 20 3d 20 28 73 69 7a 65 5f 74 29 nread = (size_t)
4b00: 20 72 65 61 64 28 73 72 63 46 64 2c 20 62 75 66 read(srcFd, buf
4b10: 66 65 72 2c 20 62 6c 6f 63 6b 53 69 7a 65 29 3b fer, blockSize);
4b20: 0a 09 69 66 20 28 28 6e 72 65 61 64 20 3d 3d 20 ..if ((nread ==
4b30: 28 73 69 7a 65 5f 74 29 20 2d 31 29 20 7c 7c 20 (size_t) -1) ||
4b40: 28 6e 72 65 61 64 20 3d 3d 20 30 29 29 20 7b 0a (nread == 0)) {.
4b50: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 . break;..}..
4b60: 69 66 20 28 28 73 69 7a 65 5f 74 29 20 77 72 69 if ((size_t) wri
4b70: 74 65 28 64 73 74 46 64 2c 20 62 75 66 66 65 72 te(dstFd, buffer
4b80: 2c 20 6e 72 65 61 64 29 20 21 3d 20 6e 72 65 61 , nread) != nrea
4b90: 64 29 20 7b 0a 09 20 20 20 20 6e 72 65 61 64 20 d) {.. nread
4ba0: 3d 20 28 73 69 7a 65 5f 74 29 20 2d 31 3b 0a 09 = (size_t) -1;..
4bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 break;..}.
4bc0: 20 20 7d 0a 0a 20 20 20 20 63 6b 66 72 65 65 28 }.. ckfree(
4bd0: 62 75 66 66 65 72 29 3b 0a 20 20 20 20 63 6c 6f buffer);. clo
4be0: 73 65 28 73 72 63 46 64 29 3b 0a 20 20 20 20 69 se(srcFd);. i
4bf0: 66 20 28 28 63 6c 6f 73 65 28 64 73 74 46 64 29 f ((close(dstFd)
4c00: 20 21 3d 20 30 29 20 7c 7c 20 28 6e 72 65 61 64 != 0) || (nread
4c10: 20 3d 3d 20 28 73 69 7a 65 5f 74 29 20 2d 31 29 == (size_t) -1)
4c20: 29 20 7b 0a 09 75 6e 6c 69 6e 6b 28 64 73 74 29 ) {..unlink(dst)
4c30: 3b 09 09 09 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e ;...../* INTL: N
4c40: 61 74 69 76 65 2e 20 2a 2f 0a 09 72 65 74 75 72 ative. */..retur
4c50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
4c60: 20 7d 0a 20 20 20 20 69 66 20 28 21 64 6f 6e 74 }. if (!dont
4c70: 43 6f 70 79 41 74 74 73 20 26 26 20 43 6f 70 79 CopyAtts && Copy
4c80: 46 69 6c 65 41 74 74 73 28 73 72 63 2c 20 64 73 FileAtts(src, ds
4c90: 74 2c 20 73 74 61 74 42 75 66 50 74 72 29 20 3d t, statBufPtr) =
4ca0: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 = TCL_ERROR) {..
4cb0: 2f 2a 0a 09 20 2a 20 54 68 65 20 63 6f 70 79 20 /*.. * The copy
4cc0: 73 75 63 63 65 65 64 65 64 2c 20 62 75 74 20 73 succeeded, but s
4cd0: 65 74 74 69 6e 67 20 74 68 65 20 70 65 72 6d 69 etting the permi
4ce0: 73 73 69 6f 6e 73 20 66 61 69 6c 65 64 2c 20 73 ssions failed, s
4cf0: 6f 20 62 65 20 69 6e 20 61 0a 09 20 2a 20 63 6f o be in a.. * co
4d00: 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2c 20 nsistent state,
4d10: 77 65 20 72 65 6d 6f 76 65 20 74 68 65 20 66 69 we remove the fi
4d20: 6c 65 20 74 68 61 74 20 77 61 73 20 63 72 65 61 le that was crea
4d30: 74 65 64 20 62 79 20 74 68 65 20 63 6f 70 79 2e ted by the copy.
4d40: 0a 09 20 2a 2f 0a 0a 09 75 6e 6c 69 6e 6b 28 64 .. */...unlink(d
4d50: 73 74 29 3b 09 09 09 09 09 2f 2a 20 49 4e 54 4c st);...../* INTL
4d60: 3a 20 4e 61 74 69 76 65 2e 20 2a 2f 0a 09 72 65 : Native. */..re
4d70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
4d80: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
4d90: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
4da0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4df0: 0a 20 2a 20 54 63 6c 70 4f 62 6a 44 65 6c 65 74 . * TclpObjDelet
4e00: 65 46 69 6c 65 2c 20 54 63 6c 70 44 65 6c 65 74 eFile, TclpDelet
4e10: 65 46 69 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 eFile --. *. *.R
4e20: 65 6d 6f 76 65 73 20 61 20 73 69 6e 67 6c 65 20 emoves a single
4e30: 66 69 6c 65 20 28 6e 6f 74 20 61 20 64 69 72 65 file (not a dire
4e40: 63 74 6f 72 79 29 2e 0a 20 2a 0a 20 2a 20 52 65 ctory).. *. * Re
4e50: 73 75 6c 74 73 3a 0a 20 2a 09 49 66 20 74 68 65 sults:. *.If the
4e60: 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 file was succes
4e70: 73 66 75 6c 6c 79 20 64 65 6c 65 74 65 64 2c 20 sfully deleted,
4e80: 72 65 74 75 72 6e 73 20 54 43 4c 5f 4f 4b 2e 20 returns TCL_OK.
4e90: 4f 74 68 65 72 77 69 73 65 20 74 68 65 0a 20 2a Otherwise the. *
4ea0: 09 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 .return value is
4eb0: 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20 65 TCL_ERROR and e
4ec0: 72 72 6e 6f 20 69 73 20 73 65 74 20 74 6f 20 69 rrno is set to i
4ed0: 6e 64 69 63 61 74 65 20 74 68 65 20 65 72 72 6f ndicate the erro
4ee0: 72 2e 20 53 6f 6d 65 0a 20 2a 09 70 6f 73 73 69 r. Some. *.possi
4ef0: 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65 ble values for e
4f00: 72 72 6e 6f 20 61 72 65 3a 0a 20 2a 0a 20 2a 09 rrno are:. *. *.
4f10: 45 41 43 43 45 53 3a 09 20 20 20 20 61 20 70 61 EACCES:. a pa
4f20: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 63 rent directory c
4f30: 61 6e 27 74 20 62 65 20 72 65 61 64 20 61 6e 64 an't be read and
4f40: 2f 6f 72 20 77 72 69 74 74 65 6e 2e 0a 20 2a 09 /or written.. *.
4f50: 45 49 53 44 49 52 3a 09 20 20 20 20 70 61 74 68 EISDIR:. path
4f60: 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 2e is a directory.
4f70: 0a 20 2a 09 45 4e 4f 45 4e 54 3a 09 20 20 20 20 . *.ENOENT:.
4f80: 70 61 74 68 20 64 6f 65 73 6e 27 74 20 65 78 69 path doesn't exi
4f90: 73 74 20 6f 72 20 69 73 20 22 22 2e 0a 20 2a 0a st or is "".. *.
4fa0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4fb0: 0a 20 2a 09 54 68 65 20 66 69 6c 65 20 69 73 20 . *.The file is
4fc0: 64 65 6c 65 74 65 64 2c 20 65 76 65 6e 20 69 66 deleted, even if
4fd0: 20 69 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 it is read-only
4fe0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5030: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 --. */..int.Tclp
5040: 4f 62 6a 44 65 6c 65 74 65 46 69 6c 65 28 0a 20 ObjDeleteFile(.
5050: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 Tcl_Obj *path
5060: 50 74 72 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 Ptr).{. retur
5070: 6e 20 54 63 6c 70 44 65 6c 65 74 65 46 69 6c 65 n TclpDeleteFile
5080: 28 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 (Tcl_FSGetNative
5090: 50 61 74 68 28 70 61 74 68 50 74 72 29 29 3b 0a Path(pathPtr));.
50a0: 7d 0a 0a 69 6e 74 0a 54 63 6c 70 44 65 6c 65 74 }..int.TclpDelet
50b0: 65 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 eFile(. const
50c0: 20 76 6f 69 64 20 2a 70 61 74 68 29 09 09 2f 2a void *path)../*
50d0: 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c Pathname of fil
50e0: 65 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 20 e to be removed
50f0: 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 7b 0a 20 (native). */.{.
5100: 20 20 20 69 66 20 28 75 6e 6c 69 6e 6b 28 28 63 if (unlink((c
5110: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 61 74 68 onst char *)path
5120: 29 20 21 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 ) != 0) {..retur
5130: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5140: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
5150: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
51b0: 20 54 63 6c 70 43 72 65 61 74 65 44 69 72 65 63 TclpCreateDirec
51c0: 74 6f 72 79 2c 20 44 6f 43 72 65 61 74 65 44 69 tory, DoCreateDi
51d0: 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a rectory --. *. *
51e0: 09 43 72 65 61 74 65 73 20 74 68 65 20 73 70 65 .Creates the spe
51f0: 63 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 cified directory
5200: 2e 20 41 6c 6c 20 70 61 72 65 6e 74 20 64 69 72 . All parent dir
5210: 65 63 74 6f 72 69 65 73 20 6f 66 20 74 68 65 0a ectories of the.
5220: 20 2a 09 73 70 65 63 69 66 69 65 64 20 64 69 72 *.specified dir
5230: 65 63 74 6f 72 79 20 6d 75 73 74 20 61 6c 72 65 ectory must alre
5240: 61 64 79 20 65 78 69 73 74 2e 20 54 68 65 20 64 ady exist. The d
5250: 69 72 65 63 74 6f 72 79 20 69 73 20 61 75 74 6f irectory is auto
5260: 6d 61 74 69 63 61 6c 6c 79 0a 20 2a 09 63 72 65 matically. *.cre
5270: 61 74 65 64 20 77 69 74 68 20 70 65 72 6d 69 73 ated with permis
5280: 73 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 75 73 sions so that us
5290: 65 72 20 63 61 6e 20 61 63 63 65 73 73 20 74 68 er can access th
52a0: 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 e new directory
52b0: 61 6e 64 0a 20 2a 09 63 72 65 61 74 65 20 6e 65 and. *.create ne
52c0: 77 20 66 69 6c 65 73 20 6f 72 20 73 75 62 64 69 w files or subdi
52d0: 72 65 63 74 6f 72 69 65 73 20 69 6e 20 69 74 2e rectories in it.
52e0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
52f0: 20 2a 09 49 66 20 74 68 65 20 64 69 72 65 63 74 *.If the direct
5300: 6f 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 ory was successf
5310: 75 6c 6c 79 20 63 72 65 61 74 65 64 2c 20 72 65 ully created, re
5320: 74 75 72 6e 73 20 54 43 4c 5f 4f 4b 2e 20 4f 74 turns TCL_OK. Ot
5330: 68 65 72 77 69 73 65 0a 20 2a 09 74 68 65 20 72 herwise. *.the r
5340: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 54 eturn value is T
5350: 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20 65 72 72 CL_ERROR and err
5360: 6e 6f 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 no is set to ind
5370: 69 63 61 74 65 20 74 68 65 20 65 72 72 6f 72 2e icate the error.
5380: 0a 20 2a 09 53 6f 6d 65 20 70 6f 73 73 69 62 6c . *.Some possibl
5390: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65 72 72 e values for err
53a0: 6e 6f 20 61 72 65 3a 0a 20 2a 0a 20 2a 09 45 41 no are:. *. *.EA
53b0: 43 43 45 53 3a 09 20 20 20 20 61 20 70 61 72 65 CCES:. a pare
53c0: 6e 74 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e nt directory can
53d0: 27 74 20 62 65 20 72 65 61 64 20 61 6e 64 2f 6f 't be read and/o
53e0: 72 20 77 72 69 74 74 65 6e 2e 0a 20 2a 09 45 45 r written.. *.EE
53f0: 58 49 53 54 3a 09 20 20 20 20 70 61 74 68 20 61 XIST:. path a
5400: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 20 lready exists..
5410: 2a 09 45 4e 4f 45 4e 54 3a 09 20 20 20 20 61 20 *.ENOENT:. a
5420: 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 parent directory
5430: 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a doesn't exist..
5440: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
5450: 74 73 3a 0a 20 2a 09 41 20 64 69 72 65 63 74 6f ts:. *.A directo
5460: 72 79 20 69 73 20 63 72 65 61 74 65 64 20 77 69 ry is created wi
5470: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 th the current u
5480: 6d 61 73 6b 2c 20 65 78 63 65 70 74 20 74 68 61 mask, except tha
5490: 74 20 70 65 72 6d 69 73 73 69 6f 6e 0a 20 2a 09 t permission. *.
54a0: 66 6f 72 20 75 2b 72 77 78 20 77 69 6c 6c 20 61 for u+rwx will a
54b0: 6c 77 61 79 73 20 62 65 20 61 64 64 65 64 2e 0a lways be added..
54c0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5510: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 . */..int.TclpOb
5520: 6a 43 72 65 61 74 65 44 69 72 65 63 74 6f 72 79 jCreateDirectory
5530: 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 (. Tcl_Obj *p
5540: 61 74 68 50 74 72 29 0a 7b 0a 20 20 20 20 72 65 athPtr).{. re
5550: 74 75 72 6e 20 44 6f 43 72 65 61 74 65 44 69 72 turn DoCreateDir
5560: 65 63 74 6f 72 79 28 54 63 6c 5f 46 53 47 65 74 ectory(Tcl_FSGet
5570: 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 NativePath(pathP
5580: 74 72 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 tr));.}..static
5590: 69 6e 74 0a 44 6f 43 72 65 61 74 65 44 69 72 65 int.DoCreateDire
55a0: 63 74 6f 72 79 28 0a 20 20 20 20 63 6f 6e 73 74 ctory(. const
55b0: 20 63 68 61 72 20 2a 70 61 74 68 29 09 09 2f 2a char *path)../*
55c0: 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 64 69 72 Pathname of dir
55d0: 65 63 74 6f 72 79 20 74 6f 20 63 72 65 61 74 65 ectory to create
55e0: 20 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 7b 0a (native). */.{.
55f0: 20 20 20 20 6d 6f 64 65 5f 74 20 6d 6f 64 65 3b mode_t mode;
5600: 0a 0a 20 20 20 20 6d 6f 64 65 20 3d 20 75 6d 61 .. mode = uma
5610: 73 6b 28 30 29 3b 0a 20 20 20 20 75 6d 61 73 6b sk(0);. umask
5620: 28 6d 6f 64 65 29 3b 0a 0a 20 20 20 20 2f 2a 0a (mode);.. /*.
5630: 20 20 20 20 20 2a 20 75 6d 61 73 6b 20 72 65 74 * umask ret
5640: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 63 74 urn value is act
5650: 75 61 6c 6c 79 20 74 68 65 20 69 6e 76 65 72 73 ually the invers
5660: 65 20 6f 66 20 74 68 65 20 70 65 72 6d 69 73 73 e of the permiss
5670: 69 6f 6e 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 ions.. */..
5680: 20 20 20 6d 6f 64 65 20 3d 20 28 30 37 37 37 20 mode = (0777
5690: 26 20 7e 6d 6f 64 65 29 20 7c 20 53 5f 49 52 55 & ~mode) | S_IRU
56a0: 53 52 20 7c 20 53 5f 49 57 55 53 52 20 7c 20 53 SR | S_IWUSR | S
56b0: 5f 49 58 55 53 52 3b 0a 0a 20 20 20 20 69 66 20 _IXUSR;.. if
56c0: 28 6d 6b 64 69 72 28 70 61 74 68 2c 20 6d 6f 64 (mkdir(path, mod
56d0: 65 29 20 21 3d 20 30 29 20 7b 09 09 09 2f 2a 20 e) != 0) {.../*
56e0: 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f INTL: Native. */
56f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5700: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
5710: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
5720: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 62 6a 43 -. *. * TclpObjC
5780: 6f 70 79 44 69 72 65 63 74 6f 72 79 20 2d 2d 0a opyDirectory --.
5790: 20 2a 0a 20 2a 09 52 65 63 75 72 73 69 76 65 6c *. *.Recursivel
57a0: 79 20 63 6f 70 69 65 73 20 61 20 64 69 72 65 63 y copies a direc
57b0: 74 6f 72 79 2e 20 54 68 65 20 74 61 72 67 65 74 tory. The target
57c0: 20 64 69 72 65 63 74 6f 72 79 20 64 73 74 20 6d directory dst m
57d0: 75 73 74 20 6e 6f 74 0a 20 2a 09 61 6c 72 65 61 ust not. *.alrea
57e0: 64 79 20 65 78 69 73 74 2e 20 4e 6f 74 65 20 74 dy exist. Note t
57f0: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f hat this functio
5800: 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 65 72 67 65 n does not merge
5810: 20 74 77 6f 20 64 69 72 65 63 74 6f 72 79 0a 20 two directory.
5820: 2a 09 68 69 65 72 61 72 63 68 69 65 73 2c 20 65 *.hierarchies, e
5830: 76 65 6e 20 69 66 20 74 68 65 20 74 61 72 67 65 ven if the targe
5840: 74 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 t directory is a
5850: 6e 20 65 6d 70 74 79 20 64 69 72 65 63 74 6f 72 n empty director
5860: 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 y.. *. * Results
5870: 3a 0a 20 2a 09 49 66 20 74 68 65 20 64 69 72 65 :. *.If the dire
5880: 63 74 6f 72 79 20 77 61 73 20 73 75 63 63 65 73 ctory was succes
5890: 73 66 75 6c 6c 79 20 63 6f 70 69 65 64 2c 20 72 sfully copied, r
58a0: 65 74 75 72 6e 73 20 54 43 4c 5f 4f 4b 2e 20 4f eturns TCL_OK. O
58b0: 74 68 65 72 77 69 73 65 0a 20 2a 09 74 68 65 20 therwise. *.the
58c0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 return value is
58d0: 54 43 4c 5f 45 52 52 4f 52 2c 20 65 72 72 6e 6f TCL_ERROR, errno
58e0: 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 is set to indic
58f0: 61 74 65 20 74 68 65 20 65 72 72 6f 72 2c 20 61 ate the error, a
5900: 6e 64 0a 20 2a 09 74 68 65 20 70 61 74 68 6e 61 nd. *.the pathna
5910: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 me of the file t
5920: 68 61 74 20 63 61 75 73 65 64 20 74 68 65 20 65 hat caused the e
5930: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 20 69 rror is stored i
5940: 6e 20 65 72 72 6f 72 50 74 72 2e 0a 20 2a 09 53 n errorPtr.. *.S
5950: 65 65 20 54 63 6c 70 4f 62 6a 43 72 65 61 74 65 ee TclpObjCreate
5960: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 54 63 Directory and Tc
5970: 6c 70 4f 62 6a 43 6f 70 79 46 69 6c 65 20 66 6f lpObjCopyFile fo
5980: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 r a description
5990: 6f 66 0a 20 2a 09 70 6f 73 73 69 62 6c 65 20 76 of. *.possible v
59a0: 61 6c 75 65 73 20 66 6f 72 20 65 72 72 6e 6f 2e alues for errno.
59b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
59c0: 63 74 73 3a 0a 20 2a 09 41 6e 20 65 78 61 63 74 cts:. *.An exact
59d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 72 copy of the dir
59e0: 65 63 74 6f 72 79 20 68 69 65 72 61 72 63 68 79 ectory hierarchy
59f0: 20 73 72 63 20 77 69 6c 6c 20 62 65 20 63 72 65 src will be cre
5a00: 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 2a ated with the. *
5a10: 09 6e 61 6d 65 20 64 73 74 2e 20 49 66 20 61 6e .name dst. If an
5a20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 error occurs, t
5a30: 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 he error will be
5a40: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 returned immedi
5a50: 61 74 65 6c 79 2c 0a 20 2a 09 61 6e 64 20 72 65 ately,. *.and re
5a60: 6d 61 69 6e 69 6e 67 20 66 69 6c 65 73 20 77 69 maining files wi
5a70: 6c 6c 20 6e 6f 74 20 62 65 20 70 72 6f 63 65 73 ll not be proces
5a80: 73 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d sed.. *. *------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ad0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
5ae0: 63 6c 70 4f 62 6a 43 6f 70 79 44 69 72 65 63 74 clpObjCopyDirect
5af0: 6f 72 79 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ory(. Tcl_Obj
5b00: 20 2a 73 72 63 50 61 74 68 50 74 72 2c 0a 20 20 *srcPathPtr,.
5b10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 65 73 74 50 Tcl_Obj *destP
5b20: 61 74 68 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f athPtr,. Tcl_
5b30: 4f 62 6a 20 2a 2a 65 72 72 6f 72 50 74 72 29 0a Obj **errorPtr).
5b40: 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e {. Tcl_DStrin
5b50: 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 g ds;. Tcl_DS
5b60: 74 72 69 6e 67 20 73 72 63 53 74 72 69 6e 67 2c tring srcString,
5b70: 20 64 73 74 53 74 72 69 6e 67 3b 0a 20 20 20 20 dstString;.
5b80: 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 54 63 6c int ret;. Tcl
5b90: 5f 4f 62 6a 20 2a 74 72 61 6e 73 50 74 72 3b 0a _Obj *transPtr;.
5ba0: 0a 20 20 20 20 74 72 61 6e 73 50 74 72 20 3d 20 . transPtr =
5bb0: 54 63 6c 5f 46 53 47 65 74 54 72 61 6e 73 6c 61 Tcl_FSGetTransla
5bc0: 74 65 64 50 61 74 68 28 4e 55 4c 4c 2c 73 72 63 tedPath(NULL,src
5bd0: 50 61 74 68 50 74 72 29 3b 0a 20 20 20 20 54 63 PathPtr);. Tc
5be0: 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 l_UtfToExternalD
5bf0: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 0a 09 20 20 String(NULL,..
5c00: 20 20 28 74 72 61 6e 73 50 74 72 20 21 3d 20 4e (transPtr != N
5c10: 55 4c 4c 20 3f 20 54 63 6c 47 65 74 53 74 72 69 ULL ? TclGetStri
5c20: 6e 67 28 74 72 61 6e 73 50 74 72 29 20 3a 20 4e ng(transPtr) : N
5c30: 55 4c 4c 29 2c 0a 09 20 20 20 20 2d 31 2c 20 26 ULL),.. -1, &
5c40: 73 72 63 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 srcString);.
5c50: 69 66 20 28 74 72 61 6e 73 50 74 72 20 21 3d 20 if (transPtr !=
5c60: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 NULL) {..Tcl_Dec
5c70: 72 52 65 66 43 6f 75 6e 74 28 74 72 61 6e 73 50 rRefCount(transP
5c80: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 tr);. }. t
5c90: 72 61 6e 73 50 74 72 20 3d 20 54 63 6c 5f 46 53 ransPtr = Tcl_FS
5ca0: 47 65 74 54 72 61 6e 73 6c 61 74 65 64 50 61 74 GetTranslatedPat
5cb0: 68 28 4e 55 4c 4c 2c 64 65 73 74 50 61 74 68 50 h(NULL,destPathP
5cc0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 55 74 66 tr);. Tcl_Utf
5cd0: 54 6f 45 78 74 65 72 6e 61 6c 44 53 74 72 69 6e ToExternalDStrin
5ce0: 67 28 4e 55 4c 4c 2c 0a 09 20 20 20 20 28 74 72 g(NULL,.. (tr
5cf0: 61 6e 73 50 74 72 20 21 3d 20 4e 55 4c 4c 20 3f ansPtr != NULL ?
5d00: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 74 72 TclGetString(tr
5d10: 61 6e 73 50 74 72 29 20 3a 20 4e 55 4c 4c 29 2c ansPtr) : NULL),
5d20: 0a 09 20 20 20 20 2d 31 2c 20 26 64 73 74 53 74 .. -1, &dstSt
5d30: 72 69 6e 67 29 3b 0a 20 20 20 20 69 66 20 28 74 ring);. if (t
5d40: 72 61 6e 73 50 74 72 20 21 3d 20 4e 55 4c 4c 29 ransPtr != NULL)
5d50: 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
5d60: 6f 75 6e 74 28 74 72 61 6e 73 50 74 72 29 3b 0a ount(transPtr);.
5d70: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 20 3d }.. ret =
5d80: 20 54 72 61 76 65 72 73 65 55 6e 69 78 54 72 65 TraverseUnixTre
5d90: 65 28 54 72 61 76 65 72 73 61 6c 43 6f 70 79 2c e(TraversalCopy,
5da0: 20 26 73 72 63 53 74 72 69 6e 67 2c 20 26 64 73 &srcString, &ds
5db0: 74 53 74 72 69 6e 67 2c 20 26 64 73 2c 20 30 29 tString, &ds, 0)
5dc0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ;.. Tcl_DStri
5dd0: 6e 67 46 72 65 65 28 26 73 72 63 53 74 72 69 6e ngFree(&srcStrin
5de0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 g);. Tcl_DStr
5df0: 69 6e 67 46 72 65 65 28 26 64 73 74 53 74 72 69 ingFree(&dstStri
5e00: 6e 67 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 ng);.. if (re
5e10: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 t != TCL_OK) {..
5e20: 2a 65 72 72 6f 72 50 74 72 20 3d 20 54 63 6c 44 *errorPtr = TclD
5e30: 53 74 72 69 6e 67 54 6f 4f 62 6a 28 26 64 73 29 StringToObj(&ds)
5e40: 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f ;..Tcl_IncrRefCo
5e50: 75 6e 74 28 2a 65 72 72 6f 72 50 74 72 29 3b 0a unt(*errorPtr);.
5e60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
5e70: 20 72 65 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ret;.}.../*. *-
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5ed0: 20 54 63 6c 70 52 65 6d 6f 76 65 44 69 72 65 63 TclpRemoveDirec
5ee0: 74 6f 72 79 2c 20 44 6f 52 65 6d 6f 76 65 44 69 tory, DoRemoveDi
5ef0: 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a rectory --. *. *
5f00: 09 52 65 6d 6f 76 65 73 20 64 69 72 65 63 74 6f .Removes directo
5f10: 72 79 20 28 61 6e 64 20 69 74 73 20 63 6f 6e 74 ry (and its cont
5f20: 65 6e 74 73 2c 20 69 66 20 74 68 65 20 72 65 63 ents, if the rec
5f30: 75 72 73 69 76 65 20 66 6c 61 67 20 69 73 20 73 ursive flag is s
5f40: 65 74 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c et).. *. * Resul
5f50: 74 73 3a 0a 20 2a 09 49 66 20 74 68 65 20 64 69 ts:. *.If the di
5f60: 72 65 63 74 6f 72 79 20 77 61 73 20 73 75 63 63 rectory was succ
5f70: 65 73 73 66 75 6c 6c 79 20 72 65 6d 6f 76 65 64 essfully removed
5f80: 2c 20 72 65 74 75 72 6e 73 20 54 43 4c 5f 4f 4b , returns TCL_OK
5f90: 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 2a 09 74 . Otherwise. *.t
5fa0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
5fb0: 69 73 20 54 43 4c 5f 45 52 52 4f 52 2c 20 65 72 is TCL_ERROR, er
5fc0: 72 6e 6f 20 69 73 20 73 65 74 20 74 6f 20 69 6e rno is set to in
5fd0: 64 69 63 61 74 65 20 74 68 65 20 65 72 72 6f 72 dicate the error
5fe0: 2c 20 61 6e 64 0a 20 2a 09 74 68 65 20 70 61 74 , and. *.the pat
5ff0: 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c hname of the fil
6000: 65 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68 e that caused th
6010: 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 e error is store
6020: 64 20 69 6e 20 65 72 72 6f 72 50 74 72 2e 0a 20 d in errorPtr..
6030: 2a 09 53 6f 6d 65 20 70 6f 73 73 69 62 6c 65 20 *.Some possible
6040: 76 61 6c 75 65 73 20 66 6f 72 20 65 72 72 6e 6f values for errno
6050: 20 61 72 65 3a 0a 20 2a 0a 20 2a 09 45 41 43 43 are:. *. *.EACC
6060: 45 53 3a 09 20 20 20 20 70 61 74 68 20 64 69 72 ES:. path dir
6070: 65 63 74 6f 72 79 20 63 61 6e 27 74 20 62 65 20 ectory can't be
6080: 72 65 61 64 20 61 6e 64 2f 6f 72 20 77 72 69 74 read and/or writ
6090: 74 65 6e 2e 0a 20 2a 09 45 45 58 49 53 54 3a 09 ten.. *.EEXIST:.
60a0: 20 20 20 20 70 61 74 68 20 69 73 20 61 20 6e 6f path is a no
60b0: 6e 2d 65 6d 70 74 79 20 64 69 72 65 63 74 6f 72 n-empty director
60c0: 79 2e 0a 20 2a 09 45 49 4e 56 41 4c 3a 09 20 20 y.. *.EINVAL:.
60d0: 20 20 70 61 74 68 20 69 73 20 61 20 72 6f 6f 74 path is a root
60e0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 09 45 directory.. *.E
60f0: 4e 4f 45 4e 54 3a 09 20 20 20 20 70 61 74 68 20 NOENT:. path
6100: 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 6f 72 doesn't exist or
6110: 20 69 73 20 22 22 2e 0a 20 2a 20 09 45 4e 4f 54 is "".. * .ENOT
6120: 44 49 52 3a 20 20 20 20 70 61 74 68 20 69 73 20 DIR: path is
6130: 6e 6f 74 20 61 20 64 69 72 65 63 74 6f 72 79 2e not a directory.
6140: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6150: 63 74 73 3a 0a 20 2a 09 44 69 72 65 63 74 6f 72 cts:. *.Director
6160: 79 20 72 65 6d 6f 76 65 64 2e 20 49 66 20 61 6e y removed. If an
6170: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 error occurs, t
6180: 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 he error will be
6190: 20 72 65 74 75 72 6e 65 64 0a 20 2a 09 69 6d 6d returned. *.imm
61a0: 65 64 69 61 74 65 6c 79 2c 20 61 6e 64 20 72 65 ediately, and re
61b0: 6d 61 69 6e 69 6e 67 20 66 69 6c 65 73 20 77 69 maining files wi
61c0: 6c 6c 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 ll not be delete
61d0: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6220: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
6230: 70 4f 62 6a 52 65 6d 6f 76 65 44 69 72 65 63 74 pObjRemoveDirect
6240: 6f 72 79 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ory(. Tcl_Obj
6250: 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 20 20 69 *pathPtr,. i
6260: 6e 74 20 72 65 63 75 72 73 69 76 65 2c 0a 20 20 nt recursive,.
6270: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 65 72 72 6f Tcl_Obj **erro
6280: 72 50 74 72 29 0a 7b 0a 20 20 20 20 54 63 6c 5f rPtr).{. Tcl_
6290: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 DString ds;.
62a0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 70 61 74 68 Tcl_DString path
62b0: 53 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 String;. int
62c0: 72 65 74 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ret;. Tcl_Obj
62d0: 20 2a 74 72 61 6e 73 50 74 72 20 3d 20 54 63 6c *transPtr = Tcl
62e0: 5f 46 53 47 65 74 54 72 61 6e 73 6c 61 74 65 64 _FSGetTranslated
62f0: 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 74 68 50 Path(NULL, pathP
6300: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 55 74 tr);.. Tcl_Ut
6310: 66 54 6f 45 78 74 65 72 6e 61 6c 44 53 74 72 69 fToExternalDStri
6320: 6e 67 28 4e 55 4c 4c 2c 0a 09 20 20 20 20 28 74 ng(NULL,.. (t
6330: 72 61 6e 73 50 74 72 20 21 3d 20 4e 55 4c 4c 20 ransPtr != NULL
6340: 3f 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 74 ? TclGetString(t
6350: 72 61 6e 73 50 74 72 29 20 3a 20 4e 55 4c 4c 29 ransPtr) : NULL)
6360: 2c 0a 09 20 20 20 20 2d 31 2c 20 26 70 61 74 68 ,.. -1, &path
6370: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 69 66 20 String);. if
6380: 28 74 72 61 6e 73 50 74 72 20 21 3d 20 4e 55 4c (transPtr != NUL
6390: 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 L) {..Tcl_DecrRe
63a0: 66 43 6f 75 6e 74 28 74 72 61 6e 73 50 74 72 29 fCount(transPtr)
63b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 20 ;. }. ret
63c0: 3d 20 44 6f 52 65 6d 6f 76 65 44 69 72 65 63 74 = DoRemoveDirect
63d0: 6f 72 79 28 26 70 61 74 68 53 74 72 69 6e 67 2c ory(&pathString,
63e0: 20 72 65 63 75 72 73 69 76 65 2c 20 26 64 73 29 recursive, &ds)
63f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
6400: 67 46 72 65 65 28 26 70 61 74 68 53 74 72 69 6e gFree(&pathStrin
6410: 67 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 g);.. if (ret
6420: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2a != TCL_OK) {..*
6430: 65 72 72 6f 72 50 74 72 20 3d 20 54 63 6c 44 53 errorPtr = TclDS
6440: 74 72 69 6e 67 54 6f 4f 62 6a 28 26 64 73 29 3b tringToObj(&ds);
6450: 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 ..Tcl_IncrRefCou
6460: 6e 74 28 2a 65 72 72 6f 72 50 74 72 29 3b 0a 20 nt(*errorPtr);.
6470: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
6480: 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 ret;.}..static i
6490: 6e 74 0a 44 6f 52 65 6d 6f 76 65 44 69 72 65 63 nt.DoRemoveDirec
64a0: 74 6f 72 79 28 0a 20 20 20 20 54 63 6c 5f 44 53 tory(. Tcl_DS
64b0: 74 72 69 6e 67 20 2a 70 61 74 68 50 74 72 2c 09 tring *pathPtr,.
64c0: 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 64 /* Pathname of d
64d0: 69 72 65 63 74 6f 72 79 20 74 6f 20 62 65 20 72 irectory to be r
64e0: 65 6d 6f 76 65 64 0a 09 09 09 09 20 2a 20 28 6e emoved..... * (n
64f0: 61 74 69 76 65 29 2e 20 2a 2f 0a 20 20 20 20 69 ative). */. i
6500: 6e 74 20 72 65 63 75 72 73 69 76 65 2c 09 09 2f nt recursive,../
6510: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 * If non-zero, r
6520: 65 6d 6f 76 65 73 20 64 69 72 65 63 74 6f 72 69 emoves directori
6530: 65 73 20 74 68 61 74 20 61 72 65 0a 09 09 09 09 es that are.....
6540: 20 2a 20 6e 6f 6e 65 6d 70 74 79 2e 20 4f 74 68 * nonempty. Oth
6550: 65 72 77 69 73 65 2c 20 77 69 6c 6c 20 6f 6e 6c erwise, will onl
6560: 79 20 72 65 6d 6f 76 65 20 65 6d 70 74 79 0a 09 y remove empty..
6570: 09 09 09 20 2a 20 64 69 72 65 63 74 6f 72 69 65 ... * directorie
6580: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 s. */. Tcl_DS
6590: 74 72 69 6e 67 20 2a 65 72 72 6f 72 50 74 72 29 tring *errorPtr)
65a0: 09 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c ./* If non-NULL,
65b0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f uninitialized o
65c0: 72 20 66 72 65 65 20 44 53 74 72 69 6e 67 0a 09 r free DString..
65d0: 09 09 09 20 2a 20 66 69 6c 6c 65 64 20 77 69 74 ... * filled wit
65e0: 68 20 55 54 46 2d 38 20 6e 61 6d 65 20 6f 66 20 h UTF-8 name of
65f0: 66 69 6c 65 20 63 61 75 73 69 6e 67 0a 09 09 09 file causing....
6600: 09 20 2a 20 65 72 72 6f 72 2e 20 2a 2f 0a 7b 0a . * error. */.{.
6610: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
6620: 70 61 74 68 3b 0a 20 20 20 20 6d 6f 64 65 5f 74 path;. mode_t
6630: 20 6f 6c 64 50 65 72 6d 20 3d 20 30 3b 0a 20 20 oldPerm = 0;.
6640: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 int result;..
6650: 20 20 20 70 61 74 68 20 3d 20 54 63 6c 5f 44 53 path = Tcl_DS
6660: 74 72 69 6e 67 56 61 6c 75 65 28 70 61 74 68 50 tringValue(pathP
6670: 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 tr);.. if (re
6680: 63 75 72 73 69 76 65 20 21 3d 20 30 29 20 7b 0a cursive != 0) {.
6690: 09 2f 2a 0a 09 20 2a 20 57 65 20 73 68 6f 75 6c ./*.. * We shoul
66a0: 64 20 74 72 79 20 74 6f 20 63 68 61 6e 67 65 20 d try to change
66b0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 73 6f 20 74 permissions so t
66c0: 68 69 73 20 63 61 6e 20 62 65 20 64 65 6c 65 74 his can be delet
66d0: 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 53 ed... */...Tcl_S
66e0: 74 61 74 42 75 66 20 73 74 61 74 42 75 66 3b 0a tatBuf statBuf;.
66f0: 09 69 6e 74 20 6e 65 77 50 65 72 6d 3b 0a 0a 09 .int newPerm;...
6700: 69 66 20 28 54 63 6c 4f 53 73 74 61 74 28 70 61 if (TclOSstat(pa
6710: 74 68 2c 20 26 73 74 61 74 42 75 66 29 20 3d 3d th, &statBuf) ==
6720: 20 30 29 20 7b 0a 09 20 20 20 20 6f 6c 64 50 65 0) {.. oldPe
6730: 72 6d 20 3d 20 28 6d 6f 64 65 5f 74 29 20 28 73 rm = (mode_t) (s
6740: 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 20 26 tatBuf.st_mode &
6750: 20 30 78 30 30 30 30 37 46 46 46 29 3b 0a 09 7d 0x00007FFF);..}
6760: 0a 0a 09 6e 65 77 50 65 72 6d 20 3d 20 6f 6c 64 ...newPerm = old
6770: 50 65 72 6d 20 7c 20 28 36 34 2b 31 32 38 2b 32 Perm | (64+128+2
6780: 35 36 29 3b 0a 09 63 68 6d 6f 64 28 70 61 74 68 56);..chmod(path
6790: 2c 20 28 6d 6f 64 65 5f 74 29 20 6e 65 77 50 65 , (mode_t) newPe
67a0: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rm);. }..
67b0: 69 66 20 28 72 6d 64 69 72 28 70 61 74 68 29 20 if (rmdir(path)
67c0: 3d 3d 20 30 29 20 7b 09 09 09 09 2f 2a 20 49 4e == 0) {..../* IN
67d0: 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f 0a 09 TL: Native. */..
67e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
67f0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 65 72 72 }. if (err
6800: 6e 6f 20 3d 3d 20 45 4e 4f 54 45 4d 50 54 59 29 no == ENOTEMPTY)
6810: 20 7b 0a 09 65 72 72 6e 6f 20 3d 20 45 45 58 49 {..errno = EEXI
6820: 53 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 ST;. }.. r
6830: 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b 0a esult = TCL_OK;.
6840: 20 20 20 20 69 66 20 28 28 65 72 72 6e 6f 20 21 if ((errno !
6850: 3d 20 45 45 58 49 53 54 29 20 7c 7c 20 28 72 65 = EEXIST) || (re
6860: 63 75 72 73 69 76 65 20 3d 3d 20 30 29 29 20 7b cursive == 0)) {
6870: 0a 09 69 66 20 28 65 72 72 6f 72 50 74 72 20 21 ..if (errorPtr !
6880: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
6890: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 cl_ExternalToUtf
68a0: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 70 61 DString(NULL, pa
68b0: 74 68 2c 20 2d 31 2c 20 65 72 72 6f 72 50 74 72 th, -1, errorPtr
68c0: 29 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 20 3d 20 );..}..result =
68d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
68e0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
68f0: 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 The directory is
6900: 20 6e 6f 6e 65 6d 70 74 79 2c 20 62 75 74 20 74 nonempty, but t
6910: 68 65 20 72 65 63 75 72 73 69 76 65 20 66 6c 61 he recursive fla
6920: 67 20 68 61 73 20 62 65 65 6e 20 73 70 65 63 69 g has been speci
6930: 66 69 65 64 2c 0a 20 20 20 20 20 2a 20 73 6f 20 fied,. * so
6940: 77 65 20 72 65 63 75 72 73 69 76 65 6c 79 20 72 we recursively r
6950: 65 6d 6f 76 65 20 61 6c 6c 20 74 68 65 20 66 69 emove all the fi
6960: 6c 65 73 20 69 6e 20 74 68 65 20 64 69 72 65 63 les in the direc
6970: 74 6f 72 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 tory.. */..
6980: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d if (result ==
6990: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 73 75 TCL_OK) {..resu
69a0: 6c 74 20 3d 20 54 72 61 76 65 72 73 65 55 6e 69 lt = TraverseUni
69b0: 78 54 72 65 65 28 54 72 61 76 65 72 73 61 6c 44 xTree(TraversalD
69c0: 65 6c 65 74 65 2c 20 70 61 74 68 50 74 72 2c 20 elete, pathPtr,
69d0: 4e 55 4c 4c 2c 20 65 72 72 6f 72 50 74 72 2c 20 NULL, errorPtr,
69e0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 1);. }.. i
69f0: 66 20 28 28 72 65 73 75 6c 74 20 21 3d 20 54 43 f ((result != TC
6a00: 4c 5f 4f 4b 29 20 26 26 20 28 72 65 63 75 72 73 L_OK) && (recurs
6a10: 69 76 65 20 21 3d 20 30 29 29 20 7b 0a 09 2f 2a ive != 0)) {../*
6a20: 0a 09 20 2a 20 54 72 79 20 74 6f 20 72 65 73 74 .. * Try to rest
6a30: 6f 72 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e ore permissions.
6a40: 0a 09 20 2a 2f 0a 0a 09 63 68 6d 6f 64 28 70 61 .. */...chmod(pa
6a50: 74 68 2c 20 6f 6c 64 50 65 72 6d 29 3b 0a 20 20 th, oldPerm);.
6a60: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
6a70: 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a esult;.}.../*. *
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6ad0: 2a 20 54 72 61 76 65 72 73 65 55 6e 69 78 54 72 * TraverseUnixTr
6ae0: 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 72 61 76 ee --. *. *.Trav
6af0: 65 72 73 65 20 64 69 72 65 63 74 6f 72 79 20 74 erse directory t
6b00: 72 65 65 20 73 70 65 63 69 66 69 65 64 20 62 79 ree specified by
6b10: 20 73 6f 75 72 63 65 50 74 72 2c 20 63 61 6c 6c sourcePtr, call
6b20: 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e ing the function
6b30: 0a 20 2a 09 74 72 61 76 65 72 73 65 50 72 6f 63 . *.traverseProc
6b40: 20 66 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 for each file a
6b50: 6e 64 20 64 69 72 65 63 74 6f 72 79 20 65 6e 63 nd directory enc
6b60: 6f 75 6e 74 65 72 65 64 2e 20 49 66 20 64 65 73 ountered. If des
6b70: 74 50 74 72 20 69 73 0a 20 2a 09 6e 6f 6e 2d 6e tPtr is. *.non-n
6b80: 75 6c 6c 2c 20 65 61 63 68 20 6f 66 20 6e 61 6d ull, each of nam
6b90: 65 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 50 e in the sourceP
6ba0: 74 72 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 tr directory is
6bb0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 0a appended to the.
6bc0: 20 2a 09 64 69 72 65 63 74 6f 72 79 20 73 70 65 *.directory spe
6bd0: 63 69 66 69 65 64 20 62 79 20 64 65 73 74 50 74 cified by destPt
6be0: 72 20 61 6e 64 20 70 61 73 73 65 64 20 61 73 20 r and passed as
6bf0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
6c00: 65 6e 74 20 74 6f 0a 20 2a 09 74 72 61 76 65 72 ent to. *.traver
6c10: 73 65 50 72 6f 63 28 29 2e 0a 20 2a 0a 20 2a 20 seProc().. *. *
6c20: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 74 61 6e Results:. *.Stan
6c30: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
6c40: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6c50: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 20 63 61 75 cts:. *.None cau
6c60: 73 65 64 20 62 79 20 54 72 61 76 65 72 73 65 55 sed by TraverseU
6c70: 6e 69 78 54 72 65 65 2c 20 68 6f 77 65 76 65 72 nixTree, however
6c80: 20 74 68 65 20 75 73 65 72 20 73 70 65 63 69 66 the user specif
6c90: 69 65 64 0a 20 2a 09 74 72 61 76 65 72 73 65 50 ied. *.traverseP
6ca0: 72 6f 63 28 29 20 6d 61 79 20 63 68 61 6e 67 65 roc() may change
6cb0: 20 73 74 61 74 65 2e 20 49 66 20 61 6e 20 65 72 state. If an er
6cc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 ror occurs, the
6cd0: 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 0a 20 2a error will be. *
6ce0: 09 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 .returned immedi
6cf0: 61 74 65 6c 79 2c 20 61 6e 64 20 72 65 6d 61 69 ately, and remai
6d00: 6e 69 6e 67 20 66 69 6c 65 73 20 77 69 6c 6c 20 ning files will
6d10: 6e 6f 74 20 62 65 20 70 72 6f 63 65 73 73 65 64 not be processed
6d20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
6d80: 6e 74 0a 54 72 61 76 65 72 73 65 55 6e 69 78 54 nt.TraverseUnixT
6d90: 72 65 65 28 0a 20 20 20 20 54 72 61 76 65 72 73 ree(. Travers
6da0: 61 6c 50 72 6f 63 20 2a 74 72 61 76 65 72 73 65 alProc *traverse
6db0: 50 72 6f 63 2c 2f 2a 20 46 75 6e 63 74 69 6f 6e Proc,/* Function
6dc0: 20 74 6f 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 to call for eve
6dd0: 72 79 20 66 69 6c 65 20 61 6e 64 0a 09 09 09 09 ry file and.....
6de0: 20 2a 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 * directory in
6df0: 73 6f 75 72 63 65 20 68 69 65 72 61 72 63 68 79 source hierarchy
6e00: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 . */. Tcl_DSt
6e10: 72 69 6e 67 20 2a 73 6f 75 72 63 65 50 74 72 2c ring *sourcePtr,
6e20: 09 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 ./* Pathname of
6e30: 73 6f 75 72 63 65 20 64 69 72 65 63 74 6f 72 79 source directory
6e40: 20 74 6f 20 62 65 0a 09 09 09 09 20 2a 20 74 72 to be..... * tr
6e50: 61 76 65 72 73 65 64 20 28 6e 61 74 69 76 65 29 aversed (native)
6e60: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 . */. Tcl_DSt
6e70: 72 69 6e 67 20 2a 74 61 72 67 65 74 50 74 72 2c ring *targetPtr,
6e80: 09 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 ./* Pathname of
6e90: 64 69 72 65 63 74 6f 72 79 20 74 6f 20 74 72 61 directory to tra
6ea0: 76 65 72 73 65 20 69 6e 0a 09 09 09 09 20 2a 20 verse in..... *
6eb0: 70 61 72 61 6c 6c 65 6c 20 77 69 74 68 20 73 6f parallel with so
6ec0: 75 72 63 65 20 64 69 72 65 63 74 6f 72 79 20 28 urce directory (
6ed0: 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 20 20 20 20 native). */.
6ee0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 65 72 72 Tcl_DString *err
6ef0: 6f 72 50 74 72 2c 09 2f 2a 20 49 66 20 6e 6f 6e orPtr,./* If non
6f00: 2d 4e 55 4c 4c 2c 20 75 6e 69 6e 69 74 69 61 6c -NULL, uninitial
6f10: 69 7a 65 64 20 6f 72 20 66 72 65 65 20 44 53 74 ized or free DSt
6f20: 72 69 6e 67 0a 09 09 09 09 20 2a 20 66 69 6c 6c ring..... * fill
6f30: 65 64 20 77 69 74 68 20 55 54 46 2d 38 20 6e 61 ed with UTF-8 na
6f40: 6d 65 20 6f 66 20 66 69 6c 65 20 63 61 75 73 69 me of file causi
6f50: 6e 67 0a 09 09 09 09 20 2a 20 65 72 72 6f 72 2e ng..... * error.
6f60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 6f 52 65 */. int doRe
6f70: 77 69 6e 64 29 09 09 2f 2a 20 46 6c 61 67 20 69 wind)../* Flag i
6f80: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 ndicating that t
6f90: 6f 20 65 6e 73 75 72 65 20 63 6f 6d 70 6c 65 74 o ensure complet
6fa0: 65 0a 20 20 20 20 09 09 09 09 20 2a 20 74 72 61 e. .... * tra
6fb0: 76 65 72 73 61 6c 20 6f 66 20 73 6f 75 72 63 65 versal of source
6fc0: 20 68 69 65 72 61 72 63 68 79 2c 20 74 68 65 20 hierarchy, the
6fd0: 72 65 61 64 64 69 72 0a 20 20 20 20 09 09 09 09 readdir. ....
6fe0: 20 2a 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 * loop should b
6ff0: 65 20 72 65 77 6f 75 6e 64 20 77 68 65 6e 65 76 e rewound whenev
7000: 65 72 0a 20 20 20 20 09 09 09 09 20 2a 20 74 72 er. .... * tr
7010: 61 76 65 72 73 65 50 72 6f 63 20 68 61 73 20 72 averseProc has r
7020: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 3b 20 eturned TCL_OK;
7030: 74 68 69 73 20 69 73 0a 20 20 20 20 09 09 09 09 this is. ....
7040: 20 2a 20 72 65 71 75 69 72 65 64 20 77 68 65 6e * required when
7050: 20 74 72 61 76 65 72 73 65 50 72 6f 63 20 6d 6f traverseProc mo
7060: 64 69 66 69 65 73 20 74 68 65 0a 20 20 20 20 09 difies the. .
7070: 09 09 09 20 2a 20 73 6f 75 72 63 65 20 68 69 65 ... * source hie
7080: 72 61 72 63 68 79 2c 20 65 2e 67 2e 20 62 79 20 rarchy, e.g. by
7090: 64 65 6c 65 74 69 6e 67 0a 20 20 20 20 09 09 09 deleting. ...
70a0: 09 20 2a 20 66 69 6c 65 73 2e 20 2a 2f 0a 7b 0a . * files. */.{.
70b0: 20 20 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 Tcl_StatBuf
70c0: 73 74 61 74 42 75 66 3b 0a 20 20 20 20 63 6f 6e statBuf;. con
70d0: 73 74 20 63 68 61 72 20 2a 73 6f 75 72 63 65 2c st char *source,
70e0: 20 2a 65 72 72 66 69 6c 65 3b 0a 20 20 20 20 69 *errfile;. i
70f0: 6e 74 20 72 65 73 75 6c 74 2c 20 73 6f 75 72 63 nt result, sourc
7100: 65 4c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 74 61 eLen;. int ta
7110: 72 67 65 74 4c 65 6e 3b 0a 23 69 66 6e 64 65 66 rgetLen;.#ifndef
7120: 20 48 41 56 45 5f 46 54 53 0a 20 20 20 20 69 6e HAVE_FTS. in
7130: 74 20 6e 75 6d 50 72 6f 63 65 73 73 65 64 20 3d t numProcessed =
7140: 20 30 3b 0a 20 20 20 20 54 63 6c 5f 44 69 72 45 0;. Tcl_DirE
7150: 6e 74 72 79 20 2a 64 69 72 45 6e 74 50 74 72 3b ntry *dirEntPtr;
7160: 0a 20 20 20 20 54 63 6c 44 49 52 20 2a 64 69 72 . TclDIR *dir
7170: 50 74 72 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 Ptr;.#else. c
7180: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 73 onst char *paths
7190: 5b 32 5d 20 3d 20 7b 4e 55 4c 4c 2c 20 4e 55 4c [2] = {NULL, NUL
71a0: 4c 7d 3b 0a 20 20 20 20 46 54 53 20 2a 66 74 73 L};. FTS *fts
71b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 46 54 53 = NULL;. FTS
71c0: 45 4e 54 20 2a 65 6e 74 3b 0a 23 65 6e 64 69 66 ENT *ent;.#endif
71d0: 0a 0a 20 20 20 20 65 72 72 66 69 6c 65 20 3d 20 .. errfile =
71e0: 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 73 75 6c 74 NULL;. result
71f0: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 74 = TCL_OK;. t
7200: 61 72 67 65 74 4c 65 6e 20 3d 20 30 3b 09 09 2f argetLen = 0;../
7210: 2a 20 6c 69 6e 74 2e 20 2a 2f 0a 0a 20 20 20 20 * lint. */..
7220: 73 6f 75 72 63 65 20 3d 20 54 63 6c 5f 44 53 74 source = Tcl_DSt
7230: 72 69 6e 67 56 61 6c 75 65 28 73 6f 75 72 63 65 ringValue(source
7240: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 54 63 Ptr);. if (Tc
7250: 6c 4f 53 6c 73 74 61 74 28 73 6f 75 72 63 65 2c lOSlstat(source,
7260: 20 26 73 74 61 74 42 75 66 29 20 21 3d 20 30 29 &statBuf) != 0)
7270: 20 7b 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 {../* INTL: Nat
7280: 69 76 65 2e 20 2a 2f 0a 09 65 72 72 66 69 6c 65 ive. */..errfile
7290: 20 3d 20 73 6f 75 72 63 65 3b 0a 09 67 6f 74 6f = source;..goto
72a0: 20 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 end;. }.
72b0: 69 66 20 28 21 53 5f 49 53 44 49 52 28 73 74 61 if (!S_ISDIR(sta
72c0: 74 42 75 66 2e 73 74 5f 6d 6f 64 65 29 29 20 7b tBuf.st_mode)) {
72d0: 0a 09 2f 2a 0a 09 20 2a 20 50 72 6f 63 65 73 73 ../*.. * Process
72e0: 20 74 68 65 20 72 65 67 75 6c 61 72 20 66 69 6c the regular fil
72f0: 65 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 e.. */...return
7300: 74 72 61 76 65 72 73 65 50 72 6f 63 28 73 6f 75 traverseProc(sou
7310: 72 63 65 50 74 72 2c 20 74 61 72 67 65 74 50 74 rcePtr, targetPt
7320: 72 2c 20 26 73 74 61 74 42 75 66 2c 20 44 4f 54 r, &statBuf, DOT
7330: 52 45 45 5f 46 2c 0a 09 09 65 72 72 6f 72 50 74 REE_F,...errorPt
7340: 72 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 r);. }.#ifnde
7350: 66 20 48 41 56 45 5f 46 54 53 0a 20 20 20 20 64 f HAVE_FTS. d
7360: 69 72 50 74 72 20 3d 20 54 63 6c 4f 53 6f 70 65 irPtr = TclOSope
7370: 6e 64 69 72 28 73 6f 75 72 63 65 29 3b 09 09 09 ndir(source);...
7380: 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e /* INTL: Native.
7390: 20 2a 2f 0a 20 20 20 20 69 66 20 28 64 69 72 50 */. if (dirP
73a0: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f tr == NULL) {../
73b0: 2a 0a 09 20 2a 20 43 61 6e 27 74 20 72 65 61 64 *.. * Can't read
73c0: 20 64 69 72 65 63 74 6f 72 79 0a 09 20 2a 2f 0a directory.. */.
73d0: 0a 09 65 72 72 66 69 6c 65 20 3d 20 73 6f 75 72 ..errfile = sour
73e0: 63 65 3b 0a 09 67 6f 74 6f 20 65 6e 64 3b 0a 20 ce;..goto end;.
73f0: 20 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 }. result
7400: 3d 20 74 72 61 76 65 72 73 65 50 72 6f 63 28 73 = traverseProc(s
7410: 6f 75 72 63 65 50 74 72 2c 20 74 61 72 67 65 74 ourcePtr, target
7420: 50 74 72 2c 20 26 73 74 61 74 42 75 66 2c 20 44 Ptr, &statBuf, D
7430: 4f 54 52 45 45 5f 50 52 45 44 2c 0a 09 20 20 20 OTREE_PRED,..
7440: 20 65 72 72 6f 72 50 74 72 29 3b 0a 20 20 20 20 errorPtr);.
7450: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 if (result != TC
7460: 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 4f 53 63 6c L_OK) {..TclOScl
7470: 6f 73 65 64 69 72 28 64 69 72 50 74 72 29 3b 0a osedir(dirPtr);.
7480: 09 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a .return result;.
7490: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 44 53 }.. TclDS
74a0: 74 72 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 72 tringAppendLiter
74b0: 61 6c 28 73 6f 75 72 63 65 50 74 72 2c 20 22 2f al(sourcePtr, "/
74c0: 22 29 3b 0a 20 20 20 20 73 6f 75 72 63 65 4c 65 ");. sourceLe
74d0: 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c n = Tcl_DStringL
74e0: 65 6e 67 74 68 28 73 6f 75 72 63 65 50 74 72 29 ength(sourcePtr)
74f0: 3b 0a 0a 20 20 20 20 69 66 20 28 74 61 72 67 65 ;.. if (targe
7500: 74 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a tPtr != NULL) {.
7510: 09 54 63 6c 44 53 74 72 69 6e 67 41 70 70 65 6e .TclDStringAppen
7520: 64 4c 69 74 65 72 61 6c 28 74 61 72 67 65 74 50 dLiteral(targetP
7530: 74 72 2c 20 22 2f 22 29 3b 0a 09 74 61 72 67 65 tr, "/");..targe
7540: 74 4c 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 tLen = Tcl_DStri
7550: 6e 67 4c 65 6e 67 74 68 28 74 61 72 67 65 74 50 ngLength(targetP
7560: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
7570: 77 68 69 6c 65 20 28 28 64 69 72 45 6e 74 50 74 while ((dirEntPt
7580: 72 20 3d 20 54 63 6c 4f 53 72 65 61 64 64 69 72 r = TclOSreaddir
7590: 28 64 69 72 50 74 72 29 29 20 21 3d 20 4e 55 4c (dirPtr)) != NUL
75a0: 4c 29 20 7b 20 2f 2a 20 49 4e 54 4c 3a 20 4e 61 L) { /* INTL: Na
75b0: 74 69 76 65 2e 20 2a 2f 0a 09 69 66 20 28 28 64 tive. */..if ((d
75c0: 69 72 45 6e 74 50 74 72 2d 3e 64 5f 6e 61 6d 65 irEntPtr->d_name
75d0: 5b 30 5d 20 3d 3d 20 27 2e 27 29 0a 09 09 26 26 [0] == '.')...&&
75e0: 20 28 28 64 69 72 45 6e 74 50 74 72 2d 3e 64 5f ((dirEntPtr->d_
75f0: 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27 5c 30 27 29 name[1] == '\0')
7600: 0a 09 09 09 7c 7c 20 28 73 74 72 63 6d 70 28 64 ....|| (strcmp(d
7610: 69 72 45 6e 74 50 74 72 2d 3e 64 5f 6e 61 6d 65 irEntPtr->d_name
7620: 2c 20 22 2e 2e 22 29 20 3d 3d 20 30 29 29 29 20 , "..") == 0)))
7630: 7b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b {.. continue;
7640: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 41 70 70 ..}.../*.. * App
7650: 65 6e 64 20 6e 61 6d 65 20 61 66 74 65 72 20 73 end name after s
7660: 6c 61 73 68 2c 20 61 6e 64 20 72 65 63 75 72 73 lash, and recurs
7670: 65 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 09 e on the file...
7680: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e */...Tcl_DStrin
7690: 67 41 70 70 65 6e 64 28 73 6f 75 72 63 65 50 74 gAppend(sourcePt
76a0: 72 2c 20 64 69 72 45 6e 74 50 74 72 2d 3e 64 5f r, dirEntPtr->d_
76b0: 6e 61 6d 65 2c 20 2d 31 29 3b 0a 09 69 66 20 28 name, -1);..if (
76c0: 74 61 72 67 65 74 50 74 72 20 21 3d 20 4e 55 4c targetPtr != NUL
76d0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 L) {.. Tcl_DS
76e0: 74 72 69 6e 67 41 70 70 65 6e 64 28 74 61 72 67 tringAppend(targ
76f0: 65 74 50 74 72 2c 20 64 69 72 45 6e 74 50 74 72 etPtr, dirEntPtr
7700: 2d 3e 64 5f 6e 61 6d 65 2c 20 2d 31 29 3b 0a 09 ->d_name, -1);..
7710: 7d 0a 09 72 65 73 75 6c 74 20 3d 20 54 72 61 76 }..result = Trav
7720: 65 72 73 65 55 6e 69 78 54 72 65 65 28 74 72 61 erseUnixTree(tra
7730: 76 65 72 73 65 50 72 6f 63 2c 20 73 6f 75 72 63 verseProc, sourc
7740: 65 50 74 72 2c 20 74 61 72 67 65 74 50 74 72 2c ePtr, targetPtr,
7750: 0a 09 09 65 72 72 6f 72 50 74 72 2c 20 64 6f 52 ...errorPtr, doR
7760: 65 77 69 6e 64 29 3b 0a 09 69 66 20 28 72 65 73 ewind);..if (res
7770: 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b ult != TCL_OK) {
7780: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 20 .. break;..}
7790: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6e 75 6d 50 else {.. numP
77a0: 72 6f 63 65 73 73 65 64 2b 2b 3b 0a 09 7d 0a 0a rocessed++;..}..
77b0: 09 2f 2a 0a 09 20 2a 20 52 65 6d 6f 76 65 20 6e ./*.. * Remove n
77c0: 61 6d 65 20 61 66 74 65 72 20 73 6c 61 73 68 2e ame after slash.
77d0: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 .. */...Tcl_DStr
77e0: 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 73 6f 75 ingSetLength(sou
77f0: 72 63 65 50 74 72 2c 20 73 6f 75 72 63 65 4c 65 rcePtr, sourceLe
7800: 6e 29 3b 0a 09 69 66 20 28 74 61 72 67 65 74 50 n);..if (targetP
7810: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 tr != NULL) {..
7820: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 Tcl_DStringSe
7830: 74 4c 65 6e 67 74 68 28 74 61 72 67 65 74 50 74 tLength(targetPt
7840: 72 2c 20 74 61 72 67 65 74 4c 65 6e 29 3b 0a 09 r, targetLen);..
7850: 7d 0a 09 69 66 20 28 64 6f 52 65 77 69 6e 64 20 }..if (doRewind
7860: 26 26 20 28 6e 75 6d 50 72 6f 63 65 73 73 65 64 && (numProcessed
7870: 20 3e 20 4d 41 58 5f 52 45 41 44 44 49 52 5f 55 > MAX_READDIR_U
7880: 4e 4c 49 4e 4b 5f 54 48 52 45 53 48 4f 4c 44 29 NLINK_THRESHOLD)
7890: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 ) {.. /*..
78a0: 20 20 2a 20 43 61 6c 6c 20 72 65 77 69 6e 64 64 * Call rewindd
78b0: 69 72 20 69 66 20 77 65 27 76 65 20 63 61 6c 6c ir if we've call
78c0: 65 64 20 75 6e 6c 69 6e 6b 20 6f 72 20 72 6d 64 ed unlink or rmd
78d0: 69 72 20 73 6f 20 6d 61 6e 79 20 74 69 6d 65 73 ir so many times
78e0: 0a 09 20 20 20 20 20 2a 20 28 73 69 6e 63 65 20 .. * (since
78f0: 74 68 65 20 6f 70 65 6e 64 69 72 20 6f 72 20 74 the opendir or t
7900: 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 77 69 he previous rewi
7910: 6e 64 64 69 72 29 2c 20 74 6f 20 61 76 6f 69 64 nddir), to avoid
7920: 20 61 0a 09 20 20 20 20 20 2a 20 4e 55 4c 4c 2d a.. * NULL-
7930: 72 65 74 75 72 6e 20 74 68 61 74 20 6d 61 79 20 return that may
7940: 61 20 73 79 6d 70 74 6f 6d 20 6f 66 20 61 20 62 a symptom of a b
7950: 75 67 67 79 20 72 65 61 64 64 69 72 2e 0a 09 20 uggy readdir...
7960: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c */... Tcl
7970: 4f 53 72 65 77 69 6e 64 64 69 72 28 64 69 72 50 OSrewinddir(dirP
7980: 74 72 29 3b 0a 09 20 20 20 20 6e 75 6d 50 72 6f tr);.. numPro
7990: 63 65 73 73 65 64 20 3d 20 30 3b 0a 09 7d 0a 20 cessed = 0;..}.
79a0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 4f 53 63 6c }. TclOScl
79b0: 6f 73 65 64 69 72 28 64 69 72 50 74 72 29 3b 0a osedir(dirPtr);.
79c0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
79d0: 74 72 69 70 20 6f 66 66 20 74 68 65 20 74 72 61 trip off the tra
79e0: 69 6c 69 6e 67 20 73 6c 61 73 68 20 77 65 20 61 iling slash we a
79f0: 64 64 65 64 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 dded. */..
7a00: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 74 Tcl_DStringSet
7a10: 4c 65 6e 67 74 68 28 73 6f 75 72 63 65 50 74 72 Length(sourcePtr
7a20: 2c 20 73 6f 75 72 63 65 4c 65 6e 20 2d 20 31 29 , sourceLen - 1)
7a30: 3b 0a 20 20 20 20 69 66 20 28 74 61 72 67 65 74 ;. if (target
7a40: 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Ptr != NULL) {..
7a50: 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65 Tcl_DStringSetLe
7a60: 6e 67 74 68 28 74 61 72 67 65 74 50 74 72 2c 20 ngth(targetPtr,
7a70: 74 61 72 67 65 74 4c 65 6e 20 2d 20 31 29 3b 0a targetLen - 1);.
7a80: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 }.. if (r
7a90: 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 esult == TCL_OK)
7aa0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 61 6c 6c 20 {../*.. * Call
7ab0: 74 72 61 76 65 72 73 65 50 72 6f 63 28 29 20 6f traverseProc() o
7ac0: 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20 61 66 n a directory af
7ad0: 74 65 72 20 76 69 73 69 74 69 6e 67 20 61 6c 6c ter visiting all
7ae0: 20 74 68 65 20 66 69 6c 65 73 20 69 6e 0a 09 20 the files in..
7af0: 2a 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 * that directory
7b00: 2e 0a 09 20 2a 2f 0a 0a 09 72 65 73 75 6c 74 20 ... */...result
7b10: 3d 20 74 72 61 76 65 72 73 65 50 72 6f 63 28 73 = traverseProc(s
7b20: 6f 75 72 63 65 50 74 72 2c 20 74 61 72 67 65 74 ourcePtr, target
7b30: 50 74 72 2c 20 26 73 74 61 74 42 75 66 2c 20 44 Ptr, &statBuf, D
7b40: 4f 54 52 45 45 5f 50 4f 53 54 44 2c 0a 09 09 65 OTREE_POSTD,...e
7b50: 72 72 6f 72 50 74 72 29 3b 0a 20 20 20 20 7d 0a rrorPtr);. }.
7b60: 23 65 6c 73 65 20 2f 2a 20 48 41 56 45 5f 46 54 #else /* HAVE_FT
7b70: 53 20 2a 2f 0a 20 20 20 20 70 61 74 68 73 5b 30 S */. paths[0
7b80: 5d 20 3d 20 73 6f 75 72 63 65 3b 0a 20 20 20 20 ] = source;.
7b90: 66 74 73 20 3d 20 66 74 73 5f 6f 70 65 6e 28 28 fts = fts_open((
7ba0: 63 68 61 72 20 2a 2a 29 20 70 61 74 68 73 2c 20 char **) paths,
7bb0: 46 54 53 5f 50 48 59 53 49 43 41 4c 20 7c 20 46 FTS_PHYSICAL | F
7bc0: 54 53 5f 4e 4f 43 48 44 49 52 20 7c 0a 09 20 20 TS_NOCHDIR |..
7bd0: 20 20 28 6e 6f 46 74 73 53 74 61 74 20 7c 7c 20 (noFtsStat ||
7be0: 64 6f 52 65 77 69 6e 64 20 3f 20 46 54 53 5f 4e doRewind ? FTS_N
7bf0: 4f 53 54 41 54 20 3a 20 30 29 2c 20 4e 55 4c 4c OSTAT : 0), NULL
7c00: 29 3b 0a 20 20 20 20 69 66 20 28 66 74 73 20 3d );. if (fts =
7c10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 65 72 72 66 69 = NULL) {..errfi
7c20: 6c 65 20 3d 20 73 6f 75 72 63 65 3b 0a 09 67 6f le = source;..go
7c30: 74 6f 20 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 to end;. }..
7c40: 20 20 20 73 6f 75 72 63 65 4c 65 6e 20 3d 20 54 sourceLen = T
7c50: 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 cl_DStringLength
7c60: 28 73 6f 75 72 63 65 50 74 72 29 3b 0a 20 20 20 (sourcePtr);.
7c70: 20 69 66 20 28 74 61 72 67 65 74 50 74 72 20 21 if (targetPtr !
7c80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 74 61 72 67 65 = NULL) {..targe
7c90: 74 4c 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 tLen = Tcl_DStri
7ca0: 6e 67 4c 65 6e 67 74 68 28 74 61 72 67 65 74 50 ngLength(targetP
7cb0: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tr);. }..
7cc0: 77 68 69 6c 65 20 28 28 65 6e 74 20 3d 20 66 74 while ((ent = ft
7cd0: 73 5f 72 65 61 64 28 66 74 73 29 29 20 21 3d 20 s_read(fts)) !=
7ce0: 4e 55 4c 4c 29 20 7b 0a 09 75 6e 73 69 67 6e 65 NULL) {..unsigne
7cf0: 64 20 73 68 6f 72 74 20 69 6e 66 6f 20 3d 20 65 d short info = e
7d00: 6e 74 2d 3e 66 74 73 5f 69 6e 66 6f 3b 0a 09 63 nt->fts_info;..c
7d10: 68 61 72 20 2a 70 61 74 68 20 3d 20 65 6e 74 2d har *path = ent-
7d20: 3e 66 74 73 5f 70 61 74 68 20 2b 20 73 6f 75 72 >fts_path + sour
7d30: 63 65 4c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 ceLen;..unsigned
7d40: 20 73 68 6f 72 74 20 70 61 74 68 6c 65 6e 20 3d short pathlen =
7d50: 20 65 6e 74 2d 3e 66 74 73 5f 70 61 74 68 6c 65 ent->fts_pathle
7d60: 6e 20 2d 20 73 6f 75 72 63 65 4c 65 6e 3b 0a 09 n - sourceLen;..
7d70: 69 6e 74 20 74 79 70 65 3b 0a 09 54 63 6c 5f 53 int type;..Tcl_S
7d80: 74 61 74 42 75 66 20 2a 73 74 61 74 42 75 66 50 tatBuf *statBufP
7d90: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66 20 tr = NULL;...if
7da0: 28 69 6e 66 6f 20 3d 3d 20 46 54 53 5f 44 4e 52 (info == FTS_DNR
7db0: 20 7c 7c 20 69 6e 66 6f 20 3d 3d 20 46 54 53 5f || info == FTS_
7dc0: 45 52 52 20 7c 7c 20 69 6e 66 6f 20 3d 3d 20 46 ERR || info == F
7dd0: 54 53 5f 4e 53 29 20 7b 0a 09 20 20 20 20 65 72 TS_NS) {.. er
7de0: 72 66 69 6c 65 20 3d 20 65 6e 74 2d 3e 66 74 73 rfile = ent->fts
7df0: 5f 70 61 74 68 3b 0a 09 20 20 20 20 62 72 65 61 _path;.. brea
7e00: 6b 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 k;..}..Tcl_DStri
7e10: 6e 67 41 70 70 65 6e 64 28 73 6f 75 72 63 65 50 ngAppend(sourceP
7e20: 74 72 2c 20 70 61 74 68 2c 20 70 61 74 68 6c 65 tr, path, pathle
7e30: 6e 29 3b 0a 09 69 66 20 28 74 61 72 67 65 74 50 n);..if (targetP
7e40: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 tr != NULL) {..
7e50: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 Tcl_DStringAp
7e60: 70 65 6e 64 28 74 61 72 67 65 74 50 74 72 2c 20 pend(targetPtr,
7e70: 70 61 74 68 2c 20 70 61 74 68 6c 65 6e 29 3b 0a path, pathlen);.
7e80: 09 7d 0a 09 73 77 69 74 63 68 20 28 69 6e 66 6f .}..switch (info
7e90: 29 20 7b 0a 09 63 61 73 65 20 46 54 53 5f 44 3a ) {..case FTS_D:
7ea0: 0a 09 20 20 20 20 74 79 70 65 20 3d 20 44 4f 54 .. type = DOT
7eb0: 52 45 45 5f 50 52 45 44 3b 0a 09 20 20 20 20 62 REE_PRED;.. b
7ec0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 46 54 53 5f reak;..case FTS_
7ed0: 44 50 3a 0a 09 20 20 20 20 74 79 70 65 20 3d 20 DP:.. type =
7ee0: 44 4f 54 52 45 45 5f 50 4f 53 54 44 3b 0a 09 20 DOTREE_POSTD;..
7ef0: 20 20 20 62 72 65 61 6b 3b 0a 09 64 65 66 61 75 break;..defau
7f00: 6c 74 3a 0a 09 20 20 20 20 74 79 70 65 20 3d 20 lt:.. type =
7f10: 44 4f 54 52 45 45 5f 46 3b 0a 09 20 20 20 20 62 DOTREE_F;.. b
7f20: 72 65 61 6b 3b 0a 09 7d 0a 09 69 66 20 28 21 64 reak;..}..if (!d
7f30: 6f 52 65 77 69 6e 64 29 20 7b 20 2f 2a 20 6e 6f oRewind) { /* no
7f40: 20 6e 65 65 64 20 74 6f 20 73 74 61 74 20 66 6f need to stat fo
7f50: 72 20 64 65 6c 65 74 65 20 2a 2f 0a 09 20 20 20 r delete */..
7f60: 20 69 66 20 28 6e 6f 46 74 73 53 74 61 74 29 20 if (noFtsStat)
7f70: 7b 0a 09 09 73 74 61 74 42 75 66 50 74 72 20 3d {...statBufPtr =
7f80: 20 26 73 74 61 74 42 75 66 3b 0a 09 09 69 66 20 &statBuf;...if
7f90: 28 54 63 6c 4f 53 6c 73 74 61 74 28 65 6e 74 2d (TclOSlstat(ent-
7fa0: 3e 66 74 73 5f 70 61 74 68 2c 20 73 74 61 74 42 >fts_path, statB
7fb0: 75 66 50 74 72 29 20 21 3d 20 30 29 20 7b 0a 09 ufPtr) != 0) {..
7fc0: 09 20 20 20 20 65 72 72 66 69 6c 65 20 3d 20 65 . errfile = e
7fd0: 6e 74 2d 3e 66 74 73 5f 70 61 74 68 3b 0a 09 09 nt->fts_path;...
7fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 break;...}..
7ff0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 73 } else {...s
8000: 74 61 74 42 75 66 50 74 72 20 3d 20 28 54 63 6c tatBufPtr = (Tcl
8010: 5f 53 74 61 74 42 75 66 20 2a 29 20 65 6e 74 2d _StatBuf *) ent-
8020: 3e 66 74 73 5f 73 74 61 74 70 3b 0a 09 20 20 20 >fts_statp;..
8030: 20 7d 0a 09 7d 0a 09 72 65 73 75 6c 74 20 3d 20 }..}..result =
8040: 74 72 61 76 65 72 73 65 50 72 6f 63 28 73 6f 75 traverseProc(sou
8050: 72 63 65 50 74 72 2c 20 74 61 72 67 65 74 50 74 rcePtr, targetPt
8060: 72 2c 20 73 74 61 74 42 75 66 50 74 72 2c 20 74 r, statBufPtr, t
8070: 79 70 65 2c 0a 09 09 65 72 72 6f 72 50 74 72 29 ype,...errorPtr)
8080: 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d ;..if (result !=
8090: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
80a0: 62 72 65 61 6b 3b 0a 09 7d 0a 09 54 63 6c 5f 44 break;..}..Tcl_D
80b0: 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 StringSetLength(
80c0: 73 6f 75 72 63 65 50 74 72 2c 20 73 6f 75 72 63 sourcePtr, sourc
80d0: 65 4c 65 6e 29 3b 0a 09 69 66 20 28 74 61 72 67 eLen);..if (targ
80e0: 65 74 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b etPtr != NULL) {
80f0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
8100: 67 53 65 74 4c 65 6e 67 74 68 28 74 61 72 67 65 gSetLength(targe
8110: 74 50 74 72 2c 20 74 61 72 67 65 74 4c 65 6e 29 tPtr, targetLen)
8120: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ;..}. }.#endi
8130: 66 20 2f 2a 20 21 48 41 56 45 5f 46 54 53 20 2a f /* !HAVE_FTS *
8140: 2f 0a 0a 20 20 65 6e 64 3a 0a 20 20 20 20 69 66 /.. end:. if
8150: 20 28 65 72 72 66 69 6c 65 20 21 3d 20 4e 55 4c (errfile != NUL
8160: 4c 29 20 7b 0a 09 69 66 20 28 65 72 72 6f 72 50 L) {..if (errorP
8170: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 tr != NULL) {..
8180: 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 Tcl_ExternalT
8190: 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c oUtfDString(NULL
81a0: 2c 20 65 72 72 66 69 6c 65 2c 20 2d 31 2c 20 65 , errfile, -1, e
81b0: 72 72 6f 72 50 74 72 29 3b 0a 09 7d 0a 09 72 65 rrorPtr);..}..re
81c0: 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 sult = TCL_ERROR
81d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 48 ;. }.#ifdef H
81e0: 41 56 45 5f 46 54 53 0a 20 20 20 20 69 66 20 28 AVE_FTS. if (
81f0: 66 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 fts != NULL) {..
8200: 66 74 73 5f 63 6c 6f 73 65 28 66 74 73 29 3b 0a fts_close(fts);.
8210: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 }.#endif..
8220: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b return result;
8230: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 0a 20 2a 0a 20 2a 20 54 72 61 76 65 72 73 61 6c . *. * Traversal
8290: 43 6f 70 79 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 Copy. *. *.Calle
82a0: 64 20 66 72 6f 6d 20 54 72 61 76 65 72 73 65 55 d from TraverseU
82b0: 6e 69 78 54 72 65 65 20 69 6e 20 6f 72 64 65 72 nixTree in order
82c0: 20 74 6f 20 65 78 65 63 75 74 65 20 61 20 72 65 to execute a re
82d0: 63 75 72 73 69 76 65 20 63 6f 70 79 20 6f 66 20 cursive copy of
82e0: 61 0a 20 2a 09 64 69 72 65 63 74 6f 72 79 2e 0a a. *.directory..
82f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
8300: 2a 09 53 74 61 6e 64 61 72 64 20 54 63 6c 20 72 *.Standard Tcl r
8310: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 esult.. *. * Sid
8320: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 e effects:. *.Th
8330: 65 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 e file or direct
8340: 6f 72 79 20 73 72 63 20 6d 61 79 20 62 65 20 63 ory src may be c
8350: 6f 70 69 65 64 20 74 6f 20 64 73 74 2c 20 64 65 opied to dst, de
8360: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 pending on the v
8370: 61 6c 75 65 0a 20 2a 09 6f 66 20 74 79 70 65 2e alue. *.of type.
8380: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
8390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
83d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 72 61 ..static int.Tra
83e0: 76 65 72 73 61 6c 43 6f 70 79 28 0a 20 20 20 20 versalCopy(.
83f0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 72 63 Tcl_DString *src
8400: 50 74 72 2c 09 2f 2a 20 53 6f 75 72 63 65 20 70 Ptr,./* Source p
8410: 61 74 68 6e 61 6d 65 20 74 6f 20 63 6f 70 79 20 athname to copy
8420: 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 20 20 20 (native). */.
8430: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 Tcl_DString *ds
8440: 74 50 74 72 2c 09 2f 2a 20 44 65 73 74 69 6e 61 tPtr,./* Destina
8450: 74 69 6f 6e 20 70 61 74 68 6e 61 6d 65 20 6f 66 tion pathname of
8460: 20 63 6f 70 79 20 28 6e 61 74 69 76 65 29 2e 20 copy (native).
8470: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c */. const Tcl
8480: 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 42 75 _StatBuf *statBu
8490: 66 50 74 72 2c 0a 09 09 09 09 2f 2a 20 53 74 61 fPtr,...../* Sta
84a0: 74 20 69 6e 66 6f 20 66 6f 72 20 66 69 6c 65 20 t info for file
84b0: 73 70 65 63 69 66 69 65 64 20 62 79 20 73 72 63 specified by src
84c0: 50 74 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 Ptr. */. int
84d0: 74 79 70 65 2c 09 09 09 2f 2a 20 52 65 61 73 6f type,.../* Reaso
84e0: 6e 20 66 6f 72 20 63 61 6c 6c 20 2d 20 73 65 65 n for call - see
84f0: 20 54 72 61 76 65 72 73 65 55 6e 69 78 54 72 65 TraverseUnixTre
8500: 65 28 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f e(). */. Tcl_
8510: 44 53 74 72 69 6e 67 20 2a 65 72 72 6f 72 50 74 DString *errorPt
8520: 72 29 09 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c r)./* If non-NUL
8530: 4c 2c 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 L, uninitialized
8540: 20 6f 72 20 66 72 65 65 20 44 53 74 72 69 6e 67 or free DString
8550: 0a 09 09 09 09 20 2a 20 66 69 6c 6c 65 64 20 77 ..... * filled w
8560: 69 74 68 20 55 54 46 2d 38 20 6e 61 6d 65 20 6f ith UTF-8 name o
8570: 66 20 66 69 6c 65 20 63 61 75 73 69 6e 67 0a 09 f file causing..
8580: 09 09 09 20 2a 20 65 72 72 6f 72 2e 20 2a 2f 0a ... * error. */.
8590: 7b 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 79 {. switch (ty
85a0: 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 44 pe) {. case D
85b0: 4f 54 52 45 45 5f 46 3a 0a 09 69 66 20 28 44 6f OTREE_F:..if (Do
85c0: 43 6f 70 79 46 69 6c 65 28 54 63 6c 5f 44 53 74 CopyFile(Tcl_DSt
85d0: 72 69 6e 67 56 61 6c 75 65 28 73 72 63 50 74 72 ringValue(srcPtr
85e0: 29 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 ), Tcl_DStringVa
85f0: 6c 75 65 28 64 73 74 50 74 72 29 2c 0a 09 09 73 lue(dstPtr),...s
8600: 74 61 74 42 75 66 50 74 72 29 20 3d 3d 20 54 43 tatBufPtr) == TC
8610: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 L_OK) {.. ret
8620: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 urn TCL_OK;..}..
8630: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 break;.. case
8640: 20 44 4f 54 52 45 45 5f 50 52 45 44 3a 0a 09 69 DOTREE_PRED:..i
8650: 66 20 28 44 6f 43 72 65 61 74 65 44 69 72 65 63 f (DoCreateDirec
8660: 74 6f 72 79 28 54 63 6c 5f 44 53 74 72 69 6e 67 tory(Tcl_DString
8670: 56 61 6c 75 65 28 64 73 74 50 74 72 29 29 20 3d Value(dstPtr)) =
8680: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
8690: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
86a0: 09 7d 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20 20 .}..break;..
86b0: 63 61 73 65 20 44 4f 54 52 45 45 5f 50 4f 53 54 case DOTREE_POST
86c0: 44 3a 0a 09 69 66 20 28 43 6f 70 79 46 69 6c 65 D:..if (CopyFile
86d0: 41 74 74 73 28 54 63 6c 5f 44 53 74 72 69 6e 67 Atts(Tcl_DString
86e0: 56 61 6c 75 65 28 73 72 63 50 74 72 29 2c 0a 09 Value(srcPtr),..
86f0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 .Tcl_DStringValu
8700: 65 28 64 73 74 50 74 72 29 2c 20 73 74 61 74 42 e(dstPtr), statB
8710: 75 66 50 74 72 29 20 3d 3d 20 54 43 4c 5f 4f 4b ufPtr) == TCL_OK
8720: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
8730: 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 62 72 65 61 TCL_OK;..}..brea
8740: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a k;. }.. /*
8750: 0a 20 20 20 20 20 2a 20 54 68 65 72 65 20 73 68 . * There sh
8760: 6f 75 6c 64 6e 27 74 20 62 65 20 61 20 70 72 6f ouldn't be a pro
8770: 62 6c 65 6d 20 77 69 74 68 20 73 72 63 2c 20 62 blem with src, b
8780: 65 63 61 75 73 65 20 77 65 20 61 6c 72 65 61 64 ecause we alread
8790: 79 20 63 68 65 63 6b 65 64 20 69 74 20 74 6f 0a y checked it to.
87a0: 20 20 20 20 20 2a 20 67 65 74 20 68 65 72 65 2e * get here.
87b0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
87c0: 20 28 65 72 72 6f 72 50 74 72 20 21 3d 20 4e 55 (errorPtr != NU
87d0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 45 78 74 65 72 LL) {..Tcl_Exter
87e0: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28 nalToUtfDString(
87f0: 4e 55 4c 4c 2c 20 54 63 6c 5f 44 53 74 72 69 6e NULL, Tcl_DStrin
8800: 67 56 61 6c 75 65 28 64 73 74 50 74 72 29 2c 0a gValue(dstPtr),.
8810: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e ..Tcl_DStringLen
8820: 67 74 68 28 64 73 74 50 74 72 29 2c 20 65 72 72 gth(dstPtr), err
8830: 6f 72 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 orPtr);. }.
8840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
8850: 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OR;.}.../*. *---
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
88b0: 72 61 76 65 72 73 61 6c 44 65 6c 65 74 65 20 2d raversalDelete -
88c0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 -. *. *.Called b
88d0: 79 20 70 72 6f 63 65 64 75 72 65 20 54 72 61 76 y procedure Trav
88e0: 65 72 73 65 55 6e 69 78 54 72 65 65 20 66 6f 72 erseUnixTree for
88f0: 20 65 76 65 72 79 20 66 69 6c 65 20 61 6e 64 20 every file and
8900: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 0a 20 directory that.
8910: 2a 09 69 74 20 65 6e 63 6f 75 6e 74 65 72 73 20 *.it encounters
8920: 69 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20 68 in a directory h
8930: 69 65 72 61 72 63 68 79 2e 20 54 68 69 73 20 70 ierarchy. This p
8940: 72 6f 63 65 64 75 72 65 20 75 6e 6c 69 6e 6b 73 rocedure unlinks
8950: 20 66 69 6c 65 73 2c 0a 20 2a 09 61 6e 64 20 72 files,. *.and r
8960: 65 6d 6f 76 65 73 20 64 69 72 65 63 74 6f 72 69 emoves directori
8970: 65 73 20 61 66 74 65 72 20 61 6c 6c 20 74 68 65 es after all the
8980: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 containing file
8990: 73 20 68 61 76 65 20 62 65 65 6e 0a 20 2a 09 70 s have been. *.p
89a0: 72 6f 63 65 73 73 65 64 2e 0a 20 2a 0a 20 2a 20 rocessed.. *. *
89b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 74 61 6e Results:. *.Stan
89c0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
89d0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
89e0: 63 74 73 3a 0a 20 2a 09 46 69 6c 65 73 20 6f 72 cts:. *.Files or
89f0: 20 64 69 72 65 63 74 6f 72 79 20 73 70 65 63 69 directory speci
8a00: 66 69 65 64 20 62 79 20 73 72 63 20 77 69 6c 6c fied by src will
8a10: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a be deleted.. *.
8a20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
8a70: 61 74 69 63 20 69 6e 74 0a 54 72 61 76 65 72 73 atic int.Travers
8a80: 61 6c 44 65 6c 65 74 65 28 0a 20 20 20 20 54 63 alDelete(. Tc
8a90: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 72 63 50 74 l_DString *srcPt
8aa0: 72 2c 09 2f 2a 20 53 6f 75 72 63 65 20 70 61 74 r,./* Source pat
8ab0: 68 6e 61 6d 65 20 28 6e 61 74 69 76 65 29 2e 20 hname (native).
8ac0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
8ad0: 6e 67 20 2a 69 67 6e 6f 72 65 2c 09 2f 2a 20 44 ng *ignore,./* D
8ae0: 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 74 68 6e estination pathn
8af0: 61 6d 65 20 28 6e 6f 74 20 75 73 65 64 29 2e 20 ame (not used).
8b00: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c */. const Tcl
8b10: 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 42 75 _StatBuf *statBu
8b20: 66 50 74 72 2c 0a 09 09 09 09 2f 2a 20 53 74 61 fPtr,...../* Sta
8b30: 74 20 69 6e 66 6f 20 66 6f 72 20 66 69 6c 65 20 t info for file
8b40: 73 70 65 63 69 66 69 65 64 20 62 79 20 73 72 63 specified by src
8b50: 50 74 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 Ptr. */. int
8b60: 74 79 70 65 2c 09 09 09 2f 2a 20 52 65 61 73 6f type,.../* Reaso
8b70: 6e 20 66 6f 72 20 63 61 6c 6c 20 2d 20 73 65 65 n for call - see
8b80: 20 54 72 61 76 65 72 73 65 55 6e 69 78 54 72 65 TraverseUnixTre
8b90: 65 28 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f e(). */. Tcl_
8ba0: 44 53 74 72 69 6e 67 20 2a 65 72 72 6f 72 50 74 DString *errorPt
8bb0: 72 29 09 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c r)./* If non-NUL
8bc0: 4c 2c 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 L, uninitialized
8bd0: 20 6f 72 20 66 72 65 65 20 44 53 74 72 69 6e 67 or free DString
8be0: 0a 09 09 09 09 20 2a 20 66 69 6c 6c 65 64 20 77 ..... * filled w
8bf0: 69 74 68 20 55 54 46 2d 38 20 6e 61 6d 65 20 6f ith UTF-8 name o
8c00: 66 20 66 69 6c 65 20 63 61 75 73 69 6e 67 0a 09 f file causing..
8c10: 09 09 09 20 2a 20 65 72 72 6f 72 2e 20 2a 2f 0a ... * error. */.
8c20: 7b 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 79 {. switch (ty
8c30: 70 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 44 pe) {. case D
8c40: 4f 54 52 45 45 5f 46 3a 0a 09 69 66 20 28 54 63 OTREE_F:..if (Tc
8c50: 6c 70 44 65 6c 65 74 65 46 69 6c 65 28 54 63 6c lpDeleteFile(Tcl
8c60: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 73 72 _DStringValue(sr
8c70: 63 50 74 72 29 29 20 3d 3d 20 30 29 20 7b 0a 09 cPtr)) == 0) {..
8c80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8c90: 4b 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 K;..}..break;.
8ca0: 20 20 63 61 73 65 20 44 4f 54 52 45 45 5f 50 52 case DOTREE_PR
8cb0: 45 44 3a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ED:..return TCL_
8cc0: 4f 4b 3b 0a 20 20 20 20 63 61 73 65 20 44 4f 54 OK;. case DOT
8cd0: 52 45 45 5f 50 4f 53 54 44 3a 0a 09 69 66 20 28 REE_POSTD:..if (
8ce0: 44 6f 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 DoRemoveDirector
8cf0: 79 28 73 72 63 50 74 72 2c 20 30 2c 20 4e 55 4c y(srcPtr, 0, NUL
8d00: 4c 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 L) == 0) {..
8d10: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
8d20: 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a }..break;. }.
8d30: 20 20 20 20 69 66 20 28 65 72 72 6f 72 50 74 72 if (errorPtr
8d40: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
8d50: 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 _ExternalToUtfDS
8d60: 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 54 63 6c 5f tring(NULL, Tcl_
8d70: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 73 72 63 DStringValue(src
8d80: 50 74 72 29 2c 0a 09 09 54 63 6c 5f 44 53 74 72 Ptr),...Tcl_DStr
8d90: 69 6e 67 4c 65 6e 67 74 68 28 73 72 63 50 74 72 ingLength(srcPtr
8da0: 29 2c 20 65 72 72 6f 72 50 74 72 29 3b 0a 20 20 ), errorPtr);.
8db0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
8dc0: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a CL_ERROR;.}.../*
8dd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8e20: 2a 0a 20 2a 20 43 6f 70 79 46 69 6c 65 41 74 74 *. * CopyFileAtt
8e30: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 70 79 20 s --. *. *.Copy
8e40: 74 68 65 20 66 69 6c 65 20 61 74 74 72 69 62 75 the file attribu
8e50: 74 65 73 20 73 75 63 68 20 61 73 20 6f 77 6e 65 tes such as owne
8e60: 72 2c 20 67 72 6f 75 70 2c 20 70 65 72 6d 69 73 r, group, permis
8e70: 73 69 6f 6e 73 2c 20 61 6e 64 0a 20 2a 09 6d 6f sions, and. *.mo
8e80: 64 69 66 69 63 61 74 69 6f 6e 20 64 61 74 65 20 dification date
8e90: 66 72 6f 6d 20 6f 6e 65 20 66 69 6c 65 20 74 6f from one file to
8ea0: 20 61 6e 6f 74 68 65 72 2e 0a 20 2a 0a 20 2a 20 another.. *. *
8eb0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 74 61 6e Results:. *.Stan
8ec0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
8ed0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
8ee0: 63 74 73 3a 0a 20 2a 09 55 73 65 72 20 69 64 2c cts:. *.User id,
8ef0: 20 67 72 6f 75 70 20 69 64 2c 20 70 65 72 6d 69 group id, permi
8f00: 73 73 69 6f 6e 20 62 69 74 73 2c 20 6c 61 73 74 ssion bits, last
8f10: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 modification ti
8f20: 6d 65 2c 20 61 6e 64 20 6c 61 73 74 0a 20 2a 09 me, and last. *.
8f30: 61 63 63 65 73 73 20 74 69 6d 65 20 61 72 65 20 access time are
8f40: 75 70 64 61 74 65 64 20 69 6e 20 74 68 65 20 6e updated in the n
8f50: 65 77 20 66 69 6c 65 20 74 6f 20 72 65 66 6c 65 ew file to refle
8f60: 63 74 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 2e ct the old file.
8f70: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
8fd0: 74 0a 43 6f 70 79 46 69 6c 65 41 74 74 73 28 0a t.CopyFileAtts(.
8fe0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
8ff0: 73 72 63 2c 09 09 2f 2a 20 50 61 74 68 20 6e 61 src,../* Path na
9000: 6d 65 20 6f 66 20 73 6f 75 72 63 65 20 66 69 6c me of source fil
9010: 65 20 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 20 e (native). */.
9020: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 const char *d
9030: 73 74 2c 09 09 2f 2a 20 50 61 74 68 20 6e 61 6d st,../* Path nam
9040: 65 20 6f 66 20 74 61 72 67 65 74 20 66 69 6c 65 e of target file
9050: 20 28 6e 61 74 69 76 65 29 2e 20 2a 2f 0a 20 20 (native). */.
9060: 20 20 63 6f 6e 73 74 20 54 63 6c 5f 53 74 61 74 const Tcl_Stat
9070: 42 75 66 20 2a 73 74 61 74 42 75 66 50 74 72 29 Buf *statBufPtr)
9080: 0a 09 09 09 09 2f 2a 20 53 74 61 74 20 69 6e 66 ...../* Stat inf
9090: 6f 20 66 6f 72 20 73 6f 75 72 63 65 20 66 69 6c o for source fil
90a0: 65 20 2a 2f 0a 7b 0a 20 20 20 20 73 74 72 75 63 e */.{. struc
90b0: 74 20 75 74 69 6d 62 75 66 20 74 76 61 6c 3b 0a t utimbuf tval;.
90c0: 20 20 20 20 6d 6f 64 65 5f 74 20 6e 65 77 4d 6f mode_t newMo
90d0: 64 65 3b 0a 0a 20 20 20 20 6e 65 77 4d 6f 64 65 de;.. newMode
90e0: 20 3d 20 73 74 61 74 42 75 66 50 74 72 2d 3e 73 = statBufPtr->s
90f0: 74 5f 6d 6f 64 65 0a 09 20 20 20 20 26 20 28 53 t_mode.. & (S
9100: 5f 49 53 55 49 44 20 7c 20 53 5f 49 53 47 49 44 _ISUID | S_ISGID
9110: 20 7c 20 53 5f 49 52 57 58 55 20 7c 20 53 5f 49 | S_IRWXU | S_I
9120: 52 57 58 47 20 7c 20 53 5f 49 52 57 58 4f 29 3b RWXG | S_IRWXO);
9130: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
9140: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 79 6f 75 Note that if you
9150: 20 63 6f 70 79 20 61 20 73 65 74 75 69 64 20 66 copy a setuid f
9160: 69 6c 65 20 74 68 61 74 20 69 73 20 6f 77 6e 65 ile that is owne
9170: 64 20 62 79 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 d by someone els
9180: 65 2c 20 61 6e 64 0a 20 20 20 20 20 2a 20 79 6f e, and. * yo
9190: 75 20 61 72 65 20 6e 6f 74 20 72 6f 6f 74 2c 20 u are not root,
91a0: 74 68 65 6e 20 74 68 65 20 63 6f 70 79 20 77 69 then the copy wi
91b0: 6c 6c 20 62 65 20 73 65 74 75 69 64 20 74 6f 20 ll be setuid to
91c0: 79 6f 75 2e 20 54 68 65 20 6d 6f 73 74 20 63 6f you. The most co
91d0: 72 72 65 63 74 0a 20 20 20 20 20 2a 20 69 6d 70 rrect. * imp
91e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 75 6c lementation woul
91f0: 64 20 70 72 6f 62 61 62 6c 79 20 62 65 20 74 6f d probably be to
9200: 20 68 61 76 65 20 74 68 65 20 63 6f 70 79 20 6e have the copy n
9210: 6f 74 20 73 65 74 75 69 64 20 74 6f 20 61 6e 79 ot setuid to any
9220: 6f 6e 65 0a 20 20 20 20 20 2a 20 69 66 20 74 68 one. * if th
9230: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 e original file
9240: 77 61 73 20 6f 77 6e 65 64 20 62 79 20 73 6f 6d was owned by som
9250: 65 6f 6e 65 20 65 6c 73 65 2c 20 62 75 74 20 74 eone else, but t
9260: 68 69 73 20 63 6f 72 6e 65 72 20 63 61 73 65 0a his corner case.
9270: 20 20 20 20 20 2a 20 69 73 6e 27 74 20 63 75 72 * isn't cur
9280: 72 65 6e 74 6c 79 20 68 61 6e 64 6c 65 64 2e 20 rently handled.
9290: 49 74 20 77 6f 75 6c 64 20 72 65 71 75 69 72 65 It would require
92a0: 20 61 6e 6f 74 68 65 72 20 6c 73 74 61 74 28 29 another lstat()
92b0: 2c 20 6f 72 20 67 65 74 75 69 64 28 29 2e 0a 20 , or getuid()..
92c0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
92d0: 63 68 6d 6f 64 28 64 73 74 2c 20 6e 65 77 4d 6f chmod(dst, newMo
92e0: 64 65 29 29 20 7b 09 09 09 09 2f 2a 20 49 4e 54 de)) {..../* INT
92f0: 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f 0a 09 6e L: Native. */..n
9300: 65 77 4d 6f 64 65 20 26 3d 20 7e 28 53 5f 49 53 ewMode &= ~(S_IS
9310: 55 49 44 20 7c 20 53 5f 49 53 47 49 44 29 3b 0a UID | S_ISGID);.
9320: 09 69 66 20 28 63 68 6d 6f 64 28 64 73 74 2c 20 .if (chmod(dst,
9330: 6e 65 77 4d 6f 64 65 29 29 20 7b 09 09 09 2f 2a newMode)) {.../*
9340: 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a INTL: Native. *
9350: 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 /.. return TC
9360: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 L_ERROR;..}.
9370: 7d 0a 0a 20 20 20 20 74 76 61 6c 2e 61 63 74 69 }.. tval.acti
9380: 6d 65 20 3d 20 73 74 61 74 42 75 66 50 74 72 2d me = statBufPtr-
9390: 3e 73 74 5f 61 74 69 6d 65 3b 0a 20 20 20 20 74 >st_atime;. t
93a0: 76 61 6c 2e 6d 6f 64 74 69 6d 65 20 3d 20 73 74 val.modtime = st
93b0: 61 74 42 75 66 50 74 72 2d 3e 73 74 5f 6d 74 69 atBufPtr->st_mti
93c0: 6d 65 3b 0a 0a 20 20 20 20 69 66 20 28 75 74 69 me;.. if (uti
93d0: 6d 65 28 64 73 74 2c 20 26 74 76 61 6c 29 29 20 me(dst, &tval))
93e0: 7b 09 09 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 {..../* INTL: Na
93f0: 74 69 76 65 2e 20 2a 2f 0a 09 72 65 74 75 72 6e tive. */..return
9400: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
9410: 7d 0a 23 69 66 64 65 66 20 4d 41 43 5f 4f 53 58 }.#ifdef MAC_OSX
9420: 5f 54 43 4c 0a 20 20 20 20 54 63 6c 4d 61 63 4f _TCL. TclMacO
9430: 53 58 43 6f 70 79 46 69 6c 65 41 74 74 72 69 62 SXCopyFileAttrib
9440: 75 74 65 73 28 73 72 63 2c 20 64 73 74 2c 20 73 utes(src, dst, s
9450: 74 61 74 42 75 66 50 74 72 29 3b 0a 23 65 6e 64 tatBufPtr);.#end
9460: 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 if. return TC
9470: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d L_OK;.}.../*. *-
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 47 -----. *. * GetG
94d0: 72 6f 75 70 41 74 74 72 69 62 75 74 65 0a 20 2a roupAttribute. *
94e0: 0a 20 2a 09 47 65 74 73 20 74 68 65 20 67 72 6f . *.Gets the gro
94f0: 75 70 20 61 74 74 72 69 62 75 74 65 20 6f 66 20 up attribute of
9500: 61 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 a file.. *. * Re
9510: 73 75 6c 74 73 3a 0a 20 2a 09 53 74 61 6e 64 61 sults:. *.Standa
9520: 72 64 20 54 43 4c 20 72 65 73 75 6c 74 2e 20 52 rd TCL result. R
9530: 65 74 75 72 6e 73 20 61 20 6e 65 77 20 54 63 6c eturns a new Tcl
9540: 5f 4f 62 6a 20 69 6e 20 61 74 74 72 69 62 75 74 _Obj in attribut
9550: 65 50 74 72 50 74 72 20 69 66 20 74 68 65 72 65 ePtrPtr if there
9560: 0a 20 2a 09 69 73 20 6e 6f 20 65 72 72 6f 72 2e . *.is no error.
9570: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9580: 63 74 73 3a 0a 20 2a 09 41 20 6e 65 77 20 6f 62 cts:. *.A new ob
9590: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 ject is allocate
95a0: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
95f0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 47 */..static int.G
9600: 65 74 47 72 6f 75 70 41 74 74 72 69 62 75 74 65 etGroupAttribute
9610: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 (. Tcl_Interp
9620: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 54 68 *interp,../* Th
9630: 65 20 69 6e 74 65 72 70 20 77 65 20 61 72 65 20 e interp we are
9640: 75 73 69 6e 67 20 66 6f 72 20 65 72 72 6f 72 73 using for errors
9650: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a . */. int obj
9660: 49 6e 64 65 78 2c 09 09 2f 2a 20 54 68 65 20 69 Index,../* The i
9670: 6e 64 65 78 20 6f 66 20 74 68 65 20 61 74 74 72 ndex of the attr
9680: 69 62 75 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 ibute. */. Tc
9690: 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c l_Obj *fileName,
96a0: 09 09 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 ../* The name of
96b0: 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 the file (UTF-8
96c0: 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 ). */. Tcl_Ob
96d0: 6a 20 2a 2a 61 74 74 72 69 62 75 74 65 50 74 72 j **attributePtr
96e0: 50 74 72 29 09 2f 2a 20 41 20 70 6f 69 6e 74 65 Ptr)./* A pointe
96f0: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 r to return the
9700: 6f 62 6a 65 63 74 20 77 69 74 68 2e 20 2a 2f 0a object with. */.
9710: 7b 0a 20 20 20 20 54 63 6c 5f 53 74 61 74 42 75 {. Tcl_StatBu
9720: 66 20 73 74 61 74 42 75 66 3b 0a 20 20 20 20 73 f statBuf;. s
9730: 74 72 75 63 74 20 67 72 6f 75 70 20 2a 67 72 6f truct group *gro
9740: 75 70 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 upPtr;. int r
9750: 65 73 75 6c 74 3b 0a 0a 20 20 20 20 72 65 73 75 esult;.. resu
9760: 6c 74 20 3d 20 54 63 6c 70 4f 62 6a 53 74 61 74 lt = TclpObjStat
9770: 28 66 69 6c 65 4e 61 6d 65 2c 20 26 73 74 61 74 (fileName, &stat
9780: 42 75 66 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 Buf);.. if (r
9790: 65 73 75 6c 74 20 21 3d 20 30 29 20 7b 0a 09 69 esult != 0) {..i
97a0: 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c f (interp != NUL
97b0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 L) {.. Tcl_Se
97c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
97d0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
97e0: 28 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 20 6e (... "could n
97f0: 6f 74 20 72 65 61 64 20 5c 22 25 73 5c 22 3a 20 ot read \"%s\":
9800: 25 73 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 %s",... TclGe
9810: 74 53 74 72 69 6e 67 28 66 69 6c 65 4e 61 6d 65 tString(fileName
9820: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f ), Tcl_PosixErro
9830: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a r(interp)));..}.
9840: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
9850: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 72 R;. }.. gr
9860: 6f 75 70 50 74 72 20 3d 20 54 63 6c 70 47 65 74 oupPtr = TclpGet
9870: 47 72 47 69 64 28 73 74 61 74 42 75 66 2e 73 74 GrGid(statBuf.st
9880: 5f 67 69 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 _gid);.. if (
9890: 67 72 6f 75 70 50 74 72 20 3d 3d 20 4e 55 4c 4c groupPtr == NULL
98a0: 29 20 7b 0a 09 54 63 6c 4e 65 77 49 6e 74 4f 62 ) {..TclNewIntOb
98b0: 6a 28 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 j(*attributePtrP
98c0: 74 72 2c 20 28 69 6e 74 29 20 73 74 61 74 42 75 tr, (int) statBu
98d0: 66 2e 73 74 5f 67 69 64 29 3b 0a 20 20 20 20 7d f.st_gid);. }
98e0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 44 53 74 else {..Tcl_DSt
98f0: 72 69 6e 67 20 64 73 3b 0a 09 63 6f 6e 73 74 20 ring ds;..const
9900: 63 68 61 72 20 2a 75 74 66 3b 0a 0a 09 75 74 66 char *utf;...utf
9910: 20 3d 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 = Tcl_ExternalT
9920: 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c oUtfDString(NULL
9930: 2c 20 67 72 6f 75 70 50 74 72 2d 3e 67 72 5f 6e , groupPtr->gr_n
9940: 61 6d 65 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 09 ame, -1, &ds);..
9950: 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 74 72 *attributePtrPtr
9960: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
9970: 4f 62 6a 28 75 74 66 2c 20 2d 31 29 3b 0a 09 54 Obj(utf, -1);..T
9980: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
9990: 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ds);. }. r
99a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
99b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
9a00: 0a 20 2a 20 47 65 74 4f 77 6e 65 72 41 74 74 72 . * GetOwnerAttr
9a10: 69 62 75 74 65 0a 20 2a 0a 20 2a 09 47 65 74 73 ibute. *. *.Gets
9a20: 20 74 68 65 20 6f 77 6e 65 72 20 61 74 74 72 69 the owner attri
9a30: 62 75 74 65 20 6f 66 20 61 20 66 69 6c 65 2e 0a bute of a file..
9a40: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
9a50: 2a 09 53 74 61 6e 64 61 72 64 20 54 43 4c 20 72 *.Standard TCL r
9a60: 65 73 75 6c 74 2e 20 52 65 74 75 72 6e 73 20 61 esult. Returns a
9a70: 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 69 6e 20 new Tcl_Obj in
9a80: 61 74 74 72 69 62 75 74 65 50 74 72 50 74 72 20 attributePtrPtr
9a90: 69 66 20 74 68 65 72 65 0a 20 2a 09 69 73 20 6e if there. *.is n
9aa0: 6f 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 o error.. *. * S
9ab0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9ac0: 41 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 A new object is
9ad0: 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 2a 0a 20 2a allocated.. *. *
9ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
9b30: 69 63 20 69 6e 74 0a 47 65 74 4f 77 6e 65 72 41 ic int.GetOwnerA
9b40: 74 74 72 69 62 75 74 65 28 0a 20 20 20 20 54 63 ttribute(. Tc
9b50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
9b60: 2c 09 09 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 ,../* The interp
9b70: 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 66 6f we are using fo
9b80: 72 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 20 20 r errors. */.
9b90: 20 69 6e 74 20 6f 62 6a 49 6e 64 65 78 2c 09 09 int objIndex,..
9ba0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 /* The index of
9bb0: 74 68 65 20 61 74 74 72 69 62 75 74 65 2e 20 2a the attribute. *
9bc0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 /. Tcl_Obj *f
9bd0: 69 6c 65 4e 61 6d 65 2c 09 09 2f 2a 20 54 68 65 ileName,../* The
9be0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c name of the fil
9bf0: 65 20 28 55 54 46 2d 38 29 2e 20 2a 2f 0a 20 20 e (UTF-8). */.
9c00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 74 74 72 Tcl_Obj **attr
9c10: 69 62 75 74 65 50 74 72 50 74 72 29 09 2f 2a 20 ibutePtrPtr)./*
9c20: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 A pointer to ret
9c30: 75 72 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 77 urn the object w
9c40: 69 74 68 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 ith. */.{. Tc
9c50: 6c 5f 53 74 61 74 42 75 66 20 73 74 61 74 42 75 l_StatBuf statBu
9c60: 66 3b 0a 20 20 20 20 73 74 72 75 63 74 20 70 61 f;. struct pa
9c70: 73 73 77 64 20 2a 70 77 50 74 72 3b 0a 20 20 20 sswd *pwPtr;.
9c80: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 20 int result;..
9c90: 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 70 4f result = TclpO
9ca0: 62 6a 53 74 61 74 28 66 69 6c 65 4e 61 6d 65 2c bjStat(fileName,
9cb0: 20 26 73 74 61 74 42 75 66 29 3b 0a 0a 20 20 20 &statBuf);..
9cc0: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 30 if (result != 0
9cd0: 29 20 7b 0a 09 69 66 20 28 69 6e 74 65 72 70 20 ) {..if (interp
9ce0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
9cf0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
9d00: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
9d10: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 63 Printf(... "c
9d20: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 5c 22 ould not read \"
9d30: 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 20 20 20 %s\": %s",...
9d40: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 66 69 TclGetString(fi
9d50: 6c 65 4e 61 6d 65 29 2c 20 54 63 6c 5f 50 6f 73 leName), Tcl_Pos
9d60: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 29 ixError(interp))
9d70: 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 );..}..return TC
9d80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
9d90: 20 20 20 20 70 77 50 74 72 20 3d 20 54 63 6c 70 pwPtr = Tclp
9da0: 47 65 74 50 77 55 69 64 28 73 74 61 74 42 75 66 GetPwUid(statBuf
9db0: 2e 73 74 5f 75 69 64 29 3b 0a 0a 20 20 20 20 69 .st_uid);.. i
9dc0: 66 20 28 70 77 50 74 72 20 3d 3d 20 4e 55 4c 4c f (pwPtr == NULL
9dd0: 29 20 7b 0a 09 54 63 6c 4e 65 77 49 6e 74 4f 62 ) {..TclNewIntOb
9de0: 6a 28 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 j(*attributePtrP
9df0: 74 72 2c 20 28 69 6e 74 29 20 73 74 61 74 42 75 tr, (int) statBu
9e00: 66 2e 73 74 5f 75 69 64 29 3b 0a 20 20 20 20 7d f.st_uid);. }
9e10: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 44 53 74 else {..Tcl_DSt
9e20: 72 69 6e 67 20 64 73 3b 0a 0a 09 28 76 6f 69 64 ring ds;...(void
9e30: 29 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f ) Tcl_ExternalTo
9e40: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c UtfDString(NULL,
9e50: 20 70 77 50 74 72 2d 3e 70 77 5f 6e 61 6d 65 2c pwPtr->pw_name,
9e60: 20 2d 31 2c 20 26 64 73 29 3b 0a 09 2a 61 74 74 -1, &ds);..*att
9e70: 72 69 62 75 74 65 50 74 72 50 74 72 20 3d 20 54 ributePtrPtr = T
9e80: 63 6c 44 53 74 72 69 6e 67 54 6f 4f 62 6a 28 26 clDStringToObj(&
9e90: 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ds);. }. r
9ea0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
9eb0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
9f00: 0a 20 2a 20 47 65 74 50 65 72 6d 69 73 73 69 6f . * GetPermissio
9f10: 6e 73 41 74 74 72 69 62 75 74 65 0a 20 2a 0a 20 nsAttribute. *.
9f20: 2a 09 47 65 74 73 20 74 68 65 20 67 72 6f 75 70 *.Gets the group
9f30: 20 61 74 74 72 69 62 75 74 65 20 6f 66 20 61 20 attribute of a
9f40: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 file.. *. * Resu
9f50: 6c 74 73 3a 0a 20 2a 09 53 74 61 6e 64 61 72 64 lts:. *.Standard
9f60: 20 54 43 4c 20 72 65 73 75 6c 74 2e 20 52 65 74 TCL result. Ret
9f70: 75 72 6e 73 20 61 20 6e 65 77 20 54 63 6c 5f 4f urns a new Tcl_O
9f80: 62 6a 20 69 6e 20 61 74 74 72 69 62 75 74 65 50 bj in attributeP
9f90: 74 72 50 74 72 20 69 66 20 74 68 65 72 65 0a 20 trPtr if there.
9fa0: 2a 09 69 73 20 6e 6f 20 65 72 72 6f 72 2e 20 54 *.is no error. T
9fb0: 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 68 he object will h
9fc0: 61 76 65 20 72 65 66 20 63 6f 75 6e 74 20 30 2e ave ref count 0.
9fd0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9fe0: 63 74 73 3a 0a 20 2a 09 41 20 6e 65 77 20 6f 62 cts:. *.A new ob
9ff0: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 ject is allocate
a000: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a050: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 47 */..static int.G
a060: 65 74 50 65 72 6d 69 73 73 69 6f 6e 73 41 74 74 etPermissionsAtt
a070: 72 69 62 75 74 65 28 0a 20 20 20 20 54 63 6c 5f ribute(. Tcl_
a080: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
a090: 09 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 . /* The inte
a0a0: 72 70 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 rp we are using
a0b0: 66 6f 72 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 for errors. */.
a0c0: 20 20 20 69 6e 74 20 6f 62 6a 49 6e 64 65 78 2c int objIndex,
a0d0: 09 09 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 .. /* The ind
a0e0: 65 78 20 6f 66 20 74 68 65 20 61 74 74 72 69 62 ex of the attrib
a0f0: 75 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ute. */. Tcl_
a100: 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 09 09 Obj *fileName,..
a110: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 /* The name
a120: 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 of the file (UTF
a130: 2d 38 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f -8). */. Tcl_
a140: 4f 62 6a 20 2a 2a 61 74 74 72 69 62 75 74 65 50 Obj **attributeP
a150: 74 72 50 74 72 29 09 20 20 20 20 2f 2a 20 41 20 trPtr). /* A
a160: 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 pointer to retur
a170: 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 74 n the object wit
a180: 68 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f h. */.{. Tcl_
a190: 53 74 61 74 42 75 66 20 73 74 61 74 42 75 66 3b StatBuf statBuf;
a1a0: 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b . int result;
a1b0: 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 .. result = T
a1c0: 63 6c 70 4f 62 6a 53 74 61 74 28 66 69 6c 65 4e clpObjStat(fileN
a1d0: 61 6d 65 2c 20 26 73 74 61 74 42 75 66 29 3b 0a ame, &statBuf);.
a1e0: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 . if (result
a1f0: 21 3d 20 30 29 20 7b 0a 09 69 66 20 28 69 6e 74 != 0) {..if (int
a200: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 erp != NULL) {..
a210: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
a220: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
a230: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 _ObjPrintf(...
a240: 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61 "could not rea
a250: 64 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 d \"%s\": %s",..
a260: 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e . TclGetStrin
a270: 67 28 66 69 6c 65 4e 61 6d 65 29 2c 20 54 63 6c g(fileName), Tcl
a280: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 _PosixError(inte
a290: 72 70 29 29 29 3b 0a 09 7d 0a 09 72 65 74 75 72 rp)));..}..retur
a2a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
a2b0: 20 7d 0a 0a 20 20 20 20 2a 61 74 74 72 69 62 75 }.. *attribu
a2c0: 74 65 50 74 72 50 74 72 20 3d 20 54 63 6c 5f 4f tePtrPtr = Tcl_O
a2d0: 62 6a 50 72 69 6e 74 66 28 0a 09 20 20 20 20 22 bjPrintf(.. "
a2e0: 25 30 23 35 6c 6f 22 2c 20 28 6c 6f 6e 67 29 20 %0#5lo", (long)
a2f0: 28 73 74 61 74 42 75 66 2e 73 74 5f 6d 6f 64 65 (statBuf.st_mode
a300: 20 26 20 30 78 30 30 30 30 37 46 46 46 29 29 3b & 0x00007FFF));
a310: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a320: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d OK;.}.../*. *---
a330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 --------. *. * S
a380: 65 74 47 72 6f 75 70 41 74 74 72 69 62 75 74 65 etGroupAttribute
a390: 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 74 73 20 74 --. *. *.Sets t
a3a0: 68 65 20 67 72 6f 75 70 20 6f 66 20 74 68 65 20 he group of the
a3b0: 66 69 6c 65 20 74 6f 20 74 68 65 20 73 70 65 63 file to the spec
a3c0: 69 66 69 65 64 20 67 72 6f 75 70 2e 0a 20 2a 0a ified group.. *.
a3d0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 * Results:. *.S
a3e0: 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 73 75 tandard TCL resu
a3f0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 lt.. *. * Side e
a400: 66 66 65 63 74 73 3a 0a 20 2a 09 41 73 20 61 62 ffects:. *.As ab
a410: 6f 76 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ove.. *. *------
a420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a460: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
a470: 63 20 69 6e 74 0a 53 65 74 47 72 6f 75 70 41 74 c int.SetGroupAt
a480: 74 72 69 62 75 74 65 28 0a 20 20 20 20 54 63 6c tribute(. Tcl
a490: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
a4a0: 09 09 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 20 ../* The interp
a4b0: 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 for error report
a4c0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ing. */. int
a4d0: 6f 62 6a 49 6e 64 65 78 2c 09 09 2f 2a 20 54 68 objIndex,../* Th
a4e0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 61 e index of the a
a4f0: 74 74 72 69 62 75 74 65 2e 20 2a 2f 0a 20 20 20 ttribute. */.
a500: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 Tcl_Obj *fileNa
a510: 6d 65 2c 09 09 2f 2a 20 54 68 65 20 6e 61 6d 65 me,../* The name
a520: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 of the file (UT
a530: 46 2d 38 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c F-8). */. Tcl
a540: 5f 4f 62 6a 20 2a 61 74 74 72 69 62 75 74 65 50 _Obj *attributeP
a550: 74 72 29 09 2f 2a 20 4e 65 77 20 67 72 6f 75 70 tr)./* New group
a560: 20 66 6f 72 20 66 69 6c 65 2e 20 2a 2f 0a 7b 0a for file. */.{.
a570: 20 20 20 20 6c 6f 6e 67 20 67 69 64 3b 0a 20 20 long gid;.
a580: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 int result;.
a590: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 const char *na
a5a0: 74 69 76 65 3b 0a 0a 20 20 20 20 69 66 20 28 54 tive;.. if (T
a5b0: 63 6c 5f 47 65 74 4c 6f 6e 67 46 72 6f 6d 4f 62 cl_GetLongFromOb
a5c0: 6a 28 4e 55 4c 4c 2c 20 61 74 74 72 69 62 75 74 j(NULL, attribut
a5d0: 65 50 74 72 2c 20 26 67 69 64 29 20 21 3d 20 54 ePtr, &gid) != T
a5e0: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 44 53 CL_OK) {..Tcl_DS
a5f0: 74 72 69 6e 67 20 64 73 3b 0a 09 73 74 72 75 63 tring ds;..struc
a600: 74 20 67 72 6f 75 70 20 2a 67 72 6f 75 70 50 74 t group *groupPt
a610: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 6f 6e 73 74 r = NULL;..const
a620: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 09 char *string;..
a630: 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 73 74 int length;...st
a640: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 ring = Tcl_GetSt
a650: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 61 74 74 72 ringFromObj(attr
a660: 69 62 75 74 65 50 74 72 2c 20 26 6c 65 6e 67 74 ibutePtr, &lengt
a670: 68 29 3b 0a 0a 09 6e 61 74 69 76 65 20 3d 20 54 h);...native = T
a680: 63 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c cl_UtfToExternal
a690: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 73 74 DString(NULL, st
a6a0: 72 69 6e 67 2c 20 6c 65 6e 67 74 68 2c 20 26 64 ring, length, &d
a6b0: 73 29 3b 0a 09 67 72 6f 75 70 50 74 72 20 3d 20 s);..groupPtr =
a6c0: 54 63 6c 70 47 65 74 47 72 4e 61 6d 28 6e 61 74 TclpGetGrNam(nat
a6d0: 69 76 65 29 3b 20 2f 2a 20 49 4e 54 4c 3a 20 4e ive); /* INTL: N
a6e0: 61 74 69 76 65 2e 20 2a 2f 0a 09 54 63 6c 5f 44 ative. */..Tcl_D
a6f0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
a700: 0a 0a 09 69 66 20 28 67 72 6f 75 70 50 74 72 20 ...if (groupPtr
a710: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
a720: 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 if (interp != NU
a730: 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f LL) {...Tcl_SetO
a740: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
a750: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a Tcl_ObjPrintf(.
a760: 09 09 09 22 63 6f 75 6c 64 20 6e 6f 74 20 73 65 ..."could not se
a770: 74 20 67 72 6f 75 70 20 66 6f 72 20 66 69 6c 65 t group for file
a780: 20 5c 22 25 73 5c 22 3a 22 0a 09 09 09 22 20 67 \"%s\":"...." g
a790: 72 6f 75 70 20 5c 22 25 73 5c 22 20 64 6f 65 73 roup \"%s\" does
a7a0: 20 6e 6f 74 20 65 78 69 73 74 22 2c 0a 09 09 09 not exist",....
a7b0: 54 63 6c 47 65 74 53 74 72 69 6e 67 28 66 69 6c TclGetString(fil
a7c0: 65 4e 61 6d 65 29 2c 20 73 74 72 69 6e 67 29 29 eName), string))
a7d0: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 ;...Tcl_SetError
a7e0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 Code(interp, "TC
a7f0: 4c 22 2c 20 22 4f 50 45 52 41 54 49 4f 4e 22 2c L", "OPERATION",
a800: 20 22 53 45 54 47 52 50 22 2c 0a 09 09 09 22 4e "SETGRP",...."N
a810: 4f 5f 47 52 4f 55 50 22 2c 20 4e 55 4c 4c 29 3b O_GROUP", NULL);
a820: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 .. }.. ret
a830: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
a840: 7d 0a 09 67 69 64 20 3d 20 67 72 6f 75 70 50 74 }..gid = groupPt
a850: 72 2d 3e 67 72 5f 67 69 64 3b 0a 20 20 20 20 7d r->gr_gid;. }
a860: 0a 0a 20 20 20 20 6e 61 74 69 76 65 20 3d 20 54 .. native = T
a870: 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 cl_FSGetNativePa
a880: 74 68 28 66 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 th(fileName);.
a890: 20 20 72 65 73 75 6c 74 20 3d 20 63 68 6f 77 6e result = chown
a8a0: 28 6e 61 74 69 76 65 2c 20 28 75 69 64 5f 74 29 (native, (uid_t)
a8b0: 20 2d 31 2c 20 28 67 69 64 5f 74 29 20 67 69 64 -1, (gid_t) gid
a8c0: 29 3b 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 );./* INTL: Nati
a8d0: 76 65 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 ve. */.. if (
a8e0: 72 65 73 75 6c 74 20 21 3d 20 30 29 20 7b 0a 09 result != 0) {..
a8f0: 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 if (interp != NU
a900: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 LL) {.. Tcl_S
a910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
a920: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
a930: 66 28 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 20 f(... "could
a940: 6e 6f 74 20 73 65 74 20 67 72 6f 75 70 20 66 6f not set group fo
a950: 72 20 66 69 6c 65 20 5c 22 25 73 5c 22 3a 20 25 r file \"%s\": %
a960: 73 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 74 s",... TclGet
a970: 53 74 72 69 6e 67 28 66 69 6c 65 4e 61 6d 65 29 String(fileName)
a980: 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 , Tcl_PosixError
a990: 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 (interp)));..}..
a9a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
a9c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f rn TCL_OK;.}.../
a9d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
a9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
aa20: 20 2a 0a 20 2a 20 53 65 74 4f 77 6e 65 72 41 74 *. * SetOwnerAt
aa30: 74 72 69 62 75 74 65 20 2d 2d 0a 20 2a 0a 20 2a tribute --. *. *
aa40: 09 53 65 74 73 20 74 68 65 20 6f 77 6e 65 72 20 .Sets the owner
aa50: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 of the file to t
aa60: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 77 6e he specified own
aa70: 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 er.. *. * Result
aa80: 73 3a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 54 s:. *.Standard T
aa90: 43 4c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a CL result.. *. *
aaa0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
aab0: 2a 09 41 73 20 61 62 6f 76 65 2e 0a 20 2a 0a 20 *.As above.. *.
aac0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
aad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
ab10: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 74 ..static int.Set
ab20: 4f 77 6e 65 72 41 74 74 72 69 62 75 74 65 28 0a OwnerAttribute(.
ab30: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
ab40: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 54 68 65 20 interp,../* The
ab50: 69 6e 74 65 72 70 20 66 6f 72 20 65 72 72 6f 72 interp for error
ab60: 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 reporting. */.
ab70: 20 20 20 69 6e 74 20 6f 62 6a 49 6e 64 65 78 2c int objIndex,
ab80: 09 09 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 6f ../* The index o
ab90: 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65 2e f the attribute.
aba0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
abb0: 2a 66 69 6c 65 4e 61 6d 65 2c 09 09 2f 2a 20 54 *fileName,../* T
abc0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 he name of the f
abd0: 69 6c 65 20 28 55 54 46 2d 38 29 2e 20 2a 2f 0a ile (UTF-8). */.
abe0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 74 74 Tcl_Obj *att
abf0: 72 69 62 75 74 65 50 74 72 29 09 2f 2a 20 4e 65 ributePtr)./* Ne
ac00: 77 20 6f 77 6e 65 72 20 66 6f 72 20 66 69 6c 65 w owner for file
ac10: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 6c 6f 6e 67 20 . */.{. long
ac20: 75 69 64 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 uid;. int res
ac30: 75 6c 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 ult;. const c
ac40: 68 61 72 20 2a 6e 61 74 69 76 65 3b 0a 0a 20 20 har *native;..
ac50: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 4c 6f 6e if (Tcl_GetLon
ac60: 67 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 61 gFromObj(NULL, a
ac70: 74 74 72 69 62 75 74 65 50 74 72 2c 20 26 75 69 ttributePtr, &ui
ac80: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a d) != TCL_OK) {.
ac90: 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b .Tcl_DString ds;
aca0: 0a 09 73 74 72 75 63 74 20 70 61 73 73 77 64 20 ..struct passwd
acb0: 2a 70 77 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 *pwPtr = NULL;..
acc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 69 const char *stri
acd0: 6e 67 3b 0a 09 69 6e 74 20 6c 65 6e 67 74 68 3b ng;..int length;
ace0: 0a 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 5f ...string = Tcl_
acf0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
ad00: 28 61 74 74 72 69 62 75 74 65 50 74 72 2c 20 26 (attributePtr, &
ad10: 6c 65 6e 67 74 68 29 3b 0a 0a 09 6e 61 74 69 76 length);...nativ
ad20: 65 20 3d 20 54 63 6c 5f 55 74 66 54 6f 45 78 74 e = Tcl_UtfToExt
ad30: 65 72 6e 61 6c 44 53 74 72 69 6e 67 28 4e 55 4c ernalDString(NUL
ad40: 4c 2c 20 73 74 72 69 6e 67 2c 20 6c 65 6e 67 74 L, string, lengt
ad50: 68 2c 20 26 64 73 29 3b 0a 09 70 77 50 74 72 20 h, &ds);..pwPtr
ad60: 3d 20 54 63 6c 70 47 65 74 50 77 4e 61 6d 28 6e = TclpGetPwNam(n
ad70: 61 74 69 76 65 29 3b 09 09 09 2f 2a 20 49 4e 54 ative);.../* INT
ad80: 4c 3a 20 4e 61 74 69 76 65 2e 20 2a 2f 0a 09 54 L: Native. */..T
ad90: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
ada0: 64 73 29 3b 0a 0a 09 69 66 20 28 70 77 50 74 72 ds);...if (pwPtr
adb0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
adc0: 20 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e if (interp != N
add0: 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 ULL) {...Tcl_Set
ade0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
adf0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
ae00: 0a 09 09 09 22 63 6f 75 6c 64 20 6e 6f 74 20 73 ...."could not s
ae10: 65 74 20 6f 77 6e 65 72 20 66 6f 72 20 66 69 6c et owner for fil
ae20: 65 20 5c 22 25 73 5c 22 3a 22 0a 09 09 09 22 20 e \"%s\":"...."
ae30: 75 73 65 72 20 5c 22 25 73 5c 22 20 64 6f 65 73 user \"%s\" does
ae40: 20 6e 6f 74 20 65 78 69 73 74 22 2c 0a 09 09 09 not exist",....
ae50: 54 63 6c 47 65 74 53 74 72 69 6e 67 28 66 69 6c TclGetString(fil
ae60: 65 4e 61 6d 65 29 2c 20 73 74 72 69 6e 67 29 29 eName), string))
ae70: 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 ;...Tcl_SetError
ae80: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 Code(interp, "TC
ae90: 4c 22 2c 20 22 4f 50 45 52 41 54 49 4f 4e 22 2c L", "OPERATION",
aea0: 20 22 53 45 54 4f 57 4e 22 2c 0a 09 09 09 22 4e "SETOWN",...."N
aeb0: 4f 5f 55 53 45 52 22 2c 20 4e 55 4c 4c 29 3b 0a O_USER", NULL);.
aec0: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 . }.. retu
aed0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
aee0: 0a 09 75 69 64 20 3d 20 70 77 50 74 72 2d 3e 70 ..uid = pwPtr->p
aef0: 77 5f 75 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 w_uid;. }..
af00: 20 20 6e 61 74 69 76 65 20 3d 20 54 63 6c 5f 46 native = Tcl_F
af10: 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 66 SGetNativePath(f
af20: 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 ileName);. re
af30: 73 75 6c 74 20 3d 20 63 68 6f 77 6e 28 6e 61 74 sult = chown(nat
af40: 69 76 65 2c 20 28 75 69 64 5f 74 29 20 75 69 64 ive, (uid_t) uid
af50: 2c 20 28 67 69 64 5f 74 29 20 2d 31 29 3b 09 2f , (gid_t) -1);./
af60: 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 * INTL: Native.
af70: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 */.. if (resu
af80: 6c 74 20 21 3d 20 30 29 20 7b 0a 09 69 66 20 28 lt != 0) {..if (
af90: 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 interp != NULL)
afa0: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 {.. Tcl_SetOb
afb0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
afc0: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 Tcl_ObjPrintf(..
afd0: 09 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 . "could not
afe0: 73 65 74 20 6f 77 6e 65 72 20 66 6f 72 20 66 69 set owner for fi
aff0: 6c 65 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a le \"%s\": %s",.
b000: 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 .. TclGetStri
b010: 6e 67 28 66 69 6c 65 4e 61 6d 65 29 2c 20 54 63 ng(fileName), Tc
b020: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
b030: 65 72 70 29 29 29 3b 0a 09 7d 0a 09 72 65 74 75 erp)));..}..retu
b040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b050: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
b060: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
b070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
b0c0: 2a 20 53 65 74 50 65 72 6d 69 73 73 69 6f 6e 73 * SetPermissions
b0d0: 41 74 74 72 69 62 75 74 65 0a 20 2a 0a 20 2a 09 Attribute. *. *.
b0e0: 53 65 74 73 20 74 68 65 20 66 69 6c 65 20 74 6f Sets the file to
b0f0: 20 74 68 65 20 67 69 76 65 6e 20 70 65 72 6d 69 the given permi
b100: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 ssion.. *. * Res
b110: 75 6c 74 73 3a 0a 20 2a 09 53 74 61 6e 64 61 72 ults:. *.Standar
b120: 64 20 54 43 4c 20 72 65 73 75 6c 74 2e 0a 20 2a d TCL result.. *
b130: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
b140: 3a 0a 20 2a 09 54 68 65 20 70 65 72 6d 69 73 73 :. *.The permiss
b150: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 ion of the file
b160: 69 73 20 63 68 61 6e 67 65 64 2e 0a 20 2a 0a 20 is changed.. *.
b170: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
b1c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 74 ..static int.Set
b1d0: 50 65 72 6d 69 73 73 69 6f 6e 73 41 74 74 72 69 PermissionsAttri
b1e0: 62 75 74 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e bute(. Tcl_In
b1f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
b200: 2a 20 54 68 65 20 69 6e 74 65 72 70 20 77 65 20 * The interp we
b210: 61 72 65 20 75 73 69 6e 67 20 66 6f 72 20 65 72 are using for er
b220: 72 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 rors. */. int
b230: 20 6f 62 6a 49 6e 64 65 78 2c 09 09 2f 2a 20 54 objIndex,../* T
b240: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 he index of the
b250: 61 74 74 72 69 62 75 74 65 2e 20 2a 2f 0a 20 20 attribute. */.
b260: 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e Tcl_Obj *fileN
b270: 61 6d 65 2c 09 09 2f 2a 20 54 68 65 20 6e 61 6d ame,../* The nam
b280: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 e of the file (U
b290: 54 46 2d 38 29 2e 20 2a 2f 0a 20 20 20 20 54 63 TF-8). */. Tc
b2a0: 6c 5f 4f 62 6a 20 2a 61 74 74 72 69 62 75 74 65 l_Obj *attribute
b2b0: 50 74 72 29 09 2f 2a 20 54 68 65 20 61 74 74 72 Ptr)./* The attr
b2c0: 69 62 75 74 65 20 74 6f 20 73 65 74 2e 20 2a 2f ibute to set. */
b2d0: 0a 7b 0a 20 20 20 20 6c 6f 6e 67 20 6d 6f 64 65 .{. long mode
b2e0: 3b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6e 65 77 ;. mode_t new
b2f0: 4d 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 Mode;. int re
b300: 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 sult = TCL_ERROR
b310: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
b320: 20 2a 6e 61 74 69 76 65 3b 0a 20 20 20 20 63 6f *native;. co
b330: 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 53 74 nst char *modeSt
b340: 72 69 6e 67 50 74 72 20 3d 20 54 63 6c 47 65 74 ringPtr = TclGet
b350: 53 74 72 69 6e 67 28 61 74 74 72 69 62 75 74 65 String(attribute
b360: 50 74 72 29 3b 0a 20 20 20 20 69 6e 74 20 73 63 Ptr);. int sc
b370: 61 6e 6e 65 64 20 3d 20 54 63 6c 50 61 72 73 65 anned = TclParse
b380: 41 6c 6c 57 68 69 74 65 53 70 61 63 65 28 6d 6f AllWhiteSpace(mo
b390: 64 65 53 74 72 69 6e 67 50 74 72 2c 20 2d 31 29 deStringPtr, -1)
b3a0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
b3b0: 20 46 69 72 73 74 20 73 75 70 70 6c 79 20 73 75 First supply su
b3c0: 70 70 6f 72 74 20 66 6f 72 20 6f 63 74 61 6c 20 pport for octal
b3d0: 6e 75 6d 62 65 72 20 66 6f 72 6d 61 74 0a 20 20 number format.
b3e0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28 */.. if ((
b3f0: 6d 6f 64 65 53 74 72 69 6e 67 50 74 72 5b 73 63 modeStringPtr[sc
b400: 61 6e 6e 65 64 5d 20 3d 3d 20 27 30 27 29 0a 09 anned] == '0')..
b410: 20 20 20 20 26 26 20 28 6d 6f 64 65 53 74 72 69 && (modeStri
b420: 6e 67 50 74 72 5b 73 63 61 6e 6e 65 64 2b 31 5d ngPtr[scanned+1]
b430: 20 3e 3d 20 27 30 27 29 0a 09 20 20 20 20 26 26 >= '0').. &&
b440: 20 28 6d 6f 64 65 53 74 72 69 6e 67 50 74 72 5b (modeStringPtr[
b450: 73 63 61 6e 6e 65 64 2b 31 5d 20 3c 3d 20 27 37 scanned+1] <= '7
b460: 27 29 29 20 7b 0a 09 2f 2a 20 4c 65 61 64 69 6e ')) {../* Leadin
b470: 67 20 7a 65 72 6f 20 2d 20 61 74 74 65 6d 70 74 g zero - attempt
b480: 20 6f 63 74 61 6c 20 69 6e 74 65 72 70 72 65 74 octal interpret
b490: 61 74 69 6f 6e 20 2a 2f 0a 09 54 63 6c 5f 4f 62 ation */..Tcl_Ob
b4a0: 6a 20 2a 6d 6f 64 65 4f 62 6a 3b 0a 0a 09 54 63 j *modeObj;...Tc
b4b0: 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e lNewLiteralStrin
b4c0: 67 4f 62 6a 28 6d 6f 64 65 4f 62 6a 2c 20 22 30 gObj(modeObj, "0
b4d0: 6f 22 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 o");..Tcl_Append
b4e0: 54 6f 4f 62 6a 28 6d 6f 64 65 4f 62 6a 2c 20 6d ToObj(modeObj, m
b4f0: 6f 64 65 53 74 72 69 6e 67 50 74 72 2b 73 63 61 odeStringPtr+sca
b500: 6e 6e 65 64 2b 31 2c 20 2d 31 29 3b 0a 09 72 65 nned+1, -1);..re
b510: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4c 6f sult = Tcl_GetLo
b520: 6e 67 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 ngFromObj(NULL,
b530: 6d 6f 64 65 4f 62 6a 2c 20 26 6d 6f 64 65 29 3b modeObj, &mode);
b540: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
b550: 6e 74 28 6d 6f 64 65 4f 62 6a 29 3b 0a 20 20 20 nt(modeObj);.
b560: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c }. if (resul
b570: 74 20 3d 3d 20 54 43 4c 5f 4f 4b 0a 09 20 20 20 t == TCL_OK..
b580: 20 7c 7c 20 54 63 6c 5f 47 65 74 4c 6f 6e 67 46 || Tcl_GetLongF
b590: 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 61 74 74 romObj(NULL, att
b5a0: 72 69 62 75 74 65 50 74 72 2c 20 26 6d 6f 64 65 ributePtr, &mode
b5b0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) == TCL_OK) {..
b5c0: 6e 65 77 4d 6f 64 65 20 3d 20 28 6d 6f 64 65 5f newMode = (mode_
b5d0: 74 29 20 28 6d 6f 64 65 20 26 20 30 78 30 30 30 t) (mode & 0x000
b5e0: 30 37 46 46 46 29 3b 0a 20 20 20 20 7d 20 65 6c 07FFF);. } el
b5f0: 73 65 20 7b 0a 09 54 63 6c 5f 53 74 61 74 42 75 se {..Tcl_StatBu
b600: 66 20 62 75 66 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 f buf;.../*.. *
b610: 54 72 79 20 74 68 65 20 66 6f 72 6d 73 20 22 72 Try the forms "r
b620: 77 78 72 77 78 72 77 78 22 20 61 6e 64 20 22 75 wxrwxrwx" and "u
b630: 67 6f 3d 72 77 78 22 0a 09 20 2a 0a 09 20 2a 20 go=rwx".. *.. *
b640: 57 65 20 67 65 74 20 74 68 65 20 63 75 72 72 65 We get the curre
b650: 6e 74 20 6d 6f 64 65 20 6f 66 20 74 68 65 20 66 nt mode of the f
b660: 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f ile, in order to
b670: 20 61 6c 6c 6f 77 20 66 6f 72 20 75 67 2b 2d 3d allow for ug+-=
b680: 72 77 78 0a 09 20 2a 20 73 74 79 6c 65 20 63 68 rwx.. * style ch
b690: 6d 6f 64 20 73 74 72 69 6e 67 73 2e 0a 09 20 2a mod strings... *
b6a0: 2f 0a 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c /...result = Tcl
b6b0: 70 4f 62 6a 53 74 61 74 28 66 69 6c 65 4e 61 6d pObjStat(fileNam
b6c0: 65 2c 20 26 62 75 66 29 3b 0a 09 69 66 20 28 72 e, &buf);..if (r
b6d0: 65 73 75 6c 74 20 21 3d 20 30 29 20 7b 0a 09 20 esult != 0) {..
b6e0: 20 20 20 69 66 20 28 69 6e 74 65 72 70 20 21 3d if (interp !=
b6f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 53 NULL) {...Tcl_S
b700: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
b710: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
b720: 66 28 0a 09 09 09 22 63 6f 75 6c 64 20 6e 6f 74 f(...."could not
b730: 20 72 65 61 64 20 5c 22 25 73 5c 22 3a 20 25 73 read \"%s\": %s
b740: 22 2c 0a 09 09 09 54 63 6c 47 65 74 53 74 72 69 ",....TclGetStri
b750: 6e 67 28 66 69 6c 65 4e 61 6d 65 29 2c 20 54 63 ng(fileName), Tc
b760: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 l_PosixError(int
b770: 65 72 70 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 erp)));.. }..
b780: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b790: 52 52 4f 52 3b 0a 09 7d 0a 09 6e 65 77 4d 6f 64 RROR;..}..newMod
b7a0: 65 20 3d 20 28 6d 6f 64 65 5f 74 29 20 28 62 75 e = (mode_t) (bu
b7b0: 66 2e 73 74 5f 6d 6f 64 65 20 26 20 30 78 30 30 f.st_mode & 0x00
b7c0: 30 30 37 46 46 46 29 3b 0a 0a 09 69 66 20 28 47 007FFF);...if (G
b7d0: 65 74 4d 6f 64 65 46 72 6f 6d 50 65 72 6d 53 74 etModeFromPermSt
b7e0: 72 69 6e 67 28 4e 55 4c 4c 2c 20 6d 6f 64 65 53 ring(NULL, modeS
b7f0: 74 72 69 6e 67 50 74 72 2c 20 26 6e 65 77 4d 6f tringPtr, &newMo
b800: 64 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b de) != TCL_OK) {
b810: 0a 09 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 .. if (interp
b820: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 != NULL) {...Tc
b830: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
b840: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
b850: 69 6e 74 66 28 0a 09 09 09 22 75 6e 6b 6e 6f 77 intf(...."unknow
b860: 6e 20 70 65 72 6d 69 73 73 69 6f 6e 20 73 74 72 n permission str
b870: 69 6e 67 20 66 6f 72 6d 61 74 20 5c 22 25 73 5c ing format \"%s\
b880: 22 22 2c 0a 09 09 09 6d 6f 64 65 53 74 72 69 6e "",....modeStrin
b890: 67 50 74 72 29 29 3b 0a 09 09 54 63 6c 5f 53 65 gPtr));...Tcl_Se
b8a0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
b8b0: 70 2c 20 22 54 43 4c 22 2c 20 22 56 41 4c 55 45 p, "TCL", "VALUE
b8c0: 22 2c 20 22 50 45 52 4d 49 53 53 49 4f 4e 22 2c ", "PERMISSION",
b8d0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 7d 0a 09 NULL);.. }..
b8e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
b8f0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a RROR;..}. }..
b900: 20 20 20 20 6e 61 74 69 76 65 20 3d 20 54 63 6c native = Tcl
b910: 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 _FSGetNativePath
b920: 28 66 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 (fileName);.
b930: 72 65 73 75 6c 74 20 3d 20 63 68 6d 6f 64 28 6e result = chmod(n
b940: 61 74 69 76 65 2c 20 6e 65 77 4d 6f 64 65 29 3b ative, newMode);
b950: 09 09 2f 2a 20 49 4e 54 4c 3a 20 4e 61 74 69 76 ../* INTL: Nativ
b960: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 e. */. if (re
b970: 73 75 6c 74 20 21 3d 20 30 29 20 7b 0a 09 69 66 sult != 0) {..if
b980: 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c (interp != NULL
b990: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 ) {.. Tcl_Set
b9a0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
b9b0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
b9c0: 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f ... "could no
b9d0: 74 20 73 65 74 20 70 65 72 6d 69 73 73 69 6f 6e t set permission
b9e0: 73 20 66 6f 72 20 66 69 6c 65 20 5c 22 25 73 5c s for file \"%s\
b9f0: 22 3a 20 25 73 22 2c 0a 09 09 20 20 20 20 54 63 ": %s",... Tc
ba00: 6c 47 65 74 53 74 72 69 6e 67 28 66 69 6c 65 4e lGetString(fileN
ba10: 61 6d 65 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 ame), Tcl_PosixE
ba20: 72 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a rror(interp)));.
ba30: 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 .}..return TCL_E
ba40: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
ba50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
ba60: 0a 0c 0a 23 69 66 6e 64 65 66 20 44 4a 47 50 50 ...#ifndef DJGPP
ba70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
ba80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ba90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
baa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bac0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 62 6a 4c -. *. * TclpObjL
bad0: 69 73 74 56 6f 6c 75 6d 65 73 20 2d 2d 0a 20 2a istVolumes --. *
bae0: 0a 20 2a 09 4c 69 73 74 73 20 74 68 65 20 63 75 . *.Lists the cu
baf0: 72 72 65 6e 74 6c 79 20 6d 6f 75 6e 74 65 64 20 rrently mounted
bb00: 76 6f 6c 75 6d 65 73 2c 20 77 68 69 63 68 20 6f volumes, which o
bb10: 6e 20 55 4e 49 58 20 69 73 20 6a 75 73 74 20 2f n UNIX is just /
bb20: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
bb30: 0a 20 2a 09 54 68 65 20 6c 69 73 74 20 6f 66 20 . *.The list of
bb40: 76 6f 6c 75 6d 65 73 2e 0a 20 2a 0a 20 2a 20 53 volumes.. *. * S
bb50: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
bb60: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
bb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bbb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f ------. */..Tcl_
bbc0: 4f 62 6a 20 2a 0a 54 63 6c 70 4f 62 6a 4c 69 73 Obj *.TclpObjLis
bbd0: 74 56 6f 6c 75 6d 65 73 28 76 6f 69 64 29 0a 7b tVolumes(void).{
bbe0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
bbf0: 73 75 6c 74 50 74 72 3b 0a 20 20 20 20 54 63 6c sultPtr;. Tcl
bc00: 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 NewLiteralString
bc10: 4f 62 6a 28 72 65 73 75 6c 74 50 74 72 2c 20 22 Obj(resultPtr, "
bc20: 2f 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e /");.. Tcl_In
bc30: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c crRefCount(resul
bc40: 74 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 tPtr);. retur
bc50: 6e 20 72 65 73 75 6c 74 50 74 72 3b 0a 7d 0a 23 n resultPtr;.}.#
bc60: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d endif.../*. *---
bc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bcb0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 4d 6f 64 ---. *. * GetMod
bcc0: 65 46 72 6f 6d 50 65 72 6d 53 74 72 69 6e 67 20 eFromPermString
bcd0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
bce0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
bcf0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 ed to process th
bd00: 65 20 22 66 69 6c 65 20 70 65 72 6d 69 73 73 69 e "file permissi
bd10: 6f 6e 73 22 20 54 63 6c 0a 20 2a 09 63 6f 6d 6d ons" Tcl. *.comm
bd20: 61 6e 64 2c 20 74 6f 20 63 68 65 63 6b 20 66 6f and, to check fo
bd30: 72 20 61 20 22 72 77 78 72 77 78 72 77 78 22 20 r a "rwxrwxrwx"
bd40: 6f 72 20 22 75 67 6f 61 2b 2d 3d 72 77 78 73 74 or "ugoa+-=rwxst
bd50: 22 20 73 74 72 69 6e 67 2e 20 53 65 65 20 74 68 " string. See th
bd60: 65 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 e. *.user docume
bd70: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 ntation for deta
bd80: 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 ils on what it d
bd90: 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c oes.. *. * Resul
bda0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 ts:. *.A standar
bdb0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a d Tcl result.. *
bdc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
bdd0: 3a 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 :. *.See the use
bde0: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e r documentation.
bdf0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
be40: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 47 65 74 ..static int.Get
be50: 4d 6f 64 65 46 72 6f 6d 50 65 72 6d 53 74 72 69 ModeFromPermStri
be60: 6e 67 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ng(. Tcl_Inte
be70: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
be80: 54 68 65 20 69 6e 74 65 72 70 20 77 65 20 61 72 The interp we ar
be90: 65 20 75 73 69 6e 67 20 66 6f 72 20 65 72 72 6f e using for erro
bea0: 72 73 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 rs. */. const
beb0: 20 63 68 61 72 20 2a 6d 6f 64 65 53 74 72 69 6e char *modeStrin
bec0: 67 50 74 72 2c 20 2f 2a 20 50 65 72 6d 69 73 73 gPtr, /* Permiss
bed0: 69 6f 6e 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 ions string */.
bee0: 20 20 20 6d 6f 64 65 5f 74 20 2a 6d 6f 64 65 50 mode_t *modeP
bef0: 74 72 29 09 09 2f 2a 20 70 6f 69 6e 74 65 72 20 tr)../* pointer
bf00: 74 6f 20 74 68 65 20 6d 6f 64 65 20 76 61 6c 75 to the mode valu
bf10: 65 20 2a 2f 0a 7b 0a 20 20 20 20 6d 6f 64 65 5f e */.{. mode_
bf20: 74 20 6e 65 77 4d 6f 64 65 3b 0a 20 20 20 20 6d t newMode;. m
bf30: 6f 64 65 5f 74 20 6f 6c 64 4d 6f 64 65 3b 09 09 ode_t oldMode;..
bf40: 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 20 74 /* Storage for t
bf50: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 he value of the
bf60: 6f 6c 64 20 6d 6f 64 65 20 28 74 68 61 74 0a 09 old mode (that..
bf70: 09 09 09 20 2a 20 69 73 20 70 61 73 73 65 64 20 ... * is passed
bf80: 69 6e 29 2c 20 74 6f 20 61 6c 6c 6f 77 20 66 6f in), to allow fo
bf90: 72 20 74 68 65 20 63 68 6d 6f 64 20 73 74 79 6c r the chmod styl
bfa0: 65 0a 09 09 09 09 20 2a 20 6d 61 6e 69 70 75 6c e..... * manipul
bfb0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e ation. */. in
bfc0: 74 20 69 2c 6e 2c 20 77 68 6f 2c 20 6f 70 2c 20 t i,n, who, op,
bfd0: 77 68 61 74 2c 20 6f 70 5f 66 6f 75 6e 64 2c 20 what, op_found,
bfe0: 77 68 6f 5f 66 6f 75 6e 64 3b 0a 0a 20 20 20 20 who_found;..
bff0: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 73 74 61 /*. * We sta
c000: 72 74 20 6f 66 66 20 63 68 65 63 6b 69 6e 67 20 rt off checking
c010: 66 6f 72 20 61 6e 20 22 72 77 78 72 77 78 72 77 for an "rwxrwxrw
c020: 78 22 20 73 74 79 6c 65 20 70 65 72 6d 69 73 73 x" style permiss
c030: 69 6f 6e 73 20 73 74 72 69 6e 67 0a 20 20 20 20 ions string.
c040: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 72 */.. if (str
c050: 6c 65 6e 28 6d 6f 64 65 53 74 72 69 6e 67 50 74 len(modeStringPt
c060: 72 29 20 21 3d 20 39 29 20 7b 0a 09 67 6f 74 6f r) != 9) {..goto
c070: 20 63 68 6d 6f 64 53 74 79 6c 65 43 68 65 63 6b chmodStyleCheck
c080: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 65 77 ;. }.. new
c090: 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 66 6f Mode = 0;. fo
c0a0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 39 3b r (i = 0; i < 9;
c0b0: 20 69 2b 2b 29 20 7b 0a 09 73 77 69 74 63 68 20 i++) {..switch
c0c0: 28 2a 28 6d 6f 64 65 53 74 72 69 6e 67 50 74 72 (*(modeStringPtr
c0d0: 2b 69 29 29 20 7b 0a 09 63 61 73 65 20 27 72 27 +i)) {..case 'r'
c0e0: 3a 0a 09 20 20 20 20 69 66 20 28 28 69 25 33 29 :.. if ((i%3)
c0f0: 20 21 3d 20 30 29 20 7b 0a 09 09 67 6f 74 6f 20 != 0) {...goto
c100: 63 68 6d 6f 64 53 74 79 6c 65 43 68 65 63 6b 3b chmodStyleCheck;
c110: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6e 65 77 .. }.. new
c120: 4d 6f 64 65 20 7c 3d 20 28 31 3c 3c 28 38 2d 69 Mode |= (1<<(8-i
c130: 29 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ));.. break;.
c140: 09 63 61 73 65 20 27 77 27 3a 0a 09 20 20 20 20 .case 'w':..
c150: 69 66 20 28 28 69 25 33 29 20 21 3d 20 31 29 20 if ((i%3) != 1)
c160: 7b 0a 09 09 67 6f 74 6f 20 63 68 6d 6f 64 53 74 {...goto chmodSt
c170: 79 6c 65 43 68 65 63 6b 3b 0a 09 20 20 20 20 7d yleCheck;.. }
c180: 0a 09 20 20 20 20 6e 65 77 4d 6f 64 65 20 7c 3d .. newMode |=
c190: 20 28 31 3c 3c 28 38 2d 69 29 29 3b 0a 09 20 20 (1<<(8-i));..
c1a0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 27 break;..case '
c1b0: 78 27 3a 0a 09 20 20 20 20 69 66 20 28 28 69 25 x':.. if ((i%
c1c0: 33 29 20 21 3d 20 32 29 20 7b 0a 09 09 67 6f 74 3) != 2) {...got
c1d0: 6f 20 63 68 6d 6f 64 53 74 79 6c 65 43 68 65 63 o chmodStyleChec
c1e0: 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6e k;.. }.. n
c1f0: 65 77 4d 6f 64 65 20 7c 3d 20 28 31 3c 3c 28 38 ewMode |= (1<<(8
c200: 2d 69 29 29 3b 0a 09 20 20 20 20 62 72 65 61 6b -i));.. break
c210: 3b 0a 09 63 61 73 65 20 27 73 27 3a 0a 09 20 20 ;..case 's':..
c220: 20 20 69 66 20 28 28 28 69 25 33 29 20 21 3d 20 if (((i%3) !=
c230: 32 29 20 7c 7c 20 28 69 20 3e 20 35 29 29 20 7b 2) || (i > 5)) {
c240: 0a 09 09 67 6f 74 6f 20 63 68 6d 6f 64 53 74 79 ...goto chmodSty
c250: 6c 65 43 68 65 63 6b 3b 0a 09 20 20 20 20 7d 0a leCheck;.. }.
c260: 09 20 20 20 20 6e 65 77 4d 6f 64 65 20 7c 3d 20 . newMode |=
c270: 28 31 3c 3c 28 38 2d 69 29 29 3b 0a 09 20 20 20 (1<<(8-i));..
c280: 20 6e 65 77 4d 6f 64 65 20 7c 3d 20 28 31 3c 3c newMode |= (1<<
c290: 28 31 31 2d 28 69 2f 33 29 29 29 3b 0a 09 20 20 (11-(i/3)));..
c2a0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 27 break;..case '
c2b0: 53 27 3a 0a 09 20 20 20 20 69 66 20 28 28 28 69 S':.. if (((i
c2c0: 25 33 29 20 21 3d 20 32 29 20 7c 7c 20 28 69 20 %3) != 2) || (i
c2d0: 3e 20 35 29 29 20 7b 0a 09 09 67 6f 74 6f 20 63 > 5)) {...goto c
c2e0: 68 6d 6f 64 53 74 79 6c 65 43 68 65 63 6b 3b 0a hmodStyleCheck;.
c2f0: 09 20 20 20 20 7d 0a 09 20 20 20 20 6e 65 77 4d . }.. newM
c300: 6f 64 65 20 7c 3d 20 28 31 3c 3c 28 31 31 2d 28 ode |= (1<<(11-(
c310: 69 2f 33 29 29 29 3b 0a 09 20 20 20 20 62 72 65 i/3)));.. bre
c320: 61 6b 3b 0a 09 63 61 73 65 20 27 74 27 3a 0a 09 ak;..case 't':..
c330: 20 20 20 20 69 66 20 28 69 20 21 3d 20 38 29 20 if (i != 8)
c340: 7b 0a 09 09 67 6f 74 6f 20 63 68 6d 6f 64 53 74 {...goto chmodSt
c350: 79 6c 65 43 68 65 63 6b 3b 0a 09 20 20 20 20 7d yleCheck;.. }
c360: 0a 09 20 20 20 20 6e 65 77 4d 6f 64 65 20 7c 3d .. newMode |=
c370: 20 28 31 3c 3c 28 38 2d 69 29 29 3b 0a 09 20 20 (1<<(8-i));..
c380: 20 20 6e 65 77 4d 6f 64 65 20 7c 3d 20 28 31 3c newMode |= (1<
c390: 3c 39 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b <9);.. break;
c3a0: 0a 09 63 61 73 65 20 27 54 27 3a 0a 09 20 20 20 ..case 'T':..
c3b0: 20 69 66 20 28 69 20 21 3d 20 38 29 20 7b 0a 09 if (i != 8) {..
c3c0: 09 67 6f 74 6f 20 63 68 6d 6f 64 53 74 79 6c 65 .goto chmodStyle
c3d0: 43 68 65 63 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 Check;.. }..
c3e0: 20 20 20 6e 65 77 4d 6f 64 65 20 7c 3d 20 28 31 newMode |= (1
c3f0: 3c 3c 39 29 3b 0a 09 20 20 20 20 62 72 65 61 6b <<9);.. break
c400: 3b 0a 09 63 61 73 65 20 27 2d 27 3a 0a 09 20 20 ;..case '-':..
c410: 20 20 62 72 65 61 6b 3b 0a 09 64 65 66 61 75 6c break;..defaul
c420: 74 3a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 t:.. /*..
c430: 20 2a 20 4f 6f 70 73 2c 20 6e 6f 74 20 77 68 61 * Oops, not wha
c440: 74 20 77 65 20 74 68 6f 75 67 68 74 20 69 74 20 t we thought it
c450: 77 61 73 2c 20 73 6f 20 67 6f 20 6f 6e 0a 09 20 was, so go on..
c460: 20 20 20 20 2a 2f 0a 09 20 20 20 20 67 6f 74 6f */.. goto
c470: 20 63 68 6d 6f 64 53 74 79 6c 65 43 68 65 63 6b chmodStyleCheck
c480: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a ;..}. }. *
c490: 6d 6f 64 65 50 74 72 20 3d 20 6e 65 77 4d 6f 64 modePtr = newMod
c4a0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 e;. return TC
c4b0: 4c 5f 4f 4b 3b 0a 0a 20 20 63 68 6d 6f 64 53 74 L_OK;.. chmodSt
c4c0: 79 6c 65 43 68 65 63 6b 3a 0a 20 20 20 20 2f 2a yleCheck:. /*
c4d0: 0a 20 20 20 20 20 2a 20 57 65 20 6e 6f 77 20 63 . * We now c
c4e0: 68 65 63 6b 20 66 6f 72 20 61 6e 20 22 75 67 6f heck for an "ugo
c4f0: 61 2b 2d 3d 72 77 78 73 74 22 20 73 74 79 6c 65 a+-=rwxst" style
c500: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 73 74 72 permissions str
c510: 69 6e 67 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ing. */..
c520: 20 66 6f 72 20 28 6e 20 3d 20 30 20 3b 20 2a 28 for (n = 0 ; *(
c530: 6d 6f 64 65 53 74 72 69 6e 67 50 74 72 2b 6e 29 modeStringPtr+n)
c540: 20 21 3d 20 27 5c 30 27 20 3b 20 6e 20 3d 20 6e != '\0' ; n = n
c550: 20 2b 20 69 29 20 7b 0a 09 6f 6c 64 4d 6f 64 65 + i) {..oldMode
c560: 20 3d 20 2a 6d 6f 64 65 50 74 72 3b 0a 09 77 68 = *modePtr;..wh
c570: 6f 20 3d 20 6f 70 20 3d 20 77 68 61 74 20 3d 20 o = op = what =
c580: 6f 70 5f 66 6f 75 6e 64 20 3d 20 77 68 6f 5f 66 op_found = who_f
c590: 6f 75 6e 64 20 3d 20 30 3b 0a 09 66 6f 72 20 28 ound = 0;..for (
c5a0: 69 20 3d 20 30 20 3b 20 2a 28 6d 6f 64 65 53 74 i = 0 ; *(modeSt
c5b0: 72 69 6e 67 50 74 72 2b 6e 2b 69 29 20 21 3d 20 ringPtr+n+i) !=
c5c0: 27 5c 30 27 20 3b 20 69 2b 2b 20 29 20 7b 0a 09 '\0' ; i++ ) {..
c5d0: 20 20 20 20 69 66 20 28 21 77 68 6f 5f 66 6f 75 if (!who_fou
c5e0: 6e 64 29 20 7b 0a 09 09 2f 2a 20 77 68 6f 20 2a nd) {.../* who *
c5f0: 2f 0a 09 09 73 77 69 74 63 68 20 28 2a 28 6d 6f /...switch (*(mo
c600: 64 65 53 74 72 69 6e 67 50 74 72 2b 6e 2b 69 29 deStringPtr+n+i)
c610: 29 20 7b 0a 09 09 63 61 73 65 20 27 75 27 3a 0a ) {...case 'u':.
c620: 09 09 20 20 20 20 77 68 6f 20 7c 3d 20 30 78 39 .. who |= 0x9
c630: 43 30 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e C0;... contin
c640: 75 65 3b 0a 09 09 63 61 73 65 20 27 67 27 3a 0a ue;...case 'g':.
c650: 09 09 20 20 20 20 77 68 6f 20 7c 3d 20 30 78 34 .. who |= 0x4
c660: 33 38 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 38;... contin
c670: 75 65 3b 0a 09 09 63 61 73 65 20 27 6f 27 3a 0a ue;...case 'o':.
c680: 09 09 20 20 20 20 77 68 6f 20 7c 3d 20 30 78 32 .. who |= 0x2
c690: 30 37 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 07;... contin
c6a0: 75 65 3b 0a 09 09 63 61 73 65 20 27 61 27 3a 0a ue;...case 'a':.
c6b0: 09 09 20 20 20 20 77 68 6f 20 7c 3d 20 30 78 46 .. who |= 0xF
c6c0: 46 46 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e FF;... contin
c6d0: 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 ue;...}.. }..
c6e0: 20 20 20 20 77 68 6f 5f 66 6f 75 6e 64 20 3d 20 who_found =
c6f0: 31 3b 0a 09 20 20 20 20 69 66 20 28 77 68 6f 20 1;.. if (who
c700: 3d 3d 20 30 29 20 7b 0a 09 09 77 68 6f 20 3d 20 == 0) {...who =
c710: 30 78 46 46 46 3b 0a 09 20 20 20 20 7d 0a 09 20 0xFFF;.. }..
c720: 20 20 20 69 66 20 28 21 6f 70 5f 66 6f 75 6e 64 if (!op_found
c730: 29 20 7b 0a 09 09 2f 2a 20 6f 70 20 2a 2f 0a 09 ) {.../* op */..
c740: 09 73 77 69 74 63 68 20 28 2a 28 6d 6f 64 65 53 .switch (*(modeS
c750: 74 72 69 6e 67 50 74 72 2b 6e 2b 69 29 29 20 7b tringPtr+n+i)) {
c760: 0a 09 09 63 61 73 65 20 27 2b 27 3a 0a 09 09 20 ...case '+':...
c770: 20 20 20 6f 70 20 3d 20 31 3b 0a 09 09 20 20 20 op = 1;...
c780: 20 6f 70 5f 66 6f 75 6e 64 20 3d 20 31 3b 0a 09 op_found = 1;..
c790: 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 . continue;..
c7a0: 09 63 61 73 65 20 27 2d 27 3a 0a 09 09 20 20 20 .case '-':...
c7b0: 20 6f 70 20 3d 20 32 3b 0a 09 09 20 20 20 20 6f op = 2;... o
c7c0: 70 5f 66 6f 75 6e 64 20 3d 20 31 3b 0a 09 09 20 p_found = 1;...
c7d0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 63 continue;...c
c7e0: 61 73 65 20 27 3d 27 3a 0a 09 09 20 20 20 20 6f ase '=':... o
c7f0: 70 20 3d 20 33 3b 0a 09 09 20 20 20 20 6f 70 5f p = 3;... op_
c800: 66 6f 75 6e 64 20 3d 20 31 3b 0a 09 09 20 20 20 found = 1;...
c810: 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 64 65 66 continue;...def
c820: 61 75 6c 74 3a 0a 09 09 20 20 20 20 72 65 74 75 ault:... retu
c830: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 rn TCL_ERROR;...
c840: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a }.. }.. /*
c850: 20 77 68 61 74 20 2a 2f 0a 09 20 20 20 20 73 77 what */.. sw
c860: 69 74 63 68 20 28 2a 28 6d 6f 64 65 53 74 72 69 itch (*(modeStri
c870: 6e 67 50 74 72 2b 6e 2b 69 29 29 20 7b 0a 09 20 ngPtr+n+i)) {..
c880: 20 20 20 63 61 73 65 20 27 72 27 3a 0a 09 09 77 case 'r':...w
c890: 68 61 74 20 7c 3d 20 30 78 31 32 34 3b 0a 09 09 hat |= 0x124;...
c8a0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 63 continue;.. c
c8b0: 61 73 65 20 27 77 27 3a 0a 09 09 77 68 61 74 20 ase 'w':...what
c8c0: 7c 3d 20 30 78 39 32 3b 0a 09 09 63 6f 6e 74 69 |= 0x92;...conti
c8d0: 6e 75 65 3b 0a 09 20 20 20 20 63 61 73 65 20 27 nue;.. case '
c8e0: 78 27 3a 0a 09 09 77 68 61 74 20 7c 3d 20 30 78 x':...what |= 0x
c8f0: 34 39 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 49;...continue;.
c900: 09 20 20 20 20 63 61 73 65 20 27 73 27 3a 0a 09 . case 's':..
c910: 09 77 68 61 74 20 7c 3d 20 30 78 43 30 30 3b 0a .what |= 0xC00;.
c920: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 ..continue;..
c930: 20 63 61 73 65 20 27 74 27 3a 0a 09 09 77 68 61 case 't':...wha
c940: 74 20 7c 3d 20 30 78 32 30 30 3b 0a 09 09 63 6f t |= 0x200;...co
c950: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 63 61 73 ntinue;.. cas
c960: 65 20 27 2c 27 3a 0a 09 09 62 72 65 61 6b 3b 0a e ',':...break;.
c970: 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 . default:...
c980: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c990: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 ;.. }.. if
c9a0: 20 28 2a 28 6d 6f 64 65 53 74 72 69 6e 67 50 74 (*(modeStringPt
c9b0: 72 2b 6e 2b 69 29 20 3d 3d 20 27 2c 27 29 20 7b r+n+i) == ',') {
c9c0: 0a 09 09 69 2b 2b 3b 0a 09 09 62 72 65 61 6b 3b ...i++;...break;
c9d0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 77 69 74 .. }..}..swit
c9e0: 63 68 20 28 6f 70 29 20 7b 0a 09 63 61 73 65 20 ch (op) {..case
c9f0: 31 3a 0a 09 20 20 20 20 2a 6d 6f 64 65 50 74 72 1:.. *modePtr
ca00: 20 3d 20 6f 6c 64 4d 6f 64 65 20 7c 20 28 77 68 = oldMode | (wh
ca10: 6f 20 26 20 77 68 61 74 29 3b 0a 09 20 20 20 20 o & what);..
ca20: 63 6f 6e 74 69 6e 75 65 3b 0a 09 63 61 73 65 20 continue;..case
ca30: 32 3a 0a 09 20 20 20 20 2a 6d 6f 64 65 50 74 72 2:.. *modePtr
ca40: 20 3d 20 6f 6c 64 4d 6f 64 65 20 26 20 7e 28 77 = oldMode & ~(w
ca50: 68 6f 20 26 20 77 68 61 74 29 3b 0a 09 20 20 20 ho & what);..
ca60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 63 61 73 65 continue;..case
ca70: 20 33 3a 0a 09 20 20 20 20 2a 6d 6f 64 65 50 74 3:.. *modePt
ca80: 72 20 3d 20 28 6f 6c 64 4d 6f 64 65 20 26 20 7e r = (oldMode & ~
ca90: 77 68 6f 29 20 7c 20 28 77 68 6f 20 26 20 77 68 who) | (who & wh
caa0: 61 74 29 3b 0a 09 20 20 20 20 63 6f 6e 74 69 6e at);.. contin
cab0: 75 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 ue;..}. }.
cac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
cad0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
cae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cb20: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f ----. *. * TclpO
cb30: 62 6a 4e 6f 72 6d 61 6c 69 7a 65 50 61 74 68 20 bjNormalizePath
cb40: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
cb50: 6e 63 74 69 6f 6e 20 73 63 61 6e 73 20 74 68 72 nction scans thr
cb60: 6f 75 67 68 20 61 20 70 61 74 68 20 73 70 65 63 ough a path spec
cb70: 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 ification and re
cb80: 70 6c 61 63 65 73 20 69 74 2c 20 69 6e 0a 20 2a places it, in. *
cb90: 09 70 6c 61 63 65 2c 20 77 69 74 68 20 61 20 6e .place, with a n
cba0: 6f 72 6d 61 6c 69 7a 65 64 20 76 65 72 73 69 6f ormalized versio
cbb0: 6e 2e 20 41 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 n. A normalized
cbc0: 76 65 72 73 69 6f 6e 20 69 73 20 6f 6e 65 20 69 version is one i
cbd0: 6e 20 77 68 69 63 68 0a 20 2a 09 61 6c 6c 20 73 n which. *.all s
cbe0: 79 6d 6c 69 6e 6b 73 20 69 6e 20 74 68 65 20 70 ymlinks in the p
cbf0: 61 74 68 20 61 72 65 20 72 65 70 6c 61 63 65 64 ath are replaced
cc00: 20 77 69 74 68 20 74 68 65 69 72 20 65 78 70 61 with their expa
cc10: 6e 64 65 64 20 66 6f 72 6d 20 28 65 78 63 65 70 nded form (excep
cc20: 74 0a 20 2a 09 61 20 73 79 6d 6c 69 6e 6b 20 61 t. *.a symlink a
cc30: 74 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f t the very end o
cc40: 66 20 74 68 65 20 70 61 74 68 29 2e 0a 20 2a 0a f the path).. *.
cc50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
cc60: 68 65 20 6e 65 77 20 27 6e 65 78 74 43 68 65 63 he new 'nextChec
cc70: 6b 70 6f 69 6e 74 27 20 76 61 6c 75 65 2c 20 67 kpoint' value, g
cc80: 69 76 69 6e 67 20 61 73 20 66 61 72 20 61 73 20 iving as far as
cc90: 77 65 20 63 6f 75 6c 64 20 75 6e 64 65 72 73 74 we could underst
cca0: 61 6e 64 0a 20 2a 09 69 6e 20 74 68 65 20 70 61 and. *.in the pa
ccb0: 74 68 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 th.. *. * Side e
ccc0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 70 ffects:. *.The p
ccd0: 61 74 68 50 74 72 20 73 74 72 69 6e 67 2c 20 69 athPtr string, i
cce0: 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 2a 0a 20 s modified.. *.
ccf0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
cd40: 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 4e 6f 72 ..int.TclpObjNor
cd50: 6d 61 6c 69 7a 65 50 61 74 68 28 0a 20 20 20 20 malizePath(.
cd60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
cd70: 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 rp,. Tcl_Obj
cd80: 2a 70 61 74 68 50 74 72 2c 0a 20 20 20 20 69 6e *pathPtr,. in
cd90: 74 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 t nextCheckpoint
cda0: 29 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ).{. const ch
cdb0: 61 72 20 2a 63 75 72 72 65 6e 74 50 61 74 68 45 ar *currentPathE
cdc0: 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 20 20 20 20 ndPosition;.
cdd0: 69 6e 74 20 70 61 74 68 4c 65 6e 3b 0a 20 20 20 int pathLen;.
cde0: 20 63 68 61 72 20 63 75 72 3b 0a 20 20 20 20 63 char cur;. c
cdf0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 20 onst char *path
ce00: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
ce10: 72 6f 6d 4f 62 6a 28 70 61 74 68 50 74 72 2c 20 romObj(pathPtr,
ce20: 26 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 54 &pathLen);. T
ce30: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 cl_DString ds;.
ce40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e const char *n
ce50: 61 74 69 76 65 50 61 74 68 3b 0a 23 69 66 6e 64 ativePath;.#ifnd
ce60: 65 66 20 4e 4f 5f 52 45 41 4c 50 41 54 48 0a 20 ef NO_REALPATH.
ce70: 20 20 20 63 68 61 72 20 6e 6f 72 6d 50 61 74 68 char normPath
ce80: 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 23 65 [MAXPATHLEN];.#e
ce90: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ndif.. /*.
cea0: 20 20 2a 20 57 65 20 61 64 64 20 27 31 27 20 68 * We add '1' h
ceb0: 65 72 65 20 62 65 63 61 75 73 65 20 69 66 20 6e ere because if n
cec0: 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 69 73 extCheckpoint is
ced0: 20 7a 65 72 6f 20 77 65 20 6b 6e 6f 77 20 74 68 zero we know th
cee0: 61 74 20 27 2f 27 0a 20 20 20 20 20 2a 20 65 78 at '/'. * ex
cef0: 69 73 74 73 2c 20 61 6e 64 20 69 66 20 69 74 20 ists, and if it
cf00: 69 73 6e 27 74 20 7a 65 72 6f 2c 20 69 74 20 6d isn't zero, it m
cf10: 75 73 74 20 70 6f 69 6e 74 20 61 74 20 61 20 64 ust point at a d
cf20: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 irectory separat
cf30: 6f 72 0a 20 20 20 20 20 2a 20 77 68 69 63 68 20 or. * which
cf40: 77 65 20 61 6c 73 6f 20 6b 6e 6f 77 20 65 78 69 we also know exi
cf50: 73 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 sts.. */..
cf60: 20 20 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 currentPathEnd
cf70: 50 6f 73 69 74 69 6f 6e 20 3d 20 70 61 74 68 20 Position = path
cf80: 2b 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 + nextCheckpoint
cf90: 3b 0a 20 20 20 20 69 66 20 28 2a 63 75 72 72 65 ;. if (*curre
cfa0: 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
cfb0: 6e 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 63 75 72 n == '/') {..cur
cfc0: 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 rentPathEndPosit
cfd0: 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 ion++;. }..#i
cfe0: 66 6e 64 65 66 20 4e 4f 5f 52 45 41 4c 50 41 54 fndef NO_REALPAT
cff0: 48 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 H. /*. *
d000: 46 6f 72 20 73 70 65 65 64 2c 20 74 72 79 20 74 For speed, try t
d010: 6f 20 67 65 74 20 74 68 65 20 65 6e 74 69 72 65 o get the entire
d020: 20 70 61 74 68 20 69 6e 20 6f 6e 65 20 67 6f 2e path in one go.
d030: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
d040: 20 28 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 (nextCheckpoint
d050: 20 3d 3d 20 30 20 26 26 20 68 61 76 65 52 65 61 == 0 && haveRea
d060: 6c 70 61 74 68 29 20 7b 0a 09 63 68 61 72 20 2a lpath) {..char *
d070: 6c 61 73 74 44 69 72 20 3d 20 73 74 72 72 63 68 lastDir = strrch
d080: 72 28 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 r(currentPathEnd
d090: 50 6f 73 69 74 69 6f 6e 2c 20 27 2f 27 29 3b 0a Position, '/');.
d0a0: 0a 09 69 66 20 28 6c 61 73 74 44 69 72 20 21 3d ..if (lastDir !=
d0b0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6e 61 NULL) {.. na
d0c0: 74 69 76 65 50 61 74 68 20 3d 20 54 63 6c 5f 55 tivePath = Tcl_U
d0d0: 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 53 74 72 tfToExternalDStr
d0e0: 69 6e 67 28 4e 55 4c 4c 2c 20 70 61 74 68 2c 0a ing(NULL, path,.
d0f0: 09 09 20 20 20 20 6c 61 73 74 44 69 72 2d 70 61 .. lastDir-pa
d100: 74 68 2c 20 26 64 73 29 3b 0a 09 20 20 20 20 69 th, &ds);.. i
d110: 66 20 28 52 65 61 6c 70 61 74 68 28 6e 61 74 69 f (Realpath(nati
d120: 76 65 50 61 74 68 2c 20 6e 6f 72 6d 50 61 74 68 vePath, normPath
d130: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 ) != NULL) {...i
d140: 66 20 28 2a 6e 61 74 69 76 65 50 61 74 68 20 21 f (*nativePath !
d150: 3d 20 27 2f 27 20 26 26 20 2a 6e 6f 72 6d 50 61 = '/' && *normPa
d160: 74 68 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 09 20 th == '/') {...
d170: 20 20 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 72 /*... * r
d180: 65 61 6c 70 61 74 68 20 68 61 73 20 74 72 61 6e ealpath has tran
d190: 73 66 6f 72 6d 65 64 20 61 20 72 65 6c 61 74 69 sformed a relati
d1a0: 76 65 20 70 61 74 68 20 69 6e 74 6f 20 61 6e 0a ve path into an.
d1b0: 09 09 20 20 20 20 20 2a 20 61 62 73 6f 6c 75 74 .. * absolut
d1c0: 65 20 70 61 74 68 2c 20 77 65 20 64 6f 20 6e 6f e path, we do no
d1d0: 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 68 61 t know how to ha
d1e0: 6e 64 6c 65 20 74 68 69 73 2e 0a 09 09 20 20 20 ndle this....
d1f0: 20 20 2a 2f 0a 09 09 7d 20 65 6c 73 65 20 7b 0a */...} else {.
d200: 09 09 20 20 20 20 6e 65 78 74 43 68 65 63 6b 70 .. nextCheckp
d210: 6f 69 6e 74 20 3d 20 6c 61 73 74 44 69 72 20 2d oint = lastDir -
d220: 20 70 61 74 68 3b 0a 09 09 20 20 20 20 67 6f 74 path;... got
d230: 6f 20 77 68 6f 6c 65 53 74 72 69 6e 67 4f 6b 3b o wholeStringOk;
d240: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 ...}.. }..
d250: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
d260: 28 26 64 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a (&ds);..}. }.
d270: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 . /*. * E
d280: 6c 73 65 20 64 6f 20 69 74 20 74 68 65 20 73 6c lse do it the sl
d290: 6f 77 20 77 61 79 2e 0a 20 20 20 20 20 2a 2f 0a ow way.. */.
d2a0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c #endif.. whil
d2b0: 65 20 28 31 29 20 7b 0a 09 63 75 72 20 3d 20 2a e (1) {..cur = *
d2c0: 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f currentPathEndPo
d2d0: 73 69 74 69 6f 6e 3b 0a 09 69 66 20 28 28 63 75 sition;..if ((cu
d2e0: 72 20 3d 3d 20 27 2f 27 29 20 26 26 20 28 70 61 r == '/') && (pa
d2f0: 74 68 20 21 3d 20 63 75 72 72 65 6e 74 50 61 74 th != currentPat
d300: 68 45 6e 64 50 6f 73 69 74 69 6f 6e 29 29 20 7b hEndPosition)) {
d310: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
d320: 20 52 65 61 63 68 65 64 20 64 69 72 65 63 74 6f Reached directo
d330: 72 79 20 73 65 70 61 72 61 74 6f 72 2e 0a 09 20 ry separator...
d340: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 6e 74 */... int
d350: 20 61 63 63 65 73 73 4f 6b 3b 0a 0a 09 20 20 20 accessOk;...
d360: 20 6e 61 74 69 76 65 50 61 74 68 20 3d 20 54 63 nativePath = Tc
d370: 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 l_UtfToExternalD
d380: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 70 61 74 String(NULL, pat
d390: 68 2c 0a 09 09 20 20 20 20 63 75 72 72 65 6e 74 h,... current
d3a0: 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 PathEndPosition
d3b0: 2d 20 70 61 74 68 2c 20 26 64 73 29 3b 0a 09 20 - path, &ds);..
d3c0: 20 20 20 61 63 63 65 73 73 4f 6b 20 3d 20 61 63 accessOk = ac
d3d0: 63 65 73 73 28 6e 61 74 69 76 65 50 61 74 68 2c cess(nativePath,
d3e0: 20 46 5f 4f 4b 29 3b 0a 09 20 20 20 20 54 63 6c F_OK);.. Tcl
d3f0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
d400: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 61 63 63 );... if (acc
d410: 65 73 73 4f 6b 20 21 3d 20 30 29 20 7b 0a 09 09 essOk != 0) {...
d420: 2f 2a 0a 09 09 20 2a 20 46 69 6c 65 20 64 6f 65 /*... * File doe
d430: 73 6e 27 74 20 65 78 69 73 74 2e 0a 09 09 20 2a sn't exist.... *
d440: 2f 0a 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 /....break;..
d450: 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 }... /*..
d460: 20 20 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 * Update the a
d470: 63 63 65 70 74 61 62 6c 65 20 70 6f 69 6e 74 2e cceptable point.
d480: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
d490: 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d nextCheckpoint =
d4a0: 20 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 currentPathEndP
d4b0: 6f 73 69 74 69 6f 6e 20 2d 20 70 61 74 68 3b 0a osition - path;.
d4c0: 09 7d 20 65 6c 73 65 20 69 66 20 28 63 75 72 20 .} else if (cur
d4d0: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a == 0) {.. /*.
d4e0: 09 20 20 20 20 20 2a 20 52 65 61 63 68 65 64 20 . * Reached
d4f0: 65 6e 64 20 6f 66 20 73 74 72 69 6e 67 2e 0a 09 end of string...
d500: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 62 72 */... br
d510: 65 61 6b 3b 0a 09 7d 0a 09 63 75 72 72 65 6e 74 eak;..}..current
d520: 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2b PathEndPosition+
d530: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a +;. }.. /*
d540: 0a 20 20 20 20 20 2a 20 57 65 20 73 68 6f 75 6c . * We shoul
d550: 64 20 72 65 61 6c 6c 79 20 6e 6f 77 20 63 6f 6e d really now con
d560: 76 65 72 74 20 74 68 69 73 20 74 6f 20 61 20 63 vert this to a c
d570: 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 2e 20 57 anonical path. W
d580: 65 20 64 6f 20 74 68 61 74 20 77 69 74 68 0a 20 e do that with.
d590: 20 20 20 20 2a 20 27 72 65 61 6c 70 61 74 68 27 * 'realpath'
d5a0: 20 69 66 20 77 65 20 68 61 76 65 20 69 74 20 61 if we have it a
d5b0: 76 61 69 6c 61 62 6c 65 2e 20 4f 74 68 65 72 77 vailable. Otherw
d5c0: 69 73 65 20 77 65 20 63 6f 75 6c 64 20 73 74 65 ise we could ste
d5d0: 70 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20 2a p through. *
d5e0: 20 65 76 65 72 79 20 73 69 6e 67 6c 65 20 70 61 every single pa
d5f0: 74 68 20 63 6f 6d 70 6f 6e 65 6e 74 2c 20 63 68 th component, ch
d600: 65 63 6b 69 6e 67 20 77 68 65 74 68 65 72 20 69 ecking whether i
d610: 74 20 69 73 20 61 20 73 79 6d 6c 69 6e 6b 2c 20 t is a symlink,
d620: 62 75 74 20 74 68 61 74 0a 20 20 20 20 20 2a 20 but that. *
d630: 77 6f 75 6c 64 20 62 65 20 61 20 6c 6f 74 20 6f would be a lot o
d640: 66 20 77 6f 72 6b 2c 20 61 6e 64 20 6d 6f 73 74 f work, and most
d650: 20 6d 6f 64 65 72 6e 20 4f 53 65 73 20 68 61 76 modern OSes hav
d660: 65 20 27 72 65 61 6c 70 61 74 68 27 2e 0a 20 20 e 'realpath'..
d670: 20 20 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e */..#ifndef N
d680: 4f 5f 52 45 41 4c 50 41 54 48 0a 20 20 20 20 69 O_REALPATH. i
d690: 66 20 28 68 61 76 65 52 65 61 6c 70 61 74 68 29 f (haveRealpath)
d6a0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 77 65 {../*.. * If we
d6b0: 20 6f 6e 6c 79 20 68 61 64 20 27 2f 66 6f 6f 27 only had '/foo'
d6c0: 20 6f 72 20 27 2f 27 20 74 68 65 6e 20 77 65 20 or '/' then we
d6d0: 6e 65 76 65 72 20 69 6e 63 72 65 6d 65 6e 74 20 never increment
d6e0: 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 0a 09 nextCheckpoint..
d6f0: 20 2a 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 * and we don't
d700: 6e 65 65 64 20 6f 72 20 77 61 6e 74 20 74 6f 20 need or want to
d710: 67 6f 20 74 68 72 6f 75 67 68 20 27 52 65 61 6c go through 'Real
d720: 70 61 74 68 27 2e 20 41 6c 73 6f 2c 20 6f 6e 20 path'. Also, on
d730: 73 6f 6d 65 0a 09 20 2a 20 70 6c 61 74 66 6f 72 some.. * platfor
d740: 6d 73 2c 20 70 61 73 73 69 6e 67 20 61 6e 20 65 ms, passing an e
d750: 6d 70 74 79 20 73 74 72 69 6e 67 20 74 6f 20 27 mpty string to '
d760: 52 65 61 6c 70 61 74 68 27 20 77 69 6c 6c 20 67 Realpath' will g
d770: 69 76 65 20 75 73 20 74 68 65 0a 09 20 2a 20 6e ive us the.. * n
d780: 6f 72 6d 61 6c 69 7a 65 64 20 70 77 64 2c 20 77 ormalized pwd, w
d790: 68 69 63 68 20 69 73 20 6e 6f 74 20 77 68 61 74 hich is not what
d7a0: 20 77 65 20 77 61 6e 74 20 61 74 20 61 6c 6c 21 we want at all!
d7b0: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 6e 65 78 74 .. */...if (next
d7c0: 43 68 65 63 6b 70 6f 69 6e 74 20 3d 3d 20 30 29 Checkpoint == 0)
d7d0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 {.. return 0
d7e0: 3b 0a 09 7d 0a 0a 09 6e 61 74 69 76 65 50 61 74 ;..}...nativePat
d7f0: 68 20 3d 20 54 63 6c 5f 55 74 66 54 6f 45 78 74 h = Tcl_UtfToExt
d800: 65 72 6e 61 6c 44 53 74 72 69 6e 67 28 4e 55 4c ernalDString(NUL
d810: 4c 2c 20 70 61 74 68 2c 6e 65 78 74 43 68 65 63 L, path,nextChec
d820: 6b 70 6f 69 6e 74 2c 20 26 64 73 29 3b 0a 09 69 kpoint, &ds);..i
d830: 66 20 28 52 65 61 6c 70 61 74 68 28 6e 61 74 69 f (Realpath(nati
d840: 76 65 50 61 74 68 2c 20 6e 6f 72 6d 50 61 74 68 vePath, normPath
d850: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) != NULL) {..
d860: 20 20 69 6e 74 20 6e 65 77 4e 6f 72 6d 4c 65 6e int newNormLen
d870: 3b 0a 0a 09 77 68 6f 6c 65 53 74 72 69 6e 67 4f ;...wholeStringO
d880: 6b 3a 0a 09 20 20 20 20 6e 65 77 4e 6f 72 6d 4c k:.. newNormL
d890: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 6f 72 6d en = strlen(norm
d8a0: 50 61 74 68 29 3b 0a 09 20 20 20 20 69 66 20 28 Path);.. if (
d8b0: 28 6e 65 77 4e 6f 72 6d 4c 65 6e 20 3d 3d 20 54 (newNormLen == T
d8c0: 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 cl_DStringLength
d8d0: 28 26 64 73 29 29 0a 09 09 20 20 20 20 26 26 20 (&ds))... &&
d8e0: 28 73 74 72 63 6d 70 28 6e 6f 72 6d 50 61 74 68 (strcmp(normPath
d8f0: 2c 20 6e 61 74 69 76 65 50 61 74 68 29 20 3d 3d , nativePath) ==
d900: 20 30 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 0)) {.../*... *
d910: 20 53 74 72 69 6e 67 20 69 73 20 75 6e 63 68 61 String is uncha
d920: 6e 67 65 64 2e 0a 09 09 20 2a 2f 0a 0a 09 09 54 nged.... */....T
d930: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
d940: 64 73 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 ds);..../*... *
d950: 45 6e 61 62 6c 65 20 74 68 69 73 20 74 6f 20 68 Enable this to h
d960: 61 76 65 20 74 68 65 20 6e 61 74 69 76 65 20 46 ave the native F
d970: 53 20 63 6c 61 69 6d 20 6e 6f 72 6d 61 6c 69 7a S claim normaliz
d980: 61 74 69 6f 6e 20 6f 66 0a 09 09 20 2a 20 74 68 ation of... * th
d990: 65 20 77 68 6f 6c 65 20 70 61 74 68 20 66 6f 72 e whole path for
d9a0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 73 2e existing files.
d9b0: 20 54 68 61 74 20 77 6f 75 6c 64 20 70 65 72 6d That would perm
d9c0: 69 74 20 74 68 65 0a 09 09 20 2a 20 63 61 6c 6c it the... * call
d9d0: 65 72 20 74 6f 20 64 65 63 6c 61 72 65 20 6e 6f er to declare no
d9e0: 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6d 70 rmalization comp
d9f0: 6c 65 74 65 20 77 69 74 68 6f 75 74 20 63 61 6c lete without cal
da00: 6c 73 20 74 6f 0a 09 09 20 2a 20 61 64 64 69 74 ls to... * addit
da10: 69 6f 6e 61 6c 20 66 69 6c 65 73 79 73 74 65 6d ional filesystem
da20: 73 2e 20 53 61 76 69 6e 67 20 6c 6f 74 73 20 6f s. Saving lots o
da30: 66 20 63 61 6c 6c 73 20 69 73 20 70 72 6f 62 61 f calls is proba
da40: 62 6c 79 0a 09 09 20 2a 20 77 6f 72 74 68 20 74 bly... * worth t
da50: 68 65 20 65 78 74 72 61 20 61 63 63 65 73 73 28 he extra access(
da60: 29 20 74 69 6d 65 20 68 65 72 65 2e 20 57 68 65 ) time here. Whe
da70: 6e 20 6e 6f 20 6f 74 68 65 72 20 46 53 27 73 20 n no other FS's
da80: 61 72 65 0a 09 09 20 2a 20 72 65 67 69 73 74 65 are... * registe
da90: 72 65 64 20 74 68 6f 75 67 68 2c 20 74 68 69 6e red though, thin
daa0: 67 73 20 61 72 65 20 6c 65 73 73 20 63 6c 65 61 gs are less clea
dab0: 72 2e 0a 09 09 20 2a 0a 09 09 69 66 20 28 30 20 r.... *...if (0
dac0: 3d 3d 20 61 63 63 65 73 73 28 6e 6f 72 6d 50 61 == access(normPa
dad0: 74 68 2c 20 46 5f 4f 4b 29 29 20 7b 0a 09 09 20 th, F_OK)) {...
dae0: 20 20 20 72 65 74 75 72 6e 20 70 61 74 68 4c 65 return pathLe
daf0: 6e 3b 0a 09 09 7d 0a 09 09 20 2a 2f 0a 0a 09 09 n;...}... */....
db00: 72 65 74 75 72 6e 20 6e 65 78 74 43 68 65 63 6b return nextCheck
db10: 70 6f 69 6e 74 3b 0a 09 20 20 20 20 7d 0a 0a 09 point;.. }...
db20: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 46 /*.. * F
db30: 72 65 65 20 75 70 20 74 68 65 20 6e 61 74 69 76 ree up the nativ
db40: 65 20 70 61 74 68 20 61 6e 64 20 70 75 74 20 69 e path and put i
db50: 6e 20 69 74 73 20 70 6c 61 63 65 20 74 68 65 20 n its place the
db60: 63 6f 6e 76 65 72 74 65 64 2c 0a 09 20 20 20 20 converted,..
db70: 20 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 61 * normalized pa
db80: 74 68 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 th... */...
db90: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
dba0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 ee(&ds);.. Tc
dbb0: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 l_ExternalToUtfD
dbc0: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 6e 6f 72 String(NULL, nor
dbd0: 6d 50 61 74 68 2c 20 28 69 6e 74 29 20 6e 65 77 mPath, (int) new
dbe0: 4e 6f 72 6d 4c 65 6e 2c 20 26 64 73 29 3b 0a 0a NormLen, &ds);..
dbf0: 09 20 20 20 20 69 66 20 28 70 61 74 68 5b 6e 65 . if (path[ne
dc00: 78 74 43 68 65 63 6b 70 6f 69 6e 74 5d 20 21 3d xtCheckpoint] !=
dc10: 20 27 5c 30 27 29 20 7b 0a 09 09 2f 2a 0a 09 09 '\0') {.../*...
dc20: 20 2a 20 4e 6f 74 20 61 74 20 65 6e 64 2c 20 61 * Not at end, a
dc30: 70 70 65 6e 64 20 72 65 6d 61 69 6e 69 6e 67 20 ppend remaining
dc40: 70 61 74 68 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 path.... */....i
dc50: 6e 74 20 6e 6f 72 6d 4c 65 6e 20 3d 20 54 63 6c nt normLen = Tcl
dc60: 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 _DStringLength(&
dc70: 64 73 29 3b 0a 0a 09 09 54 63 6c 5f 44 53 74 72 ds);....Tcl_DStr
dc80: 69 6e 67 41 70 70 65 6e 64 28 26 64 73 2c 20 70 ingAppend(&ds, p
dc90: 61 74 68 20 2b 20 6e 65 78 74 43 68 65 63 6b 70 ath + nextCheckp
dca0: 6f 69 6e 74 2c 0a 09 09 09 70 61 74 68 4c 65 6e oint,....pathLen
dcb0: 20 2d 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e - nextCheckpoin
dcc0: 74 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 57 t);..../*... * W
dcd0: 65 20 72 65 63 6f 67 6e 69 73 65 20 75 70 20 74 e recognise up t
dce0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 o and including
dcf0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 the directory se
dd00: 70 61 72 61 74 6f 72 2e 0a 09 09 20 2a 2f 0a 0a parator.... */..
dd10: 09 09 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 ..nextCheckpoint
dd20: 20 3d 20 6e 6f 72 6d 4c 65 6e 20 2b 20 31 3b 0a = normLen + 1;.
dd30: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
dd40: 2f 2a 0a 09 09 20 2a 20 57 65 20 72 65 63 6f 67 /*... * We recog
dd50: 6e 69 73 65 20 74 68 65 20 77 68 6f 6c 65 20 73 nise the whole s
dd60: 74 72 69 6e 67 2e 0a 09 09 20 2a 2f 0a 0a 09 09 tring.... */....
dd70: 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d nextCheckpoint =
dd80: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 Tcl_DStringLeng
dd90: 74 68 28 26 64 73 29 3b 0a 09 20 20 20 20 7d 0a th(&ds);.. }.
dda0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
ddb0: 20 4f 76 65 72 77 72 69 74 65 20 77 69 74 68 20 Overwrite with
ddc0: 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 the normalized p
ddd0: 61 74 68 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ath... */...
dde0: 20 20 20 20 54 63 6c 5f 53 65 74 53 74 72 69 6e Tcl_SetStrin
ddf0: 67 4f 62 6a 28 70 61 74 68 50 74 72 2c 20 54 63 gObj(pathPtr, Tc
de00: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
de10: 64 73 29 2c 0a 09 09 20 20 20 20 54 63 6c 5f 44 ds),... Tcl_D
de20: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 StringLength(&ds
de30: 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 ));..}..Tcl_DStr
de40: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 ingFree(&ds);.
de50: 20 20 7d 0a 23 65 6e 64 69 66 09 2f 2a 20 21 4e }.#endif./* !N
de60: 4f 5f 52 45 41 4c 50 41 54 48 20 2a 2f 0a 0a 20 O_REALPATH */..
de70: 20 20 20 72 65 74 75 72 6e 20 6e 65 78 74 43 68 return nextCh
de80: 65 63 6b 70 6f 69 6e 74 3b 0a 7d 0a 0c 0a 2f 2a eckpoint;.}.../*
de90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
dea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ded0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
dee0: 54 63 6c 70 4f 70 65 6e 54 65 6d 70 6f 72 61 72 TclpOpenTemporar
def0: 79 46 69 6c 65 2c 20 54 63 6c 55 6e 69 78 4f 70 yFile, TclUnixOp
df00: 65 6e 54 65 6d 70 6f 72 61 72 79 46 69 6c 65 20 enTemporaryFile
df10: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 73 --. *. *.Creates
df20: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c a temporary fil
df30: 65 2c 20 70 6f 73 73 69 62 6c 79 20 62 61 73 65 e, possibly base
df40: 64 20 6f 6e 20 74 68 65 20 73 75 70 70 6c 69 65 d on the supplie
df50: 64 20 62 69 74 73 20 61 6e 64 0a 20 2a 09 70 69 d bits and. *.pi
df60: 65 63 65 73 20 6f 66 20 74 65 6d 70 6c 61 74 65 eces of template
df70: 20 73 75 70 70 6c 69 65 64 20 69 6e 20 74 68 65 supplied in the
df80: 20 66 69 72 73 74 20 74 68 72 65 65 20 61 72 67 first three arg
df90: 75 6d 65 6e 74 73 2e 20 49 66 20 74 68 65 0a 20 uments. If the.
dfa0: 2a 09 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e *.fourth argumen
dfb0: 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 69 t is non-NULL, i
dfc0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 54 63 6c t contains a Tcl
dfd0: 5f 4f 62 6a 20 74 6f 20 73 74 6f 72 65 20 74 68 _Obj to store th
dfe0: 65 20 6e 61 6d 65 0a 20 2a 09 6f 66 20 74 68 65 e name. *.of the
dff0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 temporary file
e000: 69 6e 20 28 61 6e 64 20 69 74 20 69 73 20 63 61 in (and it is ca
e010: 6c 6c 65 72 27 73 20 72 65 73 70 6f 6e 73 69 62 ller's responsib
e020: 69 6c 69 74 79 20 74 6f 20 63 6c 65 61 6e 0a 20 ility to clean.
e030: 2a 09 75 70 29 2e 20 49 66 20 74 68 65 20 66 6f *.up). If the fo
e040: 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 69 73 urth argument is
e050: 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 61 72 NULL, try to ar
e060: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 74 65 range for the te
e070: 6d 70 6f 72 61 72 79 0a 20 2a 09 66 69 6c 65 20 mporary. *.file
e080: 74 6f 20 67 6f 20 61 77 61 79 20 6f 6e 63 65 20 to go away once
e090: 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 it is no longer
e0a0: 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 needed.. *. * Re
e0b0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 72 65 61 64 sults:. *.A read
e0c0: 2d 77 72 69 74 65 20 54 63 6c 20 43 68 61 6e 6e -write Tcl Chann
e0d0: 65 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 66 el open on the f
e0e0: 69 6c 65 20 66 6f 72 20 54 63 6c 70 4f 70 65 6e ile for TclpOpen
e0f0: 54 65 6d 70 6f 72 61 72 79 46 69 6c 65 2c 0a 20 TemporaryFile,.
e100: 2a 09 6f 72 20 61 20 66 69 6c 65 20 64 65 73 63 *.or a file desc
e110: 72 69 70 74 6f 72 20 28 6f 72 20 2d 31 20 6f 6e riptor (or -1 on
e120: 20 66 61 69 6c 75 72 65 29 20 66 6f 72 20 54 63 failure) for Tc
e130: 6c 55 6e 69 78 4f 70 65 6e 54 65 6d 70 6f 72 61 lUnixOpenTempora
e140: 72 79 46 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 ryFile.. *. * Si
e150: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 de effects:. *.A
e160: 63 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 ccesses the file
e170: 73 79 73 74 65 6d 2e 20 57 69 6c 6c 20 73 65 74 system. Will set
e180: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 the contents of
e190: 20 74 68 65 20 54 63 6c 5f 4f 62 6a 20 66 6f 75 the Tcl_Obj fou
e1a0: 72 74 68 0a 20 2a 09 61 72 67 75 6d 65 6e 74 20 rth. *.argument
e1b0: 28 69 66 20 74 68 61 74 20 69 73 20 6e 6f 6e 2d (if that is non-
e1c0: 4e 55 4c 4c 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d NULL).. *. *----
e1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e210: 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43 68 61 6e --. */..Tcl_Chan
e220: 6e 65 6c 0a 54 63 6c 70 4f 70 65 6e 54 65 6d 70 nel.TclpOpenTemp
e230: 6f 72 61 72 79 46 69 6c 65 28 0a 20 20 20 20 54 oraryFile(. T
e240: 63 6c 5f 4f 62 6a 20 2a 64 69 72 4f 62 6a 2c 0a cl_Obj *dirObj,.
e250: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 62 61 73 Tcl_Obj *bas
e260: 65 6e 61 6d 65 4f 62 6a 2c 0a 20 20 20 20 54 63 enameObj,. Tc
e270: 6c 5f 4f 62 6a 20 2a 65 78 74 65 6e 73 69 6f 6e l_Obj *extension
e280: 4f 62 6a 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a Obj,. Tcl_Obj
e290: 20 2a 72 65 73 75 6c 74 69 6e 67 4e 61 6d 65 4f *resultingNameO
e2a0: 62 6a 29 0a 7b 0a 20 20 20 20 69 6e 74 20 66 64 bj).{. int fd
e2b0: 20 3d 20 54 63 6c 55 6e 69 78 4f 70 65 6e 54 65 = TclUnixOpenTe
e2c0: 6d 70 6f 72 61 72 79 46 69 6c 65 28 64 69 72 4f mporaryFile(dirO
e2d0: 62 6a 2c 20 62 61 73 65 6e 61 6d 65 4f 62 6a 2c bj, basenameObj,
e2e0: 20 65 78 74 65 6e 73 69 6f 6e 4f 62 6a 2c 0a 09 extensionObj,..
e2f0: 20 20 20 20 72 65 73 75 6c 74 69 6e 67 4e 61 6d resultingNam
e300: 65 4f 62 6a 29 3b 0a 0a 20 20 20 20 69 66 20 28 eObj);.. if (
e310: 66 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 72 65 74 fd == -1) {..ret
e320: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e330: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4d return Tcl_M
e340: 61 6b 65 46 69 6c 65 43 68 61 6e 6e 65 6c 28 49 akeFileChannel(I
e350: 4e 54 32 50 54 52 28 66 64 29 2c 20 54 43 4c 5f NT2PTR(fd), TCL_
e360: 52 45 41 44 41 42 4c 45 7c 54 43 4c 5f 57 52 49 READABLE|TCL_WRI
e370: 54 41 42 4c 45 29 3b 0a 7d 0a 0a 69 6e 74 0a 54 TABLE);.}..int.T
e380: 63 6c 55 6e 69 78 4f 70 65 6e 54 65 6d 70 6f 72 clUnixOpenTempor
e390: 61 72 79 46 69 6c 65 28 0a 20 20 20 20 54 63 6c aryFile(. Tcl
e3a0: 5f 4f 62 6a 20 2a 64 69 72 4f 62 6a 2c 0a 20 20 _Obj *dirObj,.
e3b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 62 61 73 65 6e Tcl_Obj *basen
e3c0: 61 6d 65 4f 62 6a 2c 0a 20 20 20 20 54 63 6c 5f ameObj,. Tcl_
e3d0: 4f 62 6a 20 2a 65 78 74 65 6e 73 69 6f 6e 4f 62 Obj *extensionOb
e3e0: 6a 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a j,. Tcl_Obj *
e3f0: 72 65 73 75 6c 74 69 6e 67 4e 61 6d 65 4f 62 6a resultingNameObj
e400: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 ).{. Tcl_DStr
e410: 69 6e 67 20 74 65 6d 70 6c 61 74 65 2c 20 74 6d ing template, tm
e420: 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 p;. const cha
e430: 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20 69 r *string;. i
e440: 6e 74 20 6c 65 6e 2c 20 66 64 3b 0a 0a 20 20 20 nt len, fd;..
e450: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 73 68 /*. * We sh
e460: 6f 75 6c 64 20 61 6c 73 6f 20 63 68 65 63 6b 20 ould also check
e470: 61 67 61 69 6e 73 74 20 6d 61 6b 69 6e 67 20 6d against making m
e480: 6f 72 65 20 74 68 65 6e 20 54 4d 50 5f 4d 41 58 ore then TMP_MAX
e490: 20 6f 66 20 74 68 65 73 65 2e 0a 20 20 20 20 20 of these..
e4a0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 64 69 72 4f */.. if (dirO
e4b0: 62 6a 29 20 7b 0a 09 73 74 72 69 6e 67 20 3d 20 bj) {..string =
e4c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
e4d0: 6d 4f 62 6a 28 64 69 72 4f 62 6a 2c 20 26 6c 65 mObj(dirObj, &le
e4e0: 6e 29 3b 0a 09 54 63 6c 5f 55 74 66 54 6f 45 78 n);..Tcl_UtfToEx
e4f0: 74 65 72 6e 61 6c 44 53 74 72 69 6e 67 28 4e 55 ternalDString(NU
e500: 4c 4c 2c 20 73 74 72 69 6e 67 2c 20 6c 65 6e 2c LL, string, len,
e510: 20 26 74 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 &template);.
e520: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 44 } else {..Tcl_D
e530: 53 74 72 69 6e 67 49 6e 69 74 28 26 74 65 6d 70 StringInit(&temp
e540: 6c 61 74 65 29 3b 0a 09 54 63 6c 5f 44 53 74 72 late);..Tcl_DStr
e550: 69 6e 67 41 70 70 65 6e 64 28 26 74 65 6d 70 6c ingAppend(&templ
e560: 61 74 65 2c 20 44 65 66 61 75 6c 74 54 65 6d 70 ate, DefaultTemp
e570: 44 69 72 28 29 2c 20 2d 31 29 3b 20 2f 2a 20 49 Dir(), -1); /* I
e580: 4e 54 4c 3a 20 6e 61 74 69 76 65 20 2a 2f 0a 20 NTL: native */.
e590: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 44 53 74 }.. TclDSt
e5a0: 72 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 72 61 ringAppendLitera
e5b0: 6c 28 26 74 65 6d 70 6c 61 74 65 2c 20 22 2f 22 l(&template, "/"
e5c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 61 73 65 );.. if (base
e5d0: 6e 61 6d 65 4f 62 6a 29 20 7b 0a 09 73 74 72 69 nameObj) {..stri
e5e0: 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 ng = Tcl_GetStri
e5f0: 6e 67 46 72 6f 6d 4f 62 6a 28 62 61 73 65 6e 61 ngFromObj(basena
e600: 6d 65 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 54 meObj, &len);..T
e610: 63 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c cl_UtfToExternal
e620: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 73 74 DString(NULL, st
e630: 72 69 6e 67 2c 20 6c 65 6e 2c 20 26 74 6d 70 29 ring, len, &tmp)
e640: 3b 0a 09 54 63 6c 44 53 74 72 69 6e 67 41 70 70 ;..TclDStringApp
e650: 65 6e 64 44 53 74 72 69 6e 67 28 26 74 65 6d 70 endDString(&temp
e660: 6c 61 74 65 2c 20 26 74 6d 70 29 3b 0a 09 54 63 late, &tmp);..Tc
e670: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 l_DStringFree(&t
e680: 6d 70 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 mp);. } else
e690: 7b 0a 09 54 63 6c 44 53 74 72 69 6e 67 41 70 70 {..TclDStringApp
e6a0: 65 6e 64 4c 69 74 65 72 61 6c 28 26 74 65 6d 70 endLiteral(&temp
e6b0: 6c 61 74 65 2c 20 22 74 63 6c 22 29 3b 0a 20 20 late, "tcl");.
e6c0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 44 53 74 72 }.. TclDStr
e6d0: 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 72 61 6c ingAppendLiteral
e6e0: 28 26 74 65 6d 70 6c 61 74 65 2c 20 22 5f 58 58 (&template, "_XX
e6f0: 58 58 58 58 22 29 3b 0a 0a 23 69 66 64 65 66 20 XXXX");..#ifdef
e700: 48 41 56 45 5f 4d 4b 53 54 45 4d 50 53 0a 20 20 HAVE_MKSTEMPS.
e710: 20 20 69 66 20 28 65 78 74 65 6e 73 69 6f 6e 4f if (extensionO
e720: 62 6a 29 20 7b 0a 09 73 74 72 69 6e 67 20 3d 20 bj) {..string =
e730: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
e740: 6d 4f 62 6a 28 65 78 74 65 6e 73 69 6f 6e 4f 62 mObj(extensionOb
e750: 6a 2c 20 26 6c 65 6e 29 3b 0a 09 54 63 6c 5f 55 j, &len);..Tcl_U
e760: 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 53 74 72 tfToExternalDStr
e770: 69 6e 67 28 4e 55 4c 4c 2c 20 73 74 72 69 6e 67 ing(NULL, string
e780: 2c 20 6c 65 6e 2c 20 26 74 6d 70 29 3b 0a 09 54 , len, &tmp);..T
e790: 63 6c 44 53 74 72 69 6e 67 41 70 70 65 6e 64 44 clDStringAppendD
e7a0: 53 74 72 69 6e 67 28 26 74 65 6d 70 6c 61 74 65 String(&template
e7b0: 2c 20 26 74 6d 70 29 3b 0a 09 66 64 20 3d 20 6d , &tmp);..fd = m
e7c0: 6b 73 74 65 6d 70 73 28 54 63 6c 5f 44 53 74 72 kstemps(Tcl_DStr
e7d0: 69 6e 67 56 61 6c 75 65 28 26 74 65 6d 70 6c 61 ingValue(&templa
e7e0: 74 65 29 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 te), Tcl_DString
e7f0: 4c 65 6e 67 74 68 28 26 74 6d 70 29 29 3b 0a 09 Length(&tmp));..
e800: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
e810: 26 74 6d 70 29 3b 0a 20 20 20 20 7d 20 65 6c 73 &tmp);. } els
e820: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 09 e.#endif. {..
e830: 66 64 20 3d 20 6d 6b 73 74 65 6d 70 28 54 63 6c fd = mkstemp(Tcl
e840: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 74 _DStringValue(&t
e850: 65 6d 70 6c 61 74 65 29 29 3b 0a 20 20 20 20 7d emplate));. }
e860: 0a 0a 20 20 20 20 69 66 20 28 66 64 20 3d 3d 20 .. if (fd ==
e870: 2d 31 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 -1) {..Tcl_DStri
e880: 6e 67 46 72 65 65 28 26 74 65 6d 70 6c 61 74 65 ngFree(&template
e890: 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 );..return -1;.
e8a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 }.. if (re
e8b0: 73 75 6c 74 69 6e 67 4e 61 6d 65 4f 62 6a 29 20 sultingNameObj)
e8c0: 7b 0a 09 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 {..Tcl_ExternalT
e8d0: 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c oUtfDString(NULL
e8e0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c , Tcl_DStringVal
e8f0: 75 65 28 26 74 65 6d 70 6c 61 74 65 29 2c 0a 09 ue(&template),..
e900: 09 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 .Tcl_DStringLeng
e910: 74 68 28 26 74 65 6d 70 6c 61 74 65 29 2c 20 26 th(&template), &
e920: 74 6d 70 29 3b 0a 09 54 63 6c 5f 53 65 74 53 74 tmp);..Tcl_SetSt
e930: 72 69 6e 67 4f 62 6a 28 72 65 73 75 6c 74 69 6e ringObj(resultin
e940: 67 4e 61 6d 65 4f 62 6a 2c 20 54 63 6c 5f 44 53 gNameObj, Tcl_DS
e950: 74 72 69 6e 67 56 61 6c 75 65 28 26 74 6d 70 29 tringValue(&tmp)
e960: 2c 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 4c ,...Tcl_DStringL
e970: 65 6e 67 74 68 28 26 74 6d 70 29 29 3b 0a 09 54 ength(&tmp));..T
e980: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
e990: 74 6d 70 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 tmp);. } else
e9a0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 72 79 20 74 {../*.. * Try t
e9b0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c o delete the fil
e9c0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 73 69 e immediately si
e9d0: 6e 63 65 20 77 65 27 72 65 20 6e 6f 74 20 72 65 nce we're not re
e9e0: 70 6f 72 74 69 6e 67 20 74 68 65 0a 09 20 2a 20 porting the.. *
e9f0: 6e 61 6d 65 20 74 6f 20 61 6e 79 6f 6e 65 2e 20 name to anyone.
ea00: 4e 6f 74 65 20 74 68 61 74 20 77 65 27 72 65 20 Note that we're
ea10: 2a 6e 6f 74 2a 20 68 61 6e 64 6c 69 6e 67 20 61 *not* handling a
ea20: 6e 79 20 65 72 72 6f 72 73 20 66 72 6f 6d 0a 09 ny errors from..
ea30: 20 2a 20 74 68 69 73 21 0a 09 20 2a 2f 0a 0a 09 * this!.. */...
ea40: 75 6e 6c 69 6e 6b 28 54 63 6c 5f 44 53 74 72 69 unlink(Tcl_DStri
ea50: 6e 67 56 61 6c 75 65 28 26 74 65 6d 70 6c 61 74 ngValue(&templat
ea60: 65 29 29 3b 0a 09 65 72 72 6e 6f 20 3d 20 30 3b e));..errno = 0;
ea70: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 . }. Tcl_D
ea80: 53 74 72 69 6e 67 46 72 65 65 28 26 74 65 6d 70 StringFree(&temp
ea90: 6c 61 74 65 29 3b 0a 0a 20 20 20 20 72 65 74 75 late);.. retu
eaa0: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 rn fd;.}../*. *
eab0: 48 65 6c 70 65 72 20 74 68 61 74 20 64 6f 65 73 Helper that does
eac0: 20 2a 70 61 72 74 2a 20 6f 66 20 77 68 61 74 20 *part* of what
ead0: 74 65 6d 70 6e 61 6d 28 29 20 64 6f 65 73 2e 0a tempnam() does..
eae0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 */..static cons
eaf0: 74 20 63 68 61 72 20 2a 0a 44 65 66 61 75 6c 74 t char *.Default
eb00: 54 65 6d 70 44 69 72 28 76 6f 69 64 29 0a 7b 0a TempDir(void).{.
eb10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
eb20: 64 69 72 3b 0a 20 20 20 20 73 74 72 75 63 74 20 dir;. struct
eb30: 73 74 61 74 20 62 75 66 3b 0a 0a 20 20 20 20 64 stat buf;.. d
eb40: 69 72 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 ir = getenv("TMP
eb50: 44 49 52 22 29 3b 0a 20 20 20 20 69 66 20 28 64 DIR");. if (d
eb60: 69 72 20 26 26 20 64 69 72 5b 30 5d 20 26 26 20 ir && dir[0] &&
eb70: 73 74 61 74 28 64 69 72 2c 20 26 62 75 66 29 20 stat(dir, &buf)
eb80: 3d 3d 20 30 20 26 26 20 53 5f 49 53 44 49 52 28 == 0 && S_ISDIR(
eb90: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 09 20 20 buf.st_mode)..
eba0: 20 20 26 26 20 61 63 63 65 73 73 28 64 69 72 2c && access(dir,
ebb0: 20 57 5f 4f 4b 29 20 3d 3d 20 30 29 20 7b 0a 09 W_OK) == 0) {..
ebc0: 72 65 74 75 72 6e 20 64 69 72 3b 0a 20 20 20 20 return dir;.
ebd0: 7d 0a 0a 23 69 66 64 65 66 20 50 5f 74 6d 70 64 }..#ifdef P_tmpd
ebe0: 69 72 0a 20 20 20 20 64 69 72 20 3d 20 50 5f 74 ir. dir = P_t
ebf0: 6d 70 64 69 72 3b 0a 20 20 20 20 69 66 20 28 73 mpdir;. if (s
ec00: 74 61 74 28 64 69 72 2c 20 26 62 75 66 29 3d 3d tat(dir, &buf)==
ec10: 30 20 26 26 20 53 5f 49 53 44 49 52 28 62 75 66 0 && S_ISDIR(buf
ec20: 2e 73 74 5f 6d 6f 64 65 29 20 26 26 20 61 63 63 .st_mode) && acc
ec30: 65 73 73 28 64 69 72 2c 20 57 5f 4f 4b 29 3d 3d ess(dir, W_OK)==
ec40: 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 64 69 72 0) {..return dir
ec50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a ;. }.#endif..
ec60: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 73 /*. * As
ec70: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 64 65 sume that the de
ec80: 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 28 fault location (
ec90: 22 2f 74 6d 70 22 20 69 66 20 6e 6f 74 20 6f 76 "/tmp" if not ov
eca0: 65 72 72 69 64 64 65 6e 29 20 69 73 20 61 6c 77 erridden) is alw
ecb0: 61 79 73 0a 20 20 20 20 20 2a 20 61 6e 20 65 78 ays. * an ex
ecc0: 69 73 74 69 6e 67 20 77 72 69 74 61 62 6c 65 20 isting writable
ecd0: 64 69 72 65 63 74 6f 72 79 3b 20 77 65 27 76 65 directory; we've
ece0: 20 6e 6f 20 72 65 63 6f 76 65 72 79 20 6d 65 63 no recovery mec
ecf0: 68 61 6e 69 73 6d 20 69 66 20 69 74 0a 20 20 20 hanism if it.
ed00: 20 20 2a 20 69 73 6e 27 74 2e 0a 20 20 20 20 20 * isn't..
ed10: 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 */.. return T
ed20: 43 4c 5f 54 45 4d 50 4f 52 41 52 59 5f 46 49 4c CL_TEMPORARY_FIL
ed30: 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 7d 0a 0c E_DIRECTORY;.}..
ed40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 .#if defined(__C
ed50: 59 47 57 49 4e 5f 5f 29 0a 0a 73 74 61 74 69 63 YGWIN__)..static
ed60: 20 76 6f 69 64 0a 53 74 61 74 45 72 72 6f 72 28 void.StatError(
ed70: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
ed80: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 54 68 65 *interp,../* The
ed90: 20 69 6e 74 65 72 70 20 74 68 61 74 20 68 61 73 interp that has
eda0: 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 the error */.
edb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e Tcl_Obj *fileN
edc0: 61 6d 65 29 09 09 2f 2a 20 54 68 65 20 6e 61 6d ame)../* The nam
edd0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 77 68 e of the file wh
ede0: 69 63 68 20 63 61 75 73 65 64 20 74 68 65 0a 09 ich caused the..
edf0: 09 09 09 20 2a 20 65 72 72 6f 72 2e 20 2a 2f 0a ... * error. */.
ee00: 7b 0a 20 20 20 20 54 63 6c 57 69 6e 43 6f 6e 76 {. TclWinConv
ee10: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 ertError(GetLast
ee20: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 54 63 Error());. Tc
ee30: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
ee40: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
ee50: 69 6e 74 66 28 22 63 6f 75 6c 64 20 6e 6f 74 20 intf("could not
ee60: 72 65 61 64 20 5c 22 25 73 5c 22 3a 20 25 73 22 read \"%s\": %s"
ee70: 2c 0a 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 ,.. TclGetStr
ee80: 69 6e 67 28 66 69 6c 65 4e 61 6d 65 29 2c 20 54 ing(fileName), T
ee90: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e cl_PosixError(in
eea0: 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 73 74 61 74 terp)));.}..stat
eeb0: 69 63 20 57 43 48 41 52 20 2a 0a 77 69 6e 50 61 ic WCHAR *.winPa
eec0: 74 68 46 72 6f 6d 4f 62 6a 28 0a 20 20 20 20 54 thFromObj(. T
eed0: 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 cl_Obj *fileName
eee0: 29 0a 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 ).{. int size
eef0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
ef00: 20 2a 6e 61 74 69 76 65 20 3d 20 20 54 63 6c 5f *native = Tcl_
ef10: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 FSGetNativePath(
ef20: 66 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 57 fileName);. W
ef30: 43 48 41 52 20 2a 77 69 6e 50 61 74 68 3b 0a 0a CHAR *winPath;..
ef40: 20 20 20 20 73 69 7a 65 20 3d 20 63 79 67 77 69 size = cygwi
ef50: 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 31 2c 20 6e n_conv_path(1, n
ef60: 61 74 69 76 65 2c 20 4e 55 4c 4c 2c 20 30 29 3b ative, NULL, 0);
ef70: 0a 20 20 20 20 77 69 6e 50 61 74 68 20 3d 20 63 . winPath = c
ef80: 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 20 20 kalloc(size);.
ef90: 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 cygwin_conv_pa
efa0: 74 68 28 31 2c 20 6e 61 74 69 76 65 2c 20 77 69 th(1, native, wi
efb0: 6e 50 61 74 68 2c 20 73 69 7a 65 29 3b 0a 0a 20 nPath, size);..
efc0: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 50 61 74 return winPat
efd0: 68 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e h;.}..static con
efe0: 73 74 20 69 6e 74 20 61 74 74 72 69 62 75 74 65 st int attribute
eff0: 41 72 72 61 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 Array[] = {.
f000: 30 78 32 30 2c 20 30 2c 20 32 2c 20 30 2c 20 30 0x20, 0, 2, 0, 0
f010: 2c 20 31 2c 20 34 7d 3b 0a 0a 2f 2a 0a 20 2a 2d , 1, 4};../*. *-
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f060: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 55 -----. *. * GetU
f070: 6e 69 78 46 69 6c 65 41 74 74 72 69 62 75 74 65 nixFileAttribute
f080: 73 0a 20 2a 0a 20 2a 09 47 65 74 73 20 74 68 65 s. *. *.Gets the
f090: 20 72 65 61 64 6f 6e 6c 79 20 61 74 74 72 69 62 readonly attrib
f0a0: 75 74 65 20 6f 66 20 61 20 66 69 6c 65 2e 0a 20 ute of a file..
f0b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
f0c0: 09 53 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 .Standard TCL re
f0d0: 73 75 6c 74 2e 20 52 65 74 75 72 6e 73 20 61 20 sult. Returns a
f0e0: 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 69 6e 20 61 new Tcl_Obj in a
f0f0: 74 74 72 69 62 75 74 65 50 74 72 50 74 72 20 69 ttributePtrPtr i
f100: 66 20 74 68 65 72 65 0a 20 2a 09 69 73 20 6e 6f f there. *.is no
f110: 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 62 6a 65 error. The obje
f120: 63 74 20 77 69 6c 6c 20 68 61 76 65 20 72 65 66 ct will have ref
f130: 20 63 6f 75 6e 74 20 30 2e 0a 20 2a 0a 20 2a 20 count 0.. *. *
f140: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
f150: 09 41 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 .A new object is
f160: 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 2a 0a 20 allocated.. *.
f170: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
f180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f1b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
f1c0: 74 69 63 20 69 6e 74 0a 47 65 74 55 6e 69 78 46 tic int.GetUnixF
f1d0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 28 0a 20 ileAttributes(.
f1e0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
f1f0: 6e 74 65 72 70 2c 09 09 2f 2a 20 54 68 65 20 69 nterp,../* The i
f200: 6e 74 65 72 70 20 77 65 20 61 72 65 20 75 73 69 nterp we are usi
f210: 6e 67 20 66 6f 72 20 65 72 72 6f 72 73 2e 20 2a ng for errors. *
f220: 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 49 6e 64 /. int objInd
f230: 65 78 2c 09 09 2f 2a 20 54 68 65 20 69 6e 64 65 ex,../* The inde
f240: 78 20 6f 66 20 74 68 65 20 61 74 74 72 69 62 75 x of the attribu
f250: 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f te. */. Tcl_O
f260: 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 09 09 2f bj *fileName,../
f270: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 * The name of th
f280: 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 2e 20 e file (UTF-8).
f290: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
f2a0: 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 74 72 *attributePtrPtr
f2b0: 29 09 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 )./* A pointer t
f2c0: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6f 62 6a o return the obj
f2d0: 65 63 74 20 77 69 74 68 2e 20 2a 2f 0a 7b 0a 20 ect with. */.{.
f2e0: 20 20 20 69 6e 74 20 66 69 6c 65 41 74 74 72 69 int fileAttri
f2f0: 62 75 74 65 73 3b 0a 20 20 20 20 57 43 48 41 52 butes;. WCHAR
f300: 20 2a 77 69 6e 50 61 74 68 20 3d 20 77 69 6e 50 *winPath = winP
f310: 61 74 68 46 72 6f 6d 4f 62 6a 28 66 69 6c 65 4e athFromObj(fileN
f320: 61 6d 65 29 3b 0a 0a 20 20 20 20 66 69 6c 65 41 ame);.. fileA
f330: 74 74 72 69 62 75 74 65 73 20 3d 20 47 65 74 46 ttributes = GetF
f340: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 77 ileAttributesW(w
f350: 69 6e 50 61 74 68 29 3b 0a 20 20 20 20 63 6b 66 inPath);. ckf
f360: 72 65 65 28 77 69 6e 50 61 74 68 29 3b 0a 0a 20 ree(winPath);..
f370: 20 20 20 69 66 20 28 66 69 6c 65 41 74 74 72 69 if (fileAttri
f380: 62 75 74 65 73 20 3d 3d 20 2d 31 29 20 7b 0a 09 butes == -1) {..
f390: 53 74 61 74 45 72 72 6f 72 28 69 6e 74 65 72 70 StatError(interp
f3a0: 2c 20 66 69 6c 65 4e 61 6d 65 29 3b 0a 09 72 65 , fileName);..re
f3b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
f3c0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 4e 65 }.. TclNe
f3d0: 77 49 6e 74 4f 62 6a 28 2a 61 74 74 72 69 62 75 wIntObj(*attribu
f3e0: 74 65 50 74 72 50 74 72 2c 20 28 66 69 6c 65 41 tePtrPtr, (fileA
f3f0: 74 74 72 69 62 75 74 65 73 26 61 74 74 72 69 62 ttributes&attrib
f400: 75 74 65 41 72 72 61 79 5b 6f 62 6a 49 6e 64 65 uteArray[objInde
f410: 78 5d 29 21 3d 30 29 3b 0a 0a 20 20 20 20 72 65 x])!=0);.. re
f420: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c turn TCL_OK;.}..
f430: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f480: 2d 0a 20 2a 0a 20 2a 20 53 65 74 55 6e 69 78 46 -. *. * SetUnixF
f490: 69 6c 65 41 74 74 72 69 62 75 74 65 73 0a 20 2a ileAttributes. *
f4a0: 0a 20 2a 09 53 65 74 73 20 74 68 65 20 72 65 61 . *.Sets the rea
f4b0: 64 6f 6e 6c 79 20 61 74 74 72 69 62 75 74 65 20 donly attribute
f4c0: 6f 66 20 61 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a of a file.. *. *
f4d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 74 61 Results:. *.Sta
f4e0: 6e 64 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 ndard TCL result
f4f0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
f500: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 61 ects:. *.The rea
f510: 64 6f 6e 6c 79 20 61 74 74 72 69 62 75 74 65 20 donly attribute
f520: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 of the file is c
f530: 68 61 6e 67 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d hanged.. *. *---
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f580: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
f590: 61 74 69 63 20 69 6e 74 0a 53 65 74 55 6e 69 78 atic int.SetUnix
f5a0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 28 0a FileAttributes(.
f5b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
f5c0: 69 6e 74 65 72 70 2c 09 20 20 20 20 2f 2a 20 54 interp,. /* T
f5d0: 68 65 20 69 6e 74 65 72 70 20 77 65 20 61 72 65 he interp we are
f5e0: 20 75 73 69 6e 67 20 66 6f 72 20 65 72 72 6f 72 using for error
f5f0: 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 s. */. int ob
f600: 6a 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 jIndex,
f610: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 6f /* The index o
f620: 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65 2e f the attribute.
f630: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
f640: 2a 66 69 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 *fileName,
f650: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 /* The name of t
f660: 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 2e he file (UTF-8).
f670: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
f680: 2a 61 74 74 72 69 62 75 74 65 50 74 72 29 20 20 *attributePtr)
f690: 2f 2a 20 54 68 65 20 61 74 74 72 69 62 75 74 65 /* The attribute
f6a0: 20 74 6f 20 73 65 74 2e 20 2a 2f 0a 7b 0a 20 20 to set. */.{.
f6b0: 20 20 69 6e 74 20 79 65 73 4e 6f 2c 20 66 69 6c int yesNo, fil
f6c0: 65 41 74 74 72 69 62 75 74 65 73 2c 20 6f 6c 64 eAttributes, old
f6d0: 3b 0a 20 20 20 20 57 43 48 41 52 20 2a 77 69 6e ;. WCHAR *win
f6e0: 50 61 74 68 3b 0a 0a 20 20 20 20 69 66 20 28 54 Path;.. if (T
f6f0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f cl_GetBooleanFro
f700: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 61 74 74 mObj(interp, att
f710: 72 69 62 75 74 65 50 74 72 2c 20 26 79 65 73 4e ributePtr, &yesN
f720: 6f 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a o) != TCL_OK) {.
f730: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
f740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 R;. }.. wi
f750: 6e 50 61 74 68 20 3d 20 77 69 6e 50 61 74 68 46 nPath = winPathF
f760: 72 6f 6d 4f 62 6a 28 66 69 6c 65 4e 61 6d 65 29 romObj(fileName)
f770: 3b 0a 0a 20 20 20 20 66 69 6c 65 41 74 74 72 69 ;.. fileAttri
f780: 62 75 74 65 73 20 3d 20 6f 6c 64 20 3d 20 47 65 butes = old = Ge
f790: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 tFileAttributesW
f7a0: 28 77 69 6e 50 61 74 68 29 3b 0a 0a 20 20 20 20 (winPath);..
f7b0: 69 66 20 28 66 69 6c 65 41 74 74 72 69 62 75 74 if (fileAttribut
f7c0: 65 73 20 3d 3d 20 2d 31 29 20 7b 0a 09 63 6b 66 es == -1) {..ckf
f7d0: 72 65 65 28 77 69 6e 50 61 74 68 29 3b 0a 09 53 ree(winPath);..S
f7e0: 74 61 74 45 72 72 6f 72 28 69 6e 74 65 72 70 2c tatError(interp,
f7f0: 20 66 69 6c 65 4e 61 6d 65 29 3b 0a 09 72 65 74 fileName);..ret
f800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
f810: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 79 65 }.. if (ye
f820: 73 4e 6f 29 20 7b 0a 09 66 69 6c 65 41 74 74 72 sNo) {..fileAttr
f830: 69 62 75 74 65 73 20 7c 3d 20 61 74 74 72 69 62 ibutes |= attrib
f840: 75 74 65 41 72 72 61 79 5b 6f 62 6a 49 6e 64 65 uteArray[objInde
f850: 78 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b x];. } else {
f860: 0a 09 66 69 6c 65 41 74 74 72 69 62 75 74 65 73 ..fileAttributes
f870: 20 26 3d 20 7e 61 74 74 72 69 62 75 74 65 41 72 &= ~attributeAr
f880: 72 61 79 5b 6f 62 6a 49 6e 64 65 78 5d 3b 0a 20 ray[objIndex];.
f890: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 66 }.. if ((f
f8a0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 21 3d ileAttributes !=
f8b0: 20 6f 6c 64 29 0a 09 20 20 20 20 26 26 20 21 53 old).. && !S
f8c0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 etFileAttributes
f8d0: 57 28 77 69 6e 50 61 74 68 2c 20 66 69 6c 65 41 W(winPath, fileA
f8e0: 74 74 72 69 62 75 74 65 73 29 29 20 7b 0a 09 63 ttributes)) {..c
f8f0: 6b 66 72 65 65 28 77 69 6e 50 61 74 68 29 3b 0a kfree(winPath);.
f900: 09 53 74 61 74 45 72 72 6f 72 28 69 6e 74 65 72 .StatError(inter
f910: 70 2c 20 66 69 6c 65 4e 61 6d 65 29 3b 0a 09 72 p, fileName);..r
f920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
f930: 0a 20 20 20 20 7d 0a 0a 09 63 6b 66 72 65 65 28 . }...ckfree(
f940: 77 69 6e 50 61 74 68 29 3b 0a 20 20 20 20 72 65 winPath);. re
f950: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 turn TCL_OK;.}.#
f960: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 elif defined(HAV
f970: 45 5f 43 48 46 4c 41 47 53 29 20 26 26 20 64 65 E_CHFLAGS) && de
f980: 66 69 6e 65 64 28 55 46 5f 49 4d 4d 55 54 41 42 fined(UF_IMMUTAB
f990: 4c 45 29 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d LE)./*. *-------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
f9e0: 20 2a 0a 20 2a 20 47 65 74 55 6e 69 78 46 69 6c *. * GetUnixFil
f9f0: 65 41 74 74 72 69 62 75 74 65 73 0a 20 2a 0a 20 eAttributes. *.
fa00: 2a 09 47 65 74 73 20 74 68 65 20 72 65 61 64 6f *.Gets the reado
fa10: 6e 6c 79 20 61 74 74 72 69 62 75 74 65 20 28 75 nly attribute (u
fa20: 73 65 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 6c ser immutable fl
fa30: 61 67 29 20 6f 66 20 61 20 66 69 6c 65 2e 0a 20 ag) of a file..
fa40: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
fa50: 09 53 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 .Standard TCL re
fa60: 73 75 6c 74 2e 20 52 65 74 75 72 6e 73 20 61 20 sult. Returns a
fa70: 6e 65 77 20 54 63 6c 5f 4f 62 6a 20 69 6e 20 61 new Tcl_Obj in a
fa80: 74 74 72 69 62 75 74 65 50 74 72 50 74 72 20 69 ttributePtrPtr i
fa90: 66 20 74 68 65 72 65 0a 20 2a 09 69 73 20 6e 6f f there. *.is no
faa0: 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 62 6a 65 error. The obje
fab0: 63 74 20 77 69 6c 6c 20 68 61 76 65 20 72 65 66 ct will have ref
fac0: 20 63 6f 75 6e 74 20 30 2e 0a 20 2a 0a 20 2a 20 count 0.. *. *
fad0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
fae0: 09 41 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 .A new object is
faf0: 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 2a 0a 20 allocated.. *.
fb00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fb40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
fb50: 74 69 63 20 69 6e 74 0a 47 65 74 55 6e 69 78 46 tic int.GetUnixF
fb60: 69 6c 65 41 74 74 72 69 62 75 74 65 73 28 0a 20 ileAttributes(.
fb70: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
fb80: 6e 74 65 72 70 2c 09 09 2f 2a 20 54 68 65 20 69 nterp,../* The i
fb90: 6e 74 65 72 70 20 77 65 20 61 72 65 20 75 73 69 nterp we are usi
fba0: 6e 67 20 66 6f 72 20 65 72 72 6f 72 73 2e 20 2a ng for errors. *
fbb0: 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 49 6e 64 /. int objInd
fbc0: 65 78 2c 09 09 2f 2a 20 54 68 65 20 69 6e 64 65 ex,../* The inde
fbd0: 78 20 6f 66 20 74 68 65 20 61 74 74 72 69 62 75 x of the attribu
fbe0: 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f te. */. Tcl_O
fbf0: 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 09 09 2f bj *fileName,../
fc00: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 * The name of th
fc10: 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 2e 20 e file (UTF-8).
fc20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
fc30: 2a 61 74 74 72 69 62 75 74 65 50 74 72 50 74 72 *attributePtrPtr
fc40: 29 09 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 )./* A pointer t
fc50: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6f 62 6a o return the obj
fc60: 65 63 74 20 77 69 74 68 2e 20 2a 2f 0a 7b 0a 20 ect with. */.{.
fc70: 20 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 73 Tcl_StatBuf s
fc80: 74 61 74 42 75 66 3b 0a 20 20 20 20 69 6e 74 20 tatBuf;. int
fc90: 72 65 73 75 6c 74 3b 0a 0a 20 20 20 20 72 65 73 result;.. res
fca0: 75 6c 74 20 3d 20 54 63 6c 70 4f 62 6a 53 74 61 ult = TclpObjSta
fcb0: 74 28 66 69 6c 65 4e 61 6d 65 2c 20 26 73 74 61 t(fileName, &sta
fcc0: 74 42 75 66 29 3b 0a 0a 20 20 20 20 69 66 20 28 tBuf);.. if (
fcd0: 72 65 73 75 6c 74 20 21 3d 20 30 29 20 7b 0a 09 result != 0) {..
fce0: 69 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 if (interp != NU
fcf0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 LL) {.. Tcl_S
fd00: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
fd10: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
fd20: 66 28 0a 09 09 20 20 20 20 22 63 6f 75 6c 64 20 f(... "could
fd30: 6e 6f 74 20 72 65 61 64 20 5c 22 25 73 5c 22 3a not read \"%s\":
fd40: 20 25 73 22 2c 0a 09 09 20 20 20 20 54 63 6c 47 %s",... TclG
fd50: 65 74 53 74 72 69 6e 67 28 66 69 6c 65 4e 61 6d etString(fileNam
fd60: 65 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 e), Tcl_PosixErr
fd70: 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 7d or(interp)));..}
fd80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
fd90: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a OR;. }.. *
fda0: 61 74 74 72 69 62 75 74 65 50 74 72 50 74 72 20 attributePtrPtr
fdb0: 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e = Tcl_NewBoolean
fdc0: 4f 62 6a 28 73 74 61 74 42 75 66 2e 73 74 5f 66 Obj(statBuf.st_f
fdd0: 6c 61 67 73 26 55 46 5f 49 4d 4d 55 54 41 42 4c lags&UF_IMMUTABL
fde0: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 E);.. return
fdf0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
fe00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
fe10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
fe50: 20 2a 20 53 65 74 55 6e 69 78 46 69 6c 65 41 74 * SetUnixFileAt
fe60: 74 72 69 62 75 74 65 73 0a 20 2a 0a 20 2a 09 53 tributes. *. *.S
fe70: 65 74 73 20 74 68 65 20 72 65 61 64 6f 6e 6c 79 ets the readonly
fe80: 20 61 74 74 72 69 62 75 74 65 20 28 75 73 65 72 attribute (user
fe90: 20 69 6d 6d 75 74 61 62 6c 65 20 66 6c 61 67 29 immutable flag)
fea0: 20 6f 66 20 61 20 66 69 6c 65 2e 0a 20 2a 0a 20 of a file.. *.
feb0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 74 * Results:. *.St
fec0: 61 6e 64 61 72 64 20 54 43 4c 20 72 65 73 75 6c andard TCL resul
fed0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 t.. *. * Side ef
fee0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 fects:. *.The re
fef0: 61 64 6f 6e 6c 79 20 61 74 74 72 69 62 75 74 65 adonly attribute
ff00: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 of the file is
ff10: 63 68 61 6e 67 65 64 2e 0a 20 2a 0a 20 2a 2d 2d changed.. *. *--
ff20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ff60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
ff70: 74 61 74 69 63 20 69 6e 74 0a 53 65 74 55 6e 69 tatic int.SetUni
ff80: 78 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 28 xFileAttributes(
ff90: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
ffa0: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 54 68 65 *interp,../* The
ffb0: 20 69 6e 74 65 72 70 20 77 65 20 61 72 65 20 75 interp we are u
ffc0: 73 69 6e 67 20 66 6f 72 20 65 72 72 6f 72 73 2e sing for errors.
ffd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 49 */. int objI
ffe0: 6e 64 65 78 2c 09 09 2f 2a 20 54 68 65 20 69 6e ndex,../* The in
fff0: 64 65 78 20 6f 66 20 74 68 65 20 61 74 74 72 69 dex of the attri
10000 62 75 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c bute. */. Tcl
10010 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 2c 09 _Obj *fileName,.
10020 09 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 ./* The name of
10030 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 the file (UTF-8)
10040 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
10050 20 2a 61 74 74 72 69 62 75 74 65 50 74 72 29 09 *attributePtr).
10060 2f 2a 20 54 68 65 20 61 74 74 72 69 62 75 74 65 /* The attribute
10070 20 74 6f 20 73 65 74 2e 20 2a 2f 0a 7b 0a 20 20 to set. */.{.
10080 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 73 74 Tcl_StatBuf st
10090 61 74 42 75 66 3b 0a 20 20 20 20 69 6e 74 20 72 atBuf;. int r
100a0 65 73 75 6c 74 2c 20 72 65 61 64 6f 6e 6c 79 3b esult, readonly;
100b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
100c0 2a 6e 61 74 69 76 65 3b 0a 0a 20 20 20 20 69 66 *native;.. if
100d0 20 28 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e (Tcl_GetBoolean
100e0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
100f0 61 74 74 72 69 62 75 74 65 50 74 72 2c 20 26 72 attributePtr, &r
10100 65 61 64 6f 6e 6c 79 29 20 21 3d 20 54 43 4c 5f eadonly) != TCL_
10110 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
10120 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
10130 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c result = Tcl
10140 70 4f 62 6a 53 74 61 74 28 66 69 6c 65 4e 61 6d pObjStat(fileNam
10150 65 2c 20 26 73 74 61 74 42 75 66 29 3b 0a 0a 20 e, &statBuf);..
10160 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d if (result !=
10170 20 30 29 20 7b 0a 09 69 66 20 28 69 6e 74 65 72 0) {..if (inter
10180 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 p != NULL) {..
10190 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
101a0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
101b0 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 bjPrintf(...
101c0 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 "could not read
101d0 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 20 \"%s\": %s",...
101e0 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 TclGetString(
101f0 66 69 6c 65 4e 61 6d 65 29 2c 20 54 63 6c 5f 50 fileName), Tcl_P
10200 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 osixError(interp
10210 29 29 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 )));..}..return
10220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
10230 0a 0a 20 20 20 20 69 66 20 28 72 65 61 64 6f 6e .. if (readon
10240 6c 79 29 20 7b 0a 09 73 74 61 74 42 75 66 2e 73 ly) {..statBuf.s
10250 74 5f 66 6c 61 67 73 20 7c 3d 20 55 46 5f 49 4d t_flags |= UF_IM
10260 4d 55 54 41 42 4c 45 3b 0a 20 20 20 20 7d 20 65 MUTABLE;. } e
10270 6c 73 65 20 7b 0a 09 73 74 61 74 42 75 66 2e 73 lse {..statBuf.s
10280 74 5f 66 6c 61 67 73 20 26 3d 20 7e 55 46 5f 49 t_flags &= ~UF_I
10290 4d 4d 55 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a MMUTABLE;. }.
102a0 0a 20 20 20 20 6e 61 74 69 76 65 20 3d 20 54 63 . native = Tc
102b0 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 l_FSGetNativePat
102c0 68 28 66 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 h(fileName);.
102d0 20 72 65 73 75 6c 74 20 3d 20 63 68 66 6c 61 67 result = chflag
102e0 73 28 6e 61 74 69 76 65 2c 20 73 74 61 74 42 75 s(native, statBu
102f0 66 2e 73 74 5f 66 6c 61 67 73 29 3b 09 09 2f 2a f.st_flags);../*
10300 20 49 4e 54 4c 3a 20 4e 61 74 69 76 65 2e 20 2a INTL: Native. *
10310 2f 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 /. if (result
10320 20 21 3d 20 30 29 20 7b 0a 09 69 66 20 28 69 6e != 0) {..if (in
10330 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a terp != NULL) {.
10340 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
10350 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
10360 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 l_ObjPrintf(...
10370 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 73 65 "could not se
10380 74 20 66 6c 61 67 73 20 66 6f 72 20 66 69 6c 65 t flags for file
10390 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09 09 \"%s\": %s",...
103a0 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 TclGetString
103b0 28 66 69 6c 65 4e 61 6d 65 29 2c 20 54 63 6c 5f (fileName), Tcl_
103c0 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
103d0 70 29 29 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e p)));..}..return
103e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
103f0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
10400 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a _OK;.}.#endif /*
10410 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 43 48 defined(HAVE_CH
10420 46 4c 41 47 53 29 20 26 26 20 64 65 66 69 6e 65 FLAGS) && define
10430 64 28 55 46 5f 49 4d 4d 55 54 41 42 4c 45 29 20 d(UF_IMMUTABLE)
10440 2a 2f 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c */.../*. * Local
10450 20 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20 6d Variables:. * m
10460 6f 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73 69 ode: c. * c-basi
10470 63 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 66 c-offset: 4. * f
10480 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a 20 ill-column: 78.
10490 2a 20 45 6e 64 3a 0a 20 2a 2f 0a * End:. */.