0000: 2f 2a 0a 20 2a 20 74 63 6c 57 69 6e 46 69 6c 65 /*. * tclWinFile
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 .c --. *. *.This
0020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 file contains t
0030: 65 6d 70 6f 72 61 72 79 20 77 72 61 70 70 65 72 emporary wrapper
0040: 73 20 61 72 6f 75 6e 64 20 55 4e 49 58 20 66 69 s around UNIX fi
0050: 6c 65 20 68 61 6e 64 6c 69 6e 67 0a 20 2a 09 66 le handling. *.f
0060: 75 6e 63 74 69 6f 6e 73 2e 20 54 68 65 73 65 20 unctions. These
0070: 77 72 61 70 70 65 72 73 20 6d 61 70 20 74 68 65 wrappers map the
0080: 20 55 4e 49 58 20 66 75 6e 63 74 69 6f 6e 73 20 UNIX functions
0090: 74 6f 20 57 69 6e 33 32 20 48 41 4e 44 4c 45 2d to Win32 HANDLE-
00a0: 73 74 79 6c 65 0a 20 2a 09 66 69 6c 65 73 2c 20 style. *.files,
00b0: 77 68 69 63 68 20 63 61 6e 20 62 65 20 6d 61 6e which can be man
00c0: 69 70 75 6c 61 74 65 64 20 74 68 72 6f 75 67 68 ipulated through
00d0: 20 74 68 65 20 57 69 6e 33 32 20 63 6f 6e 73 6f the Win32 conso
00e0: 6c 65 20 72 65 64 69 72 65 63 74 69 6f 6e 0a 20 le redirection.
00f0: 2a 09 69 6e 74 65 72 66 61 63 65 73 2e 0a 20 2a *.interfaces.. *
0100: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 . * Copyright (c
0110: 29 20 31 39 39 35 2d 31 39 39 38 20 53 75 6e 20 ) 1995-1998 Sun
0120: 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e Microsystems, In
0130: 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 c.. *. * See the
0140: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 file "license.t
0150: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d erms" for inform
0160: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 ation on usage a
0170: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f nd redistributio
0180: 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c n of. * this fil
0190: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 e, and for a DIS
01a0: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 CLAIMER OF ALL W
01b0: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a ARRANTIES.. */..
01c0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 57 69 6e #include "tclWin
01d0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 Int.h".#include
01e0: 22 74 63 6c 46 69 6c 65 53 79 73 74 65 6d 2e 68 "tclFileSystem.h
01f0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 69 ".#include <wini
0200: 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 octl.h>.#include
0210: 20 3c 73 68 6c 6f 62 6a 2e 68 3e 0a 23 69 6e 63 <shlobj.h>.#inc
0220: 6c 75 64 65 20 3c 6c 6d 2e 68 3e 09 09 20 20 20 lude <lm.h>..
0230: 20 20 20 20 20 2f 2a 20 46 6f 72 20 54 63 6c 70 /* For Tclp
0240: 47 65 74 55 73 65 72 48 6f 6d 65 28 29 2e 20 2a GetUserHome(). *
0250: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 75 73 65 72 /.#include <user
0260: 65 6e 76 2e 68 3e 09 09 2f 2a 20 46 6f 72 20 54 env.h>../* For T
0270: 63 6c 70 47 65 74 55 73 65 72 48 6f 6d 65 28 29 clpGetUserHome()
0280: 2e 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 . */.#include <a
0290: 63 6c 61 70 69 2e 68 3e 20 20 20 20 20 20 20 20 clapi.h>
02a0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 47 65 74 4e /* For GetN
02b0: 61 6d 65 64 53 65 63 75 72 69 74 79 49 6e 66 6f amedSecurityInfo
02c0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 4d 53 43 */..#ifdef _MSC
02d0: 5f 56 45 52 0a 23 20 20 20 70 72 61 67 6d 61 20 _VER.# pragma
02e0: 63 6f 6d 6d 65 6e 74 28 6c 69 62 2c 20 22 75 73 comment(lib, "us
02f0: 65 72 65 6e 76 2e 6c 69 62 22 29 0a 23 65 6e 64 erenv.lib").#end
0300: 69 66 0a 2f 2a 0a 20 2a 20 54 68 65 20 6e 75 6d if./*. * The num
0310: 62 65 72 20 6f 66 20 31 30 30 2d 6e 73 20 69 6e ber of 100-ns in
0320: 74 65 72 76 61 6c 73 20 62 65 74 77 65 65 6e 20 tervals between
0330: 74 68 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 the Windows syst
0340: 65 6d 20 65 70 6f 63 68 20 28 31 36 30 31 2d 30 em epoch (1601-0
0350: 31 2d 30 31 0a 20 2a 20 6f 6e 20 74 68 65 20 70 1-01. * on the p
0360: 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 roleptic Gregori
0370: 61 6e 20 63 61 6c 65 6e 64 61 72 29 20 61 6e 64 an calendar) and
0380: 20 74 68 65 20 50 6f 73 69 78 20 65 70 6f 63 68 the Posix epoch
0390: 20 28 31 39 37 30 2d 30 31 2d 30 31 29 2e 0a 20 (1970-01-01)..
03a0: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 50 4f 53 49 */..#define POSI
03b0: 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45 54 X_EPOCH_AS_FILET
03c0: 49 4d 45 09 5c 0a 09 28 28 54 63 6c 5f 57 69 64 IME.\..((Tcl_Wid
03d0: 65 49 6e 74 29 20 31 31 36 34 34 34 37 33 36 20 eInt) 116444736
03e0: 2a 20 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 * (Tcl_WideInt)
03f0: 31 30 30 30 30 30 30 30 30 30 29 0a 0a 2f 2a 0a 1000000000)../*.
0400: 20 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 * Declarations
0410: 66 6f 72 20 27 6c 69 6e 6b 27 20 72 65 6c 61 74 for 'link' relat
0420: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 ed information.
0430: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e This information
0440: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 0a 20 2a 20 should come. *
0450: 77 69 74 68 20 56 43 2b 2b 20 36 2e 30 2c 20 62 with VC++ 6.0, b
0460: 75 74 20 69 73 20 6e 6f 74 20 69 6e 20 73 6f 6d ut is not in som
0470: 65 20 6f 6c 64 65 72 20 53 44 4b 73 2e 20 49 6e e older SDKs. In
0480: 20 61 6e 79 20 63 61 73 65 20 69 74 20 69 73 20 any case it is
0490: 6e 6f 74 20 77 65 6c 6c 0a 20 2a 20 64 6f 63 75 not well. * docu
04a0: 6d 65 6e 74 65 64 2e 0a 20 2a 2f 0a 0a 23 69 66 mented.. */..#if
04b0: 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f ndef IO_REPARSE_
04c0: 54 41 47 5f 52 45 53 45 52 56 45 44 5f 4f 4e 45 TAG_RESERVED_ONE
04d0: 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 .# define IO_RE
04e0: 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 PARSE_TAG_RESERV
04f0: 45 44 5f 4f 4e 45 09 30 78 30 30 30 30 30 30 30 ED_ONE.0x0000000
0500: 30 31 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 01.#endif.#ifnde
0510: 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 f IO_REPARSE_TAG
0520: 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45 0a _RESERVED_RANGE.
0530: 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 # define IO_REP
0540: 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 45 ARSE_TAG_RESERVE
0550: 44 5f 52 41 4e 47 45 09 30 78 30 30 30 30 30 30 D_RANGE.0x000000
0560: 30 30 31 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 001.#endif.#ifnd
0570: 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 ef IO_REPARSE_TA
0580: 47 5f 56 41 4c 49 44 5f 56 41 4c 55 45 53 0a 23 G_VALID_VALUES.#
0590: 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 define IO_REPA
05a0: 52 53 45 5f 54 41 47 5f 56 41 4c 49 44 5f 56 41 RSE_TAG_VALID_VA
05b0: 4c 55 45 53 09 30 78 30 45 30 30 30 46 46 46 46 LUES.0x0E000FFFF
05c0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
05d0: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 48 IO_REPARSE_TAG_H
05e0: 53 4d 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f SM.# define IO_
05f0: 52 45 50 41 52 53 45 5f 54 41 47 5f 48 53 4d 09 REPARSE_TAG_HSM.
0600: 09 30 78 30 43 30 30 30 30 30 30 34 0a 23 65 6e .0x0C0000004.#en
0610: 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 dif.#ifndef IO_R
0620: 45 50 41 52 53 45 5f 54 41 47 5f 4e 53 53 0a 23 EPARSE_TAG_NSS.#
0630: 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 define IO_REPA
0640: 52 53 45 5f 54 41 47 5f 4e 53 53 09 09 30 78 30 RSE_TAG_NSS..0x0
0650: 38 30 30 30 30 30 30 35 0a 23 65 6e 64 69 66 0a 80000005.#endif.
0660: 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 #ifndef IO_REPAR
0670: 53 45 5f 54 41 47 5f 4e 53 53 52 45 43 4f 56 45 SE_TAG_NSSRECOVE
0680: 52 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 R.# define IO_R
0690: 45 50 41 52 53 45 5f 54 41 47 5f 4e 53 53 52 45 EPARSE_TAG_NSSRE
06a0: 43 4f 56 45 52 09 30 78 30 38 30 30 30 30 30 30 COVER.0x08000000
06b0: 36 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 6.#endif.#ifndef
06c0: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f IO_REPARSE_TAG_
06d0: 53 49 53 0a 23 20 20 64 65 66 69 6e 65 20 49 4f SIS.# define IO
06e0: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 53 49 53 _REPARSE_TAG_SIS
06f0: 09 09 30 78 30 38 30 30 30 30 30 30 37 0a 23 65 ..0x080000007.#e
0700: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f ndif.#ifndef IO_
0710: 52 45 50 41 52 53 45 5f 54 41 47 5f 44 46 53 0a REPARSE_TAG_DFS.
0720: 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 # define IO_REP
0730: 41 52 53 45 5f 54 41 47 5f 44 46 53 09 09 30 78 ARSE_TAG_DFS..0x
0740: 30 38 30 30 30 30 30 30 38 0a 23 65 6e 64 69 66 080000008.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 ..#ifndef IO_REP
0760: 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 45 ARSE_TAG_RESERVE
0770: 44 5f 5a 45 52 4f 0a 23 20 20 64 65 66 69 6e 65 D_ZERO.# define
0780: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f IO_REPARSE_TAG_
0790: 52 45 53 45 52 56 45 44 5f 5a 45 52 4f 09 30 78 RESERVED_ZERO.0x
07a0: 30 30 30 30 30 30 30 30 0a 23 65 6e 64 69 66 0a 00000000.#endif.
07b0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41 #ifndef FILE_FLA
07c0: 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f 50 G_OPEN_REPARSE_P
07d0: 4f 49 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 46 OINT.# define F
07e0: 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52 45 ILE_FLAG_OPEN_RE
07f0: 50 41 52 53 45 5f 50 4f 49 4e 54 09 30 78 30 30 PARSE_POINT.0x00
0800: 32 30 30 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 200000.#endif.#i
0810: 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 fndef IO_REPARSE
0820: 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54 _TAG_MOUNT_POINT
0830: 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 .# define IO_RE
0840: 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f PARSE_TAG_MOUNT_
0850: 50 4f 49 4e 54 09 30 78 41 30 30 30 30 30 30 33 POINT.0xA0000003
0860: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
0870: 49 73 52 65 70 61 72 73 65 54 61 67 56 61 6c 69 IsReparseTagVali
0880: 64 0a 23 20 20 64 65 66 69 6e 65 20 49 73 52 65 d.# define IsRe
0890: 70 61 72 73 65 54 61 67 56 61 6c 69 64 28 78 29 parseTagValid(x)
08a0: 20 5c 0a 20 20 20 20 28 21 28 28 78 29 26 7e 49 \. (!((x)&~I
08b0: 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 56 41 O_REPARSE_TAG_VA
08c0: 4c 49 44 5f 56 41 4c 55 45 53 29 26 26 28 28 78 LID_VALUES)&&((x
08d0: 29 3e 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 )>IO_REPARSE_TAG
08e0: 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45 29 _RESERVED_RANGE)
08f0: 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 ).#endif.#ifndef
0900: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f IO_REPARSE_TAG_
0910: 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 0a 23 20 SYMBOLIC_LINK.#
0920: 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 define IO_REPAR
0930: 53 45 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43 5f SE_TAG_SYMBOLIC_
0940: 4c 49 4e 4b 09 49 4f 5f 52 45 50 41 52 53 45 5f LINK.IO_REPARSE_
0950: 54 41 47 5f 52 45 53 45 52 56 45 44 5f 5a 45 52 TAG_RESERVED_ZER
0960: 4f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 O.#endif.#ifndef
0970: 20 46 49 4c 45 5f 53 50 45 43 49 41 4c 5f 41 43 FILE_SPECIAL_AC
0980: 43 45 53 53 0a 23 20 20 64 65 66 69 6e 65 20 46 CESS.# define F
0990: 49 4c 45 5f 53 50 45 43 49 41 4c 5f 41 43 43 45 ILE_SPECIAL_ACCE
09a0: 53 53 09 09 28 46 49 4c 45 5f 41 4e 59 5f 41 43 SS..(FILE_ANY_AC
09b0: 43 45 53 53 29 0a 23 65 6e 64 69 66 0a 23 69 66 CESS).#endif.#if
09c0: 6e 64 65 66 20 46 53 43 54 4c 5f 53 45 54 5f 52 ndef FSCTL_SET_R
09d0: 45 50 41 52 53 45 5f 50 4f 49 4e 54 0a 23 20 20 EPARSE_POINT.#
09e0: 64 65 66 69 6e 65 20 46 53 43 54 4c 5f 53 45 54 define FSCTL_SET
09f0: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 5c _REPARSE_POINT \
0a00: 0a 20 20 20 20 43 54 4c 5f 43 4f 44 45 28 46 49 . CTL_CODE(FI
0a10: 4c 45 5f 44 45 56 49 43 45 5f 46 49 4c 45 5f 53 LE_DEVICE_FILE_S
0a20: 59 53 54 45 4d 2c 20 34 31 2c 20 4d 45 54 48 4f YSTEM, 41, METHO
0a30: 44 5f 42 55 46 46 45 52 45 44 2c 20 46 49 4c 45 D_BUFFERED, FILE
0a40: 5f 53 50 45 43 49 41 4c 5f 41 43 43 45 53 53 29 _SPECIAL_ACCESS)
0a50: 0a 23 20 20 64 65 66 69 6e 65 20 46 53 43 54 4c .# define FSCTL
0a60: 5f 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 _GET_REPARSE_POI
0a70: 4e 54 20 5c 0a 20 20 20 20 43 54 4c 5f 43 4f 44 NT \. CTL_COD
0a80: 45 28 46 49 4c 45 5f 44 45 56 49 43 45 5f 46 49 E(FILE_DEVICE_FI
0a90: 4c 45 5f 53 59 53 54 45 4d 2c 20 34 32 2c 20 4d LE_SYSTEM, 42, M
0aa0: 45 54 48 4f 44 5f 42 55 46 46 45 52 45 44 2c 20 ETHOD_BUFFERED,
0ab0: 46 49 4c 45 5f 41 4e 59 5f 41 43 43 45 53 53 29 FILE_ANY_ACCESS)
0ac0: 0a 23 20 20 64 65 66 69 6e 65 20 46 53 43 54 4c .# define FSCTL
0ad0: 5f 44 45 4c 45 54 45 5f 52 45 50 41 52 53 45 5f _DELETE_REPARSE_
0ae0: 50 4f 49 4e 54 20 5c 0a 20 20 20 20 43 54 4c 5f POINT \. CTL_
0af0: 43 4f 44 45 28 46 49 4c 45 5f 44 45 56 49 43 45 CODE(FILE_DEVICE
0b00: 5f 46 49 4c 45 5f 53 59 53 54 45 4d 2c 20 34 33 _FILE_SYSTEM, 43
0b10: 2c 20 4d 45 54 48 4f 44 5f 42 55 46 46 45 52 45 , METHOD_BUFFERE
0b20: 44 2c 20 46 49 4c 45 5f 53 50 45 43 49 41 4c 5f D, FILE_SPECIAL_
0b30: 41 43 43 45 53 53 29 0a 23 65 6e 64 69 66 0a 23 ACCESS).#endif.#
0b40: 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 ifndef INVALID_F
0b50: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 ILE_ATTRIBUTES.#
0b60: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 define INVALID_F
0b70: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 09 09 ILE_ATTRIBUTES..
0b80: 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 ((DWORD)-1).#end
0b90: 69 66 0a 0a 2f 2a 0a 20 2a 20 4d 61 78 69 6d 75 if../*. * Maximu
0ba0: 6d 20 72 65 70 61 72 73 65 20 62 75 66 66 65 72 m reparse buffer
0bb0: 20 69 6e 66 6f 20 73 69 7a 65 2e 20 54 68 65 20 info size. The
0bc0: 6d 61 78 20 75 73 65 72 20 64 65 66 69 6e 65 64 max user defined
0bd0: 20 72 65 70 61 72 73 65 20 64 61 74 61 20 69 73 reparse data is
0be0: 0a 20 2a 20 31 36 4b 42 2c 20 70 6c 75 73 20 74 . * 16KB, plus t
0bf0: 68 65 72 65 27 73 20 61 20 68 65 61 64 65 72 2e here's a header.
0c00: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4d 41 . */..#define MA
0c10: 58 5f 52 45 50 41 52 53 45 5f 53 49 5a 45 09 09 X_REPARSE_SIZE..
0c20: 31 37 30 30 30 0a 0a 2f 2a 0a 20 2a 20 55 6e 64 17000../*. * Und
0c30: 6f 63 75 6d 65 6e 74 65 64 20 52 45 50 41 52 53 ocumented REPARS
0c40: 45 5f 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 E_MOUNTPOINT_HEA
0c50: 44 45 52 5f 53 49 5a 45 20 73 74 72 75 63 74 75 DER_SIZE structu
0c60: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 54 re definition. T
0c70: 68 69 73 20 69 73 0a 20 2a 20 66 6f 75 6e 64 20 his is. * found
0c80: 69 6e 20 77 69 6e 6e 74 2e 68 2e 0a 20 2a 0a 20 in winnt.h.. *.
0c90: 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 63 61 75 * IMPORTANT: cau
0ca0: 74 69 6f 6e 20 77 68 65 6e 20 75 73 69 6e 67 20 tion when using
0cb0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2c 20 this structure,
0cc0: 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61 6c since the actual
0cd0: 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 20 75 structures. * u
0ce0: 73 65 64 20 77 69 6c 6c 20 77 61 6e 74 20 74 6f sed will want to
0cf0: 20 73 74 6f 72 65 20 61 20 66 75 6c 6c 20 70 61 store a full pa
0d00: 74 68 20 69 6e 20 74 68 65 20 27 50 61 74 68 42 th in the 'PathB
0d10: 75 66 66 65 72 27 20 66 69 65 6c 64 2c 20 62 75 uffer' field, bu
0d20: 74 20 74 68 65 72 65 0a 20 2a 20 69 73 6e 27 74 t there. * isn't
0d30: 20 72 6f 6f 6d 20 28 74 68 65 72 65 27 73 20 6f room (there's o
0d40: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 57 43 48 nly a single WCH
0d50: 41 52 21 29 2e 20 54 68 65 72 65 66 6f 72 65 20 AR!). Therefore
0d60: 6f 6e 65 20 6d 75 73 74 20 61 72 74 69 66 69 63 one must artific
0d70: 69 61 6c 6c 79 0a 20 2a 20 63 72 65 61 74 65 20 ially. * create
0d80: 61 20 6c 61 72 67 65 72 20 73 70 61 63 65 20 6f a larger space o
0d90: 66 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 f memory and the
0da0: 6e 20 63 61 73 74 20 69 74 20 74 6f 20 74 68 69 n cast it to thi
0db0: 73 20 74 79 70 65 2e 20 57 65 20 75 73 65 20 74 s type. We use t
0dc0: 68 65 0a 20 2a 20 27 44 55 4d 4d 59 5f 52 45 50 he. * 'DUMMY_REP
0dd0: 41 52 53 45 5f 42 55 46 46 45 52 27 20 73 74 72 ARSE_BUFFER' str
0de0: 75 63 74 20 6a 75 73 74 20 62 65 6c 6f 77 20 74 uct just below t
0df0: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 o deal with this
0e00: 20 70 72 6f 62 6c 65 6d 2e 0a 20 2a 2f 0a 0a 23 problem.. */..#
0e10: 64 65 66 69 6e 65 20 52 45 50 41 52 53 45 5f 4d define REPARSE_M
0e20: 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 52 OUNTPOINT_HEADER
0e30: 5f 53 49 5a 45 09 20 38 0a 23 69 66 6e 64 65 66 _SIZE. 8.#ifndef
0e40: 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 REPARSE_DATA_BU
0e50: 46 46 45 52 5f 48 45 41 44 45 52 5f 53 49 5a 45 FFER_HEADER_SIZE
0e60: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
0e70: 5f 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 _REPARSE_DATA_BU
0e80: 46 46 45 52 20 7b 0a 20 20 20 20 44 57 4f 52 44 FFER {. DWORD
0e90: 20 52 65 70 61 72 73 65 54 61 67 3b 0a 20 20 20 ReparseTag;.
0ea0: 20 57 4f 52 44 20 52 65 70 61 72 73 65 44 61 74 WORD ReparseDat
0eb0: 61 4c 65 6e 67 74 68 3b 0a 20 20 20 20 57 4f 52 aLength;. WOR
0ec0: 44 20 52 65 73 65 72 76 65 64 3b 0a 20 20 20 20 D Reserved;.
0ed0: 75 6e 69 6f 6e 20 7b 0a 09 73 74 72 75 63 74 20 union {..struct
0ee0: 7b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 62 73 {.. WORD Subs
0ef0: 74 69 74 75 74 65 4e 61 6d 65 4f 66 66 73 65 74 tituteNameOffset
0f00: 3b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 62 73 ;.. WORD Subs
0f10: 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 tituteNameLength
0f20: 3b 0a 09 20 20 20 20 57 4f 52 44 20 50 72 69 6e ;.. WORD Prin
0f30: 74 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20 20 tNameOffset;..
0f40: 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d 65 WORD PrintName
0f50: 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 55 4c 4f Length;.. ULO
0f60: 4e 47 20 46 6c 61 67 73 3b 0a 09 20 20 20 20 57 NG Flags;.. W
0f70: 43 48 41 52 20 50 61 74 68 42 75 66 66 65 72 5b CHAR PathBuffer[
0f80: 31 5d 3b 0a 09 7d 20 53 79 6d 62 6f 6c 69 63 4c 1];..} SymbolicL
0f90: 69 6e 6b 52 65 70 61 72 73 65 42 75 66 66 65 72 inkReparseBuffer
0fa0: 3b 0a 09 73 74 72 75 63 74 20 7b 0a 09 20 20 20 ;..struct {..
0fb0: 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74 65 WORD Substitute
0fc0: 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20 20 20 NameOffset;..
0fd0: 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74 65 WORD Substitute
0fe0: 4e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20 NameLength;..
0ff0: 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d 65 4f WORD PrintNameO
1000: 66 66 73 65 74 3b 0a 09 20 20 20 20 57 4f 52 44 ffset;.. WORD
1010: 20 50 72 69 6e 74 4e 61 6d 65 4c 65 6e 67 74 68 PrintNameLength
1020: 3b 0a 09 20 20 20 20 57 43 48 41 52 20 50 61 74 ;.. WCHAR Pat
1030: 68 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20 4d hBuffer[1];..} M
1040: 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 ountPointReparse
1050: 42 75 66 66 65 72 3b 0a 09 73 74 72 75 63 74 20 Buffer;..struct
1060: 7b 0a 09 20 20 20 20 42 59 54 45 20 44 61 74 61 {.. BYTE Data
1070: 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20 47 65 Buffer[1];..} Ge
1080: 6e 65 72 69 63 52 65 70 61 72 73 65 42 75 66 66 nericReparseBuff
1090: 65 72 3b 0a 20 20 20 20 7d 3b 0a 7d 20 52 45 50 er;. };.} REP
10a0: 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 ARSE_DATA_BUFFER
10b0: 3b 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64 65 ;.#endif..typede
10c0: 66 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 52 f struct {. R
10d0: 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 EPARSE_DATA_BUFF
10e0: 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20 57 43 ER dummy;. WC
10f0: 48 41 52 20 64 75 6d 6d 79 42 75 66 5b 4d 41 58 HAR dummyBuf[MAX
1100: 5f 50 41 54 48 20 2a 20 33 5d 3b 0a 7d 20 44 55 _PATH * 3];.} DU
1110: 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 46 MMY_REPARSE_BUFF
1120: 45 52 3b 0a 0a 2f 2a 0a 20 2a 20 4f 74 68 65 72 ER;../*. * Other
1130: 20 74 79 70 65 64 65 66 73 20 72 65 71 75 69 72 typedefs requir
1140: 65 64 20 62 79 20 74 68 69 73 20 63 6f 64 65 2e ed by this code.
1150: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 74 69 6d . */..static tim
1160: 65 5f 74 09 09 54 6f 43 54 69 6d 65 28 46 49 4c e_t..ToCTime(FIL
1170: 45 54 49 4d 45 20 66 69 6c 65 54 69 6d 65 29 3b ETIME fileTime);
1180: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 46 72 .static void..Fr
1190: 6f 6d 43 54 69 6d 65 28 74 69 6d 65 5f 74 20 70 omCTime(time_t p
11a0: 6f 73 69 78 54 69 6d 65 2c 20 46 49 4c 45 54 49 osixTime, FILETI
11b0: 4d 45 20 2a 66 69 6c 65 54 69 6d 65 29 3b 0a 0a ME *fileTime);..
11c0: 2f 2a 0a 20 2a 20 44 65 63 6c 61 72 61 74 69 6f /*. * Declaratio
11d0: 6e 73 20 66 6f 72 20 6c 6f 63 61 6c 20 66 75 6e ns for local fun
11e0: 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 69 ctions defined i
11f0: 6e 20 74 68 69 73 20 66 69 6c 65 3a 0a 20 2a 2f n this file:. */
1200: 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 ..static int..Na
1210: 74 69 76 65 41 63 63 65 73 73 28 63 6f 6e 73 74 tiveAccess(const
1220: 20 57 43 48 41 52 20 2a 70 61 74 68 2c 20 69 6e WCHAR *path, in
1230: 74 20 6d 6f 64 65 29 3b 0a 73 74 61 74 69 63 20 t mode);.static
1240: 69 6e 74 09 09 4e 61 74 69 76 65 44 65 76 28 63 int..NativeDev(c
1250: 6f 6e 73 74 20 57 43 48 41 52 20 2a 70 61 74 68 onst WCHAR *path
1260: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e );.static int..N
1270: 61 74 69 76 65 53 74 61 74 28 63 6f 6e 73 74 20 ativeStat(const
1280: 57 43 48 41 52 20 2a 70 61 74 68 2c 20 54 63 6c WCHAR *path, Tcl
1290: 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 50 74 _StatBuf *statPt
12a0: 72 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 63 68 r,.... int ch
12b0: 65 63 6b 4c 69 6e 6b 73 29 3b 0a 73 74 61 74 69 eckLinks);.stati
12c0: 63 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 c unsigned short
12d0: 09 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28 .NativeStatMode(
12e0: 44 57 4f 52 44 20 61 74 74 72 2c 20 69 6e 74 20 DWORD attr, int
12f0: 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a 09 09 09 20 checkLinks,....
1300: 20 20 20 69 6e 74 20 69 73 45 78 65 63 29 3b 0a int isExec);.
1310: 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74 69 static int..Nati
1320: 76 65 49 73 45 78 65 63 28 63 6f 6e 73 74 20 57 veIsExec(const W
1330: 43 48 41 52 20 2a 70 61 74 68 29 3b 0a 73 74 61 CHAR *path);.sta
1340: 74 69 63 20 69 6e 74 09 09 4e 61 74 69 76 65 52 tic int..NativeR
1350: 65 61 64 52 65 70 61 72 73 65 28 63 6f 6e 73 74 eadReparse(const
1360: 20 57 43 48 41 52 20 2a 4c 69 6e 6b 44 69 72 65 WCHAR *LinkDire
1370: 63 74 6f 72 79 2c 0a 09 09 09 20 20 20 20 52 45 ctory,.... RE
1380: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 PARSE_DATA_BUFFE
1390: 52 20 2a 62 75 66 66 65 72 2c 20 44 57 4f 52 44 R *buffer, DWORD
13a0: 20 64 65 73 69 72 65 64 41 63 63 65 73 73 29 3b desiredAccess);
13b0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74 .static int..Nat
13c0: 69 76 65 57 72 69 74 65 52 65 70 61 72 73 65 28 iveWriteReparse(
13d0: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 4c 69 6e const WCHAR *Lin
13e0: 6b 44 69 72 65 63 74 6f 72 79 2c 0a 09 09 09 20 kDirectory,....
13f0: 20 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f REPARSE_DATA_
1400: 42 55 46 46 45 52 20 2a 62 75 66 66 65 72 29 3b BUFFER *buffer);
1410: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74 .static int..Nat
1420: 69 76 65 4d 61 74 63 68 54 79 70 65 28 69 6e 74 iveMatchType(int
1430: 20 69 73 44 72 69 76 65 2c 20 44 57 4f 52 44 20 isDrive, DWORD
1440: 61 74 74 72 2c 0a 09 09 09 20 20 20 20 63 6f 6e attr,.... con
1450: 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 st WCHAR *native
1460: 4e 61 6d 65 2c 20 54 63 6c 5f 47 6c 6f 62 54 79 Name, Tcl_GlobTy
1470: 70 65 44 61 74 61 20 2a 74 79 70 65 73 29 3b 0a peData *types);.
1480: 73 74 61 74 69 63 20 69 6e 74 09 09 57 69 6e 49 static int..WinI
1490: 73 44 72 69 76 65 28 63 6f 6e 73 74 20 63 68 61 sDrive(const cha
14a0: 72 20 2a 6e 61 6d 65 2c 20 73 69 7a 65 5f 74 20 r *name, size_t
14b0: 6e 61 6d 65 4c 65 6e 29 3b 0a 73 74 61 74 69 63 nameLen);.static
14c0: 20 69 6e 74 09 09 57 69 6e 49 73 52 65 73 65 72 int..WinIsReser
14d0: 76 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ved(const char *
14e0: 70 61 74 68 29 3b 0a 73 74 61 74 69 63 20 54 63 path);.static Tc
14f0: 6c 5f 4f 62 6a 20 2a 09 57 69 6e 52 65 61 64 4c l_Obj *.WinReadL
1500: 69 6e 6b 28 63 6f 6e 73 74 20 57 43 48 41 52 20 ink(const WCHAR
1510: 2a 4c 69 6e 6b 53 6f 75 72 63 65 29 3b 0a 73 74 *LinkSource);.st
1520: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 09 57 atic Tcl_Obj *.W
1530: 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 65 63 74 inReadLinkDirect
1540: 6f 72 79 28 63 6f 6e 73 74 20 57 43 48 41 52 20 ory(const WCHAR
1550: 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 29 3b *LinkDirectory);
1560: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 57 69 6e .static int..Win
1570: 4c 69 6e 6b 28 63 6f 6e 73 74 20 57 43 48 41 52 Link(const WCHAR
1580: 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 2c 0a 09 09 *LinkSource,...
1590: 09 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 . const WCHAR
15a0: 20 2a 4c 69 6e 6b 54 61 72 67 65 74 2c 20 69 6e *LinkTarget, in
15b0: 74 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 3b 0a 73 t linkAction);.s
15c0: 74 61 74 69 63 20 69 6e 74 09 09 57 69 6e 53 79 tatic int..WinSy
15d0: 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 63 mLinkDirectory(c
15e0: 6f 6e 73 74 20 57 43 48 41 52 20 2a 4c 69 6e 6b onst WCHAR *Link
15f0: 44 69 72 65 63 74 6f 72 79 2c 0a 09 09 09 20 20 Directory,....
1600: 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 4c const WCHAR *L
1610: 69 6e 6b 54 61 72 67 65 74 29 3b 0a 4d 4f 44 55 inkTarget);.MODU
1620: 4c 45 5f 53 43 4f 50 45 20 54 43 4c 5f 4e 4f 52 LE_SCOPE TCL_NOR
1630: 45 54 55 52 4e 20 76 6f 69 64 09 74 63 6c 57 69 ETURN void.tclWi
1640: 6e 44 65 62 75 67 50 61 6e 69 63 28 63 6f 6e 73 nDebugPanic(cons
1650: 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 t char *format,
1660: 2e 2e 2e 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d ...);.../*. *---
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16b0: 2d 0a 20 2a 0a 20 2a 20 57 69 6e 4c 69 6e 6b 20 -. *. * WinLink
16c0: 2d 2d 0a 20 2a 0a 20 2a 09 4d 61 6b 65 20 61 20 --. *. *.Make a
16d0: 6c 69 6e 6b 20 66 72 6f 6d 20 73 6f 75 72 63 65 link from source
16e0: 20 74 6f 20 74 61 72 67 65 74 2e 0a 20 2a 0a 20 to target.. *.
16f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
1740: 63 20 69 6e 74 0a 57 69 6e 4c 69 6e 6b 28 0a 20 c int.WinLink(.
1750: 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a const WCHAR *
1760: 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 0a linkSourcePath,.
1770: 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 const WCHAR
1780: 2a 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 2c *linkTargetPath,
1790: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 6b 41 63 74 . int linkAct
17a0: 69 6f 6e 29 0a 7b 0a 20 20 20 20 57 43 48 41 52 ion).{. WCHAR
17b0: 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 5b 4d 41 tempFileName[MA
17c0: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 57 43 48 X_PATH];. WCH
17d0: 41 52 20 2a 74 65 6d 70 46 69 6c 65 50 61 72 74 AR *tempFilePart
17e0: 3b 0a 20 20 20 20 44 57 4f 52 44 20 61 74 74 72 ;. DWORD attr
17f0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
1800: 20 47 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 Get the full pa
1810: 74 68 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 th referenced by
1820: 20 74 68 65 20 74 61 72 67 65 74 2e 0a 20 20 20 the target..
1830: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 47 */.. if (!G
1840: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 etFullPathNameW(
1850: 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 2c 20 linkTargetPath,
1860: 4d 41 58 5f 50 41 54 48 2c 20 74 65 6d 70 46 69 MAX_PATH, tempFi
1870: 6c 65 4e 61 6d 65 2c 0a 09 20 20 20 20 26 74 65 leName,.. &te
1880: 6d 70 46 69 6c 65 50 61 72 74 29 29 20 7b 0a 09 mpFilePart)) {..
1890: 2f 2a 0a 09 20 2a 20 49 6e 76 61 6c 69 64 20 66 /*.. * Invalid f
18a0: 69 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 ile... */...TclW
18b0: 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 inConvertError(G
18c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a etLastError());.
18d0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 .return -1;.
18e0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
18f0: 20 4d 61 6b 65 20 73 75 72 65 20 73 6f 75 72 63 Make sure sourc
1900: 65 20 66 69 6c 65 20 64 6f 65 73 6e 27 74 20 65 e file doesn't e
1910: 78 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 xist.. */..
1920: 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c attr = GetFil
1930: 65 41 74 74 72 69 62 75 74 65 73 57 28 6c 69 6e eAttributesW(lin
1940: 6b 53 6f 75 72 63 65 50 61 74 68 29 3b 0a 20 20 kSourcePath);.
1950: 20 20 69 66 20 28 61 74 74 72 20 21 3d 20 49 4e if (attr != IN
1960: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 VALID_FILE_ATTRI
1970: 42 55 54 45 53 29 20 7b 0a 09 54 63 6c 5f 53 65 BUTES) {..Tcl_Se
1980: 74 45 72 72 6e 6f 28 45 45 58 49 53 54 29 3b 0a tErrno(EEXIST);.
1990: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 .return -1;.
19a0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
19b0: 20 47 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 Get the full pa
19c0: 74 68 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 th referenced by
19d0: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 the source file
19e0: 2f 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 /directory..
19f0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 47 65 */.. if (!Ge
1a00: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 6c tFullPathNameW(l
1a10: 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 20 4d inkSourcePath, M
1a20: 41 58 5f 50 41 54 48 2c 20 74 65 6d 70 46 69 6c AX_PATH, tempFil
1a30: 65 4e 61 6d 65 2c 0a 09 20 20 20 20 26 74 65 6d eName,.. &tem
1a40: 70 46 69 6c 65 50 61 72 74 29 29 20 7b 0a 09 2f pFilePart)) {../
1a50: 2a 0a 09 20 2a 20 49 6e 76 61 6c 69 64 20 66 69 *.. * Invalid fi
1a60: 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 le... */...TclWi
1a70: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 nConvertError(Ge
1a80: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 tLastError());..
1a90: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d return -1;. }
1aa0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
1ab0: 43 68 65 63 6b 20 74 68 65 20 74 61 72 67 65 74 Check the target
1ac0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 61 .. */.. a
1ad0: 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 ttr = GetFileAtt
1ae0: 72 69 62 75 74 65 73 57 28 6c 69 6e 6b 54 61 72 ributesW(linkTar
1af0: 67 65 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 getPath);. if
1b00: 20 28 61 74 74 72 20 3d 3d 20 49 4e 56 41 4c 49 (attr == INVALI
1b10: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 D_FILE_ATTRIBUTE
1b20: 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 S) {../*.. * The
1b30: 20 74 61 72 67 65 74 20 64 6f 65 73 6e 27 74 20 target doesn't
1b40: 65 78 69 73 74 2e 0a 09 20 2a 2f 0a 0a 09 54 63 exist... */...Tc
1b50: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 lWinConvertError
1b60: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 (GetLastError())
1b70: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1b80: 28 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 ((attr & FILE_AT
1b90: 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 TRIBUTE_DIRECTOR
1ba0: 59 29 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 Y) == 0) {../*..
1bb0: 20 2a 20 49 74 20 69 73 20 61 20 66 69 6c 65 2e * It is a file.
1bc0: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 6c 69 6e 6b .. */...if (link
1bd0: 41 63 74 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 Action & TCL_CRE
1be0: 41 54 45 5f 48 41 52 44 5f 4c 49 4e 4b 29 20 7b ATE_HARD_LINK) {
1bf0: 0a 09 20 20 20 20 69 66 20 28 43 72 65 61 74 65 .. if (Create
1c00: 48 61 72 64 4c 69 6e 6b 57 28 6c 69 6e 6b 53 6f HardLinkW(linkSo
1c10: 75 72 63 65 50 61 74 68 2c 20 6c 69 6e 6b 54 61 urcePath, linkTa
1c20: 72 67 65 74 50 61 74 68 2c 20 4e 55 4c 4c 29 29 rgetPath, NULL))
1c30: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 53 75 63 {.../*... * Suc
1c40: 63 65 73 73 21 0a 09 09 20 2a 2f 0a 0a 09 09 72 cess!... */....r
1c50: 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a eturn 0;.. }.
1c60: 0a 09 20 20 20 20 54 63 6c 57 69 6e 43 6f 6e 76 .. TclWinConv
1c70: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 ertError(GetLast
1c80: 45 72 72 6f 72 28 29 29 3b 0a 09 7d 20 65 6c 73 Error());..} els
1c90: 65 20 69 66 20 28 6c 69 6e 6b 41 63 74 69 6f 6e e if (linkAction
1ca0: 20 26 20 54 43 4c 5f 43 52 45 41 54 45 5f 53 59 & TCL_CREATE_SY
1cb0: 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 MBOLIC_LINK) {..
1cc0: 20 20 20 20 69 66 20 28 21 74 63 6c 57 69 6e 50 if (!tclWinP
1cd0: 72 6f 63 73 2e 63 72 65 61 74 65 53 79 6d 62 6f rocs.createSymbo
1ce0: 6c 69 63 4c 69 6e 6b 29 20 7b 0a 09 09 2f 2a 0a licLink) {.../*.
1cf0: 09 09 20 2a 20 43 61 6e 27 74 20 73 79 6d 6c 69 .. * Can't symli
1d00: 6e 6b 20 66 69 6c 65 73 2e 0a 09 09 20 2a 2f 0a nk files.... */.
1d10: 09 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 ..Tcl_SetErrno(E
1d20: 49 4e 56 41 4c 29 3b 0a 09 20 20 20 20 7d 20 65 INVAL);.. } e
1d30: 6c 73 65 20 69 66 20 28 74 63 6c 57 69 6e 50 72 lse if (tclWinPr
1d40: 6f 63 73 2e 63 72 65 61 74 65 53 79 6d 62 6f 6c ocs.createSymbol
1d50: 69 63 4c 69 6e 6b 28 6c 69 6e 6b 53 6f 75 72 63 icLink(linkSourc
1d60: 65 50 61 74 68 2c 20 6c 69 6e 6b 54 61 72 67 65 ePath, linkTarge
1d70: 74 50 61 74 68 2c 0a 09 09 20 20 20 20 30 78 32 tPath,... 0x2
1d80: 20 2f 2a 20 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e /* SYMBOLIC_LIN
1d90: 4b 5f 46 4c 41 47 5f 41 4c 4c 4f 57 5f 55 4e 50 K_FLAG_ALLOW_UNP
1da0: 52 49 56 49 4c 45 47 45 44 5f 43 52 45 41 54 45 RIVILEGED_CREATE
1db0: 20 2a 2f 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 */)) {.../*...
1dc0: 2a 20 53 75 63 63 65 73 73 21 0a 09 09 20 2a 2f * Success!... */
1dd0: 0a 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 ....return 0;..
1de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 63 } else {...Tc
1df0: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 lWinConvertError
1e00: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 (GetLastError())
1e10: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 ;.. }..} else
1e20: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 {.. Tcl_SetE
1e30: 72 72 6e 6f 28 45 4e 4f 44 45 56 29 3b 0a 09 7d rrno(ENODEV);..}
1e40: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
1e50: 2a 0a 09 20 2a 20 57 65 27 76 65 20 67 6f 74 20 *.. * We've got
1e60: 61 20 64 69 72 65 63 74 6f 72 79 2e 20 4e 6f 77 a directory. Now
1e70: 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 20 77 check whether w
1e80: 68 61 74 20 77 65 27 72 65 20 74 72 79 69 6e 67 hat we're trying
1e90: 20 74 6f 20 64 6f 20 69 73 0a 09 20 2a 20 72 65 to do is.. * re
1ea0: 61 73 6f 6e 61 62 6c 65 2e 0a 09 20 2a 2f 0a 0a asonable... */..
1eb0: 09 69 66 20 28 6c 69 6e 6b 41 63 74 69 6f 6e 20 .if (linkAction
1ec0: 26 20 54 43 4c 5f 43 52 45 41 54 45 5f 53 59 4d & TCL_CREATE_SYM
1ed0: 42 4f 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 20 BOLIC_LINK) {..
1ee0: 20 20 20 72 65 74 75 72 6e 20 57 69 6e 53 79 6d return WinSym
1ef0: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 6c 69 LinkDirectory(li
1f00: 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 20 6c 69 nkSourcePath, li
1f10: 6e 6b 54 61 72 67 65 74 50 61 74 68 29 3b 0a 0a nkTargetPath);..
1f20: 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 6b .} else if (link
1f30: 41 63 74 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 Action & TCL_CRE
1f40: 41 54 45 5f 48 41 52 44 5f 4c 49 4e 4b 29 20 7b ATE_HARD_LINK) {
1f50: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
1f60: 20 43 61 6e 27 74 20 68 61 72 64 20 6c 69 6e 6b Can't hard link
1f70: 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0a 09 20 directories...
1f80: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c */... Tcl
1f90: 5f 53 65 74 45 72 72 6e 6f 28 45 49 53 44 49 52 _SetErrno(EISDIR
1fa0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
1fb0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 Tcl_SetErrno(E
1fc0: 4e 4f 44 45 56 29 3b 0a 09 7d 0a 20 20 20 20 7d NODEV);..}. }
1fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
1fe0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2030: 0a 20 2a 20 57 69 6e 52 65 61 64 4c 69 6e 6b 20 . * WinReadLink
2040: 2d 2d 0a 20 2a 0a 20 2a 09 57 68 61 74 20 64 6f --. *. *.What do
2050: 65 73 20 27 4c 69 6e 6b 53 6f 75 72 63 65 27 20 es 'LinkSource'
2060: 70 6f 69 6e 74 20 74 6f 3f 0a 20 2a 0a 20 2a 2d point to?. *. *-
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20b0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
20c0: 54 63 6c 5f 4f 62 6a 20 2a 0a 57 69 6e 52 65 61 Tcl_Obj *.WinRea
20d0: 64 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74 dLink(. const
20e0: 20 57 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72 WCHAR *linkSour
20f0: 63 65 50 61 74 68 29 0a 7b 0a 20 20 20 20 57 43 cePath).{. WC
2100: 48 41 52 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 HAR tempFileName
2110: 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 [MAX_PATH];.
2120: 57 43 48 41 52 20 2a 74 65 6d 70 46 69 6c 65 50 WCHAR *tempFileP
2130: 61 72 74 3b 0a 20 20 20 20 44 57 4f 52 44 20 61 art;. DWORD a
2140: 74 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 ttr;.. /*.
2150: 20 20 2a 20 47 65 74 20 74 68 65 20 66 75 6c 6c * Get the full
2160: 20 70 61 74 68 20 72 65 66 65 72 65 6e 63 65 64 path referenced
2170: 20 62 79 20 74 68 65 20 74 61 72 67 65 74 2e 0a by the target..
2180: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 */.. if
2190: 28 21 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d (!GetFullPathNam
21a0: 65 57 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 eW(linkSourcePat
21b0: 68 2c 20 4d 41 58 5f 50 41 54 48 2c 20 74 65 6d h, MAX_PATH, tem
21c0: 70 46 69 6c 65 4e 61 6d 65 2c 0a 09 20 20 20 20 pFileName,..
21d0: 26 74 65 6d 70 46 69 6c 65 50 61 72 74 29 29 20 &tempFilePart))
21e0: 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e 76 61 6c 69 {../*.. * Invali
21f0: 64 20 66 69 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 54 d file... */...T
2200: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
2210: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
2220: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
2230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
2240: 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 * Make sure
2250: 73 6f 75 72 63 65 20 66 69 6c 65 20 64 6f 65 73 source file does
2260: 20 65 78 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a exist.. */.
2270: 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 . attr = GetF
2280: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 6c ileAttributesW(l
2290: 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 29 3b 0a inkSourcePath);.
22a0: 20 20 20 20 69 66 20 28 61 74 74 72 20 3d 3d 20 if (attr ==
22b0: 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 INVALID_FILE_ATT
22c0: 52 49 42 55 54 45 53 29 20 7b 0a 09 2f 2a 0a 09 RIBUTES) {../*..
22d0: 20 2a 20 54 68 65 20 73 6f 75 72 63 65 20 64 6f * The source do
22e0: 65 73 6e 27 74 20 65 78 69 73 74 2e 0a 09 20 2a esn't exist... *
22f0: 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 /...TclWinConver
2300: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 tError(GetLastEr
2310: 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 ror());..return
2320: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 NULL;.. } els
2330: 65 20 69 66 20 28 28 61 74 74 72 20 26 20 46 49 e if ((attr & FI
2340: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 LE_ATTRIBUTE_DIR
2350: 45 43 54 4f 52 59 29 20 3d 3d 20 30 29 20 7b 0a ECTORY) == 0) {.
2360: 09 2f 2a 0a 09 20 2a 20 49 74 20 69 73 20 61 20 ./*.. * It is a
2370: 66 69 6c 65 20 2d 20 74 68 69 73 20 69 73 20 6e file - this is n
2380: 6f 74 20 79 65 74 20 73 75 70 70 6f 72 74 65 64 ot yet supported
2390: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 53 65 74 ... */...Tcl_Set
23a0: 45 72 72 6e 6f 28 45 4e 4f 54 44 49 52 29 3b 0a Errno(ENOTDIR);.
23b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
23c0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
23d0: 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 65 63 WinReadLinkDirec
23e0: 74 6f 72 79 28 6c 69 6e 6b 53 6f 75 72 63 65 50 tory(linkSourceP
23f0: 61 74 68 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d ath);.}.../*. *-
2400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2440: 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 69 6e 53 79 6d ---. *. * WinSym
2450: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 2d 2d LinkDirectory --
2460: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74 . *. *.This rout
2470: 69 6e 65 20 63 72 65 61 74 65 73 20 61 20 4e 54 ine creates a NT
2480: 46 53 20 6a 75 6e 63 74 69 6f 6e 2c 20 75 73 69 FS junction, usi
2490: 6e 67 20 74 68 65 20 75 6e 64 6f 63 75 6d 65 6e ng the undocumen
24a0: 74 65 64 0a 20 2a 09 46 53 43 54 4c 5f 53 45 54 ted. *.FSCTL_SET
24b0: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 73 _REPARSE_POINT s
24c0: 74 72 75 63 74 75 72 65 20 57 69 6e 32 4b 20 75 tructure Win2K u
24d0: 73 65 73 20 66 6f 72 20 6d 6f 75 6e 74 20 70 6f ses for mount po
24e0: 69 6e 74 73 20 61 6e 64 0a 20 2a 09 6a 75 6e 63 ints and. *.junc
24f0: 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 41 73 73 tions.. *. *.Ass
2500: 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 6c 69 6e umption that lin
2510: 6b 54 61 72 67 65 74 50 61 74 68 20 69 73 20 61 kTargetPath is a
2520: 20 76 61 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 valid, existing
2530: 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 directory.. *.
2540: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a 65 * Returns:. *.Ze
2550: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 20 ro on success..
2560: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
25b0: 61 74 69 63 20 69 6e 74 0a 57 69 6e 53 79 6d 4c atic int.WinSymL
25c0: 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 0a 20 20 inkDirectory(.
25d0: 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c const WCHAR *l
25e0: 69 6e 6b 44 69 72 50 61 74 68 2c 0a 20 20 20 20 inkDirPath,.
25f0: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c 69 6e const WCHAR *lin
2600: 6b 54 61 72 67 65 74 50 61 74 68 29 0a 7b 0a 20 kTargetPath).{.
2610: 20 20 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 DUMMY_REPARSE
2620: 5f 42 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 _BUFFER dummy;.
2630: 20 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f REPARSE_DATA_
2640: 42 55 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 BUFFER *reparseB
2650: 75 66 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 uffer = (REPARSE
2660: 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 _DATA_BUFFER *)
2670: 26 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 &dummy;. int
2680: 6c 65 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 6e len;. WCHAR n
2690: 61 74 69 76 65 54 61 72 67 65 74 5b 4d 41 58 5f ativeTarget[MAX_
26a0: 50 41 54 48 5d 3b 0a 20 20 20 20 57 43 48 41 52 PATH];. WCHAR
26b0: 20 2a 6c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 0a *loop;.. /*.
26c0: 20 20 20 20 20 2a 20 4d 61 6b 65 20 74 68 65 20 * Make the
26d0: 6e 61 74 69 76 65 20 74 61 72 67 65 74 20 6e 61 native target na
26e0: 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 me.. */..
26f0: 20 6d 65 6d 63 70 79 28 6e 61 74 69 76 65 54 61 memcpy(nativeTa
2700: 72 67 65 74 2c 20 4c 22 5c 5c 3f 3f 5c 5c 22 2c rget, L"\\??\\",
2710: 20 34 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 4 * sizeof(WCHA
2720: 52 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 R));. memcpy(
2730: 6e 61 74 69 76 65 54 61 72 67 65 74 20 2b 20 34 nativeTarget + 4
2740: 2c 20 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 , linkTargetPath
2750: 2c 0a 09 20 20 20 73 69 7a 65 6f 66 28 57 43 48 ,.. sizeof(WCH
2760: 41 52 29 20 2a 20 28 31 2b 77 63 73 6c 65 6e 28 AR) * (1+wcslen(
2770: 28 57 43 48 41 52 20 2a 29 20 6c 69 6e 6b 54 61 (WCHAR *) linkTa
2780: 72 67 65 74 50 61 74 68 29 29 29 3b 0a 20 20 20 rgetPath)));.
2790: 20 6c 65 6e 20 3d 20 77 63 73 6c 65 6e 28 6e 61 len = wcslen(na
27a0: 74 69 76 65 54 61 72 67 65 74 29 3b 0a 0a 20 20 tiveTarget);..
27b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6d /*. * We m
27c0: 75 73 74 20 68 61 76 65 20 62 61 63 6b 73 6c 61 ust have backsla
27d0: 73 68 65 73 20 6f 6e 6c 79 2e 20 54 68 69 73 20 shes only. This
27e0: 69 73 20 56 45 52 59 20 49 4d 50 4f 52 54 41 4e is VERY IMPORTAN
27f0: 54 2e 20 49 66 20 77 65 20 68 61 76 65 20 61 6e T. If we have an
2800: 79 0a 20 20 20 20 20 2a 20 66 6f 72 77 61 72 64 y. * forward
2810: 20 73 6c 61 73 68 65 73 20 65 76 65 72 79 74 68 slashes everyth
2820: 69 6e 67 20 61 70 70 65 61 72 73 20 74 6f 20 77 ing appears to w
2830: 6f 72 6b 2c 20 62 75 74 20 74 68 65 20 72 65 73 ork, but the res
2840: 75 6c 74 69 6e 67 20 73 79 6d 6c 69 6e 6b 0a 20 ulting symlink.
2850: 20 20 20 20 2a 20 69 73 20 75 73 65 6c 65 73 73 * is useless
2860: 21 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 !. */.. f
2870: 6f 72 20 28 6c 6f 6f 70 20 3d 20 6e 61 74 69 76 or (loop = nativ
2880: 65 54 61 72 67 65 74 3b 20 2a 6c 6f 6f 70 20 21 eTarget; *loop !
2890: 3d 20 30 3b 20 6c 6f 6f 70 2b 2b 29 20 7b 0a 09 = 0; loop++) {..
28a0: 69 66 20 28 2a 6c 6f 6f 70 20 3d 3d 20 27 2f 27 if (*loop == '/'
28b0: 29 20 7b 0a 09 20 20 20 20 2a 6c 6f 6f 70 20 3d ) {.. *loop =
28c0: 20 27 5c 5c 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a '\\';..}. }.
28d0: 20 20 20 20 69 66 20 28 28 6e 61 74 69 76 65 54 if ((nativeT
28e0: 61 72 67 65 74 5b 6c 65 6e 2d 31 5d 20 3d 3d 20 arget[len-1] ==
28f0: 27 5c 5c 27 29 20 26 26 20 28 6e 61 74 69 76 65 '\\') && (native
2900: 54 61 72 67 65 74 5b 6c 65 6e 2d 32 5d 20 21 3d Target[len-2] !=
2910: 20 27 3a 27 29 29 20 7b 0a 09 6e 61 74 69 76 65 ':')) {..native
2920: 54 61 72 67 65 74 5b 6c 65 6e 2d 31 5d 20 3d 20 Target[len-1] =
2930: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0;. }.. /*
2940: 0a 20 20 20 20 20 2a 20 42 75 69 6c 64 20 74 68 . * Build th
2950: 65 20 72 65 70 61 72 73 65 20 69 6e 66 6f 2e 0a e reparse info..
2960: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d */.. mem
2970: 73 65 74 28 72 65 70 61 72 73 65 42 75 66 66 65 set(reparseBuffe
2980: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 55 4d r, 0, sizeof(DUM
2990: 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 46 45 MY_REPARSE_BUFFE
29a0: 52 29 29 3b 0a 20 20 20 20 72 65 70 61 72 73 65 R));. reparse
29b0: 42 75 66 66 65 72 2d 3e 52 65 70 61 72 73 65 54 Buffer->ReparseT
29c0: 61 67 20 3d 20 49 4f 5f 52 45 50 41 52 53 45 5f ag = IO_REPARSE_
29d0: 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54 3b TAG_MOUNT_POINT;
29e0: 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 . reparseBuff
29f0: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 er->MountPointRe
2a00: 70 61 72 73 65 42 75 66 66 65 72 2e 53 75 62 73 parseBuffer.Subs
2a10: 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 tituteNameLength
2a20: 20 3d 0a 09 20 20 20 20 77 63 73 6c 65 6e 28 6e =.. wcslen(n
2a30: 61 74 69 76 65 54 61 72 67 65 74 29 20 2a 20 73 ativeTarget) * s
2a40: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 izeof(WCHAR);.
2a50: 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2d reparseBuffer-
2a60: 3e 52 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 >Reserved = 0;.
2a70: 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72 reparseBuffer
2a80: 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 ->MountPointRepa
2a90: 72 73 65 42 75 66 66 65 72 2e 50 72 69 6e 74 4e rseBuffer.PrintN
2aa0: 61 6d 65 4c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 ameLength = 0;.
2ab0: 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72 reparseBuffer
2ac0: 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 ->MountPointRepa
2ad0: 72 73 65 42 75 66 66 65 72 2e 50 72 69 6e 74 4e rseBuffer.PrintN
2ae0: 61 6d 65 4f 66 66 73 65 74 20 3d 0a 09 20 20 20 ameOffset =..
2af0: 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e reparseBuffer->
2b00: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 MountPointRepars
2b10: 65 42 75 66 66 65 72 2e 53 75 62 73 74 69 74 75 eBuffer.Substitu
2b20: 74 65 4e 61 6d 65 4c 65 6e 67 74 68 0a 09 20 20 teNameLength..
2b30: 20 20 2b 20 73 69 7a 65 6f 66 28 57 43 48 41 52 + sizeof(WCHAR
2b40: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 72 65 );. memcpy(re
2b50: 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 parseBuffer->Mou
2b60: 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 ntPointReparseBu
2b70: 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 2c ffer.PathBuffer,
2b80: 20 6e 61 74 69 76 65 54 61 72 67 65 74 2c 0a 09 nativeTarget,..
2b90: 20 20 20 20 73 69 7a 65 6f 66 28 57 43 48 41 52 sizeof(WCHAR
2ba0: 29 0a 09 20 20 20 20 2b 20 72 65 70 61 72 73 65 ).. + reparse
2bb0: 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 Buffer->MountPoi
2bc0: 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 2e ntReparseBuffer.
2bd0: 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 SubstituteNameLe
2be0: 6e 67 74 68 29 3b 0a 20 20 20 20 72 65 70 61 72 ngth);. repar
2bf0: 73 65 42 75 66 66 65 72 2d 3e 52 65 70 61 72 73 seBuffer->Repars
2c00: 65 44 61 74 61 4c 65 6e 67 74 68 20 3d 0a 09 20 eDataLength =..
2c10: 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72 reparseBuffer
2c20: 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 ->MountPointRepa
2c30: 72 73 65 42 75 66 66 65 72 2e 53 75 62 73 74 69 rseBuffer.Substi
2c40: 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 2b 31 tuteNameLength+1
2c50: 32 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 2;.. return N
2c60: 61 74 69 76 65 57 72 69 74 65 52 65 70 61 72 73 ativeWriteRepars
2c70: 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c 20 72 e(linkDirPath, r
2c80: 65 70 61 72 73 65 42 75 66 66 65 72 29 3b 0a 7d eparseBuffer);.}
2c90: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2ce0: 20 2a 20 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b * TclWinSymLink
2cf0: 43 6f 70 79 44 69 72 65 63 74 6f 72 79 20 2d 2d CopyDirectory --
2d00: 0a 20 2a 0a 20 2a 09 43 6f 70 79 20 61 20 57 69 . *. *.Copy a Wi
2d10: 6e 64 6f 77 73 20 4e 54 46 53 20 6a 75 6e 63 74 ndows NTFS junct
2d20: 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 ion. This functi
2d30: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 on assumes that
2d40: 4c 69 6e 6b 4f 72 69 67 69 6e 61 6c 0a 20 2a 09 LinkOriginal. *.
2d50: 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 61 20 exists and is a
2d60: 76 61 6c 69 64 20 6a 75 6e 63 74 69 6f 6e 20 70 valid junction p
2d70: 6f 69 6e 74 2c 20 61 6e 64 20 74 68 61 74 20 4c oint, and that L
2d80: 69 6e 6b 43 6f 70 79 20 64 6f 65 73 20 6e 6f 74 inkCopy does not
2d90: 0a 20 2a 09 65 78 69 73 74 2e 0a 20 2a 0a 20 2a . *.exist.. *. *
2da0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a 65 72 Returns:. *.Zer
2db0: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 20 2a o on success.. *
2dc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
2e10: 0a 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b 43 6f .TclWinSymLinkCo
2e20: 70 79 44 69 72 65 63 74 6f 72 79 28 0a 20 20 20 pyDirectory(.
2e30: 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c 69 const WCHAR *li
2e40: 6e 6b 4f 72 69 67 50 61 74 68 2c 09 2f 2a 20 45 nkOrigPath,./* E
2e50: 78 69 73 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e xisting junction
2e60: 20 2d 20 72 65 70 61 72 73 65 20 70 6f 69 6e 74 - reparse point
2e70: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 */. const WC
2e80: 48 41 52 20 2a 6c 69 6e 6b 43 6f 70 79 50 61 74 HAR *linkCopyPat
2e90: 68 29 09 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d h)./* Will becom
2ea0: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6a 75 e a duplicate ju
2eb0: 6e 63 74 69 6f 6e 20 2a 2f 0a 7b 0a 20 20 20 20 nction */.{.
2ec0: 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 DUMMY_REPARSE_BU
2ed0: 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20 FFER dummy;.
2ee0: 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 REPARSE_DATA_BUF
2ef0: 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 66 66 FER *reparseBuff
2f00: 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f 44 41 er = (REPARSE_DA
2f10: 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 64 75 TA_BUFFER *) &du
2f20: 6d 6d 79 3b 0a 0a 20 20 20 20 69 66 20 28 4e 61 mmy;.. if (Na
2f30: 74 69 76 65 52 65 61 64 52 65 70 61 72 73 65 28 tiveReadReparse(
2f40: 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 20 72 65 linkOrigPath, re
2f50: 70 61 72 73 65 42 75 66 66 65 72 2c 20 47 45 4e parseBuffer, GEN
2f60: 45 52 49 43 5f 52 45 41 44 29 29 20 7b 0a 09 72 ERIC_READ)) {..r
2f70: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a eturn -1;. }.
2f80: 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74 69 76 return Nativ
2f90: 65 57 72 69 74 65 52 65 70 61 72 73 65 28 6c 69 eWriteReparse(li
2fa0: 6e 6b 43 6f 70 79 50 61 74 68 2c 20 72 65 70 61 nkCopyPath, repa
2fb0: 72 73 65 42 75 66 66 65 72 29 3b 0a 7d 0a 0c 0a rseBuffer);.}...
2fc0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3010: 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b 44 65 6c TclWinSymLinkDel
3020: 65 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 6c ete --. *. *.Del
3030: 65 74 65 20 61 20 57 69 6e 64 6f 77 73 20 4e 54 ete a Windows NT
3040: 46 53 20 6a 75 6e 63 74 69 6f 6e 2e 20 4f 6e 63 FS junction. Onc
3050: 65 20 74 68 65 20 6a 75 6e 63 74 69 6f 6e 20 69 e the junction i
3060: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 0a 20 2a nformation is. *
3070: 09 64 65 6c 65 74 65 64 2c 20 74 68 65 20 66 69 .deleted, the fi
3080: 6c 65 73 79 73 74 65 6d 20 6f 62 6a 65 63 74 20 lesystem object
3090: 62 65 63 6f 6d 65 73 20 61 6e 20 6f 72 64 69 6e becomes an ordin
30a0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 55 ary directory. U
30b0: 6e 6c 65 73 73 0a 20 2a 09 27 6c 69 6e 6b 4f 6e nless. *.'linkOn
30c0: 6c 79 27 20 69 73 20 67 69 76 65 6e 2c 20 74 68 ly' is given, th
30d0: 61 74 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 at directory is
30e0: 61 6c 73 6f 20 72 65 6d 6f 76 65 64 2e 0a 20 2a also removed.. *
30f0: 0a 20 2a 09 41 73 73 75 6d 70 74 69 6f 6e 20 74 . *.Assumption t
3100: 68 61 74 20 4c 69 6e 6b 4f 72 69 67 69 6e 61 6c hat LinkOriginal
3110: 20 69 73 20 61 20 76 61 6c 69 64 2c 20 65 78 69 is a valid, exi
3120: 73 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e 0a sting junction..
3130: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
3140: 2a 09 5a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 *.Zero on succes
3150: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d s.. *. *--------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
31a0: 0a 0a 69 6e 74 0a 54 63 6c 57 69 6e 53 79 6d 4c ..int.TclWinSymL
31b0: 69 6e 6b 44 65 6c 65 74 65 28 0a 20 20 20 20 63 inkDelete(. c
31c0: 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c 69 6e 6b onst WCHAR *link
31d0: 4f 72 69 67 50 61 74 68 2c 0a 20 20 20 20 69 6e OrigPath,. in
31e0: 74 20 6c 69 6e 6b 4f 6e 6c 79 29 0a 7b 0a 20 20 t linkOnly).{.
31f0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 74 20 69 /*. * It i
3200: 73 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e s a symbolic lin
3210: 6b 20 2d 20 72 65 6d 6f 76 65 20 69 74 2e 0a 20 k - remove it..
3220: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 44 55 4d 4d */.. DUMM
3230: 59 5f 52 45 50 41 52 53 45 5f 42 55 46 46 45 52 Y_REPARSE_BUFFER
3240: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 52 45 50 41 dummy;. REPA
3250: 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 RSE_DATA_BUFFER
3260: 2a 72 65 70 61 72 73 65 42 75 66 66 65 72 20 3d *reparseBuffer =
3270: 20 28 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 (REPARSE_DATA_B
3280: 55 46 46 45 52 20 2a 29 20 26 64 75 6d 6d 79 3b UFFER *) &dummy;
3290: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 46 69 6c . HANDLE hFil
32a0: 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 72 65 74 e;. DWORD ret
32b0: 75 72 6e 65 64 4c 65 6e 67 74 68 3b 0a 0a 20 20 urnedLength;..
32c0: 20 20 6d 65 6d 73 65 74 28 72 65 70 61 72 73 65 memset(reparse
32d0: 42 75 66 66 65 72 2c 20 30 2c 20 73 69 7a 65 6f Buffer, 0, sizeo
32e0: 66 28 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f f(DUMMY_REPARSE_
32f0: 42 55 46 46 45 52 29 29 3b 0a 20 20 20 20 72 65 BUFFER));. re
3300: 70 61 72 73 65 42 75 66 66 65 72 2d 3e 52 65 70 parseBuffer->Rep
3310: 61 72 73 65 54 61 67 20 3d 20 49 4f 5f 52 45 50 arseTag = IO_REP
3320: 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 ARSE_TAG_MOUNT_P
3330: 4f 49 4e 54 3b 0a 20 20 20 20 68 46 69 6c 65 20 OINT;. hFile
3340: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 6c 69 = CreateFileW(li
3350: 6e 6b 4f 72 69 67 50 61 74 68 2c 20 47 45 4e 45 nkOrigPath, GENE
3360: 52 49 43 5f 57 52 49 54 45 2c 20 30 2c 20 4e 55 RIC_WRITE, 0, NU
3370: 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e LL, OPEN_EXISTIN
3380: 47 2c 0a 09 20 20 20 20 46 49 4c 45 5f 46 4c 41 G,.. FILE_FLA
3390: 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f 50 G_OPEN_REPARSE_P
33a0: 4f 49 4e 54 20 7c 20 46 49 4c 45 5f 46 4c 41 47 OINT | FILE_FLAG
33b0: 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 49 43 _BACKUP_SEMANTIC
33c0: 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 S, NULL);.. i
33d0: 66 20 28 68 46 69 6c 65 20 21 3d 20 49 4e 56 41 f (hFile != INVA
33e0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
33f0: 29 20 7b 0a 09 69 66 20 28 21 44 65 76 69 63 65 ) {..if (!Device
3400: 49 6f 43 6f 6e 74 72 6f 6c 28 68 46 69 6c 65 2c IoControl(hFile,
3410: 20 46 53 43 54 4c 5f 44 45 4c 45 54 45 5f 52 45 FSCTL_DELETE_RE
3420: 50 41 52 53 45 5f 50 4f 49 4e 54 2c 20 72 65 70 PARSE_POINT, rep
3430: 61 72 73 65 42 75 66 66 65 72 2c 0a 09 09 52 45 arseBuffer,...RE
3440: 50 41 52 53 45 5f 4d 4f 55 4e 54 50 4f 49 4e 54 PARSE_MOUNTPOINT
3450: 5f 48 45 41 44 45 52 5f 53 49 5a 45 2c 4e 55 4c _HEADER_SIZE,NUL
3460: 4c 2c 30 2c 26 72 65 74 75 72 6e 65 64 4c 65 6e L,0,&returnedLen
3470: 67 74 68 2c 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 gth,NULL)) {..
3480: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45 72 72 /*.. * Err
3490: 6f 72 20 73 65 74 74 69 6e 67 20 6a 75 6e 63 74 or setting junct
34a0: 69 6f 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ion... */...
34b0: 20 20 20 20 54 63 6c 57 69 6e 43 6f 6e 76 65 72 TclWinConver
34c0: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 tError(GetLastEr
34d0: 72 6f 72 28 29 29 3b 0a 09 20 20 20 20 43 6c 6f ror());.. Clo
34e0: 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b seHandle(hFile);
34f0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
3500: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 46 69 6c CloseHandle(hFil
3510: 65 29 3b 0a 09 20 20 20 20 69 66 20 28 21 6c 69 e);.. if (!li
3520: 6e 6b 4f 6e 6c 79 29 20 7b 0a 09 09 52 65 6d 6f nkOnly) {...Remo
3530: 76 65 44 69 72 65 63 74 6f 72 79 57 28 6c 69 6e veDirectoryW(lin
3540: 6b 4f 72 69 67 50 61 74 68 29 3b 0a 09 20 20 20 kOrigPath);..
3550: 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 }.. return 0
3560: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 ;..}. }. r
3570: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a eturn -1;.}.../*
3580: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 69 -------. *. * Wi
35d0: 6e 52 65 61 64 4c 69 6e 6b 44 69 72 65 63 74 6f nReadLinkDirecto
35e0: 72 79 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ry --. *. *.This
35f0: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 routine reads a
3600: 20 4e 54 46 53 20 6a 75 6e 63 74 69 6f 6e 2c 20 NTFS junction,
3610: 75 73 69 6e 67 20 74 68 65 20 75 6e 64 6f 63 75 using the undocu
3620: 6d 65 6e 74 65 64 0a 20 2a 09 46 53 43 54 4c 5f mented. *.FSCTL_
3630: 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e GET_REPARSE_POIN
3640: 54 20 73 74 72 75 63 74 75 72 65 20 57 69 6e 32 T structure Win2
3650: 4b 20 75 73 65 73 20 66 6f 72 20 6d 6f 75 6e 74 K uses for mount
3660: 20 70 6f 69 6e 74 73 20 61 6e 64 0a 20 2a 09 6a points and. *.j
3670: 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 unctions.. *. *.
3680: 41 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 Assumption that
3690: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 69 73 LinkDirectory is
36a0: 20 61 20 76 61 6c 69 64 2c 20 65 78 69 73 74 69 a valid, existi
36b0: 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a ng directory.. *
36c0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
36d0: 41 20 54 63 6c 5f 4f 62 6a 20 77 69 74 68 20 72 A Tcl_Obj with r
36e0: 65 66 43 6f 75 6e 74 20 6f 66 20 31 20 28 69 2e efCount of 1 (i.
36f0: 65 2e 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 e. owned by the
3700: 63 61 6c 6c 65 72 29 2c 20 6f 72 20 4e 55 4c 4c caller), or NULL
3710: 20 69 66 0a 20 2a 09 61 6e 79 74 68 69 6e 67 20 if. *.anything
3720: 77 65 6e 74 20 77 72 6f 6e 67 2e 0a 20 2a 0a 20 went wrong.. *.
3730: 2a 09 49 6e 20 74 68 65 20 66 75 74 75 72 65 20 *.In the future
3740: 77 65 20 73 68 6f 75 6c 64 20 65 6e 68 61 6e 63 we should enhanc
3750: 65 20 74 68 69 73 20 74 6f 20 72 65 74 75 72 6e e this to return
3760: 20 61 20 70 61 74 68 20 6f 62 6a 65 63 74 20 72 a path object r
3770: 61 74 68 65 72 0a 20 2a 09 74 68 61 6e 20 61 20 ather. *.than a
3780: 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 2d 2d 2d string.. *. *---
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37d0: 2d 0a 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e -. */..#if defin
37e0: 65 64 20 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 7c ed (__clang__) |
37f0: 7c 20 28 28 5f 5f 47 4e 55 43 5f 5f 29 20 20 26 | ((__GNUC__) &
3800: 26 20 28 28 5f 5f 47 4e 55 43 5f 5f 20 3e 20 34 & ((__GNUC__ > 4
3810: 29 20 7c 7c 20 28 28 5f 5f 47 4e 55 43 5f 5f 20 ) || ((__GNUC__
3820: 3d 3d 20 34 29 20 26 26 20 28 5f 5f 47 4e 55 43 == 4) && (__GNUC
3830: 5f 4d 49 4e 4f 52 5f 5f 20 3e 20 35 29 29 29 29 _MINOR__ > 5))))
3840: 0a 23 70 72 61 67 6d 61 20 47 43 43 20 64 69 61 .#pragma GCC dia
3850: 67 6e 6f 73 74 69 63 20 70 75 73 68 0a 23 70 72 gnostic push.#pr
3860: 61 67 6d 61 20 47 43 43 20 64 69 61 67 6e 6f 73 agma GCC diagnos
3870: 74 69 63 20 69 67 6e 6f 72 65 64 20 22 2d 57 61 tic ignored "-Wa
3880: 72 72 61 79 2d 62 6f 75 6e 64 73 22 0a 23 65 6e rray-bounds".#en
3890: 64 69 66 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f dif..static Tcl_
38a0: 4f 62 6a 20 2a 0a 57 69 6e 52 65 61 64 4c 69 6e Obj *.WinReadLin
38b0: 6b 44 69 72 65 63 74 6f 72 79 28 0a 20 20 20 20 kDirectory(.
38c0: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c 69 6e const WCHAR *lin
38d0: 6b 44 69 72 50 61 74 68 29 0a 7b 0a 20 20 20 20 kDirPath).{.
38e0: 69 6e 74 20 61 74 74 72 2c 20 6c 65 6e 2c 20 6f int attr, len, o
38f0: 66 66 73 65 74 3b 0a 20 20 20 20 44 55 4d 4d 59 ffset;. DUMMY
3900: 5f 52 45 50 41 52 53 45 5f 42 55 46 46 45 52 20 _REPARSE_BUFFER
3910: 64 75 6d 6d 79 3b 0a 20 20 20 20 52 45 50 41 52 dummy;. REPAR
3920: 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a SE_DATA_BUFFER *
3930: 72 65 70 61 72 73 65 42 75 66 66 65 72 20 3d 20 reparseBuffer =
3940: 28 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 (REPARSE_DATA_BU
3950: 46 46 45 52 20 2a 29 20 26 64 75 6d 6d 79 3b 0a FFER *) &dummy;.
3960: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 Tcl_Obj *ret
3970: 56 61 6c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 Val;. Tcl_DSt
3980: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 63 6f 6e ring ds;. con
3990: 73 74 20 63 68 61 72 20 2a 63 6f 70 79 3b 0a 0a st char *copy;..
39a0: 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 attr = GetFi
39b0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 6c 69 leAttributesW(li
39c0: 6e 6b 44 69 72 50 61 74 68 29 3b 0a 20 20 20 20 nkDirPath);.
39d0: 69 66 20 28 21 28 61 74 74 72 20 26 20 46 49 4c if (!(attr & FIL
39e0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 50 41 E_ATTRIBUTE_REPA
39f0: 52 53 45 5f 50 4f 49 4e 54 29 29 20 7b 0a 09 67 RSE_POINT)) {..g
3a00: 6f 74 6f 20 69 6e 76 61 6c 69 64 45 72 72 6f 72 oto invalidError
3a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3a20: 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 72 73 NativeReadRepars
3a30: 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c 20 72 e(linkDirPath, r
3a40: 65 70 61 72 73 65 42 75 66 66 65 72 2c 20 30 29 eparseBuffer, 0)
3a50: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
3a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
3a70: 74 63 68 20 28 72 65 70 61 72 73 65 42 75 66 66 tch (reparseBuff
3a80: 65 72 2d 3e 52 65 70 61 72 73 65 54 61 67 29 20 er->ReparseTag)
3a90: 7b 0a 20 20 20 20 63 61 73 65 20 30 78 38 30 30 {. case 0x800
3aa0: 30 30 30 30 30 7c 49 4f 5f 52 45 50 41 52 53 45 00000|IO_REPARSE
3ab0: 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 _TAG_SYMBOLIC_LI
3ac0: 4e 4b 3a 0a 20 20 20 20 63 61 73 65 20 49 4f 5f NK:. case IO_
3ad0: 52 45 50 41 52 53 45 5f 54 41 47 5f 53 59 4d 42 REPARSE_TAG_SYMB
3ae0: 4f 4c 49 43 5f 4c 49 4e 4b 3a 0a 20 20 20 20 63 OLIC_LINK:. c
3af0: 61 73 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 ase IO_REPARSE_T
3b00: 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54 3a 0a AG_MOUNT_POINT:.
3b10: 09 2f 2a 0a 09 20 2a 20 43 65 72 74 61 69 6e 20 ./*.. * Certain
3b20: 6e 61 74 69 76 65 20 70 61 74 68 20 72 65 70 72 native path repr
3b30: 65 73 65 6e 74 61 74 69 6f 6e 73 20 6f 6e 20 57 esentations on W
3b40: 69 6e 64 6f 77 73 20 68 61 76 65 20 61 20 73 70 indows have a sp
3b50: 65 63 69 61 6c 0a 09 20 2a 20 70 72 65 66 69 78 ecial.. * prefix
3b60: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 to indicate tha
3b70: 74 20 74 68 65 79 20 61 72 65 20 74 6f 20 62 65 t they are to be
3b80: 20 74 72 65 61 74 65 64 20 73 70 65 63 69 61 6c treated special
3b90: 6c 79 2e 20 46 6f 72 0a 09 20 2a 20 65 78 61 6d ly. For.. * exam
3ba0: 70 6c 65 20 65 78 74 72 65 6d 65 6c 79 20 6c 6f ple extremely lo
3bb0: 6e 67 20 70 61 74 68 73 2c 20 6f 72 20 73 79 6d ng paths, or sym
3bc0: 6c 69 6e 6b 73 2c 20 6f 72 20 76 6f 6c 75 6d 65 links, or volume
3bd0: 73 20 6d 6f 75 6e 74 65 64 0a 09 20 2a 20 69 6e s mounted.. * in
3be0: 73 69 64 65 20 64 69 72 65 63 74 6f 72 69 65 73 side directories
3bf0: 2e 0a 09 20 2a 0a 09 20 2a 20 54 68 65 72 65 20 ... *.. * There
3c00: 69 73 20 61 6e 20 61 73 73 75 6d 70 74 69 6f 6e is an assumption
3c10: 20 69 6e 20 74 68 69 73 20 63 6f 64 65 20 74 68 in this code th
3c20: 61 74 20 27 77 69 64 65 27 20 69 6e 74 65 72 66 at 'wide' interf
3c30: 61 63 65 73 20 61 72 65 0a 09 20 2a 20 62 65 69 aces are.. * bei
3c40: 6e 67 20 75 73 65 64 20 28 73 65 65 20 74 63 6c ng used (see tcl
3c50: 57 69 6e 33 32 44 6c 6c 2e 63 29 2c 20 77 68 69 Win32Dll.c), whi
3c60: 63 68 20 69 73 20 74 72 75 65 20 66 6f 72 20 74 ch is true for t
3c70: 68 65 20 6f 6e 6c 79 20 73 79 73 74 65 6d 73 0a he only systems.
3c80: 09 20 2a 20 77 68 69 63 68 20 73 75 70 70 6f 72 . * which suppor
3c90: 74 20 72 65 70 61 72 73 65 20 74 61 67 73 20 61 t reparse tags a
3ca0: 74 20 70 72 65 73 65 6e 74 2e 20 49 66 20 74 68 t present. If th
3cb0: 61 74 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 at changes in th
3cc0: 65 0a 09 20 2a 20 66 75 74 75 72 65 2c 20 74 68 e.. * future, th
3cd0: 69 73 20 63 6f 64 65 20 77 69 6c 6c 20 68 61 76 is code will hav
3ce0: 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 6c 69 e to be generali
3cf0: 73 65 64 2e 0a 09 20 2a 2f 0a 0a 09 6f 66 66 73 sed... */...offs
3d00: 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 70 et = 0;..if (rep
3d10: 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e arseBuffer->Moun
3d20: 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 tPointReparseBuf
3d30: 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 5b 30 fer.PathBuffer[0
3d40: 5d 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 ] == '\\') {..
3d50: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 68 65 /*.. * Che
3d60: 63 6b 20 77 68 65 74 68 65 72 20 74 68 69 73 20 ck whether this
3d70: 69 73 20 61 20 6d 6f 75 6e 74 65 64 20 76 6f 6c is a mounted vol
3d80: 75 6d 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ume... */...
3d90: 20 20 20 20 69 66 20 28 77 63 73 6e 63 6d 70 28 if (wcsncmp(
3da0: 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d reparseBuffer->M
3db0: 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 ountPointReparse
3dc0: 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 Buffer.PathBuffe
3dd0: 72 2c 0a 09 09 20 20 20 20 4c 22 5c 5c 3f 3f 5c r,... L"\\??\
3de0: 5c 56 6f 6c 75 6d 65 7b 22 2c 31 31 29 20 3d 3d \Volume{",11) ==
3df0: 20 30 29 20 7b 0a 09 09 63 68 61 72 20 64 72 69 0) {...char dri
3e00: 76 65 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 54 ve;..../*... * T
3e10: 68 65 72 65 20 69 73 20 73 6f 6d 65 20 63 6f 6e here is some con
3e20: 66 75 73 69 6f 6e 20 62 65 74 77 65 65 6e 20 5c fusion between \
3e30: 3f 3f 5c 20 61 6e 64 20 5c 5c 3f 5c 20 77 68 69 ??\ and \\?\ whi
3e40: 63 68 20 77 65 20 68 61 76 65 0a 09 09 20 2a 20 ch we have... *
3e50: 74 6f 20 66 69 78 20 68 65 72 65 2e 20 49 74 20 to fix here. It
3e60: 64 6f 65 73 6e 27 74 20 73 65 65 6d 20 76 65 72 doesn't seem ver
3e70: 79 20 77 65 6c 6c 20 64 6f 63 75 6d 65 6e 74 65 y well documente
3e80: 64 2e 0a 09 09 20 2a 2f 0a 0a 09 09 72 65 70 61 d.... */....repa
3e90: 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 rseBuffer->Mount
3ea0: 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 PointReparseBuff
3eb0: 65 72 2e 50 61 74 68 42 75 66 66 65 72 5b 31 5d er.PathBuffer[1]
3ec0: 20 3d 20 27 5c 5c 27 3b 0a 0a 09 09 2f 2a 0a 09 = '\\';..../*..
3ed0: 09 20 2a 20 43 68 65 63 6b 20 69 66 20 61 20 63 . * Check if a c
3ee0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 72 69 orresponding dri
3ef0: 76 65 20 6c 65 74 74 65 72 20 65 78 69 73 74 73 ve letter exists
3f00: 2c 20 61 6e 64 20 75 73 65 20 74 68 61 74 0a 09 , and use that..
3f10: 09 20 2a 20 69 66 20 69 74 20 69 73 20 66 6f 75 . * if it is fou
3f20: 6e 64 0a 09 09 20 2a 2f 0a 0a 09 09 64 72 69 76 nd... */....driv
3f30: 65 20 3d 20 54 63 6c 57 69 6e 44 72 69 76 65 4c e = TclWinDriveL
3f40: 65 74 74 65 72 46 6f 72 56 6f 6c 4d 6f 75 6e 74 etterForVolMount
3f50: 50 6f 69 6e 74 28 0a 09 09 09 72 65 70 61 72 73 Point(....repars
3f60: 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f eBuffer->MountPo
3f70: 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 intReparseBuffer
3f80: 2e 50 61 74 68 42 75 66 66 65 72 29 3b 0a 09 09 .PathBuffer);...
3f90: 69 66 20 28 64 72 69 76 65 20 21 3d 20 2d 31 29 if (drive != -1)
3fa0: 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20 64 72 {... char dr
3fb0: 69 76 65 53 70 65 63 5b 33 5d 20 3d 20 7b 0a 09 iveSpec[3] = {..
3fc0: 09 09 27 5c 30 27 2c 20 27 3a 27 2c 20 27 5c 30 ..'\0', ':', '\0
3fd0: 27 0a 09 09 20 20 20 20 7d 3b 0a 0a 09 09 20 20 '... };....
3fe0: 20 20 64 72 69 76 65 53 70 65 63 5b 30 5d 20 3d driveSpec[0] =
3ff0: 20 64 72 69 76 65 3b 0a 09 09 20 20 20 20 72 65 drive;... re
4000: 74 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 tVal = Tcl_NewSt
4010: 72 69 6e 67 4f 62 6a 28 64 72 69 76 65 53 70 65 ringObj(driveSpe
4020: 63 2c 32 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f c,2);... Tcl_
4030: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 74 IncrRefCount(ret
4040: 56 61 6c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 Val);... retu
4050: 72 6e 20 72 65 74 56 61 6c 3b 0a 09 09 7d 0a 0a rn retVal;...}..
4060: 09 09 2f 2a 0a 09 09 20 2a 20 54 68 69 73 20 69 ../*... * This i
4070: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 6d 6f 75 s actually a mou
4080: 6e 74 65 64 20 64 72 69 76 65 2c 20 77 68 69 63 nted drive, whic
4090: 68 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 73 h doesn't exists
40a0: 20 61 73 20 61 0a 09 09 20 2a 20 44 4f 53 20 64 as a... * DOS d
40b0: 72 69 76 65 20 6c 65 74 74 65 72 2e 20 54 68 69 rive letter. Thi
40c0: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 74 68 s means the path
40d0: 20 69 73 6e 27 74 20 61 63 74 75 61 6c 6c 79 20 isn't actually
40e0: 61 0a 09 09 20 2a 20 6c 69 6e 6b 2c 20 61 6c 74 a... * link, alt
40f0: 68 6f 75 67 68 20 77 65 20 70 61 72 74 69 61 6c hough we partial
4100: 6c 79 20 74 72 65 61 74 20 69 74 20 6c 69 6b 65 ly treat it like
4110: 20 6f 6e 65 20 28 27 66 69 6c 65 20 74 79 70 65 one ('file type
4120: 27 0a 09 09 20 2a 20 77 69 6c 6c 20 72 65 74 75 '... * will retu
4130: 72 6e 20 27 6c 69 6e 6b 27 29 2c 20 62 75 74 20 rn 'link'), but
4140: 74 68 65 6e 20 74 68 65 20 6c 69 6e 6b 20 77 69 then the link wi
4150: 6c 6c 20 61 63 74 75 61 6c 6c 79 20 6a 75 73 74 ll actually just
4160: 0a 09 09 20 2a 20 62 65 20 74 72 65 61 74 65 64 ... * be treated
4170: 20 6c 69 6b 65 20 61 6e 20 6f 72 64 69 6e 61 72 like an ordinar
4180: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 49 20 64 y directory. I d
4190: 6f 6e 27 74 20 62 65 6c 69 65 76 65 20 61 6e 79 on't believe any
41a0: 0a 09 09 20 2a 20 73 65 72 69 6f 75 73 20 69 6e ... * serious in
41b0: 63 6f 6e 73 69 73 74 65 6e 63 79 20 77 69 6c 6c consistency will
41c0: 20 61 72 69 73 65 20 66 72 6f 6d 20 74 68 69 73 arise from this
41d0: 2c 20 62 75 74 20 69 74 20 69 73 0a 09 09 20 2a , but it is... *
41e0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 6f 20 62 65 something to be
41f0: 20 61 77 61 72 65 20 6f 66 2e 0a 09 09 20 2a 2f aware of.... */
4200: 0a 0a 09 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 ....goto invalid
4210: 45 72 72 6f 72 3b 0a 09 20 20 20 20 7d 20 65 6c Error;.. } el
4220: 73 65 20 69 66 20 28 77 63 73 6e 63 6d 70 28 72 se if (wcsncmp(r
4230: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f eparseBuffer->Mo
4240: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 untPointReparseB
4250: 75 66 66 65 72 0a 09 09 20 20 20 20 2e 50 61 74 uffer... .Pat
4260: 68 42 75 66 66 65 72 2c 20 4c 22 5c 5c 5c 5c 3f hBuffer, L"\\\\?
4270: 5c 5c 22 2c 34 29 20 3d 3d 20 30 29 20 7b 0a 09 \\",4) == 0) {..
4280: 09 2f 2a 0a 09 09 20 2a 20 53 74 72 69 70 20 6f ./*... * Strip o
4290: 66 66 20 74 68 65 20 70 72 65 66 69 78 2e 0a 09 ff the prefix...
42a0: 09 20 2a 2f 0a 0a 09 09 6f 66 66 73 65 74 20 3d . */....offset =
42b0: 20 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 4;.. } else
42c0: 69 66 20 28 77 63 73 6e 63 6d 70 28 72 65 70 61 if (wcsncmp(repa
42d0: 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 rseBuffer->Mount
42e0: 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 PointReparseBuff
42f0: 65 72 0a 09 09 20 20 20 20 2e 50 61 74 68 42 75 er... .PathBu
4300: 66 66 65 72 2c 20 4c 22 5c 5c 3f 3f 5c 5c 22 2c ffer, L"\\??\\",
4310: 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 0a 4) == 0) {.../*.
4320: 09 09 20 2a 20 53 74 72 69 70 20 6f 66 66 20 74 .. * Strip off t
4330: 68 65 20 70 72 65 66 69 78 2e 0a 09 09 20 2a 2f he prefix.... */
4340: 0a 0a 09 09 6f 66 66 73 65 74 20 3d 20 34 3b 0a ....offset = 4;.
4350: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 54 63 6c 5f . }..}...Tcl_
4360: 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 54 WinTCharToUtf((T
4370: 43 48 41 52 20 2a 29 0a 09 09 72 65 70 61 72 73 CHAR *)...repars
4380: 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f eBuffer->MountPo
4390: 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 intReparseBuffer
43a0: 2e 50 61 74 68 42 75 66 66 65 72 2c 0a 09 09 72 .PathBuffer,...r
43b0: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f eparseBuffer->Mo
43c0: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 untPointReparseB
43d0: 75 66 66 65 72 0a 09 09 2e 53 75 62 73 74 69 74 uffer....Substit
43e0: 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 2c 20 26 uteNameLength, &
43f0: 64 73 29 3b 0a 0a 09 63 6f 70 79 20 3d 20 54 63 ds);...copy = Tc
4400: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
4410: 64 73 29 2b 6f 66 66 73 65 74 3b 0a 09 6c 65 6e ds)+offset;..len
4420: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 = Tcl_DStringLe
4430: 6e 67 74 68 28 26 64 73 29 2d 6f 66 66 73 65 74 ngth(&ds)-offset
4440: 3b 0a 09 72 65 74 56 61 6c 20 3d 20 54 63 6c 5f ;..retVal = Tcl_
4450: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f 70 NewStringObj(cop
4460: 79 2c 6c 65 6e 29 3b 0a 09 54 63 6c 5f 49 6e 63 y,len);..Tcl_Inc
4470: 72 52 65 66 43 6f 75 6e 74 28 72 65 74 56 61 6c rRefCount(retVal
4480: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 );..Tcl_DStringF
4490: 72 65 65 28 26 64 73 29 3b 0a 09 72 65 74 75 72 ree(&ds);..retur
44a0: 6e 20 72 65 74 56 61 6c 3b 0a 20 20 20 20 7d 0a n retVal;. }.
44b0: 0a 20 20 69 6e 76 61 6c 69 64 45 72 72 6f 72 3a . invalidError:
44c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e . Tcl_SetErrn
44d0: 6f 28 45 49 4e 56 41 4c 29 3b 0a 20 20 20 20 72 o(EINVAL);. r
44e0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 23 eturn NULL;.}..#
44f0: 69 66 20 64 65 66 69 6e 65 64 20 28 5f 5f 63 6c if defined (__cl
4500: 61 6e 67 5f 5f 29 20 7c 7c 20 28 28 5f 5f 47 4e ang__) || ((__GN
4510: 55 43 5f 5f 29 20 20 26 26 20 28 28 5f 5f 47 4e UC__) && ((__GN
4520: 55 43 5f 5f 20 3e 20 34 29 20 7c 7c 20 28 28 5f UC__ > 4) || ((_
4530: 5f 47 4e 55 43 5f 5f 20 3d 3d 20 34 29 20 26 26 _GNUC__ == 4) &&
4540: 20 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f (__GNUC_MINOR__
4550: 20 3e 20 35 29 29 29 29 0a 23 70 72 61 67 6d 61 > 5)))).#pragma
4560: 20 47 43 43 20 64 69 61 67 6e 6f 73 74 69 63 20 GCC diagnostic
4570: 70 6f 70 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a pop.#endif.../*.
4580: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 ------. *. * Nat
45d0: 69 76 65 52 65 61 64 52 65 70 61 72 73 65 20 2d iveReadReparse -
45e0: 2d 0a 20 2a 0a 20 2a 09 52 65 61 64 20 74 68 65 -. *. *.Read the
45f0: 20 6a 75 6e 63 74 69 6f 6e 2f 72 65 70 61 72 73 junction/repars
4600: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 e information fr
4610: 6f 6d 20 61 20 67 69 76 65 6e 20 4e 54 46 53 20 om a given NTFS
4620: 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a directory.. *. *
4630: 09 41 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 .Assumption that
4640: 20 6c 69 6e 6b 44 69 72 50 61 74 68 20 69 73 20 linkDirPath is
4650: 61 20 76 61 6c 69 64 2c 20 65 78 69 73 74 69 6e a valid, existin
4660: 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a g directory.. *.
4670: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a * Returns:. *.Z
4680: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a ero on success..
4690: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
46e0: 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 tatic int.Native
46f0: 52 65 61 64 52 65 70 61 72 73 65 28 0a 20 20 20 ReadReparse(.
4700: 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c 69 const WCHAR *li
4710: 6e 6b 44 69 72 50 61 74 68 2c 09 2f 2a 20 54 68 nkDirPath,./* Th
4720: 65 20 6a 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 e junction to re
4730: 61 64 20 2a 2f 0a 20 20 20 20 52 45 50 41 52 53 ad */. REPARS
4740: 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a 62 E_DATA_BUFFER *b
4750: 75 66 66 65 72 2c 2f 2a 20 50 6f 69 6e 74 65 72 uffer,/* Pointer
4760: 20 74 6f 20 62 75 66 66 65 72 2e 20 43 61 6e 6e to buffer. Cann
4770: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 ot be NULL */.
4780: 20 20 44 57 4f 52 44 20 64 65 73 69 72 65 64 41 DWORD desiredA
4790: 63 63 65 73 73 29 0a 7b 0a 20 20 20 20 48 41 4e ccess).{. HAN
47a0: 44 4c 45 20 68 46 69 6c 65 3b 0a 20 20 20 20 44 DLE hFile;. D
47b0: 57 4f 52 44 20 72 65 74 75 72 6e 65 64 4c 65 6e WORD returnedLen
47c0: 67 74 68 3b 0a 0a 20 20 20 20 68 46 69 6c 65 20 gth;.. hFile
47d0: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 6c 69 = CreateFileW(li
47e0: 6e 6b 44 69 72 50 61 74 68 2c 20 64 65 73 69 72 nkDirPath, desir
47f0: 65 64 41 63 63 65 73 73 2c 20 46 49 4c 45 5f 53 edAccess, FILE_S
4800: 48 41 52 45 5f 52 45 41 44 2c 20 4e 55 4c 4c 2c HARE_READ, NULL,
4810: 0a 09 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54 .. OPEN_EXIST
4820: 49 4e 47 2c 0a 09 20 20 20 20 46 49 4c 45 5f 46 ING,.. FILE_F
4830: 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 LAG_OPEN_REPARSE
4840: 5f 50 4f 49 4e 54 20 7c 20 46 49 4c 45 5f 46 4c _POINT | FILE_FL
4850: 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 AG_BACKUP_SEMANT
4860: 49 43 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 ICS, NULL);..
4870: 20 69 66 20 28 68 46 69 6c 65 20 3d 3d 20 49 4e if (hFile == IN
4880: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c VALID_HANDLE_VAL
4890: 55 45 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 UE) {../*.. * Er
48a0: 72 6f 72 20 63 72 65 61 74 69 6e 67 20 64 69 72 ror creating dir
48b0: 65 63 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 54 ectory... */...T
48c0: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
48d0: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
48e0: 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 );..return -1;.
48f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
4900: 20 20 2a 20 47 65 74 20 74 68 65 20 6c 69 6e 6b * Get the link
4910: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
4920: 66 20 28 21 44 65 76 69 63 65 49 6f 43 6f 6e 74 f (!DeviceIoCont
4930: 72 6f 6c 28 68 46 69 6c 65 2c 20 46 53 43 54 4c rol(hFile, FSCTL
4940: 5f 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 _GET_REPARSE_POI
4950: 4e 54 2c 20 4e 55 4c 4c 2c 20 30 2c 20 62 75 66 NT, NULL, 0, buf
4960: 66 65 72 2c 0a 09 20 20 20 20 73 69 7a 65 6f 66 fer,.. sizeof
4970: 28 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 (DUMMY_REPARSE_B
4980: 55 46 46 45 52 29 2c 20 26 72 65 74 75 72 6e 65 UFFER), &returne
4990: 64 4c 65 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20 dLength, NULL))
49a0: 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 {../*.. * Error
49b0: 73 65 74 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e setting junction
49c0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 ... */...TclWinC
49d0: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c onvertError(GetL
49e0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c astError());..Cl
49f0: 6f 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 oseHandle(hFile)
4a00: 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 ;..return -1;.
4a10: 20 20 7d 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e }. CloseHan
4a20: 64 6c 65 28 68 46 69 6c 65 29 3b 0a 0a 20 20 20 dle(hFile);..
4a30: 20 69 66 20 28 21 49 73 52 65 70 61 72 73 65 54 if (!IsReparseT
4a40: 61 67 56 61 6c 69 64 28 62 75 66 66 65 72 2d 3e agValid(buffer->
4a50: 52 65 70 61 72 73 65 54 61 67 29 29 20 7b 0a 09 ReparseTag)) {..
4a60: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e Tcl_SetErrno(EIN
4a70: 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 VAL);..return -1
4a80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
4a90: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ae0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 ---. *. * Native
4af0: 57 72 69 74 65 52 65 70 61 72 73 65 20 2d 2d 0a WriteReparse --.
4b00: 20 2a 0a 20 2a 09 57 72 69 74 65 20 74 68 65 20 *. *.Write the
4b10: 72 65 70 61 72 73 65 20 69 6e 66 6f 72 6d 61 74 reparse informat
4b20: 69 6f 6e 20 66 6f 72 20 61 20 67 69 76 65 6e 20 ion for a given
4b30: 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a directory.. *. *
4b40: 09 41 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 .Assumption that
4b50: 20 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 64 LinkDirectory d
4b60: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 oes not exist..
4b70: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
4bc0: 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 57 atic int.NativeW
4bd0: 72 69 74 65 52 65 70 61 72 73 65 28 0a 20 20 20 riteReparse(.
4be0: 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6c 69 const WCHAR *li
4bf0: 6e 6b 44 69 72 50 61 74 68 2c 0a 20 20 20 20 52 nkDirPath,. R
4c00: 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 EPARSE_DATA_BUFF
4c10: 45 52 20 2a 62 75 66 66 65 72 29 0a 7b 0a 20 20 ER *buffer).{.
4c20: 20 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a HANDLE hFile;.
4c30: 20 20 20 20 44 57 4f 52 44 20 72 65 74 75 72 6e DWORD return
4c40: 65 64 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 2f edLength;.. /
4c50: 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 *. * Create
4c60: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2d 20 the directory -
4c70: 69 74 20 6d 75 73 74 20 6e 6f 74 20 61 6c 72 65 it must not alre
4c80: 61 64 79 20 65 78 69 73 74 2e 0a 20 20 20 20 20 ady exist..
4c90: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 43 72 65 61 */.. if (Crea
4ca0: 74 65 44 69 72 65 63 74 6f 72 79 57 28 6c 69 6e teDirectoryW(lin
4cb0: 6b 44 69 72 50 61 74 68 2c 20 4e 55 4c 4c 29 20 kDirPath, NULL)
4cc0: 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 == 0) {../*.. *
4cd0: 45 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20 64 Error creating d
4ce0: 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a irectory... */..
4cf0: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 .TclWinConvertEr
4d00: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 ror(GetLastError
4d10: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b ());..return -1;
4d20: 0a 20 20 20 20 7d 0a 20 20 20 20 68 46 69 6c 65 . }. hFile
4d30: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 6c = CreateFileW(l
4d40: 69 6e 6b 44 69 72 50 61 74 68 2c 20 47 45 4e 45 inkDirPath, GENE
4d50: 52 49 43 5f 57 52 49 54 45 2c 20 30 2c 20 4e 55 RIC_WRITE, 0, NU
4d60: 4c 4c 2c 0a 09 20 20 20 20 4f 50 45 4e 5f 45 58 LL,.. OPEN_EX
4d70: 49 53 54 49 4e 47 2c 20 46 49 4c 45 5f 46 4c 41 ISTING, FILE_FLA
4d80: 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f 50 G_OPEN_REPARSE_P
4d90: 4f 49 4e 54 0a 09 20 20 20 20 7c 20 46 49 4c 45 OINT.. | FILE
4da0: 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d _FLAG_BACKUP_SEM
4db0: 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 3b 0a 20 ANTICS, NULL);.
4dc0: 20 20 20 69 66 20 28 68 46 69 6c 65 20 3d 3d 20 if (hFile ==
4dd0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
4de0: 41 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 ALUE) {../*.. *
4df0: 45 72 72 6f 72 20 63 72 65 61 74 69 6e 67 20 64 Error creating d
4e00: 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a irectory... */..
4e10: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 .TclWinConvertEr
4e20: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 ror(GetLastError
4e30: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b ());..return -1;
4e40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
4e50: 20 20 20 20 2a 20 53 65 74 20 74 68 65 20 6c 69 * Set the li
4e60: 6e 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 nk.. */..
4e70: 20 69 66 20 28 21 44 65 76 69 63 65 49 6f 43 6f if (!DeviceIoCo
4e80: 6e 74 72 6f 6c 28 68 46 69 6c 65 2c 20 46 53 43 ntrol(hFile, FSC
4e90: 54 4c 5f 53 45 54 5f 52 45 50 41 52 53 45 5f 50 TL_SET_REPARSE_P
4ea0: 4f 49 4e 54 2c 20 62 75 66 66 65 72 2c 0a 09 20 OINT, buffer,..
4eb0: 20 20 20 28 44 57 4f 52 44 29 20 62 75 66 66 65 (DWORD) buffe
4ec0: 72 2d 3e 52 65 70 61 72 73 65 44 61 74 61 4c 65 r->ReparseDataLe
4ed0: 6e 67 74 68 20 2b 20 52 45 50 41 52 53 45 5f 4d ngth + REPARSE_M
4ee0: 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 52 OUNTPOINT_HEADER
4ef0: 5f 53 49 5a 45 2c 0a 09 20 20 20 20 4e 55 4c 4c _SIZE,.. NULL
4f00: 2c 20 30 2c 20 26 72 65 74 75 72 6e 65 64 4c 65 , 0, &returnedLe
4f10: 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 ngth, NULL)) {..
4f20: 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 73 65 74 /*.. * Error set
4f30: 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e 0a 09 ting junction...
4f40: 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 */...TclWinConv
4f50: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 ertError(GetLast
4f60: 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c 6f 73 65 Error());..Close
4f70: 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 Handle(hFile);..
4f80: 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 57 RemoveDirectoryW
4f90: 28 6c 69 6e 6b 44 69 72 50 61 74 68 29 3b 0a 09 (linkDirPath);..
4fa0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d return -1;. }
4fb0: 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 . CloseHandle
4fc0: 28 68 46 69 6c 65 29 3b 0a 0a 20 20 20 20 2f 2a (hFile);.. /*
4fd0: 0a 20 20 20 20 20 2a 20 57 65 20 73 75 63 63 65 . * We succe
4fe0: 65 64 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 eded.. */..
4ff0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c return 0;.}..
5000: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5050: 20 2a 20 74 63 6c 57 69 6e 44 65 62 75 67 50 61 * tclWinDebugPa
5060: 6e 69 63 20 2d 2d 0a 20 2a 0a 20 2a 09 44 69 73 nic --. *. *.Dis
5070: 70 6c 61 79 20 61 20 6d 65 73 73 61 67 65 2e 20 play a message.
5080: 49 66 20 61 20 64 65 62 75 67 67 65 72 20 69 73 If a debugger is
5090: 20 70 72 65 73 65 6e 74 2c 20 70 72 65 73 65 6e present, presen
50a0: 74 20 69 74 20 64 69 72 65 63 74 6c 79 20 74 6f t it directly to
50b0: 0a 20 2a 09 74 68 65 20 64 65 62 75 67 67 65 72 . *.the debugger
50c0: 2c 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 20 , otherwise use
50d0: 61 20 4d 65 73 73 61 67 65 42 6f 78 2e 0a 20 2a a MessageBox.. *
50e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
50f0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 None.. *. * Side
5100: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
5110: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5160: 2a 2f 0a 0a 54 43 4c 5f 4e 4f 52 45 54 55 52 4e */..TCL_NORETURN
5170: 20 76 6f 69 64 0a 74 63 6c 57 69 6e 44 65 62 75 void.tclWinDebu
5180: 67 50 61 6e 69 63 28 0a 20 20 20 20 63 6f 6e 73 gPanic(. cons
5190: 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 t char *format,
51a0: 2e 2e 2e 29 0a 7b 0a 23 64 65 66 69 6e 65 20 54 ...).{.#define T
51b0: 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f 4c 45 4e 20 CL_MAX_WARN_LEN
51c0: 31 30 32 34 0a 20 20 20 20 76 61 5f 6c 69 73 74 1024. va_list
51d0: 20 61 72 67 4c 69 73 74 3b 0a 20 20 20 20 63 68 argList;. ch
51e0: 61 72 20 62 75 66 5b 54 43 4c 5f 4d 41 58 5f 57 ar buf[TCL_MAX_W
51f0: 41 52 4e 5f 4c 45 4e 20 2a 20 33 5d 3b 0a 20 20 ARN_LEN * 3];.
5200: 20 20 57 43 48 41 52 20 6d 73 67 53 74 72 69 6e WCHAR msgStrin
5210: 67 5b 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f 4c g[TCL_MAX_WARN_L
5220: 45 4e 5d 3b 0a 0a 20 20 20 20 76 61 5f 73 74 61 EN];.. va_sta
5230: 72 74 28 61 72 67 4c 69 73 74 2c 20 66 6f 72 6d rt(argList, form
5240: 61 74 29 3b 0a 20 20 20 20 76 73 6e 70 72 69 6e at);. vsnprin
5250: 74 66 28 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 tf(buf, sizeof(b
5260: 75 66 29 2c 20 66 6f 72 6d 61 74 2c 20 61 72 67 uf), format, arg
5270: 4c 69 73 74 29 3b 0a 0a 20 20 20 20 6d 73 67 53 List);.. msgS
5280: 74 72 69 6e 67 5b 54 43 4c 5f 4d 41 58 5f 57 41 tring[TCL_MAX_WA
5290: 52 4e 5f 4c 45 4e 2d 31 5d 20 3d 20 27 5c 30 27 RN_LEN-1] = '\0'
52a0: 3b 0a 20 20 20 20 4d 75 6c 74 69 42 79 74 65 54 ;. MultiByteT
52b0: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 oWideChar(CP_UTF
52c0: 38 2c 20 30 2c 20 62 75 66 2c 20 2d 31 2c 20 6d 8, 0, buf, -1, m
52d0: 73 67 53 74 72 69 6e 67 2c 20 54 43 4c 5f 4d 41 sgString, TCL_MA
52e0: 58 5f 57 41 52 4e 5f 4c 45 4e 29 3b 0a 0a 20 20 X_WARN_LEN);..
52f0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 72 75 6e /*. * Trun
5300: 63 61 74 65 20 4d 65 73 73 61 67 65 42 6f 78 20 cate MessageBox
5310: 73 74 72 69 6e 67 20 69 66 20 69 74 20 69 73 20 string if it is
5320: 74 6f 6f 20 6c 6f 6e 67 20 74 6f 20 6e 6f 74 20 too long to not
5330: 6f 76 65 72 66 6c 6f 77 20 74 68 65 20 73 63 72 overflow the scr
5340: 65 65 6e 0a 20 20 20 20 20 2a 20 61 6e 64 20 63 een. * and c
5350: 61 75 73 65 20 70 6f 73 73 69 62 6c 65 20 6f 76 ause possible ov
5360: 65 72 73 69 7a 65 64 20 77 69 6e 64 6f 77 20 65 ersized window e
5370: 72 72 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 rror.. */..
5380: 20 20 20 69 66 20 28 6d 73 67 53 74 72 69 6e 67 if (msgString
5390: 5b 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f 4c 45 [TCL_MAX_WARN_LE
53a0: 4e 2d 31 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a N-1] != '\0') {.
53b0: 09 6d 65 6d 63 70 79 28 6d 73 67 53 74 72 69 6e .memcpy(msgStrin
53c0: 67 20 2b 20 28 54 43 4c 5f 4d 41 58 5f 57 41 52 g + (TCL_MAX_WAR
53d0: 4e 5f 4c 45 4e 20 2d 20 35 29 2c 20 4c 22 20 2e N_LEN - 5), L" .
53e0: 2e 2e 22 2c 20 35 20 2a 20 73 69 7a 65 6f 66 28 ..", 5 * sizeof(
53f0: 57 43 48 41 52 29 29 3b 0a 20 20 20 20 7d 0a 20 WCHAR));. }.
5400: 20 20 20 69 66 20 28 49 73 44 65 62 75 67 67 65 if (IsDebugge
5410: 72 50 72 65 73 65 6e 74 28 29 29 20 7b 0a 09 4f rPresent()) {..O
5420: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 utputDebugString
5430: 57 28 6d 73 67 53 74 72 69 6e 67 29 3b 0a 20 20 W(msgString);.
5440: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 4d 65 73 73 } else {..Mess
5450: 61 67 65 42 65 65 70 28 4d 42 5f 49 43 4f 4e 45 ageBeep(MB_ICONE
5460: 58 43 4c 41 4d 41 54 49 4f 4e 29 3b 0a 09 4d 65 XCLAMATION);..Me
5470: 73 73 61 67 65 42 6f 78 57 28 4e 55 4c 4c 2c 20 ssageBoxW(NULL,
5480: 6d 73 67 53 74 72 69 6e 67 2c 20 4c 22 46 61 74 msgString, L"Fat
5490: 61 6c 20 45 72 72 6f 72 22 2c 0a 09 09 4d 42 5f al Error",...MB_
54a0: 49 43 4f 4e 53 54 4f 50 20 7c 20 4d 42 5f 4f 4b ICONSTOP | MB_OK
54b0: 20 7c 20 4d 42 5f 54 41 53 4b 4d 4f 44 41 4c 20 | MB_TASKMODAL
54c0: 7c 20 4d 42 5f 53 45 54 46 4f 52 45 47 52 4f 55 | MB_SETFOREGROU
54d0: 4e 44 29 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 ND);. }.#if d
54e0: 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
54f0: 0a 20 20 20 20 5f 5f 62 75 69 6c 74 69 6e 5f 74 . __builtin_t
5500: 72 61 70 28 29 3b 0a 23 65 6c 69 66 20 64 65 66 rap();.#elif def
5510: 69 6e 65 64 28 5f 57 49 4e 36 34 29 0a 20 20 20 ined(_WIN64).
5520: 20 5f 5f 64 65 62 75 67 62 72 65 61 6b 28 29 3b __debugbreak();
5530: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f .#elif defined(_
5540: 4d 53 43 5f 56 45 52 29 20 26 26 20 64 65 66 69 MSC_VER) && defi
5550: 6e 65 64 20 28 5f 4d 5f 49 58 38 36 29 0a 20 20 ned (_M_IX86).
5560: 20 20 5f 61 73 6d 20 7b 69 6e 74 20 33 7d 0a 23 _asm {int 3}.#
5570: 65 6c 73 65 0a 20 20 20 20 44 65 62 75 67 42 72 else. DebugBr
5580: 65 61 6b 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 eak();.#endif.
5590: 20 20 61 62 6f 72 74 28 29 3b 0a 7d 0a 0c 0a 2f abort();.}.../
55a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
55f0: 20 2a 0a 20 2a 20 54 63 6c 70 46 69 6e 64 45 78 *. * TclpFindEx
5600: 65 63 75 74 61 62 6c 65 20 2d 2d 0a 20 2a 0a 20 ecutable --. *.
5610: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
5620: 63 6f 6d 70 75 74 65 73 20 74 68 65 20 61 62 73 computes the abs
5630: 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 olute path name
5640: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 of the current.
5650: 2a 09 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 20 *.application..
5660: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
5670: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
5680: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 e effects:. *.Th
5690: 65 20 63 6f 6d 70 75 74 65 64 20 70 61 74 68 20 e computed path
56a0: 69 73 20 73 74 6f 72 65 64 2e 0a 20 2a 0a 20 2a is stored.. *. *
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
5700: 0a 76 6f 69 64 0a 54 63 6c 70 46 69 6e 64 45 78 .void.TclpFindEx
5710: 65 63 75 74 61 62 6c 65 28 0a 20 20 20 20 63 6f ecutable(. co
5720: 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76 30 29 nst char *argv0)
5730: 09 09 2f 2a 20 49 66 20 4e 55 4c 4c 2c 20 69 6e ../* If NULL, in
5740: 73 74 61 6c 6c 20 50 61 6e 69 63 4d 65 73 73 61 stall PanicMessa
5750: 67 65 42 6f 78 2c 20 6f 74 68 65 72 77 69 73 65 geBox, otherwise
5760: 0a 09 09 09 09 20 2a 20 69 67 6e 6f 72 65 2e 20 ..... * ignore.
5770: 2a 2f 0a 7b 0a 20 20 20 20 57 43 48 41 52 20 77 */.{. WCHAR w
5780: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a Name[MAX_PATH];.
5790: 20 20 20 20 63 68 61 72 20 6e 61 6d 65 5b 4d 41 char name[MA
57a0: 58 5f 50 41 54 48 20 2a 20 33 5d 3b 0a 0a 20 20 X_PATH * 3];..
57b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 55 6e 64 65 /*. * Unde
57c0: 72 20 57 69 6e 64 6f 77 73 20 77 65 20 69 67 6e r Windows we ign
57d0: 6f 72 65 20 61 72 67 76 30 2c 20 61 6e 64 20 72 ore argv0, and r
57e0: 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 20 66 eturn the path f
57f0: 6f 72 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 or the file used
5800: 20 74 6f 0a 20 20 20 20 20 2a 20 63 72 65 61 74 to. * creat
5810: 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 e this process.
5820: 4f 6e 6c 79 20 69 66 20 69 74 20 69 73 20 4e 55 Only if it is NU
5830: 4c 4c 2c 20 69 6e 73 74 61 6c 6c 20 61 20 6e 65 LL, install a ne
5840: 77 20 70 61 6e 69 63 20 68 61 6e 64 6c 65 72 2e w panic handler.
5850: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
5860: 20 28 61 72 67 76 30 20 3d 3d 20 4e 55 4c 4c 29 (argv0 == NULL)
5870: 20 7b 0a 09 54 63 6c 5f 53 65 74 50 61 6e 69 63 {..Tcl_SetPanic
5880: 50 72 6f 63 28 74 63 6c 57 69 6e 44 65 62 75 67 Proc(tclWinDebug
5890: 50 61 6e 69 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 Panic);. }..
58a0: 20 20 20 47 65 74 4d 6f 64 75 6c 65 46 69 6c 65 GetModuleFile
58b0: 4e 61 6d 65 57 28 4e 55 4c 4c 2c 20 77 4e 61 6d NameW(NULL, wNam
58c0: 65 2c 20 73 69 7a 65 6f 66 28 77 4e 61 6d 65 29 e, sizeof(wName)
58d0: 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b /sizeof(WCHAR));
58e0: 0a 20 20 20 20 57 69 64 65 43 68 61 72 54 6f 4d . WideCharToM
58f0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 ultiByte(CP_UTF8
5900: 2c 20 30 2c 20 77 4e 61 6d 65 2c 20 2d 31 2c 20 , 0, wName, -1,
5910: 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28 6e 61 6d name, sizeof(nam
5920: 65 29 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b e), NULL, NULL);
5930: 0a 20 20 20 20 54 63 6c 57 69 6e 4e 6f 42 61 63 . TclWinNoBac
5940: 6b 73 6c 61 73 68 28 6e 61 6d 65 29 3b 0a 20 20 kslash(name);.
5950: 20 20 54 63 6c 53 65 74 4f 62 6a 4e 61 6d 65 4f TclSetObjNameO
5960: 66 45 78 65 63 75 74 61 62 6c 65 28 54 63 6c 5f fExecutable(Tcl_
5970: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6e 61 6d NewStringObj(nam
5980: 65 2c 20 2d 31 29 2c 20 4e 55 4c 4c 29 3b 0a 7d e, -1), NULL);.}
5990: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
59e0: 2a 0a 20 2a 20 54 63 6c 70 4d 61 74 63 68 49 6e *. * TclpMatchIn
59f0: 44 69 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a Directory --. *.
5a00: 20 2a 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 *.This routine
5a10: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 67 is used by the g
5a20: 6c 6f 62 62 69 6e 67 20 63 6f 64 65 20 74 6f 20 lobbing code to
5a30: 73 65 61 72 63 68 20 61 20 64 69 72 65 63 74 6f search a directo
5a40: 72 79 20 66 6f 72 0a 20 2a 09 61 6c 6c 20 66 69 ry for. *.all fi
5a50: 6c 65 73 20 77 68 69 63 68 20 6d 61 74 63 68 20 les which match
5a60: 61 20 67 69 76 65 6e 20 70 61 74 74 65 72 6e 2e a given pattern.
5a70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5a80: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 *.The return va
5a90: 6c 75 65 20 69 73 20 61 20 73 74 61 6e 64 61 72 lue is a standar
5aa0: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 69 6e 64 d Tcl result ind
5ab0: 69 63 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 icating whether
5ac0: 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6f 63 63 75 an error. *.occu
5ad0: 72 72 65 64 20 69 6e 20 67 6c 6f 62 62 69 6e 67 rred in globbing
5ae0: 2e 20 45 72 72 6f 72 73 20 61 72 65 20 6c 65 66 . Errors are lef
5af0: 74 20 69 6e 20 69 6e 74 65 72 70 2c 20 67 6f 6f t in interp, goo
5b00: 64 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20 2a d results are. *
5b10: 09 6c 61 70 70 65 6e 64 65 64 20 74 6f 20 72 65 .lappended to re
5b20: 73 75 6c 74 50 74 72 20 28 77 68 69 63 68 20 6d sultPtr (which m
5b30: 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 6f ust be a valid o
5b40: 62 6a 65 63 74 29 2e 0a 20 2a 0a 20 2a 20 53 69 bject).. *. * Si
5b50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
5b60: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4d 61 . */..int.TclpMa
5bc0: 74 63 68 49 6e 44 69 72 65 63 74 6f 72 79 28 0a tchInDirectory(.
5bd0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
5be0: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 interp,../* Inte
5bf0: 72 70 72 65 74 65 72 20 74 6f 20 72 65 63 65 69 rpreter to recei
5c00: 76 65 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 20 ve errors. */.
5c10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
5c20: 74 50 74 72 2c 09 09 2f 2a 20 4c 69 73 74 20 6f tPtr,../* List o
5c30: 62 6a 65 63 74 20 74 6f 20 6c 61 70 70 65 6e 64 bject to lappend
5c40: 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 results. */.
5c50: 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 Tcl_Obj *pathPt
5c60: 72 2c 09 09 2f 2a 20 43 6f 6e 74 61 69 6e 73 20 r,../* Contains
5c70: 70 61 74 68 20 74 6f 20 64 69 72 65 63 74 6f 72 path to director
5c80: 79 20 74 6f 20 73 65 61 72 63 68 2e 20 2a 2f 0a y to search. */.
5c90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
5ca0: 70 61 74 74 65 72 6e 2c 09 2f 2a 20 50 61 74 74 pattern,./* Patt
5cb0: 65 72 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 ern to match aga
5cc0: 69 6e 73 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c inst. */. Tcl
5cd0: 5f 47 6c 6f 62 54 79 70 65 44 61 74 61 20 2a 74 _GlobTypeData *t
5ce0: 79 70 65 73 29 09 2f 2a 20 4f 62 6a 65 63 74 20 ypes)./* Object
5cf0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6c 69 73 74 20 containing list
5d00: 6f 66 20 61 63 63 65 70 74 61 62 6c 65 20 74 79 of acceptable ty
5d10: 70 65 73 2e 0a 09 09 09 09 20 2a 20 4d 61 79 20 pes...... * May
5d20: 62 65 20 4e 55 4c 4c 2e 20 49 6e 20 70 61 72 74 be NULL. In part
5d30: 69 63 75 6c 61 72 20 74 68 65 20 64 69 72 65 63 icular the direc
5d40: 74 6f 72 79 0a 09 09 09 09 20 2a 20 66 6c 61 67 tory..... * flag
5d50: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 is very importa
5d60: 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e nt. */.{. con
5d70: 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 st WCHAR *native
5d80: 3b 0a 0a 20 20 20 20 69 66 20 28 74 79 70 65 73 ;.. if (types
5d90: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 79 70 65 != NULL && type
5da0: 73 2d 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 47 s->type == TCL_G
5db0: 4c 4f 42 5f 54 59 50 45 5f 4d 4f 55 4e 54 29 20 LOB_TYPE_MOUNT)
5dc0: 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 6e 61 {../*.. * The na
5dd0: 74 69 76 65 20 66 69 6c 65 73 79 73 74 65 6d 20 tive filesystem
5de0: 6e 65 76 65 72 20 61 64 64 73 20 6d 6f 75 6e 74 never adds mount
5df0: 73 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e s... */...return
5e00: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a TCL_OK;. }..
5e10: 20 20 20 20 69 66 20 28 70 61 74 74 65 72 6e 20 if (pattern
5e20: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 2a 70 61 74 == NULL || (*pat
5e30: 74 65 72 6e 20 3d 3d 20 27 5c 30 27 29 29 20 7b tern == '\0')) {
5e40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 20 ..Tcl_Obj *norm
5e50: 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 = Tcl_FSGetNorma
5e60: 6c 69 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 lizedPath(NULL,
5e70: 70 61 74 68 50 74 72 29 3b 0a 0a 09 69 66 20 28 pathPtr);...if (
5e80: 6e 6f 72 6d 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a norm != NULL) {.
5e90: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
5ea0: 4d 61 74 63 68 20 61 20 73 69 6e 67 6c 65 20 66 Match a single f
5eb0: 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 09 20 ile directly...
5ec0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 6e 74 */... int
5ed0: 20 6c 65 6e 3b 0a 09 20 20 20 20 44 57 4f 52 44 len;.. DWORD
5ee0: 20 61 74 74 72 3b 0a 09 20 20 20 20 57 49 4e 33 attr;.. WIN3
5ef0: 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 2_FILE_ATTRIBUTE
5f00: 5f 44 41 54 41 20 64 61 74 61 3b 0a 09 20 20 20 _DATA data;..
5f10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 const char *str
5f20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
5f30: 46 72 6f 6d 4f 62 6a 28 6e 6f 72 6d 2c 26 6c 65 FromObj(norm,&le
5f40: 6e 29 3b 0a 0a 09 20 20 20 20 6e 61 74 69 76 65 n);... native
5f50: 20 3d 20 28 57 43 48 41 52 20 2a 29 54 63 6c 5f = (WCHAR *)Tcl_
5f60: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 FSGetNativePath(
5f70: 70 61 74 68 50 74 72 29 3b 0a 0a 09 20 20 20 20 pathPtr);...
5f80: 69 66 20 28 47 65 74 46 69 6c 65 41 74 74 72 69 if (GetFileAttri
5f90: 62 75 74 65 73 45 78 57 28 6e 61 74 69 76 65 2c butesExW(native,
5fa0: 0a 09 09 20 20 20 20 47 65 74 46 69 6c 65 45 78 ... GetFileEx
5fb0: 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 26 64 InfoStandard, &d
5fc0: 61 74 61 29 20 21 3d 20 54 52 55 45 29 20 7b 0a ata) != TRUE) {.
5fd0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
5fe0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 61 74 74 .. }.. att
5ff0: 72 20 3d 20 64 61 74 61 2e 64 77 46 69 6c 65 41 r = data.dwFileA
6000: 74 74 72 69 62 75 74 65 73 3b 0a 0a 09 20 20 20 ttributes;...
6010: 20 69 66 20 28 4e 61 74 69 76 65 4d 61 74 63 68 if (NativeMatch
6020: 54 79 70 65 28 57 69 6e 49 73 44 72 69 76 65 28 Type(WinIsDrive(
6030: 73 74 72 2c 6c 65 6e 29 2c 20 61 74 74 72 2c 20 str,len), attr,
6040: 6e 61 74 69 76 65 2c 20 74 79 70 65 73 29 29 20 native, types))
6050: 7b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 {...Tcl_ListObjA
6060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
6070: 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 2c 20 erp, resultPtr,
6080: 70 61 74 68 50 74 72 29 3b 0a 09 20 20 20 20 7d pathPtr);.. }
6090: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ..}..return TCL_
60a0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
60b0: 0a 09 44 57 4f 52 44 20 61 74 74 72 3b 0a 09 48 ..DWORD attr;..H
60c0: 41 4e 44 4c 45 20 68 61 6e 64 6c 65 3b 0a 09 57 ANDLE handle;..W
60d0: 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 IN32_FIND_DATAW
60e0: 64 61 74 61 3b 0a 09 63 6f 6e 73 74 20 63 68 61 data;..const cha
60f0: 72 20 2a 64 69 72 4e 61 6d 65 3b 09 2f 2a 20 55 r *dirName;./* U
6100: 54 46 2d 38 20 64 69 72 20 6e 61 6d 65 2c 20 6c TF-8 dir name, l
6110: 61 74 65 72 20 77 69 74 68 20 70 61 74 74 65 72 ater with patter
6120: 6e 0a 09 09 09 09 20 2a 20 61 70 70 65 6e 64 65 n..... * appende
6130: 64 2e 20 2a 2f 0a 09 69 6e 74 20 64 69 72 4c 65 d. */..int dirLe
6140: 6e 67 74 68 3b 0a 09 69 6e 74 20 6d 61 74 63 68 ngth;..int match
6150: 53 70 65 63 69 61 6c 44 6f 74 73 3b 0a 09 54 63 SpecialDots;..Tc
6160: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f l_DString ds;../
6170: 2a 20 4e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e * Native encodin
6180: 67 20 6f 66 20 64 69 72 2c 20 61 6c 73 6f 20 75 g of dir, also u
6190: 73 65 64 0a 09 09 09 09 20 2a 20 74 65 6d 70 6f sed..... * tempo
61a0: 72 61 72 69 6c 79 20 66 6f 72 20 6f 74 68 65 72 rarily for other
61b0: 20 74 68 69 6e 67 73 2e 20 2a 2f 0a 09 54 63 6c things. */..Tcl
61c0: 5f 44 53 74 72 69 6e 67 20 64 73 4f 72 69 67 3b _DString dsOrig;
61d0: 09 2f 2a 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 ./* UTF-8 encodi
61e0: 6e 67 20 6f 66 20 64 69 72 2e 20 2a 2f 0a 09 54 ng of dir. */..T
61f0: 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e 61 6d 65 cl_Obj *fileName
6200: 50 74 72 3b 0a 09 63 68 61 72 20 6c 61 73 74 43 Ptr;..char lastC
6210: 68 61 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 47 65 har;.../*.. * Ge
6220: 74 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 t the normalized
6230: 20 70 61 74 68 20 72 65 70 72 65 73 65 6e 74 61 path representa
6240: 74 69 6f 6e 20 28 74 68 65 20 6d 61 69 6e 20 74 tion (the main t
6250: 68 69 6e 67 20 69 73 20 77 65 20 64 6f 6e 74 0a hing is we dont.
6260: 09 20 2a 20 77 61 6e 74 20 61 6e 79 20 27 7e 27 . * want any '~'
6270: 20 73 65 71 75 65 6e 63 65 73 29 2e 0a 09 20 2a sequences)... *
6280: 2f 0a 0a 09 66 69 6c 65 4e 61 6d 65 50 74 72 20 /...fileNamePtr
6290: 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 = Tcl_FSGetNorma
62a0: 6c 69 7a 65 64 50 61 74 68 28 69 6e 74 65 72 70 lizedPath(interp
62b0: 2c 20 70 61 74 68 50 74 72 29 3b 0a 09 69 66 20 , pathPtr);..if
62c0: 28 66 69 6c 65 4e 61 6d 65 50 74 72 20 3d 3d 20 (fileNamePtr ==
62d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 NULL) {.. ret
62e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
62f0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 56 65 72 69 66 }.../*.. * Verif
6300: 79 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69 y that the speci
6310: 66 69 65 64 20 70 61 74 68 20 65 78 69 73 74 73 fied path exists
6320: 20 61 6e 64 20 69 73 20 61 63 74 75 61 6c 6c 79 and is actually
6330: 20 61 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 a directory...
6340: 2a 2f 0a 0a 09 6e 61 74 69 76 65 20 3d 20 28 63 */...native = (c
6350: 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 54 63 6c onst WCHAR *)Tcl
6360: 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 _FSGetNativePath
6370: 28 70 61 74 68 50 74 72 29 3b 0a 09 69 66 20 28 (pathPtr);..if (
6380: 6e 61 74 69 76 65 20 3d 3d 20 4e 55 4c 4c 29 20 native == NULL)
6390: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
63a0: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 61 74 74 72 20 3d L_OK;..}..attr =
63b0: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 GetFileAttribut
63c0: 65 73 57 28 6e 61 74 69 76 65 29 3b 0a 0a 09 69 esW(native);...i
63d0: 66 20 28 28 61 74 74 72 20 3d 3d 20 49 4e 56 41 f ((attr == INVA
63e0: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 LID_FILE_ATTRIBU
63f0: 54 45 53 29 0a 09 20 20 20 20 7c 7c 20 28 28 61 TES).. || ((a
6400: 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 ttr & FILE_ATTRI
6410: 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20 BUTE_DIRECTORY)
6420: 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 72 65 == 0)) {.. re
6430: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a turn TCL_OK;..}.
6440: 0a 09 2f 2a 0a 09 20 2a 20 42 75 69 6c 64 20 75 ../*.. * Build u
6450: 70 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 p the directory
6460: 6e 61 6d 65 20 66 6f 72 20 73 65 61 72 63 68 69 name for searchi
6470: 6e 67 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 20 ng, including a
6480: 74 72 61 69 6c 69 6e 67 0a 09 20 2a 20 64 69 72 trailing.. * dir
6490: 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 ectory separator
64a0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 ... */...Tcl_DSt
64b0: 72 69 6e 67 49 6e 69 74 28 26 64 73 4f 72 69 67 ringInit(&dsOrig
64c0: 29 3b 0a 09 64 69 72 4e 61 6d 65 20 3d 20 54 63 );..dirName = Tc
64d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
64e0: 62 6a 28 66 69 6c 65 4e 61 6d 65 50 74 72 2c 20 bj(fileNamePtr,
64f0: 26 64 69 72 4c 65 6e 67 74 68 29 3b 0a 09 54 63 &dirLength);..Tc
6500: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 l_DStringAppend(
6510: 26 64 73 4f 72 69 67 2c 20 64 69 72 4e 61 6d 65 &dsOrig, dirName
6520: 2c 20 64 69 72 4c 65 6e 67 74 68 29 3b 0a 0a 09 , dirLength);...
6530: 6c 61 73 74 43 68 61 72 20 3d 20 64 69 72 4e 61 lastChar = dirNa
6540: 6d 65 5b 64 69 72 4c 65 6e 67 74 68 20 2d 31 5d me[dirLength -1]
6550: 3b 0a 09 69 66 20 28 28 6c 61 73 74 43 68 61 72 ;..if ((lastChar
6560: 20 21 3d 20 27 5c 5c 27 29 20 26 26 20 28 6c 61 != '\\') && (la
6570: 73 74 43 68 61 72 20 21 3d 20 27 2f 27 29 20 26 stChar != '/') &
6580: 26 20 28 6c 61 73 74 43 68 61 72 20 21 3d 20 27 & (lastChar != '
6590: 3a 27 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 44 :')) {.. TclD
65a0: 53 74 72 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 StringAppendLite
65b0: 72 61 6c 28 26 64 73 4f 72 69 67 2c 20 22 2f 22 ral(&dsOrig, "/"
65c0: 29 3b 0a 09 20 20 20 20 64 69 72 4c 65 6e 67 74 );.. dirLengt
65d0: 68 2b 2b 3b 0a 09 7d 0a 09 64 69 72 4e 61 6d 65 h++;..}..dirName
65e0: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 = Tcl_DStringVa
65f0: 6c 75 65 28 26 64 73 4f 72 69 67 29 3b 0a 0a 09 lue(&dsOrig);...
6600: 2f 2a 0a 09 20 2a 20 57 65 20 6e 65 65 64 20 74 /*.. * We need t
6610: 6f 20 63 68 65 63 6b 20 61 6c 6c 20 66 69 6c 65 o check all file
6620: 73 20 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f s in the directo
6630: 72 79 2c 20 73 6f 20 77 65 20 61 70 70 65 6e 64 ry, so we append
6640: 20 27 2a 2e 2a 27 20 74 6f 0a 09 20 2a 20 74 68 '*.*' to.. * th
6650: 65 20 70 61 74 68 2c 20 75 6e 6c 65 73 73 20 74 e path, unless t
6660: 68 65 20 70 61 74 74 65 72 6e 20 77 65 27 76 65 he pattern we've
6670: 20 62 65 65 6e 20 67 69 76 65 6e 20 69 73 20 72 been given is r
6680: 61 74 68 65 72 20 73 69 6d 70 6c 65 2c 0a 09 20 ather simple,..
6690: 2a 20 77 68 65 6e 20 77 65 20 63 61 6e 20 75 73 * when we can us
66a0: 65 20 74 68 61 74 20 69 6e 73 74 65 61 64 2e 0a e that instead..
66b0: 09 20 2a 2f 0a 0a 09 69 66 20 28 73 74 72 70 62 . */...if (strpb
66c0: 72 6b 28 70 61 74 74 65 72 6e 2c 20 22 5b 5d 5c rk(pattern, "[]\
66d0: 5c 22 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 \") == NULL) {..
66e0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 /*.. * T
66f0: 68 65 20 70 61 74 74 65 72 6e 20 69 73 20 61 20 he pattern is a
6700: 73 69 6d 70 6c 65 20 6f 6e 65 20 63 6f 6e 74 61 simple one conta
6710: 69 6e 69 6e 67 20 6a 75 73 74 20 27 2a 27 20 61 ining just '*' a
6720: 6e 64 2f 6f 72 20 27 3f 27 2e 0a 09 20 20 20 20 nd/or '?'...
6730: 20 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 77 65 * This means we
6740: 20 63 61 6e 20 67 65 74 20 74 68 65 20 4f 53 20 can get the OS
6750: 74 6f 20 68 65 6c 70 20 75 73 2c 20 62 79 20 70 to help us, by p
6760: 61 73 73 69 6e 67 20 69 74 20 74 68 65 0a 09 20 assing it the..
6770: 20 20 20 20 2a 20 70 61 74 74 65 72 6e 2e 0a 09 * pattern...
6780: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 64 69 */... di
6790: 72 4e 61 6d 65 20 3d 20 54 63 6c 5f 44 53 74 72 rName = Tcl_DStr
67a0: 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4f 72 69 ingAppend(&dsOri
67b0: 67 2c 20 70 61 74 74 65 72 6e 2c 20 2d 31 29 3b g, pattern, -1);
67c0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
67d0: 64 69 72 4e 61 6d 65 20 3d 20 54 63 6c 44 53 74 dirName = TclDSt
67e0: 72 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 72 61 ringAppendLitera
67f0: 6c 28 26 64 73 4f 72 69 67 2c 20 22 2a 2e 2a 22 l(&dsOrig, "*.*"
6800: 29 3b 0a 09 7d 0a 0a 09 6e 61 74 69 76 65 20 3d );..}...native =
6810: 20 28 57 43 48 41 52 20 2a 29 54 63 6c 5f 57 69 (WCHAR *)Tcl_Wi
6820: 6e 55 74 66 54 6f 54 43 68 61 72 28 64 69 72 4e nUtfToTChar(dirN
6830: 61 6d 65 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 09 ame, -1, &ds);..
6840: 69 66 20 28 28 74 79 70 65 73 20 3d 3d 20 4e 55 if ((types == NU
6850: 4c 4c 29 20 7c 7c 20 28 74 79 70 65 73 2d 3e 74 LL) || (types->t
6860: 79 70 65 20 21 3d 20 54 43 4c 5f 47 4c 4f 42 5f ype != TCL_GLOB_
6870: 54 59 50 45 5f 44 49 52 29 29 20 7b 0a 09 20 20 TYPE_DIR)) {..
6880: 20 20 68 61 6e 64 6c 65 20 3d 20 46 69 6e 64 46 handle = FindF
6890: 69 72 73 74 46 69 6c 65 57 28 6e 61 74 69 76 65 irstFileW(native
68a0: 2c 20 26 64 61 74 61 29 3b 0a 09 7d 20 65 6c 73 , &data);..} els
68b0: 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 e {.. /*..
68c0: 20 20 2a 20 57 65 20 63 61 6e 20 62 65 20 6d 6f * We can be mo
68d0: 72 65 20 65 66 66 69 63 69 65 6e 74 2c 20 66 6f re efficient, fo
68e0: 72 20 70 75 72 65 20 64 69 72 65 63 74 6f 72 79 r pure directory
68f0: 20 72 65 71 75 65 73 74 73 2e 0a 09 20 20 20 20 requests...
6900: 20 2a 2f 0a 0a 09 20 20 20 20 68 61 6e 64 6c 65 */... handle
6910: 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 = FindFirstFile
6920: 45 78 57 28 6e 61 74 69 76 65 2c 0a 09 09 20 20 ExW(native,...
6930: 20 20 46 69 6e 64 45 78 49 6e 66 6f 53 74 61 6e FindExInfoStan
6940: 64 61 72 64 2c 20 26 64 61 74 61 2c 0a 09 09 20 dard, &data,...
6950: 20 20 20 46 69 6e 64 45 78 53 65 61 72 63 68 4c FindExSearchL
6960: 69 6d 69 74 54 6f 44 69 72 65 63 74 6f 72 69 65 imitToDirectorie
6970: 73 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a s, NULL, 0);..}.
6980: 0a 09 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 ..if (handle ==
6990: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
69a0: 41 4c 55 45 29 20 7b 0a 09 20 20 20 20 44 57 4f ALUE) {.. DWO
69b0: 52 44 20 65 72 72 20 3d 20 47 65 74 4c 61 73 74 RD err = GetLast
69c0: 45 72 72 6f 72 28 29 3b 0a 0a 09 20 20 20 20 54 Error();... T
69d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
69e0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 65 72 ds);.. if (er
69f0: 72 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f r == ERROR_FILE_
6a00: 4e 4f 54 5f 46 4f 55 4e 44 29 20 7b 0a 09 09 2f NOT_FOUND) {.../
6a10: 2a 0a 09 09 20 2a 20 57 65 20 75 73 65 64 20 6f *... * We used o
6a20: 75 72 20 27 70 61 74 74 65 72 6e 27 20 61 62 6f ur 'pattern' abo
6a30: 76 65 2c 20 61 6e 64 20 6d 61 74 63 68 65 64 20 ve, and matched
6a40: 6e 6f 74 68 69 6e 67 2e 20 54 68 69 73 0a 09 09 nothing. This...
6a50: 20 2a 20 6d 65 61 6e 73 20 77 65 20 6a 75 73 74 * means we just
6a60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 2c 20 return TCL_OK,
6a70: 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 72 65 indicating no re
6a80: 73 75 6c 74 73 20 66 6f 75 6e 64 2e 0a 09 09 20 sults found....
6a90: 2a 2f 0a 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e */....Tcl_DStrin
6aa0: 67 46 72 65 65 28 26 64 73 4f 72 69 67 29 3b 0a gFree(&dsOrig);.
6ab0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b ..return TCL_OK;
6ac0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 .. }... Tc
6ad0: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 lWinConvertError
6ae0: 28 65 72 72 29 3b 0a 09 20 20 20 20 69 66 20 28 (err);.. if (
6af0: 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 interp != NULL)
6b00: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {...Tcl_SetObjRe
6b10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
6b20: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 _ObjPrintf(...."
6b30: 63 6f 75 6c 64 6e 27 74 20 72 65 61 64 20 64 69 couldn't read di
6b40: 72 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 3a 20 rectory \"%s\":
6b50: 25 73 22 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 %s",....Tcl_DStr
6b60: 69 6e 67 56 61 6c 75 65 28 26 64 73 4f 72 69 67 ingValue(&dsOrig
6b70: 29 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f ), Tcl_PosixErro
6b80: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 r(interp)));..
6b90: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
6ba0: 72 69 6e 67 46 72 65 65 28 26 64 73 4f 72 69 67 ringFree(&dsOrig
6bb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
6bc0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 CL_ERROR;..}..Tc
6bd0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
6be0: 73 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 s);.../*.. * We
6bf0: 6d 61 79 20 75 73 65 20 74 68 69 73 20 6c 61 74 may use this lat
6c00: 65 72 2c 20 73 6f 20 77 65 20 6d 75 73 74 20 72 er, so we must r
6c10: 65 73 74 6f 72 65 20 69 74 20 74 6f 20 69 74 73 estore it to its
6c20: 20 6c 65 6e 67 74 68 0a 09 20 2a 20 69 6e 63 6c length.. * incl
6c30: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 uding the direct
6c40: 6f 72 79 20 64 65 6c 69 6d 69 74 65 72 2e 0a 09 ory delimiter...
6c50: 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e */...Tcl_DStrin
6c60: 67 53 65 74 4c 65 6e 67 74 68 28 26 64 73 4f 72 gSetLength(&dsOr
6c70: 69 67 2c 20 64 69 72 4c 65 6e 67 74 68 29 3b 0a ig, dirLength);.
6c80: 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 74 ../*.. * Check t
6c90: 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 61 74 o see if the pat
6ca0: 74 65 72 6e 20 73 68 6f 75 6c 64 20 6d 61 74 63 tern should matc
6cb0: 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 2e 20 h the special .
6cc0: 61 6e 64 0a 09 20 2a 20 2e 2e 20 6e 61 6d 65 73 and.. * .. names
6cd0: 2c 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 , referring to t
6ce0: 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 he current direc
6cf0: 74 6f 72 79 2c 20 6f 72 20 74 68 65 20 64 69 72 tory, or the dir
6d00: 65 63 74 6f 72 79 0a 09 20 2a 20 61 62 6f 76 65 ectory.. * above
6d10: 2e 20 57 65 20 6e 65 65 64 20 61 20 73 70 65 63 . We need a spec
6d20: 69 61 6c 20 63 68 65 63 6b 20 66 6f 72 20 74 68 ial check for th
6d30: 69 73 20 62 65 63 61 75 73 65 20 70 61 74 68 73 is because paths
6d40: 20 62 65 67 69 6e 6e 69 6e 67 0a 09 20 2a 20 77 beginning.. * w
6d50: 69 74 68 20 61 20 64 6f 74 20 61 72 65 20 6e 6f ith a dot are no
6d60: 74 20 63 6f 6e 73 69 64 65 72 65 64 20 68 69 64 t considered hid
6d70: 64 65 6e 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 den on Windows,
6d80: 61 6e 64 20 73 6f 20 6f 74 68 65 72 77 69 73 65 and so otherwise
6d90: 20 61 0a 09 20 2a 20 72 65 6c 61 74 69 76 65 20 a.. * relative
6da0: 67 6c 6f 62 20 6c 69 6b 65 20 27 67 6c 6f 62 20 glob like 'glob
6db0: 2d 6a 6f 69 6e 20 2a 20 2a 27 20 77 69 6c 6c 20 -join * *' will
6dc0: 61 63 74 75 61 6c 6c 79 20 72 65 74 75 72 6e 0a actually return.
6dd0: 09 20 2a 20 27 2e 2f 2e 20 2e 2e 2f 2e 2e 27 20 . * './. ../..'
6de0: 65 74 63 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 etc... */...if (
6df0: 28 70 61 74 74 65 72 6e 5b 30 5d 20 3d 3d 20 27 (pattern[0] == '
6e00: 2e 27 29 0a 09 09 7c 7c 20 28 28 70 61 74 74 65 .')...|| ((patte
6e10: 72 6e 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 rn[0] == '\\') &
6e20: 26 20 28 70 61 74 74 65 72 6e 5b 31 5d 20 3d 3d & (pattern[1] ==
6e30: 20 27 2e 27 29 29 29 20 7b 0a 09 20 20 20 20 6d '.'))) {.. m
6e40: 61 74 63 68 53 70 65 63 69 61 6c 44 6f 74 73 20 atchSpecialDots
6e50: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 = 1;..} else {..
6e60: 20 20 20 20 6d 61 74 63 68 53 70 65 63 69 61 6c matchSpecial
6e70: 44 6f 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f Dots = 0;..}.../
6e80: 2a 0a 09 20 2a 20 4e 6f 77 20 69 74 65 72 61 74 *.. * Now iterat
6e90: 65 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 e over all of th
6ea0: 65 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64 e files in the d
6eb0: 69 72 65 63 74 6f 72 79 2c 20 73 74 61 72 74 69 irectory, starti
6ec0: 6e 67 20 77 69 74 68 0a 09 20 2a 20 74 68 65 20 ng with.. * the
6ed0: 66 69 72 73 74 20 6f 6e 65 20 77 65 20 66 6f 75 first one we fou
6ee0: 6e 64 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 20 7b 0a nd... */...do {.
6ef0: 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
6f00: 2a 75 74 66 6e 61 6d 65 3b 0a 09 20 20 20 20 69 *utfname;.. i
6f10: 6e 74 20 63 68 65 63 6b 44 72 69 76 65 20 3d 20 nt checkDrive =
6f20: 30 2c 20 69 73 44 72 69 76 65 3b 0a 0a 09 20 20 0, isDrive;...
6f30: 20 20 6e 61 74 69 76 65 20 3d 20 64 61 74 61 2e native = data.
6f40: 63 46 69 6c 65 4e 61 6d 65 3b 0a 09 20 20 20 20 cFileName;..
6f50: 61 74 74 72 20 3d 20 64 61 74 61 2e 64 77 46 69 attr = data.dwFi
6f60: 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 09 20 leAttributes;..
6f70: 20 20 20 75 74 66 6e 61 6d 65 20 3d 20 54 63 6c utfname = Tcl
6f80: 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 _WinTCharToUtf((
6f90: 54 43 48 41 52 20 2a 29 6e 61 74 69 76 65 2c 20 TCHAR *)native,
6fa0: 2d 31 2c 20 26 64 73 29 3b 0a 0a 09 20 20 20 20 -1, &ds);...
6fb0: 69 66 20 28 21 6d 61 74 63 68 53 70 65 63 69 61 if (!matchSpecia
6fc0: 6c 44 6f 74 73 29 20 7b 0a 09 09 2f 2a 0a 09 09 lDots) {.../*...
6fd0: 20 2a 20 49 66 20 69 74 20 69 73 20 65 78 61 63 * If it is exac
6fe0: 74 6c 79 20 27 2e 27 20 6f 72 20 27 2e 2e 27 20 tly '.' or '..'
6ff0: 74 68 65 6e 20 77 65 20 69 67 6e 6f 72 65 20 69 then we ignore i
7000: 74 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 t.... */....if (
7010: 28 75 74 66 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 (utfname[0] == '
7020: 2e 27 29 20 26 26 20 28 75 74 66 6e 61 6d 65 5b .') && (utfname[
7030: 31 5d 20 3d 3d 20 27 5c 30 27 0a 09 09 09 7c 7c 1] == '\0'....||
7040: 20 28 75 74 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20 (utfname[1] ==
7050: 27 2e 27 20 26 26 20 75 74 66 6e 61 6d 65 5b 32 '.' && utfname[2
7060: 5d 20 3d 3d 20 27 5c 30 27 29 29 29 20 7b 0a 09 ] == '\0'))) {..
7070: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
7080: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 20 20 20 Free(&ds);...
7090: 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 09 continue;...}..
70a0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 75 } else if (u
70b0: 74 66 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 2e 27 tfname[0] == '.'
70c0: 20 26 26 20 75 74 66 6e 61 6d 65 5b 31 5d 20 3d && utfname[1] =
70d0: 3d 20 27 2e 27 0a 09 09 20 20 20 20 26 26 20 75 = '.'... && u
70e0: 74 66 6e 61 6d 65 5b 32 5d 20 3d 3d 20 27 5c 30 tfname[2] == '\0
70f0: 27 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 48 ') {.../*... * H
7100: 61 76 65 20 74 6f 20 63 68 65 63 6b 20 69 66 20 ave to check if
7110: 74 68 69 73 20 69 73 20 61 20 64 72 69 76 65 20 this is a drive
7120: 62 65 6c 6f 77 2c 20 73 6f 20 77 65 20 63 61 6e below, so we can
7130: 20 63 6f 72 72 65 63 74 6c 79 0a 09 09 20 2a 20 correctly... *
7140: 6d 61 74 63 68 20 27 68 69 64 64 65 6e 27 20 61 match 'hidden' a
7150: 6e 64 20 6e 6f 74 20 68 69 64 64 65 6e 20 66 69 nd not hidden fi
7160: 6c 65 73 2e 0a 09 09 20 2a 2f 0a 0a 09 09 63 68 les.... */....ch
7170: 65 63 6b 44 72 69 76 65 20 3d 20 31 3b 0a 09 20 eckDrive = 1;..
7180: 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 }... /*..
7190: 20 20 20 20 2a 20 43 68 65 63 6b 20 74 6f 20 73 * Check to s
71a0: 65 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 6d ee if the file m
71b0: 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65 atches the patte
71c0: 72 6e 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 rn. Note that we
71d0: 20 61 72 65 0a 09 20 20 20 20 20 2a 20 69 67 6e are.. * ign
71e0: 6f 72 69 6e 67 20 74 68 65 20 63 61 73 65 20 73 oring the case s
71f0: 65 6e 73 69 74 69 76 69 74 79 20 66 6c 61 67 20 ensitivity flag
7200: 62 65 63 61 75 73 65 20 57 69 6e 64 6f 77 73 20 because Windows
7210: 64 6f 65 73 6e 27 74 0a 09 20 20 20 20 20 2a 20 doesn't.. *
7220: 68 6f 6e 6f 72 20 63 61 73 65 20 65 76 65 6e 20 honor case even
7230: 69 66 20 74 68 65 20 76 6f 6c 75 6d 65 20 69 73 if the volume is
7240: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2e case sensitive.
7250: 20 49 66 20 74 68 65 20 76 6f 6c 75 6d 65 0a 09 If the volume..
7260: 20 20 20 20 20 2a 20 61 6c 73 6f 20 64 6f 65 73 * also does
7270: 6e 27 74 20 70 72 65 73 65 72 76 65 20 63 61 73 n't preserve cas
7280: 65 2c 20 74 68 65 6e 20 77 65 20 70 72 65 76 69 e, then we previ
7290: 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 74 ously returned t
72a0: 68 65 0a 09 20 20 20 20 20 2a 20 6c 6f 77 65 72 he.. * lower
72b0: 20 63 61 73 65 20 66 6f 72 6d 20 6f 66 20 74 68 case form of th
72c0: 65 20 6e 61 6d 65 2e 20 54 68 69 73 20 64 69 64 e name. This did
72d0: 6e 27 74 20 73 65 65 6d 20 71 75 69 74 65 20 72 n't seem quite r
72e0: 69 67 68 74 20 73 69 6e 63 65 0a 09 20 20 20 20 ight since..
72f0: 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 6e * there are non
7300: 2d 63 61 73 65 2d 70 72 65 73 65 72 76 69 6e 67 -case-preserving
7310: 20 76 6f 6c 75 6d 65 73 20 74 68 61 74 20 61 63 volumes that ac
7320: 74 75 61 6c 6c 79 20 72 65 74 75 72 6e 0a 09 20 tually return..
7330: 20 20 20 20 2a 20 6d 69 78 65 64 20 63 61 73 65 * mixed case
7340: 2e 20 53 6f 20 6e 6f 77 20 77 65 20 61 72 65 20 . So now we are
7350: 72 65 74 75 72 6e 69 6e 67 20 65 78 61 63 74 6c returning exactl
7360: 79 20 77 68 61 74 20 77 65 20 67 65 74 20 66 72 y what we get fr
7370: 6f 6d 0a 09 20 20 20 20 20 2a 20 74 68 65 20 73 om.. * the s
7380: 79 73 74 65 6d 2e 0a 09 20 20 20 20 20 2a 2f 0a ystem... */.
7390: 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 53 74 .. if (Tcl_St
73a0: 72 69 6e 67 43 61 73 65 4d 61 74 63 68 28 75 74 ringCaseMatch(ut
73b0: 66 6e 61 6d 65 2c 20 70 61 74 74 65 72 6e 2c 20 fname, pattern,
73c0: 31 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 1)) {.../*... *
73d0: 49 66 20 74 68 65 20 66 69 6c 65 20 6d 61 74 63 If the file matc
73e0: 68 65 73 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 hes, then we nee
73f0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 d to process the
7400: 20 72 65 6d 61 69 6e 64 65 72 0a 09 09 20 2a 20 remainder... *
7410: 6f 66 20 74 68 65 20 70 61 74 68 2e 0a 09 09 20 of the path....
7420: 2a 2f 0a 0a 09 09 69 66 20 28 63 68 65 63 6b 44 */....if (checkD
7430: 72 69 76 65 29 20 7b 0a 09 09 20 20 20 20 63 6f rive) {... co
7440: 6e 73 74 20 63 68 61 72 20 2a 66 75 6c 6c 6e 61 nst char *fullna
7450: 6d 65 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 me = Tcl_DString
7460: 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67 2c 20 Append(&dsOrig,
7470: 75 74 66 6e 61 6d 65 2c 0a 09 09 09 20 20 20 20 utfname,....
7480: 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 Tcl_DStringLengt
7490: 68 28 26 64 73 29 29 3b 0a 0a 09 09 20 20 20 20 h(&ds));....
74a0: 69 73 44 72 69 76 65 20 3d 20 57 69 6e 49 73 44 isDrive = WinIsD
74b0: 72 69 76 65 28 66 75 6c 6c 6e 61 6d 65 2c 20 54 rive(fullname, T
74c0: 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 cl_DStringLength
74d0: 28 26 64 73 4f 72 69 67 29 29 3b 0a 09 09 20 20 (&dsOrig));...
74e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 74 Tcl_DStringSet
74f0: 4c 65 6e 67 74 68 28 26 64 73 4f 72 69 67 2c 20 Length(&dsOrig,
7500: 64 69 72 4c 65 6e 67 74 68 29 3b 0a 09 09 7d 20 dirLength);...}
7510: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 69 73 44 else {... isD
7520: 72 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 09 rive = 0;...}...
7530: 69 66 20 28 4e 61 74 69 76 65 4d 61 74 63 68 54 if (NativeMatchT
7540: 79 70 65 28 69 73 44 72 69 76 65 2c 20 61 74 74 ype(isDrive, att
7550: 72 2c 20 6e 61 74 69 76 65 2c 20 74 79 70 65 73 r, native, types
7560: 29 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 4c )) {... Tcl_L
7570: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7580: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
7590: 6c 74 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63 ltPtr,.... Tc
75a0: 6c 4e 65 77 46 53 50 61 74 68 4f 62 6a 28 70 61 lNewFSPathObj(pa
75b0: 74 68 50 74 72 2c 20 75 74 66 6e 61 6d 65 2c 0a thPtr, utfname,.
75c0: 09 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 .... Tcl_DStr
75d0: 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 29 29 ingLength(&ds)))
75e0: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 09 20 ;...}.. }...
75f0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 46 72 /*.. * Fr
7600: 65 65 20 64 73 20 68 65 72 65 20 74 6f 20 65 6e ee ds here to en
7610: 73 75 72 65 20 74 68 61 74 20 6e 61 74 69 76 65 sure that native
7620: 20 69 73 20 76 61 6c 69 64 20 61 62 6f 76 65 2e is valid above.
7630: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
7640: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
7650: 26 64 73 29 3b 0a 09 7d 20 77 68 69 6c 65 20 28 &ds);..} while (
7660: 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 61 FindNextFileW(ha
7670: 6e 64 6c 65 2c 20 26 64 61 74 61 29 20 3d 3d 20 ndle, &data) ==
7680: 54 52 55 45 29 3b 0a 0a 09 46 69 6e 64 43 6c 6f TRUE);...FindClo
7690: 73 65 28 68 61 6e 64 6c 65 29 3b 0a 09 54 63 6c se(handle);..Tcl
76a0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
76b0: 4f 72 69 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 Orig);..return T
76c0: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c CL_OK;. }.}..
76d0: 0a 2f 2a 0a 20 2a 20 44 6f 65 73 20 74 68 65 20 ./*. * Does the
76e0: 67 69 76 65 6e 20 70 61 74 68 20 72 65 70 72 65 given path repre
76f0: 73 65 6e 74 20 61 20 72 6f 6f 74 20 76 6f 6c 75 sent a root volu
7700: 6d 65 3f 20 57 65 20 6e 65 65 64 20 74 68 69 73 me? We need this
7710: 20 73 70 65 63 69 61 6c 20 63 61 73 65 0a 20 2a special case. *
7720: 20 62 65 63 61 75 73 65 20 66 6f 72 20 4e 54 46 because for NTF
7730: 53 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 73 2c 20 S root volumes,
7740: 74 68 65 20 67 65 74 46 69 6c 65 41 74 74 72 69 the getFileAttri
7750: 62 75 74 65 73 50 72 6f 63 20 72 65 74 75 72 6e butesProc return
7760: 73 20 61 20 27 68 69 64 64 65 6e 27 0a 20 2a 20 s a 'hidden'. *
7770: 61 74 74 72 69 62 75 74 65 20 77 68 65 6e 20 69 attribute when i
7780: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 2e 0a 20 2a t should not.. *
7790: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 /..static int.Wi
77a0: 6e 49 73 44 72 69 76 65 28 0a 20 20 20 20 63 6f nIsDrive(. co
77b0: 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 09 nst char *name,.
77c0: 09 2f 2a 20 4e 61 6d 65 20 28 55 54 46 2d 38 29 ./* Name (UTF-8)
77d0: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c */. size_t l
77e0: 65 6e 29 09 09 09 2f 2a 20 4c 65 6e 67 74 68 20 en).../* Length
77f0: 6f 66 20 6e 61 6d 65 20 2a 2f 0a 7b 0a 20 20 20 of name */.{.
7800: 20 69 6e 74 20 72 65 6d 6f 76 65 20 3d 20 30 3b int remove = 0;
7810: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e .. while (len
7820: 20 3e 20 34 29 20 7b 0a 09 69 66 20 28 28 6e 61 > 4) {..if ((na
7830: 6d 65 5b 6c 65 6e 2d 31 5d 20 21 3d 20 27 2e 27 me[len-1] != '.'
7840: 20 7c 7c 20 6e 61 6d 65 5b 6c 65 6e 2d 32 5d 20 || name[len-2]
7850: 21 3d 20 27 2e 27 29 0a 09 09 7c 7c 20 28 6e 61 != '.')...|| (na
7860: 6d 65 5b 6c 65 6e 2d 33 5d 20 21 3d 20 27 2f 27 me[len-3] != '/'
7870: 20 26 26 20 6e 61 6d 65 5b 6c 65 6e 2d 33 5d 20 && name[len-3]
7880: 21 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20 20 20 != '\\')) {..
7890: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 64 /*.. * We d
78a0: 6f 6e 27 74 20 68 61 76 65 20 27 2f 2e 2e 27 20 on't have '/..'
78b0: 61 74 20 74 68 65 20 65 6e 64 2e 0a 09 20 20 20 at the end...
78c0: 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 72 */... if (r
78d0: 65 6d 6f 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 emove == 0) {...
78e0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 break;.. }..
78f0: 20 20 20 72 65 6d 6f 76 65 2d 2d 3b 0a 09 20 20 remove--;..
7900: 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 20 30 while (len > 0
7910: 29 20 7b 0a 09 09 6c 65 6e 2d 2d 3b 0a 09 09 69 ) {...len--;...i
7920: 66 20 28 6e 61 6d 65 5b 6c 65 6e 5d 20 3d 3d 20 f (name[len] ==
7930: 27 2f 27 20 7c 7c 20 6e 61 6d 65 5b 6c 65 6e 5d '/' || name[len]
7940: 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 09 20 20 == '\\') {...
7950: 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 break;...}..
7960: 20 20 7d 0a 09 20 20 20 20 69 66 20 28 6c 65 6e }.. if (len
7970: 20 3c 20 34 29 20 7b 0a 09 09 6c 65 6e 2b 2b 3b < 4) {...len++;
7980: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d ...break;.. }
7990: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
79a0: 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 64 6f /*.. * We do
79b0: 20 68 61 76 65 20 27 2f 2e 2e 27 0a 09 20 20 20 have '/..'..
79c0: 20 20 2a 2f 0a 0a 09 20 20 20 20 6c 65 6e 20 2d */... len -
79d0: 3d 20 33 3b 0a 09 20 20 20 20 72 65 6d 6f 76 65 = 3;.. remove
79e0: 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ++;..}. }..
79f0: 20 20 69 66 20 28 6c 65 6e 20 3c 20 34 29 20 7b if (len < 4) {
7a00: 0a 09 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 ..if (len == 0)
7a10: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
7a20: 2a 20 4e 6f 74 20 73 75 72 65 20 69 66 20 74 68 * Not sure if th
7a30: 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 is is possible,
7a40: 62 75 74 20 77 65 20 70 61 73 73 20 69 74 20 6f but we pass it o
7a50: 6e 20 61 6e 79 77 61 79 2e 0a 09 20 20 20 20 20 n anyway...
7a60: 2a 2f 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6c */..} else if (l
7a70: 65 6e 20 3d 3d 20 31 20 26 26 20 28 6e 61 6d 65 en == 1 && (name
7a80: 5b 30 5d 20 3d 3d 20 27 2f 27 20 7c 7c 20 6e 61 [0] == '/' || na
7a90: 6d 65 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 me[0] == '\\'))
7aa0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
7ab0: 2a 20 50 61 74 68 20 69 73 20 70 6f 69 6e 74 69 * Path is pointi
7ac0: 6e 67 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 76 ng to the root v
7ad0: 6f 6c 75 6d 65 2e 0a 09 20 20 20 20 20 2a 2f 0a olume... */.
7ae0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a .. return 1;.
7af0: 09 7d 20 65 6c 73 65 20 69 66 20 28 28 6e 61 6d .} else if ((nam
7b00: 65 5b 31 5d 20 3d 3d 20 27 3a 27 29 0a 09 09 20 e[1] == ':')...
7b10: 20 20 26 26 20 28 6c 65 6e 20 3d 3d 20 32 20 7c && (len == 2 |
7b20: 7c 20 28 6e 61 6d 65 5b 32 5d 20 3d 3d 20 27 2f | (name[2] == '/
7b30: 27 20 7c 7c 20 6e 61 6d 65 5b 32 5d 20 3d 3d 20 ' || name[2] ==
7b40: 27 5c 5c 27 29 29 29 20 7b 0a 09 20 20 20 20 2f '\\'))) {.. /
7b50: 2a 0a 09 20 20 20 20 20 2a 20 50 61 74 68 20 69 *.. * Path i
7b60: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 27 78 s of the form 'x
7b70: 3a 27 20 6f 72 20 27 78 3a 2f 27 20 6f 72 20 27 :' or 'x:/' or '
7b80: 78 3a 5c 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 x:\'.. */...
7b90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d return 1;..}
7ba0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 . }.. retu
7bb0: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 rn 0;.}.../*. *
7bc0: 44 6f 65 73 20 74 68 65 20 67 69 76 65 6e 20 70 Does the given p
7bd0: 61 74 68 20 72 65 70 72 65 73 65 6e 74 20 61 20 ath represent a
7be0: 72 65 73 65 72 76 65 64 20 77 69 6e 64 6f 77 20 reserved window
7bf0: 70 61 74 68 20 6e 61 6d 65 3f 20 49 66 20 6e 6f path name? If no
7c00: 74 20 72 65 74 75 72 6e 20 30 2c 0a 20 2a 20 69 t return 0,. * i
7c10: 66 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20 74 f true, return t
7c20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 he number of cha
7c30: 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 70 racters of the p
7c40: 61 74 68 20 74 68 61 74 20 77 65 20 61 63 74 75 ath that we actu
7c50: 61 6c 6c 79 20 77 61 6e 74 0a 20 2a 20 28 6e 6f ally want. * (no
7c60: 74 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 3a t any trailing :
7c70: 29 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 ).. */..static i
7c80: 6e 74 0a 57 69 6e 49 73 52 65 73 65 72 76 65 64 nt.WinIsReserved
7c90: 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 (. const char
7ca0: 20 2a 70 61 74 68 29 09 09 2f 2a 20 50 61 74 68 *path)../* Path
7cb0: 20 69 6e 20 55 54 46 2d 38 20 2a 2f 0a 7b 0a 20 in UTF-8 */.{.
7cc0: 20 20 20 69 66 20 28 28 70 61 74 68 5b 30 5d 20 if ((path[0]
7cd0: 3d 3d 20 27 63 27 20 7c 7c 20 70 61 74 68 5b 30 == 'c' || path[0
7ce0: 5d 20 3d 3d 20 27 43 27 29 0a 09 20 20 20 20 26 ] == 'C').. &
7cf0: 26 20 28 70 61 74 68 5b 31 5d 20 3d 3d 20 27 6f & (path[1] == 'o
7d00: 27 20 7c 7c 20 70 61 74 68 5b 31 5d 20 3d 3d 20 ' || path[1] ==
7d10: 27 4f 27 29 29 20 7b 0a 09 69 66 20 28 28 70 61 'O')) {..if ((pa
7d20: 74 68 5b 32 5d 20 3d 3d 20 27 6d 27 20 7c 7c 20 th[2] == 'm' ||
7d30: 70 61 74 68 5b 32 5d 20 3d 3d 20 27 4d 27 29 0a path[2] == 'M').
7d40: 09 09 26 26 20 70 61 74 68 5b 33 5d 20 3e 3d 20 ..&& path[3] >=
7d50: 27 31 27 20 26 26 20 70 61 74 68 5b 33 5d 20 3c '1' && path[3] <
7d60: 3d 20 27 39 27 29 20 7b 0a 09 20 20 20 20 2f 2a = '9') {.. /*
7d70: 0a 09 20 20 20 20 20 2a 20 4d 61 79 20 68 61 76 .. * May hav
7d80: 65 20 6d 61 74 63 68 20 66 6f 72 20 27 63 6f 6d e match for 'com
7d90: 5b 31 2d 39 5d 3a 3f 27 2c 20 77 68 69 63 68 20 [1-9]:?', which
7da0: 69 73 20 61 20 73 65 72 69 61 6c 20 70 6f 72 74 is a serial port
7db0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
7dc0: 20 69 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d 20 if (path[4] ==
7dd0: 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e '\0') {...return
7de0: 20 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 4;.. } else
7df0: 69 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d 20 27 if (path[4] == '
7e00: 3a 27 20 26 26 20 70 61 74 68 5b 35 5d 20 3d 3d :' && path[5] ==
7e10: 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 '\0') {...retur
7e20: 6e 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 n 4;.. }..} e
7e30: 6c 73 65 20 69 66 20 28 28 70 61 74 68 5b 32 5d lse if ((path[2]
7e40: 20 3d 3d 20 27 6e 27 20 7c 7c 20 70 61 74 68 5b == 'n' || path[
7e50: 32 5d 20 3d 3d 20 27 4e 27 29 20 26 26 20 70 61 2] == 'N') && pa
7e60: 74 68 5b 33 5d 20 3d 3d 20 27 5c 30 27 29 20 7b th[3] == '\0') {
7e70: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
7e80: 20 48 61 76 65 20 6d 61 74 63 68 20 66 6f 72 20 Have match for
7e90: 27 63 6f 6e 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 'con'.. */..
7ea0: 09 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 09 . return 3;..
7eb0: 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 }.. } else if
7ec0: 20 28 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 6c ((path[0] == 'l
7ed0: 27 20 7c 7c 20 70 61 74 68 5b 30 5d 20 3d 3d 20 ' || path[0] ==
7ee0: 27 4c 27 29 0a 09 20 20 20 20 26 26 20 28 70 61 'L').. && (pa
7ef0: 74 68 5b 31 5d 20 3d 3d 20 27 70 27 20 7c 7c 20 th[1] == 'p' ||
7f00: 70 61 74 68 5b 31 5d 20 3d 3d 20 27 50 27 29 0a path[1] == 'P').
7f10: 09 20 20 20 20 26 26 20 28 70 61 74 68 5b 32 5d . && (path[2]
7f20: 20 3d 3d 20 27 74 27 20 7c 7c 20 70 61 74 68 5b == 't' || path[
7f30: 32 5d 20 3d 3d 20 27 54 27 29 29 20 7b 0a 09 69 2] == 'T')) {..i
7f40: 66 20 28 70 61 74 68 5b 33 5d 20 3e 3d 20 27 31 f (path[3] >= '1
7f50: 27 20 26 26 20 70 61 74 68 5b 33 5d 20 3c 3d 20 ' && path[3] <=
7f60: 27 39 27 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 '9') {.. /*..
7f70: 20 20 20 20 20 2a 20 4d 61 79 20 68 61 76 65 20 * May have
7f80: 6d 61 74 63 68 20 66 6f 72 20 27 6c 70 74 5b 31 match for 'lpt[1
7f90: 2d 39 5d 3a 3f 27 0a 09 20 20 20 20 20 2a 2f 0a -9]:?'.. */.
7fa0: 0a 09 20 20 20 20 69 66 20 28 70 61 74 68 5b 34 .. if (path[4
7fb0: 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 ] == '\0') {...r
7fc0: 65 74 75 72 6e 20 34 3b 0a 09 20 20 20 20 7d 20 eturn 4;.. }
7fd0: 65 6c 73 65 20 69 66 20 28 70 61 74 68 5b 34 5d else if (path[4]
7fe0: 20 3d 3d 20 27 3a 27 20 26 26 20 70 61 74 68 5b == ':' && path[
7ff0: 35 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 5] == '\0') {...
8000: 72 65 74 75 72 6e 20 34 3b 0a 09 20 20 20 20 7d return 4;.. }
8010: 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ..}.. } else
8020: 69 66 20 28 21 73 74 72 63 61 73 65 63 6d 70 28 if (!strcasecmp(
8030: 70 61 74 68 2c 20 22 70 72 6e 22 29 20 7c 7c 20 path, "prn") ||
8040: 21 73 74 72 63 61 73 65 63 6d 70 28 70 61 74 68 !strcasecmp(path
8050: 2c 20 22 6e 75 6c 22 29 0a 09 20 20 20 20 7c 7c , "nul").. ||
8060: 20 21 73 74 72 63 61 73 65 63 6d 70 28 70 61 74 !strcasecmp(pat
8070: 68 2c 20 22 61 75 78 22 29 29 20 7b 0a 09 2f 2a h, "aux")) {../*
8080: 0a 09 20 2a 20 48 61 76 65 20 6d 61 74 63 68 20 .. * Have match
8090: 66 6f 72 20 27 70 72 6e 27 2c 20 27 6e 75 6c 27 for 'prn', 'nul'
80a0: 20 6f 72 20 27 61 75 78 27 2e 0a 09 20 2a 2f 0a or 'aux'... */.
80b0: 0a 09 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 ..return 3;.
80c0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a }. return 0;.
80d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8120: 20 2a 0a 20 2a 20 4e 61 74 69 76 65 4d 61 74 63 *. * NativeMatc
8130: 68 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 hType --. *. *.T
8140: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 his function nee
8150: 64 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 ds a special cas
8160: 65 20 66 6f 72 20 61 20 70 61 74 68 20 77 68 69 e for a path whi
8170: 63 68 20 69 73 20 61 20 72 6f 6f 74 20 76 6f 6c ch is a root vol
8180: 75 6d 65 2c 0a 20 2a 09 62 65 63 61 75 73 65 20 ume,. *.because
8190: 66 6f 72 20 4e 54 46 53 20 72 6f 6f 74 20 76 6f for NTFS root vo
81a0: 6c 75 6d 65 73 2c 20 74 68 65 20 67 65 74 46 69 lumes, the getFi
81b0: 6c 65 41 74 74 72 69 62 75 74 65 73 50 72 6f 63 leAttributesProc
81c0: 20 72 65 74 75 72 6e 73 20 61 0a 20 2a 09 27 68 returns a. *.'h
81d0: 69 64 64 65 6e 27 20 61 74 74 72 69 62 75 74 65 idden' attribute
81e0: 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 when it should
81f0: 6e 6f 74 2e 0a 20 2a 0a 20 2a 09 57 65 20 6e 65 not.. *. *.We ne
8200: 76 65 72 20 6d 61 6b 65 20 61 6e 79 20 63 61 6c ver make any cal
8210: 6c 73 20 74 6f 20 61 20 27 67 65 74 20 61 74 74 ls to a 'get att
8220: 72 69 62 75 74 65 73 27 20 72 6f 75 74 69 6e 65 ributes' routine
8230: 20 68 65 72 65 2c 20 73 69 6e 63 65 20 77 65 0a here, since we.
8240: 20 2a 09 68 61 76 65 20 61 72 72 61 6e 67 65 64 *.have arranged
8250: 20 74 68 69 6e 67 73 20 73 6f 20 74 68 61 74 20 things so that
8260: 6f 75 72 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 our caller alrea
8270: 64 79 20 6b 6e 6f 77 73 20 73 75 63 68 0a 20 2a dy knows such. *
8280: 09 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a .information.. *
8290: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
82a0: 30 20 3d 20 66 69 6c 65 20 64 6f 65 73 6e 27 74 0 = file doesn't
82b0: 20 6d 61 74 63 68 0a 20 2a 09 31 20 3d 20 66 69 match. *.1 = fi
82c0: 6c 65 20 6d 61 74 63 68 65 73 0a 20 2a 0a 20 2a le matches. *. *
82d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8310: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
8320: 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 4d 61 74 ic int.NativeMat
8330: 63 68 54 79 70 65 28 0a 20 20 20 20 69 6e 74 20 chType(. int
8340: 69 73 44 72 69 76 65 2c 09 09 2f 2a 20 49 73 20 isDrive,../* Is
8350: 74 68 69 73 20 61 20 64 72 69 76 65 2e 20 2a 2f this a drive. */
8360: 0a 20 20 20 20 44 57 4f 52 44 20 61 74 74 72 2c . DWORD attr,
8370: 09 09 09 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 .../* We already
8380: 20 6b 6e 6f 77 20 74 68 65 20 61 74 74 72 69 62 know the attrib
8390: 75 74 65 73 20 66 6f 72 20 74 68 65 0a 09 09 09 utes for the....
83a0: 09 20 2a 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 . * file. */.
83b0: 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 const WCHAR *na
83c0: 74 69 76 65 4e 61 6d 65 2c 09 2f 2a 20 4e 61 74 tiveName,./* Nat
83d0: 69 76 65 20 70 61 74 68 20 74 6f 20 63 68 65 63 ive path to chec
83e0: 6b 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 6c k. */. Tcl_Gl
83f0: 6f 62 54 79 70 65 44 61 74 61 20 2a 74 79 70 65 obTypeData *type
8400: 73 29 09 2f 2a 20 54 79 70 65 20 64 65 73 63 72 s)./* Type descr
8410: 69 70 74 69 6f 6e 20 74 6f 20 6d 61 74 63 68 20 iption to match
8420: 61 67 61 69 6e 73 74 2e 20 2a 2f 0a 7b 0a 20 20 against. */.{.
8430: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 27 61 74 74 /*. * 'att
8440: 72 27 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 r' represents th
8450: 65 20 61 74 74 72 69 62 75 74 65 73 20 6f 66 20 e attributes of
8460: 74 68 65 20 66 69 6c 65 2c 20 62 75 74 20 77 65 the file, but we
8470: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 0a 20 20 only want to.
8480: 20 20 20 2a 20 72 65 74 72 69 65 76 65 20 74 68 * retrieve th
8490: 69 73 20 69 6e 66 6f 20 69 66 20 69 74 20 69 73 is info if it is
84a0: 20 61 62 73 6f 6c 75 74 65 6c 79 20 6e 65 63 65 absolutely nece
84b0: 73 73 61 72 79 20 62 65 63 61 75 73 65 20 69 74 ssary because it
84c0: 20 69 73 20 61 6e 0a 20 20 20 20 20 2a 20 65 78 is an. * ex
84d0: 70 65 6e 73 69 76 65 20 63 61 6c 6c 2e 20 55 6e pensive call. Un
84e0: 66 6f 72 74 75 6e 61 74 65 6c 79 2c 20 74 6f 20 fortunately, to
84f0: 64 65 61 6c 20 77 69 74 68 20 68 69 64 64 65 6e deal with hidden
8500: 20 66 69 6c 65 73 20 70 72 6f 70 65 72 6c 79 2c files properly,
8510: 20 77 65 0a 20 20 20 20 20 2a 20 6d 75 73 74 20 we. * must
8520: 61 6c 77 61 79 73 20 72 65 74 72 69 65 76 65 20 always retrieve
8530: 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 it.. */..
8540: 20 69 66 20 28 74 79 70 65 73 20 3d 3d 20 4e 55 if (types == NU
8550: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 LL) {../*.. * If
8560: 20 69 6e 76 69 73 69 62 6c 65 2c 20 64 6f 6e 27 invisible, don'
8570: 74 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 6c t return the fil
8580: 65 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e e... */...return
8590: 20 21 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 !(attr & FILE_A
85a0: 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 20 TTRIBUTE_HIDDEN
85b0: 26 26 20 21 69 73 44 72 69 76 65 29 3b 0a 20 20 && !isDrive);.
85c0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 74 74 }.. if (att
85d0: 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 r & FILE_ATTRIBU
85e0: 54 45 5f 48 49 44 44 45 4e 20 26 26 20 21 69 73 TE_HIDDEN && !is
85f0: 44 72 69 76 65 29 20 7b 0a 09 2f 2a 0a 09 20 2a Drive) {../*.. *
8600: 20 49 66 20 69 6e 76 69 73 69 62 6c 65 2e 0a 09 If invisible...
8610: 20 2a 2f 0a 0a 09 69 66 20 28 28 74 79 70 65 73 */...if ((types
8620: 2d 3e 70 65 72 6d 20 3d 3d 20 30 29 20 7c 7c 20 ->perm == 0) ||
8630: 21 28 74 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 !(types->perm &
8640: 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 48 49 TCL_GLOB_PERM_HI
8650: 44 44 45 4e 29 29 20 7b 0a 09 20 20 20 20 72 65 DDEN)) {.. re
8660: 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d turn 0;..}. }
8670: 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 else {../*.. *
8680: 56 69 73 69 62 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 Visible... */...
8690: 69 66 20 28 74 79 70 65 73 2d 3e 70 65 72 6d 20 if (types->perm
86a0: 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f & TCL_GLOB_PERM_
86b0: 48 49 44 44 45 4e 29 20 7b 0a 09 20 20 20 20 72 HIDDEN) {.. r
86c0: 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 eturn 0;..}.
86d0: 7d 0a 0a 20 20 20 20 69 66 20 28 74 79 70 65 73 }.. if (types
86e0: 2d 3e 70 65 72 6d 20 21 3d 20 30 29 20 7b 0a 09 ->perm != 0) {..
86f0: 69 66 20 28 28 28 74 79 70 65 73 2d 3e 70 65 72 if (((types->per
8700: 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 m & TCL_GLOB_PER
8710: 4d 5f 52 4f 4e 4c 59 29 20 26 26 0a 09 09 20 20 M_RONLY) &&...
8720: 20 20 21 28 61 74 74 72 20 26 20 46 49 4c 45 5f !(attr & FILE_
8730: 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e ATTRIBUTE_READON
8740: 4c 59 29 29 20 7c 7c 0a 09 09 28 28 74 79 70 65 LY)) ||...((type
8750: 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c 5f 47 4c s->perm & TCL_GL
8760: 4f 42 5f 50 45 52 4d 5f 52 29 20 26 26 0a 09 09 OB_PERM_R) &&...
8770: 20 20 20 20 28 30 20 2f 2a 20 46 69 6c 65 20 65 (0 /* File e
8780: 78 69 73 74 73 20 3d 3e 20 52 5f 4f 4b 20 6f 6e xists => R_OK on
8790: 20 57 69 6e 64 6f 77 73 20 2a 2f 29 29 20 7c 7c Windows */)) ||
87a0: 0a 09 09 28 28 74 79 70 65 73 2d 3e 70 65 72 6d ...((types->perm
87b0: 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d & TCL_GLOB_PERM
87c0: 5f 57 29 20 26 26 0a 09 09 20 20 20 20 28 61 74 _W) &&... (at
87d0: 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 tr & FILE_ATTRIB
87e0: 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 29 20 7c UTE_READONLY)) |
87f0: 7c 0a 09 09 28 28 74 79 70 65 73 2d 3e 70 65 72 |...((types->per
8800: 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 m & TCL_GLOB_PER
8810: 4d 5f 58 29 20 26 26 0a 09 09 20 20 20 20 28 21 M_X) &&... (!
8820: 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 (attr & FILE_ATT
8830: 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 RIBUTE_DIRECTORY
8840: 29 0a 09 09 20 20 20 20 26 26 20 21 4e 61 74 69 )... && !Nati
8850: 76 65 49 73 45 78 65 63 28 6e 61 74 69 76 65 4e veIsExec(nativeN
8860: 61 6d 65 29 29 29 29 20 7b 0a 09 20 20 20 20 72 ame)))) {.. r
8870: 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 eturn 0;..}.
8880: 7d 0a 0a 20 20 20 20 69 66 20 28 28 74 79 70 65 }.. if ((type
8890: 73 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47 4c s->type & TCL_GL
88a0: 4f 42 5f 54 59 50 45 5f 44 49 52 29 0a 09 20 20 OB_TYPE_DIR)..
88b0: 20 20 26 26 20 28 61 74 74 72 20 26 20 46 49 4c && (attr & FIL
88c0: 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 E_ATTRIBUTE_DIRE
88d0: 43 54 4f 52 59 29 29 20 7b 0a 09 2f 2a 0a 09 20 CTORY)) {../*..
88e0: 2a 20 51 75 69 63 6b 65 72 20 74 65 73 74 20 66 * Quicker test f
88f0: 6f 72 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 or directory, wh
8900: 69 63 68 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 ich is a common
8910: 63 61 73 65 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 case... */...ret
8920: 75 72 6e 20 31 3b 0a 0a 20 20 20 20 7d 20 65 6c urn 1;.. } el
8930: 73 65 20 69 66 20 28 74 79 70 65 73 2d 3e 74 79 se if (types->ty
8940: 70 65 20 21 3d 20 30 29 20 7b 0a 09 75 6e 73 69 pe != 0) {..unsi
8950: 67 6e 65 64 20 73 68 6f 72 74 20 73 74 5f 6d 6f gned short st_mo
8960: 64 65 3b 0a 09 69 6e 74 20 69 73 45 78 65 63 20 de;..int isExec
8970: 3d 20 4e 61 74 69 76 65 49 73 45 78 65 63 28 6e = NativeIsExec(n
8980: 61 74 69 76 65 4e 61 6d 65 29 3b 0a 0a 09 73 74 ativeName);...st
8990: 5f 6d 6f 64 65 20 3d 20 4e 61 74 69 76 65 53 74 _mode = NativeSt
89a0: 61 74 4d 6f 64 65 28 61 74 74 72 2c 20 30 2c 20 atMode(attr, 0,
89b0: 69 73 45 78 65 63 29 3b 0a 0a 09 2f 2a 0a 09 20 isExec);.../*..
89c0: 2a 20 49 6e 20 6f 72 64 65 72 20 62 63 64 70 66 * In order bcdpf
89d0: 6c 73 20 61 73 20 69 6e 20 27 66 69 6e 64 20 2d ls as in 'find -
89e0: 74 27 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 28 t'.. */...if (((
89f0: 74 79 70 65 73 2d 3e 74 79 70 65 26 54 43 4c 5f types->type&TCL_
8a00: 47 4c 4f 42 5f 54 59 50 45 5f 42 4c 4f 43 4b 29 GLOB_TYPE_BLOCK)
8a10: 20 20 20 20 26 26 20 53 5f 49 53 42 4c 4b 28 73 && S_ISBLK(s
8a20: 74 5f 6d 6f 64 65 29 29 20 7c 7c 0a 09 09 28 28 t_mode)) ||...((
8a30: 74 79 70 65 73 2d 3e 74 79 70 65 26 54 43 4c 5f types->type&TCL_
8a40: 47 4c 4f 42 5f 54 59 50 45 5f 43 48 41 52 29 20 GLOB_TYPE_CHAR)
8a50: 26 26 20 53 5f 49 53 43 48 52 28 73 74 5f 6d 6f && S_ISCHR(st_mo
8a60: 64 65 29 29 20 7c 7c 0a 09 09 28 28 74 79 70 65 de)) ||...((type
8a70: 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 s->type&TCL_GLOB
8a80: 5f 54 59 50 45 5f 44 49 52 29 20 20 26 26 20 53 _TYPE_DIR) && S
8a90: 5f 49 53 44 49 52 28 73 74 5f 6d 6f 64 65 29 29 _ISDIR(st_mode))
8aa0: 20 7c 7c 0a 09 09 28 28 74 79 70 65 73 2d 3e 74 ||...((types->t
8ab0: 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 ype&TCL_GLOB_TYP
8ac0: 45 5f 50 49 50 45 29 20 26 26 20 53 5f 49 53 46 E_PIPE) && S_ISF
8ad0: 49 46 4f 28 73 74 5f 6d 6f 64 65 29 29 20 7c 7c IFO(st_mode)) ||
8ae0: 0a 23 69 66 64 65 66 20 53 5f 49 53 53 4f 43 4b .#ifdef S_ISSOCK
8af0: 0a 09 09 28 28 74 79 70 65 73 2d 3e 74 79 70 65 ...((types->type
8b00: 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 53 &TCL_GLOB_TYPE_S
8b10: 4f 43 4b 29 20 26 26 20 53 5f 49 53 53 4f 43 4b OCK) && S_ISSOCK
8b20: 28 73 74 5f 6d 6f 64 65 29 29 20 7c 7c 0a 23 65 (st_mode)) ||.#e
8b30: 6e 64 69 66 0a 09 09 28 28 74 79 70 65 73 2d 3e ndif...((types->
8b40: 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 type&TCL_GLOB_TY
8b50: 50 45 5f 46 49 4c 45 29 20 26 26 20 53 5f 49 53 PE_FILE) && S_IS
8b60: 52 45 47 28 73 74 5f 6d 6f 64 65 29 29 29 20 7b REG(st_mode))) {
8b70: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
8b80: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2d 20 74 68 Do nothing - th
8b90: 69 73 20 66 69 6c 65 20 69 73 20 6f 6b 2e 0a 09 is file is ok...
8ba0: 20 20 20 20 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 */..} else
8bb0: 7b 0a 23 69 66 64 65 66 20 53 5f 49 53 4c 4e 4b {.#ifdef S_ISLNK
8bc0: 0a 09 20 20 20 20 69 66 20 28 74 79 70 65 73 2d .. if (types-
8bd0: 3e 74 79 70 65 20 26 20 54 43 4c 5f 47 4c 4f 42 >type & TCL_GLOB
8be0: 5f 54 59 50 45 5f 4c 49 4e 4b 29 20 7b 0a 09 09 _TYPE_LINK) {...
8bf0: 73 74 5f 6d 6f 64 65 20 3d 20 4e 61 74 69 76 65 st_mode = Native
8c00: 53 74 61 74 4d 6f 64 65 28 61 74 74 72 2c 20 31 StatMode(attr, 1
8c10: 2c 20 69 73 45 78 65 63 29 3b 0a 09 09 69 66 20 , isExec);...if
8c20: 28 53 5f 49 53 4c 4e 4b 28 73 74 5f 6d 6f 64 65 (S_ISLNK(st_mode
8c30: 29 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 )) {... retur
8c40: 6e 20 31 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a n 1;...}.. }.
8c50: 23 65 6e 64 69 66 20 2f 2a 20 53 5f 49 53 4c 4e #endif /* S_ISLN
8c60: 4b 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e K */.. return
8c70: 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 0;..}. }.
8c80: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f return 1;.}.../
8c90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8ce0: 20 54 63 6c 70 47 65 74 55 73 65 72 48 6f 6d 65 TclpGetUserHome
8cf0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
8d00: 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74 68 unction takes th
8d10: 65 20 70 61 73 73 65 64 20 69 6e 20 75 73 65 72 e passed in user
8d20: 20 6e 61 6d 65 20 61 6e 64 20 66 69 6e 64 73 20 name and finds
8d30: 74 68 65 0a 20 2a 09 63 6f 72 72 65 73 70 6f 6e the. *.correspon
8d40: 64 69 6e 67 20 68 6f 6d 65 20 64 69 72 65 63 74 ding home direct
8d50: 6f 72 79 20 73 70 65 63 69 66 69 65 64 20 69 6e ory specified in
8d60: 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 66 69 the password fi
8d70: 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 le.. *. * Result
8d80: 73 3a 0a 20 2a 09 54 68 65 20 72 65 73 75 6c 74 s:. *.The result
8d90: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f is a pointer to
8da0: 20 61 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 a string specif
8db0: 79 69 6e 67 20 74 68 65 20 75 73 65 72 27 73 20 ying the user's
8dc0: 68 6f 6d 65 0a 20 2a 09 64 69 72 65 63 74 6f 72 home. *.director
8dd0: 79 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 y, or NULL if th
8de0: 65 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 e user's home di
8df0: 72 65 63 74 6f 72 79 20 63 6f 75 6c 64 20 6e 6f rectory could no
8e00: 74 20 62 65 0a 20 2a 09 64 65 74 65 72 6d 69 6e t be. *.determin
8e10: 65 64 2e 20 53 74 6f 72 61 67 65 20 66 6f 72 20 ed. Storage for
8e20: 74 68 65 20 72 65 73 75 6c 74 20 73 74 72 69 6e the result strin
8e30: 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 g is allocated i
8e40: 6e 20 62 75 66 66 65 72 50 74 72 3b 0a 20 2a 09 n bufferPtr;. *.
8e50: 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 the caller must
8e60: 63 61 6c 6c 20 54 63 6c 5f 44 53 74 72 69 6e 67 call Tcl_DString
8e70: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 Free() when the
8e80: 72 65 73 75 6c 74 20 69 73 20 6e 6f 20 6c 6f 6e result is no lon
8e90: 67 65 72 0a 20 2a 09 6e 65 65 64 65 64 2e 0a 20 ger. *.needed..
8ea0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
8eb0: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
8ec0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e -------. */..con
8f10: 73 74 20 63 68 61 72 20 2a 0a 54 63 6c 70 47 65 st char *.TclpGe
8f20: 74 55 73 65 72 48 6f 6d 65 28 0a 20 20 20 20 63 tUserHome(. c
8f30: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c onst char *name,
8f40: 09 09 2f 2a 20 55 73 65 72 20 6e 61 6d 65 20 66 ../* User name f
8f50: 6f 72 20 64 65 73 69 72 65 64 20 68 6f 6d 65 20 or desired home
8f60: 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f 0a 20 20 directory. */.
8f70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 62 Tcl_DString *b
8f80: 75 66 66 65 72 50 74 72 29 09 2f 2a 20 55 6e 69 ufferPtr)./* Uni
8f90: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 66 72 nitialized or fr
8fa0: 65 65 20 44 53 74 72 69 6e 67 20 66 69 6c 6c 65 ee DString fille
8fb0: 64 20 77 69 74 68 0a 09 09 09 09 20 2a 20 6e 61 d with..... * na
8fc0: 6d 65 20 6f 66 20 75 73 65 72 27 73 20 68 6f 6d me of user's hom
8fd0: 65 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f 0a e directory. */.
8fe0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 72 65 73 75 {. char *resu
8ff0: 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 55 lt = NULL;. U
9000: 53 45 52 5f 49 4e 46 4f 5f 31 20 2a 75 69 50 74 SER_INFO_1 *uiPt
9010: 72 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 r;. Tcl_DStri
9020: 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6e ng ds;. int n
9030: 61 6d 65 4c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 ameLen = -1;.
9040: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 int rc = 0;.
9050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 6f 6d const char *dom
9060: 61 69 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 2a ain;. WCHAR *
9070: 77 4e 61 6d 65 2c 20 2a 77 48 6f 6d 65 44 69 72 wName, *wHomeDir
9080: 2c 20 2a 77 44 6f 6d 61 69 6e 3b 0a 0a 20 20 20 , *wDomain;..
9090: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 Tcl_DStringInit
90a0: 28 62 75 66 66 65 72 50 74 72 29 3b 0a 0a 20 20 (bufferPtr);..
90b0: 20 20 77 44 6f 6d 61 69 6e 20 3d 20 4e 55 4c 4c wDomain = NULL
90c0: 3b 0a 20 20 20 20 64 6f 6d 61 69 6e 20 3d 20 54 ;. domain = T
90d0: 63 6c 5f 55 74 66 46 69 6e 64 46 69 72 73 74 28 cl_UtfFindFirst(
90e0: 6e 61 6d 65 2c 20 27 40 27 29 3b 0a 20 20 20 20 name, '@');.
90f0: 69 66 20 28 64 6f 6d 61 69 6e 20 3d 3d 20 4e 55 if (domain == NU
9100: 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 LL) {..const cha
9110: 72 20 2a 70 74 72 3b 0a 0a 20 20 20 20 20 20 20 r *ptr;..
9120: 20 2f 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 54 /*. * T
9130: 72 65 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 reat the current
9140: 20 75 73 65 72 20 61 73 20 61 20 73 70 65 63 69 user as a speci
9150: 61 6c 20 63 61 73 65 20 62 65 63 61 75 73 65 20 al case because
9160: 74 68 65 20 67 65 6e 65 72 61 6c 20 63 61 73 65 the general case
9170: 0a 20 20 20 20 20 20 20 20 20 2a 20 62 65 6c 6f . * belo
9180: 77 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 70 65 w does not prope
9190: 72 6c 79 20 72 65 74 72 69 65 76 65 20 74 68 65 rly retrieve the
91a0: 20 70 61 74 68 2e 20 54 68 65 20 4e 65 74 55 73 path. The NetUs
91b0: 65 72 47 65 74 49 6e 66 6f 0a 20 20 20 20 20 20 erGetInfo.
91c0: 20 20 20 2a 20 63 61 6c 6c 20 72 65 74 75 72 6e * call return
91d0: 73 20 61 6e 20 65 6d 70 74 79 20 70 61 74 68 20 s an empty path
91e0: 61 6e 64 20 74 68 65 20 63 6f 64 65 20 64 65 66 and the code def
91f0: 61 75 6c 74 73 20 74 6f 20 74 68 65 20 75 73 65 aults to the use
9200: 72 27 73 0a 20 20 20 20 20 20 20 20 20 2a 20 6e r's. * n
9210: 61 6d 65 20 69 6e 20 74 68 65 20 70 72 6f 66 69 ame in the profi
9220: 6c 65 73 20 64 69 72 65 63 74 6f 72 79 2e 20 4f les directory. O
9230: 6e 20 6d 6f 64 65 72 6e 20 57 69 6e 64 6f 77 73 n modern Windows
9240: 20 73 79 73 74 65 6d 73 2c 20 74 68 69 73 0a 20 systems, this.
9250: 20 20 20 20 20 20 20 20 2a 20 69 73 20 67 65 6e * is gen
9260: 65 72 61 6c 6c 79 20 77 72 6f 6e 67 20 61 73 20 erally wrong as
9270: 77 68 65 6e 20 74 68 65 20 61 63 63 6f 75 6e 74 when the account
9280: 20 69 73 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 is a Microsoft
9290: 61 63 63 6f 75 6e 74 2c 0a 20 20 20 20 20 20 20 account,.
92a0: 20 20 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 * for example
92b0: 61 62 63 64 65 66 67 68 69 40 6f 75 74 6c 6f 6f abcdefghi@outloo
92c0: 6b 2e 63 6f 6d 2c 20 74 68 65 20 64 69 72 65 63 k.com, the direc
92d0: 74 6f 72 79 20 6e 61 6d 65 20 69 73 0a 20 20 20 tory name is.
92e0: 20 20 20 20 20 20 2a 20 61 62 63 64 65 20 61 6e * abcde an
92f0: 64 20 6e 6f 74 20 61 62 63 64 65 66 67 68 69 2e d not abcdefghi.
9300: 0a 20 20 20 20 20 20 20 20 20 2a 0a 20 20 20 20 . *.
9310: 20 20 20 20 20 2a 20 4e 6f 74 65 20 77 65 20 63 * Note we c
9320: 6f 75 6c 64 20 68 61 76 65 20 6a 75 73 74 20 75 ould have just u
9330: 73 65 64 20 65 6e 76 28 55 53 45 52 50 52 4f 46 sed env(USERPROF
9340: 49 4c 45 29 20 68 65 72 65 20 62 75 74 0a 20 20 ILE) here but.
9350: 20 20 20 20 20 20 20 2a 20 74 68 65 20 69 6e 74 * the int
9360: 65 6e 74 20 69 73 20 74 6f 20 72 65 74 72 69 65 ent is to retrie
9370: 76 65 20 28 61 73 20 6f 6e 20 55 6e 69 78 29 20 ve (as on Unix)
9380: 74 68 65 20 73 79 73 74 65 6d 27 73 20 76 69 65 the system's vie
9390: 77 0a 20 20 20 20 20 20 20 20 20 2a 20 6f 66 20 w. * of
93a0: 74 68 65 20 68 6f 6d 65 20 69 72 72 65 73 70 65 the home irrespe
93b0: 63 74 69 76 65 20 6f 66 20 65 6e 76 69 72 6f 6e ctive of environ
93c0: 6d 65 6e 74 20 73 65 74 74 69 6e 67 73 20 6f 66 ment settings of
93d0: 20 48 4f 4d 45 0a 20 20 20 20 20 20 20 20 20 2a HOME. *
93e0: 20 61 6e 64 20 55 53 45 52 50 52 4f 46 49 4c 45 and USERPROFILE
93f0: 2e 0a 20 20 20 20 20 20 20 20 20 2a 0a 20 20 20 .. *.
9400: 20 20 20 20 20 20 2a 20 46 69 78 69 6e 67 20 74 * Fixing t
9410: 68 69 73 20 66 6f 72 20 74 68 65 20 67 65 6e 65 his for the gene
9420: 72 61 6c 20 75 73 65 72 20 6e 65 65 64 73 20 6d ral user needs m
9430: 6f 72 65 20 69 6e 76 65 73 74 69 67 61 74 69 6e ore investigatin
9440: 67 20 62 75 74 0a 20 20 20 20 20 20 20 20 20 2a g but. *
9450: 20 61 74 20 6c 65 61 73 74 20 66 6f 72 20 74 68 at least for th
9460: 65 20 63 75 72 72 65 6e 74 20 75 73 65 72 20 77 e current user w
9470: 65 20 63 61 6e 20 75 73 65 20 61 20 64 69 72 65 e can use a dire
9480: 63 74 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 20 ct call..
9490: 20 20 2a 2f 0a 09 70 74 72 20 3d 20 54 63 6c 70 */..ptr = Tclp
94a0: 47 65 74 55 73 65 72 4e 61 6d 65 28 26 64 73 29 GetUserName(&ds)
94b0: 3b 0a 09 69 66 20 28 70 74 72 20 21 3d 20 4e 55 ;..if (ptr != NU
94c0: 4c 4c 20 26 26 20 73 74 72 63 61 73 65 63 6d 70 LL && strcasecmp
94d0: 28 6e 61 6d 65 2c 20 70 74 72 29 20 3d 3d 20 30 (name, ptr) == 0
94e0: 29 20 7b 0a 09 20 20 20 20 48 41 4e 44 4c 45 20 ) {.. HANDLE
94f0: 68 50 72 6f 63 65 73 73 3b 0a 09 20 20 20 20 57 hProcess;.. W
9500: 43 48 41 52 20 62 75 66 5b 4d 41 58 5f 50 41 54 CHAR buf[MAX_PAT
9510: 48 5d 3b 0a 09 20 20 20 20 44 57 4f 52 44 20 6e H];.. DWORD n
9520: 43 68 61 72 73 20 3d 20 73 69 7a 65 6f 66 28 62 Chars = sizeof(b
9530: 75 66 29 20 2f 20 73 69 7a 65 6f 66 28 62 75 66 uf) / sizeof(buf
9540: 5b 30 5d 29 3b 0a 09 20 20 20 20 2f 2a 20 53 61 [0]);.. /* Sa
9550: 64 6c 79 20 47 65 74 43 75 72 72 65 6e 74 50 72 dly GetCurrentPr
9560: 6f 63 65 73 73 54 6f 6b 65 6e 20 6e 6f 74 20 69 ocessToken not i
9570: 6e 20 57 69 6e 20 37 20 73 6f 20 73 6c 69 67 68 n Win 7 so sligh
9580: 74 6c 79 20 6c 6f 6e 67 65 72 20 2a 2f 0a 09 20 tly longer */..
9590: 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65 hProcess = Ge
95a0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 tCurrentProcess(
95b0: 29 3b 20 2f 2a 20 4e 65 65 64 20 6e 6f 74 20 62 ); /* Need not b
95c0: 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 09 20 20 20 e closed */..
95d0: 20 69 66 20 28 68 50 72 6f 63 65 73 73 29 20 7b if (hProcess) {
95e0: 0a 09 09 48 41 4e 44 4c 45 20 68 54 6f 6b 65 6e ...HANDLE hToken
95f0: 3b 0a 09 09 69 66 20 28 4f 70 65 6e 50 72 6f 63 ;...if (OpenProc
9600: 65 73 73 54 6f 6b 65 6e 28 68 50 72 6f 63 65 73 essToken(hProces
9610: 73 2c 20 54 4f 4b 45 4e 5f 51 55 45 52 59 2c 20 s, TOKEN_QUERY,
9620: 26 68 54 6f 6b 65 6e 29 29 20 7b 0a 09 09 20 20 &hToken)) {...
9630: 20 20 69 66 20 28 47 65 74 55 73 65 72 50 72 6f if (GetUserPro
9640: 66 69 6c 65 44 69 72 65 63 74 6f 72 79 57 28 68 fileDirectoryW(h
9650: 54 6f 6b 65 6e 2c 20 62 75 66 2c 20 26 6e 43 68 Token, buf, &nCh
9660: 61 72 73 29 29 20 7b 0a 09 09 09 54 63 6c 5f 57 ars)) {....Tcl_W
9670: 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 54 43 inTCharToUtf((TC
9680: 48 41 52 20 2a 29 62 75 66 2c 0a 09 09 09 09 28 HAR *)buf,.....(
9690: 6e 43 68 61 72 73 2d 31 29 2a 73 69 7a 65 6f 66 nChars-1)*sizeof
96a0: 28 57 43 48 41 52 29 2c 20 62 75 66 66 65 72 50 (WCHAR), bufferP
96b0: 74 72 29 3b 0a 09 09 09 72 65 73 75 6c 74 20 3d tr);....result =
96c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 Tcl_DStringValu
96d0: 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a 09 09 e(bufferPtr);...
96e0: 09 72 63 20 3d 20 31 3b 0a 09 09 20 20 20 20 7d .rc = 1;... }
96f0: 0a 09 09 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 ... CloseHand
9700: 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 09 7d 0a le(hToken);...}.
9710: 09 20 20 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 44 . }..}..Tcl_D
9720: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
9730: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 77 . } else {..w
9740: 4e 61 6d 65 20 3d 20 28 57 43 48 41 52 20 2a 29 Name = (WCHAR *)
9750: 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54 43 68 61 Tcl_WinUtfToTCha
9760: 72 28 64 6f 6d 61 69 6e 20 2b 20 31 2c 20 2d 31 r(domain + 1, -1
9770: 2c 20 26 64 73 29 3b 0a 09 72 63 20 3d 20 4e 65 , &ds);..rc = Ne
9780: 74 47 65 74 44 43 4e 61 6d 65 28 4e 55 4c 4c 2c tGetDCName(NULL,
9790: 20 77 4e 61 6d 65 2c 20 28 4c 50 42 59 54 45 20 wName, (LPBYTE
97a0: 2a 29 20 26 77 44 6f 6d 61 69 6e 29 3b 0a 09 54 *) &wDomain);..T
97b0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
97c0: 64 73 29 3b 0a 09 6e 61 6d 65 4c 65 6e 20 3d 20 ds);..nameLen =
97d0: 64 6f 6d 61 69 6e 20 2d 20 6e 61 6d 65 3b 0a 20 domain - name;.
97e0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 63 20 }. if (rc
97f0: 3d 3d 20 30 29 20 7b 0a 09 77 4e 61 6d 65 20 3d == 0) {..wName =
9800: 20 28 57 43 48 41 52 20 2a 29 54 63 6c 5f 57 69 (WCHAR *)Tcl_Wi
9810: 6e 55 74 66 54 6f 54 43 68 61 72 28 6e 61 6d 65 nUtfToTChar(name
9820: 2c 20 6e 61 6d 65 4c 65 6e 2c 20 26 64 73 29 3b , nameLen, &ds);
9830: 0a 09 77 68 69 6c 65 20 28 4e 65 74 55 73 65 72 ..while (NetUser
9840: 47 65 74 49 6e 66 6f 28 77 44 6f 6d 61 69 6e 2c GetInfo(wDomain,
9850: 20 77 4e 61 6d 65 2c 20 31 2c 20 28 4c 50 42 59 wName, 1, (LPBY
9860: 54 45 20 2a 29 20 26 75 69 50 74 72 29 20 21 3d TE *) &uiPtr) !=
9870: 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 0) {.. /*..
9880: 20 20 20 20 2a 20 55 73 65 72 20 64 6f 65 73 20 * User does
9890: 6e 6f 74 20 65 78 69 73 74 3b 20 69 66 20 64 6f not exist; if do
98a0: 6d 61 69 6e 20 77 61 73 20 6e 6f 74 20 73 70 65 main was not spe
98b0: 63 69 66 69 65 64 2c 20 74 72 79 20 61 67 61 69 cified, try agai
98c0: 6e 0a 09 20 20 20 20 20 2a 20 75 73 69 6e 67 20 n.. * using
98d0: 63 75 72 72 65 6e 74 20 64 6f 6d 61 69 6e 2e 0a current domain..
98e0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72 . */... r
98f0: 63 20 3d 20 31 3b 0a 09 20 20 20 20 69 66 20 28 c = 1;.. if (
9900: 64 6f 6d 61 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 domain != NULL)
9910: 7b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 {...break;..
9920: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 }... /*..
9930: 20 2a 20 47 65 74 20 63 75 72 72 65 6e 74 20 64 * Get current d
9940: 6f 6d 61 69 6e 0a 09 20 20 20 20 20 2a 2f 0a 0a omain.. */..
9950: 09 20 20 20 20 72 63 20 3d 20 4e 65 74 47 65 74 . rc = NetGet
9960: 44 43 4e 61 6d 65 28 4e 55 4c 4c 2c 20 4e 55 4c DCName(NULL, NUL
9970: 4c 2c 20 28 4c 50 42 59 54 45 20 2a 29 20 26 77 L, (LPBYTE *) &w
9980: 44 6f 6d 61 69 6e 29 3b 0a 09 20 20 20 20 69 66 Domain);.. if
9990: 20 28 72 63 20 21 3d 20 30 29 20 7b 0a 09 09 62 (rc != 0) {...b
99a0: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 reak;.. }..
99b0: 20 20 64 6f 6d 61 69 6e 20 3d 20 28 63 6f 6e 73 domain = (cons
99c0: 74 20 63 68 61 72 20 2a 29 49 4e 54 32 50 54 52 t char *)INT2PTR
99d0: 28 2d 31 29 3b 20 2f 2a 20 72 65 70 65 61 74 20 (-1); /* repeat
99e0: 6f 6e 63 65 20 2a 2f 0a 09 7d 0a 09 69 66 20 28 once */..}..if (
99f0: 72 63 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 rc == 0) {..
9a00: 44 57 4f 52 44 20 69 2c 20 73 69 7a 65 20 3d 20 DWORD i, size =
9a10: 4d 41 58 5f 50 41 54 48 3b 0a 0a 09 20 20 20 20 MAX_PATH;...
9a20: 77 48 6f 6d 65 44 69 72 20 3d 20 75 69 50 74 72 wHomeDir = uiPtr
9a30: 2d 3e 75 73 72 69 31 5f 68 6f 6d 65 5f 64 69 72 ->usri1_home_dir
9a40: 3b 0a 09 20 20 20 20 69 66 20 28 28 77 48 6f 6d ;.. if ((wHom
9a50: 65 44 69 72 20 21 3d 20 4e 55 4c 4c 29 20 26 26 eDir != NULL) &&
9a60: 20 28 77 48 6f 6d 65 44 69 72 5b 30 5d 20 21 3d (wHomeDir[0] !=
9a70: 20 27 5c 30 27 29 29 20 7b 0a 09 09 73 69 7a 65 '\0')) {...size
9a80: 20 3d 20 6c 73 74 72 6c 65 6e 57 28 77 48 6f 6d = lstrlenW(wHom
9a90: 65 44 69 72 29 3b 0a 09 09 54 63 6c 5f 57 69 6e eDir);...Tcl_Win
9aa0: 54 43 68 61 72 54 6f 55 74 66 28 28 54 43 48 41 TCharToUtf((TCHA
9ab0: 52 20 2a 29 77 48 6f 6d 65 44 69 72 2c 20 73 69 R *)wHomeDir, si
9ac0: 7a 65 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 ze*sizeof(WCHAR)
9ad0: 2c 20 62 75 66 66 65 72 50 74 72 29 3b 0a 09 20 , bufferPtr);..
9ae0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 57 43 } else {...WC
9af0: 48 41 52 20 62 75 66 5b 4d 41 58 5f 50 41 54 48 HAR buf[MAX_PATH
9b00: 5d 3b 0a 09 09 2f 2a 0a 09 09 20 2a 20 55 73 65 ];.../*... * Use
9b10: 72 20 65 78 69 73 74 73 20 62 75 74 20 68 61 73 r exists but has
9b20: 20 6e 6f 20 68 6f 6d 65 20 64 69 72 2e 20 52 65 no home dir. Re
9b30: 74 75 72 6e 0a 09 09 20 2a 20 22 7b 47 65 74 50 turn... * "{GetP
9b40: 72 6f 66 69 6c 65 73 44 69 72 65 63 74 6f 72 79 rofilesDirectory
9b50: 7d 2f 3c 75 73 65 72 3e 22 2e 0a 09 09 20 2a 2f }/<user>".... */
9b60: 0a 0a 09 09 47 65 74 50 72 6f 66 69 6c 65 73 44 ....GetProfilesD
9b70: 69 72 65 63 74 6f 72 79 57 28 62 75 66 2c 20 26 irectoryW(buf, &
9b80: 73 69 7a 65 29 3b 0a 09 09 54 63 6c 5f 57 69 6e size);...Tcl_Win
9b90: 54 43 68 61 72 54 6f 55 74 66 28 28 54 43 48 41 TCharToUtf((TCHA
9ba0: 52 20 2a 29 62 75 66 2c 20 28 73 69 7a 65 2d 31 R *)buf, (size-1
9bb0: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2c )*sizeof(WCHAR),
9bc0: 20 62 75 66 66 65 72 50 74 72 29 3b 0a 09 09 54 bufferPtr);...T
9bd0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 cl_DStringAppend
9be0: 28 62 75 66 66 65 72 50 74 72 2c 20 22 2f 22 2c (bufferPtr, "/",
9bf0: 20 31 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 1);...Tcl_DStri
9c00: 6e 67 41 70 70 65 6e 64 28 62 75 66 66 65 72 50 ngAppend(bufferP
9c10: 74 72 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 tr, name, nameLe
9c20: 6e 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 n);.. }..
9c30: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 44 53 74 result = Tcl_DSt
9c40: 72 69 6e 67 56 61 6c 75 65 28 62 75 66 66 65 72 ringValue(buffer
9c50: 50 74 72 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 Ptr);... /*..
9c60: 20 20 20 20 20 2a 20 42 65 20 73 75 72 65 20 77 * Be sure w
9c70: 65 20 72 65 74 75 72 6e 20 6e 6f 72 6d 61 6c 69 e return normali
9c80: 7a 65 64 20 70 61 74 68 0a 09 20 20 20 20 20 2a zed path.. *
9c90: 2f 0a 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d /... for (i =
9ca0: 20 30 3b 20 69 20 3c 20 73 69 7a 65 3b 20 2b 2b 0; i < size; ++
9cb0: 69 29 20 7b 0a 09 09 69 66 20 28 72 65 73 75 6c i) {...if (resul
9cc0: 74 5b 69 5d 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a t[i] == '\\') {.
9cd0: 09 09 20 20 20 20 72 65 73 75 6c 74 5b 69 5d 20 .. result[i]
9ce0: 3d 20 27 2f 27 3b 0a 09 09 7d 0a 09 20 20 20 20 = '/';...}..
9cf0: 7d 0a 09 20 20 20 20 4e 65 74 41 70 69 42 75 66 }.. NetApiBuf
9d00: 66 65 72 46 72 65 65 28 28 76 6f 69 64 20 2a 29 ferFree((void *)
9d10: 20 75 69 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c uiPtr);..}..Tcl
9d20: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
9d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
9d40: 28 77 44 6f 6d 61 69 6e 20 21 3d 20 4e 55 4c 4c (wDomain != NULL
9d50: 29 20 7b 0a 09 4e 65 74 41 70 69 42 75 66 66 65 ) {..NetApiBuffe
9d60: 72 46 72 65 65 28 28 76 6f 69 64 20 2a 29 20 77 rFree((void *) w
9d70: 44 6f 6d 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 0a Domain);. }..
9d80: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
9d90: 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d t;.}.../*. *----
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 -------. *. * Na
9df0: 74 69 76 65 41 63 63 65 73 73 20 2d 2d 0a 20 2a tiveAccess --. *
9e00: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
9e10: 6e 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 6c n replaces the l
9e20: 69 62 72 61 72 79 20 76 65 72 73 69 6f 6e 20 6f ibrary version o
9e30: 66 20 61 63 63 65 73 73 28 29 2c 20 66 69 78 69 f access(), fixi
9e40: 6e 67 20 74 68 65 0a 20 2a 09 66 6f 6c 6c 6f 77 ng the. *.follow
9e50: 69 6e 67 20 62 75 67 73 3a 0a 20 2a 0a 20 2a 09 ing bugs:. *. *.
9e60: 31 2e 20 61 63 63 65 73 73 28 29 20 72 65 74 75 1. access() retu
9e70: 72 6e 73 20 74 68 61 74 20 61 6c 6c 20 66 69 6c rns that all fil
9e80: 65 73 20 68 61 76 65 20 65 78 65 63 75 74 65 20 es have execute
9e90: 70 65 72 6d 69 73 73 69 6f 6e 2e 0a 20 2a 0a 20 permission.. *.
9ea0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 65 * Results:. *.Se
9eb0: 65 20 61 63 63 65 73 73 20 64 6f 63 75 6d 65 6e e access documen
9ec0: 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69 tation.. *. * Si
9ed0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
9ee0: 65 65 20 61 63 63 65 73 73 20 64 6f 63 75 6d 65 ee access docume
9ef0: 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d ntation.. *. *--
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
9f50: 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 tatic int.Native
9f60: 41 63 63 65 73 73 28 0a 20 20 20 20 63 6f 6e 73 Access(. cons
9f70: 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 50 t WCHAR *nativeP
9f80: 61 74 68 2c 09 2f 2a 20 50 61 74 68 20 6f 66 20 ath,./* Path of
9f90: 66 69 6c 65 20 74 6f 20 61 63 63 65 73 73 2c 20 file to access,
9fa0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2e native encoding.
9fb0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 */. int mode
9fc0: 29 09 09 09 2f 2a 20 50 65 72 6d 69 73 73 69 6f ).../* Permissio
9fd0: 6e 20 73 65 74 74 69 6e 67 2e 20 2a 2f 0a 7b 0a n setting. */.{.
9fe0: 20 20 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a DWORD attr;.
9ff0: 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 . attr = GetF
a000: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 6e ileAttributesW(n
a010: 61 74 69 76 65 50 61 74 68 29 3b 0a 0a 20 20 20 ativePath);..
a020: 20 69 66 20 28 61 74 74 72 20 3d 3d 20 49 4e 56 if (attr == INV
a030: 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 ALID_FILE_ATTRIB
a040: 55 54 45 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 UTES) {../*.. *
a050: 46 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 65 File might not e
a060: 78 69 73 74 2e 0a 09 20 2a 2f 0a 0a 09 44 57 4f xist... */...DWO
a070: 52 44 20 6c 61 73 74 65 72 72 6f 72 20 3d 20 47 RD lasterror = G
a080: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 09 etLastError();..
a090: 69 66 20 28 6c 61 73 74 65 72 72 6f 72 20 21 3d if (lasterror !=
a0a0: 20 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 ERROR_SHARING_V
a0b0: 49 4f 4c 41 54 49 4f 4e 29 20 7b 0a 09 20 20 20 IOLATION) {..
a0c0: 20 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 TclWinConvertEr
a0d0: 72 6f 72 28 6c 61 73 74 65 72 72 6f 72 29 3b 0a ror(lasterror);.
a0e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
a0f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 .}. }.. if
a100: 20 28 6d 6f 64 65 20 3d 3d 20 46 5f 4f 4b 29 20 (mode == F_OK)
a110: 7b 0a 09 2f 2a 0a 09 20 2a 20 46 69 6c 65 20 65 {../*.. * File e
a120: 78 69 73 74 73 2c 20 6e 6f 74 68 69 6e 67 20 65 xists, nothing e
a130: 6c 73 65 20 74 6f 20 63 68 65 63 6b 2e 0a 09 20 lse to check...
a140: 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 */...return 0;.
a150: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
a160: 20 20 2a 20 49 66 20 69 74 27 73 20 6e 6f 74 20 * If it's not
a170: 61 20 64 69 72 65 63 74 6f 72 79 20 28 61 73 73 a directory (ass
a180: 75 6d 65 20 66 69 6c 65 29 2c 20 64 6f 20 73 65 ume file), do se
a190: 76 65 72 61 6c 20 66 61 73 74 20 63 68 65 63 6b veral fast check
a1a0: 73 3a 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 s:. */..
a1b0: 69 66 20 28 21 28 61 74 74 72 20 26 20 46 49 4c if (!(attr & FIL
a1c0: 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 E_ATTRIBUTE_DIRE
a1d0: 43 54 4f 52 59 29 29 20 7b 0a 09 2f 2a 0a 09 20 CTORY)) {../*..
a1e0: 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 * If the attribu
a1f0: 74 65 73 20 73 61 79 20 74 68 69 73 20 69 73 20 tes say this is
a200: 6e 6f 74 20 77 72 69 74 61 62 6c 65 20 61 74 20 not writable at
a210: 61 6c 6c 2e 20 20 54 68 65 20 66 69 6c 65 20 69 all. The file i
a220: 73 20 61 0a 09 20 2a 20 72 65 67 75 6c 61 72 20 s a.. * regular
a230: 66 69 6c 65 20 28 69 2e 65 2e 2c 20 6e 6f 74 20 file (i.e., not
a240: 61 20 64 69 72 65 63 74 6f 72 79 29 2c 20 74 68 a directory), th
a250: 65 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e en the file is n
a260: 6f 74 0a 09 20 2a 20 77 72 69 74 61 62 6c 65 2c ot.. * writable,
a270: 20 66 75 6c 6c 20 73 74 6f 70 2e 20 20 46 6f 72 full stop. For
a280: 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 74 68 directories, th
a290: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 69 74 20 e read-only bit
a2a0: 69 73 0a 09 20 2a 20 28 6d 6f 73 74 6c 79 29 20 is.. * (mostly)
a2b0: 69 67 6e 6f 72 65 64 20 62 79 20 57 69 6e 64 6f ignored by Windo
a2c0: 77 73 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20 ws, so we can't
a2d0: 61 73 63 65 72 74 61 69 6e 20 61 6e 79 74 68 69 ascertain anythi
a2e0: 6e 67 20 61 62 6f 75 74 0a 09 20 2a 20 64 69 72 ng about.. * dir
a2f0: 65 63 74 6f 72 79 20 61 63 63 65 73 73 20 66 72 ectory access fr
a300: 6f 6d 20 74 68 65 20 61 74 74 72 69 62 20 64 61 om the attrib da
a310: 74 61 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 ta. However, if
a320: 20 77 65 20 68 61 76 65 20 74 68 65 0a 09 20 2a we have the.. *
a330: 20 61 64 76 61 6e 63 65 64 20 27 67 65 74 46 69 advanced 'getFi
a340: 6c 65 53 65 63 75 72 69 74 79 50 72 6f 63 27 2c leSecurityProc',
a350: 20 74 68 65 6e 20 6d 6f 72 65 20 72 6f 62 75 73 then more robus
a360: 74 20 41 43 4c 20 63 68 65 63 6b 73 20 77 69 6c t ACL checks wil
a370: 6c 20 62 65 0a 09 20 2a 20 64 6f 6e 65 20 62 65 l be.. * done be
a380: 6c 6f 77 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 low... */...if (
a390: 28 6d 6f 64 65 20 26 20 57 5f 4f 4b 29 20 26 26 (mode & W_OK) &&
a3a0: 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 (attr & FILE_AT
a3b0: 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 TRIBUTE_READONLY
a3c0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 )) {.. Tcl_Se
a3d0: 74 45 72 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a tErrno(EACCES);.
a3e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
a3f0: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 64 .}.../*.. * If d
a400: 6f 65 73 6e 27 74 20 68 61 76 65 20 74 68 65 20 oesn't have the
a410: 63 6f 72 72 65 63 74 20 65 78 74 65 6e 73 69 6f correct extensio
a420: 6e 2c 20 69 74 20 63 61 6e 27 74 20 62 65 20 65 n, it can't be e
a430: 78 65 63 75 74 61 62 6c 65 0a 09 20 2a 2f 0a 0a xecutable.. */..
a440: 09 69 66 20 28 28 6d 6f 64 65 20 26 20 58 5f 4f .if ((mode & X_O
a450: 4b 29 20 26 26 20 21 4e 61 74 69 76 65 49 73 45 K) && !NativeIsE
a460: 78 65 63 28 6e 61 74 69 76 65 50 61 74 68 29 29 xec(nativePath))
a470: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 {.. Tcl_SetE
a480: 72 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a 09 20 rrno(EACCES);..
a490: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d return -1;..}
a4a0: 0a 0a 09 2f 2a 0a 09 20 2a 20 53 70 65 63 69 61 .../*.. * Specia
a4b0: 6c 20 63 61 73 65 20 66 6f 72 20 72 65 61 64 2f l case for read/
a4c0: 77 72 69 74 65 2f 65 78 65 63 75 74 61 62 6c 65 write/executable
a4d0: 20 63 68 65 63 6b 20 6f 6e 20 66 69 6c 65 0a 09 check on file..
a4e0: 20 2a 2f 0a 0a 09 69 66 20 28 28 6d 6f 64 65 20 */...if ((mode
a4f0: 26 20 28 52 5f 4f 4b 7c 57 5f 4f 4b 7c 58 5f 4f & (R_OK|W_OK|X_O
a500: 4b 29 29 20 26 26 20 21 28 6d 6f 64 65 20 26 20 K)) && !(mode &
a510: 7e 28 52 5f 4f 4b 7c 57 5f 4f 4b 7c 58 5f 4f 4b ~(R_OK|W_OK|X_OK
a520: 29 29 29 20 7b 0a 09 20 20 20 20 44 57 4f 52 44 ))) {.. DWORD
a530: 20 6d 61 73 6b 20 3d 20 30 3b 0a 09 20 20 20 20 mask = 0;..
a540: 48 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 0a 09 HANDLE hFile;...
a550: 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 52 if (mode & R
a560: 5f 4f 4b 29 20 7b 0a 09 09 6d 61 73 6b 20 7c 3d _OK) {...mask |=
a570: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 09 GENERIC_READ;..
a580: 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 6d }.. if (m
a590: 6f 64 65 20 26 20 57 5f 4f 4b 29 20 7b 0a 09 09 ode & W_OK) {...
a5a0: 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43 5f mask |= GENERIC_
a5b0: 57 52 49 54 45 3b 0a 09 20 20 20 20 7d 0a 09 20 WRITE;.. }..
a5c0: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 58 5f if (mode & X_
a5d0: 4f 4b 29 20 7b 0a 09 09 6d 61 73 6b 20 7c 3d 20 OK) {...mask |=
a5e0: 47 45 4e 45 52 49 43 5f 45 58 45 43 55 54 45 3b GENERIC_EXECUTE;
a5f0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 68 46 .. }... hF
a600: 69 6c 65 20 3d 20 43 72 65 61 74 65 46 69 6c 65 ile = CreateFile
a610: 57 28 6e 61 74 69 76 65 50 61 74 68 2c 20 6d 61 W(nativePath, ma
a620: 73 6b 2c 0a 09 09 20 20 20 20 46 49 4c 45 5f 53 sk,... FILE_S
a630: 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 HARE_READ | FILE
a640: 5f 53 48 41 52 45 5f 57 52 49 54 45 20 7c 20 46 _SHARE_WRITE | F
a650: 49 4c 45 5f 53 48 41 52 45 5f 44 45 4c 45 54 45 ILE_SHARE_DELETE
a660: 2c 0a 09 09 20 20 20 20 4e 55 4c 4c 2c 20 4f 50 ,... NULL, OP
a670: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 20 46 49 4c EN_EXISTING, FIL
a680: 45 5f 46 4c 41 47 5f 4e 4f 5f 42 55 46 46 45 52 E_FLAG_NO_BUFFER
a690: 49 4e 47 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 ING, NULL);..
a6a0: 20 69 66 20 28 68 46 69 6c 65 20 21 3d 20 49 4e if (hFile != IN
a6b0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c VALID_HANDLE_VAL
a6c0: 55 45 29 20 7b 0a 09 09 43 6c 6f 73 65 48 61 6e UE) {...CloseHan
a6d0: 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 09 72 65 dle(hFile);...re
a6e0: 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a turn 0;.. }..
a6f0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
a700: 46 61 73 74 20 65 78 69 74 20 69 66 20 61 63 63 Fast exit if acc
a710: 65 73 73 20 77 61 73 20 64 65 6e 69 65 64 0a 09 ess was denied..
a720: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
a730: 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 (GetLastError()
a740: 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53 == ERROR_ACCESS
a750: 5f 44 45 4e 49 45 44 29 20 7b 0a 09 09 54 63 6c _DENIED) {...Tcl
a760: 5f 53 65 74 45 72 72 6e 6f 28 45 41 43 43 45 53 _SetErrno(EACCES
a770: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a );...return -1;.
a780: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 . }..}.../*..
a790: 20 2a 20 57 65 20 63 61 6e 6e 6f 74 20 76 65 72 * We cannot ver
a7a0: 69 66 79 20 74 68 65 20 61 63 63 65 73 73 20 66 ify the access f
a7b0: 61 73 74 2c 20 63 68 65 63 6b 20 69 74 20 62 65 ast, check it be
a7c0: 6c 6f 77 20 75 73 69 6e 67 20 73 65 63 75 72 69 low using securi
a7d0: 74 79 0a 09 20 2a 20 69 6e 66 6f 2e 0a 09 20 2a ty.. * info... *
a7e0: 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a /. }.. /*.
a7f0: 20 20 20 20 20 2a 20 49 74 20 6c 6f 6f 6b 73 20 * It looks
a800: 61 73 20 69 66 20 74 68 65 20 70 65 72 6d 69 73 as if the permis
a810: 73 69 6f 6e 73 20 61 72 65 20 6f 6b 2c 20 62 75 sions are ok, bu
a820: 74 20 69 66 20 77 65 20 61 72 65 20 6f 6e 20 4e t if we are on N
a830: 54 2c 20 32 30 30 30 20 6f 72 20 58 50 2c 0a 20 T, 2000 or XP,.
a840: 20 20 20 20 2a 20 77 65 20 68 61 76 65 20 61 20 * we have a
a850: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 70 65 72 more complex per
a860: 6d 69 73 73 69 6f 6e 73 20 73 74 72 75 63 74 75 missions structu
a870: 72 65 20 73 6f 20 77 65 20 74 72 79 20 74 6f 20 re so we try to
a880: 63 68 65 63 6b 20 74 68 61 74 2e 0a 20 20 20 20 check that..
a890: 20 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f * The code belo
a8a0: 77 20 69 73 20 72 65 6d 61 72 6b 61 62 6c 79 20 w is remarkably
a8b0: 63 6f 6d 70 6c 65 78 20 66 6f 72 20 73 75 63 68 complex for such
a8c0: 20 61 20 73 69 6d 70 6c 65 20 74 68 69 6e 67 20 a simple thing
a8d0: 61 73 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 20 as finding.
a8e0: 2a 20 77 68 61 74 20 70 65 72 6d 69 73 73 69 6f * what permissio
a8f0: 6e 73 20 74 68 65 20 4f 53 20 68 61 73 20 73 65 ns the OS has se
a900: 74 20 66 6f 72 20 61 20 66 69 6c 65 2e 0a 20 20 t for a file..
a910: 20 20 20 2a 2f 0a 0a 20 20 20 20 7b 0a 09 53 45 */.. {..SE
a920: 43 55 52 49 54 59 5f 44 45 53 43 52 49 50 54 4f CURITY_DESCRIPTO
a930: 52 20 2a 73 64 50 74 72 20 3d 20 4e 55 4c 4c 3b R *sdPtr = NULL;
a940: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 ..unsigned long
a950: 73 69 7a 65 3b 0a 09 50 53 49 44 20 70 53 69 64 size;..PSID pSid
a960: 20 3d 20 30 3b 0a 09 42 4f 4f 4c 20 53 69 64 44 = 0;..BOOL SidD
a970: 65 66 61 75 6c 74 65 64 3b 0a 09 53 49 44 5f 49 efaulted;..SID_I
a980: 44 45 4e 54 49 46 49 45 52 5f 41 55 54 48 4f 52 DENTIFIER_AUTHOR
a990: 49 54 59 20 73 61 6d 62 61 5f 75 6e 6d 61 70 70 ITY samba_unmapp
a9a0: 65 64 20 3d 20 7b 7b 30 2c 20 30 2c 20 30 2c 20 ed = {{0, 0, 0,
a9b0: 30 2c 20 30 2c 20 32 32 7d 7d 3b 0a 09 47 45 4e 0, 0, 22}};..GEN
a9c0: 45 52 49 43 5f 4d 41 50 50 49 4e 47 20 67 65 6e ERIC_MAPPING gen
a9d0: 4d 61 70 3b 0a 09 48 41 4e 44 4c 45 20 68 54 6f Map;..HANDLE hTo
a9e0: 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 44 57 4f ken = NULL;..DWO
a9f0: 52 44 20 64 65 73 69 72 65 64 41 63 63 65 73 73 RD desiredAccess
aa00: 20 3d 20 30 2c 20 67 72 61 6e 74 65 64 41 63 63 = 0, grantedAcc
aa10: 65 73 73 20 3d 20 30 3b 0a 09 42 4f 4f 4c 20 61 ess = 0;..BOOL a
aa20: 63 63 65 73 73 59 65 73 4e 6f 20 3d 20 46 41 4c ccessYesNo = FAL
aa30: 53 45 3b 0a 09 50 52 49 56 49 4c 45 47 45 5f 53 SE;..PRIVILEGE_S
aa40: 45 54 20 70 72 69 76 53 65 74 3b 0a 09 44 57 4f ET privSet;..DWO
aa50: 52 44 20 70 72 69 76 53 65 74 53 69 7a 65 20 3d RD privSetSize =
aa60: 20 73 69 7a 65 6f 66 28 50 52 49 56 49 4c 45 47 sizeof(PRIVILEG
aa70: 45 5f 53 45 54 29 3b 0a 09 69 6e 74 20 65 72 72 E_SET);..int err
aa80: 6f 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 46 69 72 or;.../*.. * Fir
aa90: 73 74 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 st find out how
aaa0: 62 69 67 20 74 68 65 20 62 75 66 66 65 72 20 6e big the buffer n
aab0: 65 65 64 73 20 74 6f 20 62 65 2e 0a 09 20 2a 2f eeds to be... */
aac0: 0a 0a 09 73 69 7a 65 20 3d 20 30 3b 0a 09 47 65 ...size = 0;..Ge
aad0: 74 46 69 6c 65 53 65 63 75 72 69 74 79 57 28 6e tFileSecurityW(n
aae0: 61 74 69 76 65 50 61 74 68 2c 0a 09 09 4f 57 4e ativePath,...OWN
aaf0: 45 52 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f ER_SECURITY_INFO
ab00: 52 4d 41 54 49 4f 4e 20 7c 20 47 52 4f 55 50 5f RMATION | GROUP_
ab10: 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41 SECURITY_INFORMA
ab20: 54 49 4f 4e 0a 09 09 7c 20 44 41 43 4c 5f 53 45 TION...| DACL_SE
ab30: 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41 54 49 CURITY_INFORMATI
ab40: 4f 4e 20 7c 20 4c 41 42 45 4c 5f 53 45 43 55 52 ON | LABEL_SECUR
ab50: 49 54 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 2c ITY_INFORMATION,
ab60: 0a 09 09 30 2c 20 30 2c 20 26 73 69 7a 65 29 3b ...0, 0, &size);
ab70: 0a 0a 09 2f 2a 0a 09 20 2a 20 53 68 6f 75 6c 64 .../*.. * Should
ab80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 have failed wit
ab90: 68 20 45 52 52 4f 52 5f 49 4e 53 55 46 46 49 43 h ERROR_INSUFFIC
aba0: 49 45 4e 54 5f 42 55 46 46 45 52 0a 09 20 2a 2f IENT_BUFFER.. */
abb0: 0a 0a 09 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 ...error = GetLa
abc0: 73 74 45 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 stError();..if (
abd0: 65 72 72 6f 72 20 21 3d 20 45 52 52 4f 52 5f 49 error != ERROR_I
abe0: 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 NSUFFICIENT_BUFF
abf0: 45 52 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 ER) {.. /*..
ac00: 20 20 20 20 2a 20 4d 6f 73 74 20 6c 69 6b 65 6c * Most likel
ac10: 79 20 63 61 73 65 20 69 73 20 45 52 52 4f 52 5f y case is ERROR_
ac20: 41 43 43 45 53 53 5f 44 45 4e 49 45 44 2c 20 77 ACCESS_DENIED, w
ac30: 68 69 63 68 20 77 65 20 77 69 6c 6c 20 63 6f 6e hich we will con
ac40: 76 65 72 74 0a 09 20 20 20 20 20 2a 20 74 6f 20 vert.. * to
ac50: 45 41 43 43 45 53 20 2d 20 6a 75 73 74 20 77 68 EACCES - just wh
ac60: 61 74 20 77 65 20 77 61 6e 74 21 0a 09 20 20 20 at we want!..
ac70: 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 57 69 */... TclWi
ac80: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 28 44 nConvertError((D
ac90: 57 4f 52 44 29 20 65 72 72 6f 72 29 3b 0a 09 20 WORD) error);..
aca0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d return -1;..}
acb0: 0a 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 77 20 73 69 .../*.. * Now si
acc0: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 ze contains the
acd0: 73 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 6e size of buffer n
ace0: 65 65 64 65 64 2e 0a 09 20 2a 2f 0a 0a 09 73 64 eeded... */...sd
acf0: 50 74 72 20 3d 20 28 53 45 43 55 52 49 54 59 5f Ptr = (SECURITY_
ad00: 44 45 53 43 52 49 50 54 4f 52 20 2a 29 20 48 65 DESCRIPTOR *) He
ad10: 61 70 41 6c 6c 6f 63 28 47 65 74 50 72 6f 63 65 apAlloc(GetProce
ad20: 73 73 48 65 61 70 28 29 2c 20 30 2c 20 73 69 7a ssHeap(), 0, siz
ad30: 65 29 3b 0a 0a 09 69 66 20 28 73 64 50 74 72 20 e);...if (sdPtr
ad40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
ad50: 67 6f 74 6f 20 61 63 63 65 73 73 45 72 72 6f 72 goto accessError
ad60: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 61 ;..}.../*.. * Ca
ad70: 6c 6c 20 47 65 74 46 69 6c 65 53 65 63 75 72 69 ll GetFileSecuri
ad80: 74 79 57 28 29 20 66 6f 72 20 72 65 61 6c 2e 0a tyW() for real..
ad90: 09 20 2a 2f 0a 0a 09 69 66 20 28 21 47 65 74 46 . */...if (!GetF
ada0: 69 6c 65 53 65 63 75 72 69 74 79 57 28 6e 61 74 ileSecurityW(nat
adb0: 69 76 65 50 61 74 68 2c 0a 09 09 4f 57 4e 45 52 ivePath,...OWNER
adc0: 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d _SECURITY_INFORM
add0: 41 54 49 4f 4e 20 7c 20 47 52 4f 55 50 5f 53 45 ATION | GROUP_SE
ade0: 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41 54 49 CURITY_INFORMATI
adf0: 4f 4e 0a 09 09 7c 20 44 41 43 4c 5f 53 45 43 55 ON...| DACL_SECU
ae00: 52 49 54 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e RITY_INFORMATION
ae10: 20 7c 20 4c 41 42 45 4c 5f 53 45 43 55 52 49 54 | LABEL_SECURIT
ae20: 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 2c 0a 09 Y_INFORMATION,..
ae30: 09 73 64 50 74 72 2c 20 73 69 7a 65 2c 20 26 73 .sdPtr, size, &s
ae40: 69 7a 65 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a ize)) {.. /*.
ae50: 09 20 20 20 20 20 2a 20 45 72 72 6f 72 20 67 65 . * Error ge
ae60: 74 74 69 6e 67 20 6f 77 6e 65 72 20 53 44 0a 09 tting owner SD..
ae70: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 67 6f */... go
ae80: 74 6f 20 61 63 63 65 73 73 45 72 72 6f 72 3b 0a to accessError;.
ae90: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 41 73 20 6f .}.../*.. * As o
aea0: 66 20 53 61 6d 62 61 20 33 2e 30 2e 32 33 20 28 f Samba 3.0.23 (
aeb0: 31 30 2d 4a 75 6c 2d 32 30 30 36 29 2c 20 75 6e 10-Jul-2006), un
aec0: 6d 61 70 70 65 64 20 75 73 65 72 73 20 61 6e 64 mapped users and
aed0: 20 67 72 6f 75 70 73 20 61 72 65 0a 09 20 2a 20 groups are.. *
aee0: 61 73 73 69 67 6e 65 64 20 74 6f 20 53 49 44 20 assigned to SID
aef0: 64 6f 6d 61 69 6e 73 20 53 2d 31 2d 32 32 2d 31 domains S-1-22-1
af00: 20 61 6e 64 20 53 2d 31 2d 32 32 2d 32 2c 20 77 and S-1-22-2, w
af10: 68 65 72 65 20 22 32 32 22 20 69 73 20 74 68 65 here "22" is the
af20: 0a 09 20 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 61 .. * top-level a
af30: 75 74 68 6f 72 69 74 79 2e 09 20 49 66 20 74 68 uthority.. If th
af40: 65 20 66 69 6c 65 20 6f 77 6e 65 72 20 61 6e 64 e file owner and
af50: 20 67 72 6f 75 70 20 69 73 20 75 6e 6d 61 70 70 group is unmapp
af60: 65 64 20 74 68 65 6e 0a 09 20 2a 20 74 68 65 20 ed then.. * the
af70: 41 43 4c 20 61 63 63 65 73 73 20 63 68 65 63 6b ACL access check
af80: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6f 6e 6c 79 below will only
af90: 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 77 6f test against wo
afa0: 72 6c 64 20 61 63 63 65 73 73 2c 0a 09 20 2a 20 rld access,.. *
afb0: 77 68 69 63 68 20 69 73 20 6c 69 6b 65 6c 79 20 which is likely
afc0: 74 6f 20 62 65 20 6d 6f 72 65 20 72 65 73 74 72 to be more restr
afd0: 69 63 74 69 76 65 20 74 68 61 6e 20 74 68 65 20 ictive than the
afe0: 61 63 74 75 61 6c 20 61 63 63 65 73 73 0a 09 20 actual access..
aff0: 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 2e 20 * restrictions.
b000: 20 53 69 6e 63 65 20 74 68 65 20 41 43 4c 20 74 Since the ACL t
b010: 65 73 74 73 20 61 72 65 20 6d 6f 72 65 20 6c 69 ests are more li
b020: 6b 65 6c 79 20 77 72 6f 6e 67 20 74 68 61 6e 0a kely wrong than.
b030: 09 20 2a 20 72 69 67 68 74 2c 20 73 6b 69 70 20 . * right, skip
b040: 74 68 65 6d 2e 20 20 4d 6f 72 65 6f 76 65 72 2c them. Moreover,
b050: 20 74 68 65 20 75 6e 69 78 20 6f 77 6e 65 72 20 the unix owner
b060: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f access permissio
b070: 6e 73 20 61 72 65 0a 09 20 2a 20 75 73 75 61 6c ns are.. * usual
b080: 6c 79 20 6d 61 70 70 65 64 20 74 6f 20 74 68 65 ly mapped to the
b090: 20 57 69 6e 64 6f 77 73 20 61 74 74 72 69 62 75 Windows attribu
b0a0: 74 65 73 2c 20 73 6f 20 69 66 20 74 68 65 20 75 tes, so if the u
b0b0: 73 65 72 20 69 73 20 74 68 65 0a 09 20 2a 20 66 ser is the.. * f
b0c0: 69 6c 65 20 6f 77 6e 65 72 20 74 68 65 6e 20 74 ile owner then t
b0d0: 68 65 20 61 74 74 72 69 62 20 63 68 65 63 6b 73 he attrib checks
b0e0: 20 61 62 6f 76 65 20 61 72 65 20 63 6f 72 72 65 above are corre
b0f0: 63 74 20 28 61 73 20 66 61 72 20 61 73 20 74 68 ct (as far as th
b100: 65 79 0a 09 20 2a 20 67 6f 29 2e 0a 09 20 2a 2f ey.. * go)... */
b110: 0a 0a 09 69 66 28 21 47 65 74 53 65 63 75 72 69 ...if(!GetSecuri
b120: 74 79 44 65 73 63 72 69 70 74 6f 72 4f 77 6e 65 tyDescriptorOwne
b130: 72 28 73 64 50 74 72 2c 26 70 53 69 64 2c 26 53 r(sdPtr,&pSid,&S
b140: 69 64 44 65 66 61 75 6c 74 65 64 29 20 7c 7c 0a idDefaulted) ||.
b150: 09 20 20 20 6d 65 6d 63 6d 70 28 47 65 74 53 69 . memcmp(GetSi
b160: 64 49 64 65 6e 74 69 66 69 65 72 41 75 74 68 6f dIdentifierAutho
b170: 72 69 74 79 28 70 53 69 64 29 2c 26 73 61 6d 62 rity(pSid),&samb
b180: 61 5f 75 6e 6d 61 70 70 65 64 2c 0a 09 09 20 20 a_unmapped,...
b190: 73 69 7a 65 6f 66 28 53 49 44 5f 49 44 45 4e 54 sizeof(SID_IDENT
b1a0: 49 46 49 45 52 5f 41 55 54 48 4f 52 49 54 59 29 IFIER_AUTHORITY)
b1b0: 29 3d 3d 30 29 20 7b 0a 09 20 20 20 20 48 65 61 )==0) {.. Hea
b1c0: 70 46 72 65 65 28 47 65 74 50 72 6f 63 65 73 73 pFree(GetProcess
b1d0: 48 65 61 70 28 29 2c 20 30 2c 20 73 64 50 74 72 Heap(), 0, sdPtr
b1e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 );.. return 0
b1f0: 3b 20 2f 2a 20 41 74 74 72 69 62 20 74 65 73 74 ; /* Attrib test
b200: 73 20 73 61 79 20 61 63 63 65 73 73 20 61 6c 6c s say access all
b210: 6f 77 65 64 2e 20 2a 2f 0a 09 7d 0a 0a 09 2f 2a owed. */..}.../*
b220: 0a 09 20 2a 20 50 65 72 66 6f 72 6d 20 73 65 63 .. * Perform sec
b230: 75 72 69 74 79 20 69 6d 70 65 72 73 6f 6e 61 74 urity impersonat
b240: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 65 72 20 ion of the user
b250: 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 72 65 73 and open the res
b260: 75 6c 74 69 6e 67 0a 09 20 2a 20 74 68 72 65 61 ulting.. * threa
b270: 64 20 74 6f 6b 65 6e 2e 0a 09 20 2a 2f 0a 0a 09 d token... */...
b280: 69 66 20 28 21 49 6d 70 65 72 73 6f 6e 61 74 65 if (!Impersonate
b290: 53 65 6c 66 28 53 65 63 75 72 69 74 79 49 6d 70 Self(SecurityImp
b2a0: 65 72 73 6f 6e 61 74 69 6f 6e 29 29 20 7b 0a 09 ersonation)) {..
b2b0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 55 /*.. * U
b2c0: 6e 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d nable to perform
b2d0: 20 73 65 63 75 72 69 74 79 20 69 6d 70 65 72 73 security impers
b2e0: 6f 6e 61 74 69 6f 6e 2e 0a 09 20 20 20 20 20 2a onation... *
b2f0: 2f 0a 0a 09 20 20 20 20 67 6f 74 6f 20 61 63 63 /... goto acc
b300: 65 73 73 45 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 essError;..}..if
b310: 20 28 21 4f 70 65 6e 54 68 72 65 61 64 54 6f 6b (!OpenThreadTok
b320: 65 6e 28 47 65 74 43 75 72 72 65 6e 74 54 68 72 en(GetCurrentThr
b330: 65 61 64 28 29 2c 0a 09 09 54 4f 4b 45 4e 5f 44 ead(),...TOKEN_D
b340: 55 50 4c 49 43 41 54 45 20 7c 20 54 4f 4b 45 4e UPLICATE | TOKEN
b350: 5f 51 55 45 52 59 2c 20 46 41 4c 53 45 2c 20 26 _QUERY, FALSE, &
b360: 68 54 6f 6b 65 6e 29 29 20 7b 0a 09 20 20 20 20 hToken)) {..
b370: 2f 2a 0a 09 20 20 20 20 20 2a 20 55 6e 61 62 6c /*.. * Unabl
b380: 65 20 74 6f 20 67 65 74 20 63 75 72 72 65 6e 74 e to get current
b390: 20 74 68 72 65 61 64 27 73 20 74 6f 6b 65 6e 2e thread's token.
b3a0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
b3b0: 67 6f 74 6f 20 61 63 63 65 73 73 45 72 72 6f 72 goto accessError
b3c0: 3b 0a 09 7d 0a 0a 09 52 65 76 65 72 74 54 6f 53 ;..}...RevertToS
b3d0: 65 6c 66 28 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 elf();.../*.. *
b3e0: 53 65 74 75 70 20 64 65 73 69 72 65 64 41 63 63 Setup desiredAcc
b3f0: 65 73 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f ess according to
b400: 20 74 68 65 20 61 63 63 65 73 73 20 70 72 69 76 the access priv
b410: 69 6c 65 67 65 73 20 77 65 20 61 72 65 0a 09 20 ileges we are..
b420: 2a 20 63 68 65 63 6b 69 6e 67 2e 0a 09 20 2a 2f * checking... */
b430: 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 52 5f ...if (mode & R_
b440: 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65 73 69 72 OK) {.. desir
b450: 65 64 41 63 63 65 73 73 20 7c 3d 20 46 49 4c 45 edAccess |= FILE
b460: 5f 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 09 _GENERIC_READ;..
b470: 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 57 5f }..if (mode & W_
b480: 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65 73 69 72 OK) {.. desir
b490: 65 64 41 63 63 65 73 73 20 7c 3d 20 46 49 4c 45 edAccess |= FILE
b4a0: 5f 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a _GENERIC_WRITE;.
b4b0: 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 58 .}..if (mode & X
b4c0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65 73 69 _OK) {.. desi
b4d0: 72 65 64 41 63 63 65 73 73 20 7c 3d 20 46 49 4c redAccess |= FIL
b4e0: 45 5f 47 45 4e 45 52 49 43 5f 45 58 45 43 55 54 E_GENERIC_EXECUT
b4f0: 45 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 26 E;..}...memset(&
b500: 67 65 6e 4d 61 70 2c 20 30 78 30 2c 20 73 69 7a genMap, 0x0, siz
b510: 65 6f 66 28 47 45 4e 45 52 49 43 5f 4d 41 50 50 eof(GENERIC_MAPP
b520: 49 4e 47 29 29 3b 0a 09 67 65 6e 4d 61 70 2e 47 ING));..genMap.G
b530: 65 6e 65 72 69 63 52 65 61 64 20 3d 20 46 49 4c enericRead = FIL
b540: 45 5f 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a E_GENERIC_READ;.
b550: 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72 69 63 57 .genMap.GenericW
b560: 72 69 74 65 20 3d 20 46 49 4c 45 5f 47 45 4e 45 rite = FILE_GENE
b570: 52 49 43 5f 57 52 49 54 45 3b 0a 09 67 65 6e 4d RIC_WRITE;..genM
b580: 61 70 2e 47 65 6e 65 72 69 63 45 78 65 63 75 74 ap.GenericExecut
b590: 65 20 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49 43 e = FILE_GENERIC
b5a0: 5f 45 58 45 43 55 54 45 3b 0a 09 67 65 6e 4d 61 _EXECUTE;..genMa
b5b0: 70 2e 47 65 6e 65 72 69 63 41 6c 6c 20 3d 20 46 p.GenericAll = F
b5c0: 49 4c 45 5f 41 4c 4c 5f 41 43 43 45 53 53 3b 0a ILE_ALL_ACCESS;.
b5d0: 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66 6f 72 6d ../*.. * Perform
b5e0: 20 61 63 63 65 73 73 20 63 68 65 63 6b 20 75 73 access check us
b5f0: 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 09 ing the token...
b600: 20 2a 2f 0a 0a 09 69 66 20 28 21 41 63 63 65 73 */...if (!Acces
b610: 73 43 68 65 63 6b 28 73 64 50 74 72 2c 20 68 54 sCheck(sdPtr, hT
b620: 6f 6b 65 6e 2c 20 64 65 73 69 72 65 64 41 63 63 oken, desiredAcc
b630: 65 73 73 2c 0a 09 09 26 67 65 6e 4d 61 70 2c 20 ess,...&genMap,
b640: 26 70 72 69 76 53 65 74 2c 20 26 70 72 69 76 53 &privSet, &privS
b650: 65 74 53 69 7a 65 2c 20 26 67 72 61 6e 74 65 64 etSize, &granted
b660: 41 63 63 65 73 73 2c 0a 09 09 26 61 63 63 65 73 Access,...&acces
b670: 73 59 65 73 4e 6f 29 29 20 7b 0a 09 20 20 20 20 sYesNo)) {..
b680: 2f 2a 0a 09 20 20 20 20 20 2a 20 55 6e 61 62 6c /*.. * Unabl
b690: 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 61 63 63 e to perform acc
b6a0: 65 73 73 20 63 68 65 63 6b 2e 0a 09 20 20 20 20 ess check...
b6b0: 20 2a 2f 0a 0a 09 61 63 63 65 73 73 45 72 72 6f */...accessErro
b6c0: 72 3a 0a 09 20 20 20 20 54 63 6c 57 69 6e 43 6f r:.. TclWinCo
b6d0: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 nvertError(GetLa
b6e0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20 20 stError());..
b6f0: 20 69 66 20 28 73 64 50 74 72 20 21 3d 20 4e 55 if (sdPtr != NU
b700: 4c 4c 29 20 7b 0a 09 09 48 65 61 70 46 72 65 65 LL) {...HeapFree
b710: 28 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 (GetProcessHeap(
b720: 29 2c 20 30 2c 20 73 64 50 74 72 29 3b 0a 09 20 ), 0, sdPtr);..
b730: 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 68 54 }.. if (hT
b740: 6f 6b 65 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a oken != NULL) {.
b750: 09 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 54 ..CloseHandle(hT
b760: 6f 6b 65 6e 29 3b 0a 09 20 20 20 20 7d 0a 09 20 oken);.. }..
b770: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d return -1;..}
b780: 0a 0a 09 2f 2a 0a 09 20 2a 20 43 6c 65 61 6e 20 .../*.. * Clean
b790: 75 70 2e 0a 09 20 2a 2f 0a 0a 09 48 65 61 70 46 up... */...HeapF
b7a0: 72 65 65 28 47 65 74 50 72 6f 63 65 73 73 48 65 ree(GetProcessHe
b7b0: 61 70 28 29 2c 20 30 2c 20 73 64 50 74 72 29 3b ap(), 0, sdPtr);
b7c0: 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 54 ..CloseHandle(hT
b7d0: 6f 6b 65 6e 29 3b 0a 09 69 66 20 28 21 61 63 63 oken);..if (!acc
b7e0: 65 73 73 59 65 73 4e 6f 29 20 7b 0a 09 20 20 20 essYesNo) {..
b7f0: 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 41 Tcl_SetErrno(EA
b800: 43 43 45 53 29 3b 0a 09 20 20 20 20 72 65 74 75 CCES);.. retu
b810: 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 20 20 20 20 7d rn -1;..}.. }
b820: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
b830: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
b840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b880: 2a 0a 20 2a 20 4e 61 74 69 76 65 49 73 45 78 65 *. * NativeIsExe
b890: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 74 65 72 c --. *. *.Deter
b8a0: 6d 69 6e 65 73 20 69 66 20 61 20 70 61 74 68 20 mines if a path
b8b0: 69 73 20 65 78 65 63 75 74 61 62 6c 65 2e 20 4f is executable. O
b8c0: 6e 20 77 69 6e 64 6f 77 73 20 74 68 69 73 20 69 n windows this i
b8d0: 73 20 73 69 6d 70 6c 79 20 64 65 66 69 6e 65 64 s simply defined
b8e0: 0a 20 2a 09 62 79 20 77 68 65 74 68 65 72 20 74 . *.by whether t
b8f0: 68 65 20 70 61 74 68 20 65 6e 64 73 20 69 6e 20 he path ends in
b900: 61 20 73 74 61 6e 64 61 72 64 20 65 78 65 63 75 a standard execu
b910: 74 61 62 6c 65 20 65 78 74 65 6e 73 69 6f 6e 2e table extension.
b920: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
b930: 20 2a 09 31 20 3d 20 65 78 65 63 75 74 61 62 6c *.1 = executabl
b940: 65 2c 20 30 20 3d 20 6e 6f 74 2e 0a 20 2a 0a 20 e, 0 = not.. *.
b950: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
b960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b990: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
b9a0: 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 49 73 tic int.NativeIs
b9b0: 45 78 65 63 28 0a 20 20 20 20 63 6f 6e 73 74 20 Exec(. const
b9c0: 57 43 48 41 52 20 2a 70 61 74 68 29 0a 7b 0a 20 WCHAR *path).{.
b9d0: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 20 3d 20 size_t len =
b9e0: 77 63 73 6c 65 6e 28 70 61 74 68 29 3b 0a 0a 20 wcslen(path);..
b9f0: 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 35 29 20 if (len < 5)
ba00: 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 {..return 0;.
ba10: 20 7d 0a 0a 20 20 20 20 69 66 20 28 70 61 74 68 }.. if (path
ba20: 5b 6c 65 6e 2d 34 5d 20 21 3d 20 27 2e 27 29 20 [len-4] != '.')
ba30: 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 {..return 0;.
ba40: 20 7d 0a 0a 20 20 20 20 70 61 74 68 20 2b 3d 20 }.. path +=
ba50: 6c 65 6e 2d 33 3b 0a 20 20 20 20 69 66 20 28 28 len-3;. if ((
ba60: 5f 77 63 73 69 63 6d 70 28 70 61 74 68 2c 20 4c _wcsicmp(path, L
ba70: 22 65 78 65 22 29 20 3d 3d 20 30 29 0a 09 20 20 "exe") == 0)..
ba80: 20 20 7c 7c 20 28 5f 77 63 73 69 63 6d 70 28 70 || (_wcsicmp(p
ba90: 61 74 68 2c 20 4c 22 63 6f 6d 22 29 20 3d 3d 20 ath, L"com") ==
baa0: 30 29 0a 09 20 20 20 20 7c 7c 20 28 5f 77 63 73 0).. || (_wcs
bab0: 69 63 6d 70 28 70 61 74 68 2c 20 4c 22 63 6d 64 icmp(path, L"cmd
bac0: 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7c 7c ") == 0).. ||
bad0: 20 28 5f 77 63 73 69 63 6d 70 28 70 61 74 68 2c (_wcsicmp(path,
bae0: 20 4c 22 62 61 74 22 29 20 3d 3d 20 30 29 29 20 L"bat") == 0))
baf0: 7b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 {..return 1;.
bb00: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b }. return 0;
bb10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb60: 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 62 6a 43 68 . *. * TclpObjCh
bb70: 64 69 72 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 dir --. *. *.Thi
bb80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 s function repla
bb90: 63 65 73 20 74 68 65 20 6c 69 62 72 61 72 79 20 ces the library
bba0: 76 65 72 73 69 6f 6e 20 6f 66 20 63 68 64 69 72 version of chdir
bbb0: 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ().. *. * Result
bbc0: 73 3a 0a 20 2a 09 53 65 65 20 63 68 64 69 72 28 s:. *.See chdir(
bbd0: 29 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e ) documentation.
bbe0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
bbf0: 63 74 73 3a 0a 20 2a 09 53 65 65 20 63 68 64 69 cts:. *.See chdi
bc00: 72 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f r() documentatio
bc10: 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d n.. *. *--------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
bc60: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 43 */..int.TclpObjC
bc70: 68 64 69 72 28 0a 20 20 20 20 54 63 6c 5f 4f 62 hdir(. Tcl_Ob
bc80: 6a 20 2a 70 61 74 68 50 74 72 29 09 2f 2a 20 50 j *pathPtr)./* P
bc90: 61 74 68 20 74 6f 20 6e 65 77 20 77 6f 72 6b 69 ath to new worki
bca0: 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f ng directory. */
bcb0: 0a 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c .{. int resul
bcc0: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 48 t;. const WCH
bcd0: 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 3b 0a AR *nativePath;.
bce0: 0a 20 20 20 20 6e 61 74 69 76 65 50 61 74 68 20 . nativePath
bcf0: 3d 20 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a = (const WCHAR *
bd00: 29 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 )Tcl_FSGetNative
bd10: 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a 0a Path(pathPtr);..
bd20: 20 20 20 20 69 66 20 28 21 6e 61 74 69 76 65 50 if (!nativeP
bd30: 61 74 68 29 20 7b 0a 09 72 65 74 75 72 6e 20 2d ath) {..return -
bd40: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 1;. }. res
bd50: 75 6c 74 20 3d 20 53 65 74 43 75 72 72 65 6e 74 ult = SetCurrent
bd60: 44 69 72 65 63 74 6f 72 79 57 28 6e 61 74 69 76 DirectoryW(nativ
bd70: 65 50 61 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 ePath);.. if
bd80: 28 72 65 73 75 6c 74 20 3d 3d 20 30 29 20 7b 0a (result == 0) {.
bd90: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 .TclWinConvertEr
bda0: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 ror(GetLastError
bdb0: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b ());..return -1;
bdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
bdd0: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d n 0;.}.../*. *--
bde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bdf0: 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 63 6c 70 47 ----. *. * TclpG
be30: 65 74 43 77 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 etCwd --. *. *.T
be40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 his function rep
be50: 6c 61 63 65 73 20 74 68 65 20 6c 69 62 72 61 72 laces the librar
be60: 79 20 76 65 72 73 69 6f 6e 20 6f 66 20 67 65 74 y version of get
be70: 63 77 64 28 29 2e 20 28 4f 62 73 6f 6c 65 74 65 cwd(). (Obsolete
be80: 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 2c 20 6f 6e . *.function, on
be90: 6c 79 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 ly retained for
bea0: 6f 6c 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 77 old extensions w
beb0: 68 69 63 68 20 6d 61 79 20 63 61 6c 6c 20 69 74 hich may call it
bec0: 0a 20 2a 09 64 69 72 65 63 74 6c 79 29 2e 0a 20 . *.directly)..
bed0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
bee0: 09 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 .The result is a
bef0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 pointer to a st
bf00: 72 69 6e 67 20 73 70 65 63 69 66 79 69 6e 67 20 ring specifying
bf10: 74 68 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 the current dire
bf20: 63 74 6f 72 79 2c 0a 20 2a 09 6f 72 20 4e 55 4c ctory,. *.or NUL
bf30: 4c 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 L if the current
bf40: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 75 6c 64 directory could
bf50: 20 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e not be determin
bf60: 65 64 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 20 ed. If NULL is.
bf70: 2a 09 72 65 74 75 72 6e 65 64 2c 20 61 6e 20 65 *.returned, an e
bf80: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
bf90: 6c 65 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 left in the inte
bfa0: 72 70 27 73 20 72 65 73 75 6c 74 2e 20 53 74 6f rp's result. Sto
bfb0: 72 61 67 65 20 66 6f 72 0a 20 2a 09 74 68 65 20 rage for. *.the
bfc0: 72 65 73 75 6c 74 20 73 74 72 69 6e 67 20 69 73 result string is
bfd0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 62 75 allocated in bu
bfe0: 66 66 65 72 50 74 72 3b 20 74 68 65 20 63 61 6c fferPtr; the cal
bff0: 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 0a 20 2a ler must call. *
c000: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
c010: 28 29 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 () when the resu
c020: 6c 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 lt is no longer
c030: 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 needed.. *. * Si
c040: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
c050: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
c060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0a0: 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 . */..const char
c0b0: 20 2a 0a 54 63 6c 70 47 65 74 43 77 64 28 0a 20 *.TclpGetCwd(.
c0c0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
c0d0: 6e 74 65 72 70 2c 09 09 2f 2a 20 49 66 20 6e 6f nterp,../* If no
c0e0: 6e 2d 4e 55 4c 4c 2c 20 75 73 65 64 20 66 6f 72 n-NULL, used for
c0f0: 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 error reporting
c100: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 . */. Tcl_DSt
c110: 72 69 6e 67 20 2a 62 75 66 66 65 72 50 74 72 29 ring *bufferPtr)
c120: 09 2f 2a 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65 ./* Uninitialize
c130: 64 20 6f 72 20 66 72 65 65 20 44 53 74 72 69 6e d or free DStrin
c140: 67 20 66 69 6c 6c 65 64 20 77 69 74 68 0a 09 09 g filled with...
c150: 09 09 20 2a 20 6e 61 6d 65 20 6f 66 20 63 75 72 .. * name of cur
c160: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2e 20 rent directory.
c170: 2a 2f 0a 7b 0a 20 20 20 20 57 43 48 41 52 20 62 */.{. WCHAR b
c180: 75 66 66 65 72 5b 4d 41 58 5f 50 41 54 48 5d 3b uffer[MAX_PATH];
c190: 0a 20 20 20 20 63 68 61 72 20 2a 70 3b 0a 20 20 . char *p;.
c1a0: 20 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 3b WCHAR *native;
c1b0: 0a 0a 20 20 20 20 69 66 20 28 47 65 74 43 75 72 .. if (GetCur
c1c0: 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28 4d rentDirectoryW(M
c1d0: 41 58 5f 50 41 54 48 2c 20 62 75 66 66 65 72 29 AX_PATH, buffer)
c1e0: 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 57 69 6e == 0) {..TclWin
c1f0: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 ConvertError(Get
c200: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 69 LastError());..i
c210: 66 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c f (interp != NUL
c220: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 L) {.. Tcl_Se
c230: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
c240: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
c250: 28 0a 09 09 20 20 20 20 22 65 72 72 6f 72 20 67 (... "error g
c260: 65 74 74 69 6e 67 20 77 6f 72 6b 69 6e 67 20 64 etting working d
c270: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 3a 20 25 irectory name: %
c280: 73 22 2c 0a 09 09 20 20 20 20 54 63 6c 5f 50 6f s",... Tcl_Po
c290: 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 sixError(interp)
c2a0: 29 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 4e ));..}..return N
c2b0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
c2c0: 2f 2a 0a 20 20 20 20 20 2a 20 57 61 74 63 68 20 /*. * Watch
c2d0: 66 6f 72 20 74 68 65 20 77 65 69 72 64 20 57 69 for the weird Wi
c2e0: 6e 64 6f 77 73 20 63 3a 5c 5c 55 4e 43 20 73 79 ndows c:\\UNC sy
c2f0: 6e 74 61 78 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 ntax.. */..
c300: 20 20 20 6e 61 74 69 76 65 20 3d 20 28 57 43 48 native = (WCH
c310: 41 52 20 2a 29 20 62 75 66 66 65 72 3b 0a 20 20 AR *) buffer;.
c320: 20 20 69 66 20 28 28 6e 61 74 69 76 65 5b 30 5d if ((native[0]
c330: 20 21 3d 20 27 5c 30 27 29 20 26 26 20 28 6e 61 != '\0') && (na
c340: 74 69 76 65 5b 31 5d 20 3d 3d 20 27 3a 27 29 0a tive[1] == ':').
c350: 09 20 20 20 20 26 26 20 28 6e 61 74 69 76 65 5b . && (native[
c360: 32 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 26 20 28 2] == '\\') && (
c370: 6e 61 74 69 76 65 5b 33 5d 20 3d 3d 20 27 5c 5c native[3] == '\\
c380: 27 29 29 20 7b 0a 09 6e 61 74 69 76 65 20 2b 3d ')) {..native +=
c390: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 2;. }. Tc
c3a0: 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 l_WinTCharToUtf(
c3b0: 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 (TCHAR *) native
c3c0: 2c 20 2d 31 2c 20 62 75 66 66 65 72 50 74 72 29 , -1, bufferPtr)
c3d0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
c3e0: 20 43 6f 6e 76 65 72 74 20 74 6f 20 66 6f 72 77 Convert to forw
c3f0: 61 72 64 20 73 6c 61 73 68 65 73 20 66 6f 72 20 ard slashes for
c400: 65 61 73 69 65 72 20 75 73 65 20 69 6e 20 73 63 easier use in sc
c410: 72 69 70 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a ripts.. */..
c420: 20 20 20 20 66 6f 72 20 28 70 20 3d 20 54 63 6c for (p = Tcl
c430: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 62 75 _DStringValue(bu
c440: 66 66 65 72 50 74 72 29 3b 20 2a 70 20 21 3d 20 fferPtr); *p !=
c450: 27 5c 30 27 3b 20 70 2b 2b 29 20 7b 0a 09 69 66 '\0'; p++) {..if
c460: 20 28 2a 70 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a (*p == '\\') {.
c470: 09 20 20 20 20 2a 70 20 3d 20 27 2f 27 3b 0a 09 . *p = '/';..
c480: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 }. }. retu
c490: 72 6e 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 rn Tcl_DStringVa
c4a0: 6c 75 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a lue(bufferPtr);.
c4b0: 7d 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 53 }...int.TclpObjS
c4c0: 74 61 74 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a tat(. Tcl_Obj
c4d0: 20 2a 70 61 74 68 50 74 72 2c 09 09 2f 2a 20 50 *pathPtr,../* P
c4e0: 61 74 68 20 6f 66 20 66 69 6c 65 20 74 6f 20 73 ath of file to s
c4f0: 74 61 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f tat. */. Tcl_
c500: 53 74 61 74 42 75 66 20 2a 73 74 61 74 50 74 72 StatBuf *statPtr
c510: 29 09 2f 2a 20 46 69 6c 6c 65 64 20 77 69 74 68 )./* Filled with
c520: 20 72 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 results of stat
c530: 20 63 61 6c 6c 2e 20 2a 2f 0a 7b 0a 20 20 20 20 call. */.{.
c540: 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 65 /*. * Ensure
c550: 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 73 69 correct file si
c560: 7a 65 73 20 62 79 20 66 6f 72 63 69 6e 67 20 74 zes by forcing t
c570: 68 65 20 4f 53 20 74 6f 20 77 72 69 74 65 20 61 he OS to write a
c580: 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 0a ny pending data.
c590: 20 20 20 20 20 2a 20 74 6f 20 64 69 73 6b 2e 20 * to disk.
c5a0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 6f 6e 6c This is done onl
c5b0: 79 20 66 6f 72 20 63 68 61 6e 6e 65 6c 73 20 77 y for channels w
c5c0: 68 69 63 68 20 61 72 65 20 64 69 72 74 79 2c 20 hich are dirty,
c5d0: 69 2e 65 2e 20 68 61 76 65 20 62 65 65 6e 0a 20 i.e. have been.
c5e0: 20 20 20 20 2a 20 77 72 69 74 74 65 6e 20 74 6f * written to
c5f0: 20 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 since the last
c600: 66 6c 75 73 68 20 68 65 72 65 2e 0a 20 20 20 20 flush here..
c610: 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 57 69 6e 46 */.. TclWinF
c620: 6c 75 73 68 44 69 72 74 79 43 68 61 6e 6e 65 6c lushDirtyChannel
c630: 73 28 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e s();.. return
c640: 20 4e 61 74 69 76 65 53 74 61 74 28 28 63 6f 6e NativeStat((con
c650: 73 74 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 st WCHAR *)Tcl_F
c660: 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 SGetNativePath(p
c670: 61 74 68 50 74 72 29 2c 20 73 74 61 74 50 74 72 athPtr), statPtr
c680: 2c 20 30 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d , 0);.}.../*. *-
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 -----. *. * Nati
c6e0: 76 65 53 74 61 74 20 2d 2d 0a 20 2a 0a 20 2a 09 veStat --. *. *.
c6f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 This function re
c700: 70 6c 61 63 65 73 20 74 68 65 20 6c 69 62 72 61 places the libra
c710: 72 79 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 ry version of st
c720: 61 74 28 29 2c 20 66 69 78 69 6e 67 20 74 68 65 at(), fixing the
c730: 0a 20 2a 09 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 . *.following bu
c740: 67 73 3a 0a 20 2a 0a 20 2a 09 31 2e 20 73 74 61 gs:. *. *.1. sta
c750: 74 28 22 63 3a 22 29 20 72 65 74 75 72 6e 73 20 t("c:") returns
c760: 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 32 2e 20 an error.. *.2.
c770: 42 6f 72 6c 61 6e 64 20 73 74 61 74 28 29 20 72 Borland stat() r
c780: 65 74 75 72 6e 20 74 69 6d 65 20 69 6e 20 47 4d eturn time in GM
c790: 54 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 6f 63 T instead of loc
c7a0: 61 6c 74 69 6d 65 2e 0a 20 2a 09 33 2e 20 73 74 altime.. *.3. st
c7b0: 61 74 28 22 5c 5c 73 65 72 76 65 72 5c 6d 6f 75 at("\\server\mou
c7c0: 6e 74 22 29 20 77 6f 75 6c 64 20 72 65 74 75 72 nt") would retur
c7d0: 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 34 2e 20 41 n error.. *.4. A
c7e0: 63 63 65 70 74 73 20 73 6c 61 73 68 65 73 20 6f ccepts slashes o
c7f0: 72 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0a 20 r backslashes..
c800: 2a 09 35 2e 20 73 74 5f 64 65 76 20 61 6e 64 20 *.5. st_dev and
c810: 73 74 5f 72 64 65 76 20 77 65 72 65 20 77 72 6f st_rdev were wro
c820: 6e 67 20 66 6f 72 20 55 4e 43 20 70 61 74 68 73 ng for UNC paths
c830: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
c840: 0a 20 2a 09 53 65 65 20 73 74 61 74 20 64 6f 63 . *.See stat doc
c850: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 umentation.. *.
c860: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
c870: 20 2a 09 53 65 65 20 73 74 61 74 20 64 6f 63 75 *.See stat docu
c880: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a mentation.. *. *
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c8d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
c8e0: 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 53 74 61 ic int.NativeSta
c8f0: 74 28 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 48 t(. const WCH
c900: 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 2c 09 AR *nativePath,.
c910: 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 /* Path of file
c920: 74 6f 20 73 74 61 74 20 2a 2f 0a 20 20 20 20 54 to stat */. T
c930: 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 cl_StatBuf *stat
c940: 50 74 72 2c 09 2f 2a 20 46 69 6c 6c 65 64 20 77 Ptr,./* Filled w
c950: 69 74 68 20 72 65 73 75 6c 74 73 20 6f 66 20 73 ith results of s
c960: 74 61 74 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 20 tat call. */.
c970: 20 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 29 int checkLinks)
c980: 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f ../* If non-zero
c990: 2c 20 62 65 68 61 76 65 20 6c 69 6b 65 20 27 6c , behave like 'l
c9a0: 73 74 61 74 27 20 2a 2f 0a 7b 0a 20 20 20 20 44 stat' */.{. D
c9b0: 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 20 20 69 WORD attr;. i
c9c0: 6e 74 20 64 65 76 2c 20 6e 6c 69 6e 6b 20 3d 20 nt dev, nlink =
c9d0: 31 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 1;. unsigned
c9e0: 73 68 6f 72 74 20 6d 6f 64 65 3b 0a 20 20 20 20 short mode;.
c9f0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6f unsigned int ino
ca00: 64 65 20 3d 20 30 3b 0a 20 20 20 20 48 41 4e 44 de = 0;. HAND
ca10: 4c 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b 0a 20 LE fileHandle;.
ca20: 20 20 20 44 57 4f 52 44 20 66 69 6c 65 54 79 70 DWORD fileTyp
ca30: 65 20 3d 20 46 49 4c 45 5f 54 59 50 45 5f 55 4e e = FILE_TYPE_UN
ca40: 4b 4e 4f 57 4e 3b 0a 0a 20 20 20 20 2f 2a 0a 20 KNOWN;.. /*.
ca50: 20 20 20 20 2a 20 49 66 20 77 65 20 63 61 6e 20 * If we can
ca60: 75 73 65 20 27 63 72 65 61 74 65 46 69 6c 65 27 use 'createFile'
ca70: 20 6f 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 77 on this, then w
ca80: 65 20 63 61 6e 20 75 73 65 20 74 68 65 20 72 65 e can use the re
ca90: 73 75 6c 74 69 6e 67 0a 20 20 20 20 20 2a 20 66 sulting. * f
caa0: 69 6c 65 48 61 6e 64 6c 65 20 74 6f 20 72 65 61 ileHandle to rea
cab0: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 d more informati
cac0: 6f 6e 20 28 6e 6c 69 6e 6b 2c 20 69 6e 6f 29 20 on (nlink, ino)
cad0: 74 68 61 6e 20 77 65 20 63 61 6e 20 67 65 74 20 than we can get
cae0: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 6f 74 68 65 from. * othe
caf0: 72 20 61 74 74 72 69 62 75 74 65 73 20 72 65 61 r attributes rea
cb00: 64 69 6e 67 20 41 50 49 73 2e 20 49 66 20 6e 6f ding APIs. If no
cb10: 74 2c 20 74 68 65 6e 20 77 65 20 74 72 79 20 74 t, then we try t
cb20: 6f 20 66 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 74 o fall back on t
cb30: 68 65 0a 20 20 20 20 20 2a 20 27 67 65 74 46 69 he. * 'getFi
cb40: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 50 72 leAttributesExPr
cb50: 6f 63 27 2c 20 61 6e 64 20 69 66 20 74 68 61 74 oc', and if that
cb60: 20 69 73 6e 27 74 20 61 76 61 69 6c 61 62 6c 65 isn't available
cb70: 2c 20 74 68 65 6e 20 6f 6e 20 65 76 65 6e 0a 20 , then on even.
cb80: 20 20 20 20 2a 20 73 69 6d 70 6c 65 72 20 72 6f * simpler ro
cb90: 75 74 69 6e 65 73 2e 0a 20 20 20 20 20 2a 0a 20 utines.. *.
cba0: 20 20 20 20 2a 20 53 70 65 63 69 61 6c 20 63 6f * Special co
cbb0: 6e 73 69 64 65 72 61 74 69 6f 6e 20 6d 75 73 74 nsideration must
cbc0: 20 62 65 20 67 69 76 65 6e 20 74 6f 20 57 69 6e be given to Win
cbd0: 64 6f 77 73 20 68 61 72 64 2d 63 6f 64 65 64 20 dows hard-coded
cbe0: 6e 61 6d 65 73 20 6c 69 6b 65 0a 20 20 20 20 20 names like.
cbf0: 2a 20 43 4f 4e 2c 20 4e 55 4c 4c 2c 20 43 4f 4d * CON, NULL, COM
cc00: 31 2c 20 4c 50 54 31 20 65 74 63 2e 20 46 6f 72 1, LPT1 etc. For
cc10: 20 74 68 65 73 65 2c 20 77 65 20 73 74 69 6c 6c these, we still
cc20: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 65 0a need to do the.
cc30: 20 20 20 20 20 2a 20 43 72 65 61 74 65 46 69 6c * CreateFil
cc40: 65 20 61 73 20 73 6f 6d 65 20 6d 61 79 20 6e 6f e as some may no
cc50: 74 20 65 78 69 73 74 20 28 65 2e 67 2e 20 74 68 t exist (e.g. th
cc60: 65 72 65 20 69 73 20 6e 6f 20 43 4f 4e 20 69 6e ere is no CON in
cc70: 20 77 69 73 68 20 62 79 0a 20 20 20 20 20 2a 20 wish by. *
cc80: 64 65 66 61 75 6c 74 29 2e 20 48 6f 77 65 76 65 default). Howeve
cc90: 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 r the subsequent
cca0: 20 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 GetFileInformat
ccb0: 69 6f 6e 42 79 48 61 6e 64 6c 65 20 77 69 6c 6c ionByHandle will
ccc0: 0a 20 20 20 20 20 2a 20 66 61 69 6c 2e 20 57 65 . * fail. We
ccd0: 20 64 6f 20 61 20 57 69 6e 49 73 52 65 73 65 72 do a WinIsReser
cce0: 76 65 64 20 74 6f 20 73 65 65 20 69 66 20 69 74 ved to see if it
ccf0: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 is one of the s
cd00: 70 65 63 69 61 6c 20 6e 61 6d 65 73 2c 0a 20 20 pecial names,.
cd10: 20 20 20 2a 20 61 6e 64 20 69 66 20 73 75 63 63 * and if succ
cd20: 65 73 73 66 75 6c 2c 20 6d 6f 63 6b 20 75 70 20 essful, mock up
cd30: 61 20 42 59 5f 48 41 4e 44 4c 45 5f 46 49 4c 45 a BY_HANDLE_FILE
cd40: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 73 74 72 _INFORMATION str
cd50: 75 63 74 75 72 65 2e 0a 20 20 20 20 20 2a 2f 0a ucture.. */.
cd60: 0a 20 20 20 20 66 69 6c 65 48 61 6e 64 6c 65 20 . fileHandle
cd70: 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 6e 61 = CreateFileW(na
cd80: 74 69 76 65 50 61 74 68 2c 20 47 45 4e 45 52 49 tivePath, GENERI
cd90: 43 5f 52 45 41 44 2c 0a 09 20 20 20 20 46 49 4c C_READ,.. FIL
cda0: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 E_SHARE_READ | F
cdb0: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 20 ILE_SHARE_WRITE
cdc0: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 44 45 4c | FILE_SHARE_DEL
cdd0: 45 54 45 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 ETE,.. NULL,
cde0: 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 OPEN_EXISTING,..
cdf0: 20 20 20 20 46 49 4c 45 5f 46 4c 41 47 5f 42 41 FILE_FLAG_BA
ce00: 43 4b 55 50 5f 53 45 4d 41 4e 54 49 43 53 20 7c CKUP_SEMANTICS |
ce10: 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f FILE_FLAG_OPEN_
ce20: 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 2c 20 4e REPARSE_POINT, N
ce30: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 66 ULL);.. if (f
ce40: 69 6c 65 48 61 6e 64 6c 65 20 21 3d 20 49 4e 56 ileHandle != INV
ce50: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
ce60: 45 29 20 7b 0a 09 42 59 5f 48 41 4e 44 4c 45 5f E) {..BY_HANDLE_
ce70: 46 49 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e FILE_INFORMATION
ce80: 20 64 61 74 61 3b 0a 0a 09 69 66 20 28 47 65 74 data;...if (Get
ce90: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 FileInformationB
cea0: 79 48 61 6e 64 6c 65 28 66 69 6c 65 48 61 6e 64 yHandle(fileHand
ceb0: 6c 65 2c 26 64 61 74 61 29 20 21 3d 20 54 52 55 le,&data) != TRU
cec0: 45 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 E) {.
ced0: 20 66 69 6c 65 54 79 70 65 20 3d 20 47 65 74 46 fileType = GetF
cee0: 69 6c 65 54 79 70 65 28 66 69 6c 65 48 61 6e 64 ileType(fileHand
cef0: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 le);.
cf00: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 66 69 6c CloseHandle(fil
cf10: 65 48 61 6e 64 6c 65 29 3b 0a 20 20 20 20 20 20 eHandle);.
cf20: 20 20 20 20 20 20 69 66 20 28 66 69 6c 65 54 79 if (fileTy
cf30: 70 65 20 21 3d 20 46 49 4c 45 5f 54 59 50 45 5f pe != FILE_TYPE_
cf40: 43 48 41 52 20 26 26 20 66 69 6c 65 54 79 70 65 CHAR && fileType
cf50: 20 21 3d 20 46 49 4c 45 5f 54 59 50 45 5f 44 49 != FILE_TYPE_DI
cf60: 53 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 SK) {.
cf70: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 Tcl_SetErr
cf80: 6e 6f 28 45 4e 4f 45 4e 54 29 3b 0a 20 20 20 20 no(ENOENT);.
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
cfa0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 rn -1;.
cfb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 }..
cfc0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 6f 63 /*.. * Moc
cfd0: 6b 20 75 70 20 74 68 65 20 65 78 70 65 63 74 65 k up the expecte
cfe0: 64 20 73 74 72 75 63 74 75 72 65 0a 09 20 20 20 d structure..
cff0: 20 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 */..
d000: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 2c 20 memset(&data,
d010: 30 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 0, sizeof(data))
d020: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 ;. st
d030: 61 74 50 74 72 2d 3e 73 74 5f 61 74 69 6d 65 20 atPtr->st_atime
d040: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 = 0;.
d050: 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 6d 74 69 statPtr->st_mti
d060: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 me = 0;.
d070: 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f statPtr->st_
d080: 63 74 69 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 ctime = 0;.
d090: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 } else {.
d0a0: 20 20 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e CloseHan
d0b0: 64 6c 65 28 66 69 6c 65 48 61 6e 64 6c 65 29 3b dle(fileHandle);
d0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 . sta
d0d0: 74 50 74 72 2d 3e 73 74 5f 61 74 69 6d 65 20 3d tPtr->st_atime =
d0e0: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 ToCTime(data.ft
d0f0: 4c 61 73 74 41 63 63 65 73 73 54 69 6d 65 29 3b LastAccessTime);
d100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 . sta
d110: 74 50 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d tPtr->st_mtime =
d120: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 ToCTime(data.ft
d130: 4c 61 73 74 57 72 69 74 65 54 69 6d 65 29 3b 0a LastWriteTime);.
d140: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 stat
d150: 50 74 72 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20 Ptr->st_ctime =
d160: 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 43 ToCTime(data.ftC
d170: 72 65 61 74 69 6f 6e 54 69 6d 65 29 3b 0a 20 20 reationTime);.
d180: 20 20 20 20 20 20 7d 0a 09 61 74 74 72 20 3d 20 }..attr =
d190: 64 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 data.dwFileAttri
d1a0: 62 75 74 65 73 3b 0a 09 73 74 61 74 50 74 72 2d butes;..statPtr-
d1b0: 3e 73 74 5f 73 69 7a 65 20 3d 20 28 28 54 63 6c >st_size = ((Tcl
d1c0: 5f 57 69 64 65 49 6e 74 29 20 64 61 74 61 2e 6e _WideInt) data.n
d1d0: 46 69 6c 65 53 69 7a 65 4c 6f 77 29 20 7c 0a 09 FileSizeLow) |..
d1e0: 09 28 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 .(((Tcl_WideInt)
d1f0: 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 data.nFileSizeH
d200: 69 67 68 29 20 3c 3c 20 33 32 29 3b 0a 0a 09 2f igh) << 32);.../
d210: 2a 0a 09 20 2a 20 4f 6e 20 55 6e 69 78 2c 20 66 *.. * On Unix, f
d220: 6f 72 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 or directories,
d230: 6e 6c 69 6e 6b 20 61 70 70 61 72 65 6e 74 6c 79 nlink apparently
d240: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 depends on the
d250: 6e 75 6d 62 65 72 20 6f 66 0a 09 20 2a 20 66 69 number of.. * fi
d260: 6c 65 73 20 69 6e 20 74 68 65 20 64 69 72 65 63 les in the direc
d270: 74 6f 72 79 2e 20 20 57 65 20 63 6f 75 6c 64 20 tory. We could
d280: 63 61 6c 63 75 6c 61 74 65 20 74 68 61 74 2c 20 calculate that,
d290: 62 75 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 but it would be
d2a0: 61 0a 09 20 2a 20 62 69 74 20 6f 66 20 61 20 70 a.. * bit of a p
d2b0: 65 72 66 6f 72 6d 61 6e 63 65 20 70 65 6e 61 6c erformance penal
d2c0: 74 79 2c 20 49 20 74 68 69 6e 6b 2e 20 48 65 6e ty, I think. Hen
d2d0: 63 65 20 77 65 20 6a 75 73 74 20 75 73 65 20 77 ce we just use w
d2e0: 68 61 74 0a 09 20 2a 20 57 69 6e 64 6f 77 73 20 hat.. * Windows
d2f0: 67 69 76 65 73 20 75 73 2c 20 77 68 69 63 68 20 gives us, which
d300: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 55 is the same as U
d310: 6e 69 78 20 66 6f 72 20 66 69 6c 65 73 2c 20 61 nix for files, a
d320: 74 20 6c 65 61 73 74 2e 0a 09 20 2a 2f 0a 0a 09 t least... */...
d330: 6e 6c 69 6e 6b 20 3d 20 64 61 74 61 2e 6e 4e 75 nlink = data.nNu
d340: 6d 62 65 72 4f 66 4c 69 6e 6b 73 3b 0a 0a 09 2f mberOfLinks;.../
d350: 2a 0a 09 20 2a 20 55 6e 66 6f 72 74 75 6e 61 74 *.. * Unfortunat
d360: 65 6c 79 20 6f 75 72 20 73 74 61 74 20 64 65 66 ely our stat def
d370: 69 6e 69 74 69 6f 6e 27 73 20 69 6e 6f 64 65 20 inition's inode
d380: 66 69 65 6c 64 20 28 75 6e 73 69 67 6e 65 64 20 field (unsigned
d390: 73 68 6f 72 74 29 0a 09 20 2a 20 77 69 6c 6c 20 short).. * will
d3a0: 74 68 72 6f 77 20 61 77 61 79 20 6d 6f 73 74 20 throw away most
d3b0: 6f 66 20 74 68 65 20 70 72 65 63 69 73 69 6f 6e of the precision
d3c0: 20 77 65 20 68 61 76 65 20 68 65 72 65 2c 20 77 we have here, w
d3d0: 68 69 63 68 20 6d 65 61 6e 73 20 77 65 0a 09 20 hich means we..
d3e0: 2a 20 63 61 6e 27 74 20 72 65 6c 79 20 6f 6e 20 * can't rely on
d3f0: 69 6e 6f 64 65 20 61 73 20 61 20 75 6e 69 71 75 inode as a uniqu
d400: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 e identifier of
d410: 61 20 66 69 6c 65 2e 20 57 65 27 64 20 72 65 61 a file. We'd rea
d420: 6c 6c 79 0a 09 20 2a 20 6c 69 6b 65 20 74 6f 20 lly.. * like to
d430: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b do something lik
d440: 65 20 68 6f 77 20 77 65 20 68 61 6e 64 6c 65 20 e how we handle
d450: 27 73 74 5f 73 69 7a 65 27 2e 0a 09 20 2a 2f 0a 'st_size'... */.
d460: 0a 09 69 6e 6f 64 65 20 3d 20 64 61 74 61 2e 6e ..inode = data.n
d470: 46 69 6c 65 49 6e 64 65 78 48 69 67 68 20 7c 20 FileIndexHigh |
d480: 64 61 74 61 2e 6e 46 69 6c 65 49 6e 64 65 78 4c data.nFileIndexL
d490: 6f 77 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ow;. } else {
d4a0: 0a 09 2f 2a 0a 09 20 2a 20 46 61 6c 6c 20 62 61 ../*.. * Fall ba
d4b0: 63 6b 20 6f 6e 20 74 68 65 20 6c 65 73 73 20 63 ck on the less c
d4c0: 61 70 61 62 6c 65 20 72 6f 75 74 69 6e 65 73 2e apable routines.
d4d0: 20 54 68 69 73 20 6d 65 61 6e 73 20 6e 6f 20 6e This means no n
d4e0: 6c 69 6e 6b 20 6f 72 20 69 6e 6f 2e 0a 09 20 2a link or ino... *
d4f0: 2f 0a 0a 09 57 49 4e 33 32 5f 46 49 4c 45 5f 41 /...WIN32_FILE_A
d500: 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 64 61 TTRIBUTE_DATA da
d510: 74 61 3b 0a 0a 09 69 66 20 28 47 65 74 46 69 6c ta;...if (GetFil
d520: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 6e eAttributesExW(n
d530: 61 74 69 76 65 50 61 74 68 2c 0a 09 09 47 65 74 ativePath,...Get
d540: 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 FileExInfoStanda
d550: 72 64 2c 20 26 64 61 74 61 29 20 21 3d 20 54 52 rd, &data) != TR
d560: 55 45 29 20 7b 0a 09 20 20 20 20 48 41 4e 44 4c UE) {.. HANDL
d570: 45 20 68 46 69 6e 64 3b 0a 09 20 20 20 20 57 49 E hFind;.. WI
d580: 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 N32_FIND_DATAW f
d590: 66 64 3b 0a 09 20 20 20 20 44 57 4f 52 44 20 6c fd;.. DWORD l
d5a0: 61 73 74 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 asterror = GetLa
d5b0: 73 74 45 72 72 6f 72 28 29 3b 0a 0a 09 20 20 20 stError();...
d5c0: 20 69 66 20 28 6c 61 73 74 65 72 72 6f 72 20 21 if (lasterror !
d5d0: 3d 20 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f = ERROR_SHARING_
d5e0: 56 49 4f 4c 41 54 49 4f 4e 29 20 7b 0a 09 09 54 VIOLATION) {...T
d5f0: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
d600: 72 28 6c 61 73 74 65 72 72 6f 72 29 3b 0a 09 09 r(lasterror);...
d610: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 09 7d 0a 09 return -1;...}..
d620: 20 20 20 20 68 46 69 6e 64 20 3d 20 46 69 6e 64 hFind = Find
d630: 46 69 72 73 74 46 69 6c 65 57 28 6e 61 74 69 76 FirstFileW(nativ
d640: 65 50 61 74 68 2c 20 26 66 66 64 29 3b 0a 09 20 ePath, &ffd);..
d650: 20 20 20 69 66 20 28 68 46 69 6e 64 20 3d 3d 20 if (hFind ==
d660: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
d670: 41 4c 55 45 29 20 7b 0a 09 09 54 63 6c 57 69 6e ALUE) {...TclWin
d680: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 ConvertError(Get
d690: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 09 LastError());...
d6a0: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 return -1;..
d6b0: 7d 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 26 64 }.. memcpy(&d
d6c0: 61 74 61 2c 20 26 66 66 64 2c 20 73 69 7a 65 6f ata, &ffd, sizeo
d6d0: 66 28 64 61 74 61 29 29 3b 0a 09 20 20 20 20 46 f(data));.. F
d6e0: 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 29 3b indClose(hFind);
d6f0: 0a 09 7d 0a 0a 09 61 74 74 72 20 3d 20 64 61 74 ..}...attr = dat
d700: 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 a.dwFileAttribut
d710: 65 73 3b 0a 0a 09 73 74 61 74 50 74 72 2d 3e 73 es;...statPtr->s
d720: 74 5f 73 69 7a 65 20 3d 20 28 28 54 63 6c 5f 57 t_size = ((Tcl_W
d730: 69 64 65 49 6e 74 29 20 64 61 74 61 2e 6e 46 69 ideInt) data.nFi
d740: 6c 65 53 69 7a 65 4c 6f 77 29 20 7c 0a 09 09 28 leSizeLow) |...(
d750: 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 64 ((Tcl_WideInt) d
d760: 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 ata.nFileSizeHig
d770: 68 29 20 3c 3c 20 33 32 29 3b 0a 09 73 74 61 74 h) << 32);..stat
d780: 50 74 72 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20 Ptr->st_atime =
d790: 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 4c ToCTime(data.ftL
d7a0: 61 73 74 41 63 63 65 73 73 54 69 6d 65 29 3b 0a astAccessTime);.
d7b0: 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 6d 74 69 .statPtr->st_mti
d7c0: 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 me = ToCTime(dat
d7d0: 61 2e 66 74 4c 61 73 74 57 72 69 74 65 54 69 6d a.ftLastWriteTim
d7e0: 65 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 e);..statPtr->st
d7f0: 5f 63 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d 65 _ctime = ToCTime
d800: 28 64 61 74 61 2e 66 74 43 72 65 61 74 69 6f 6e (data.ftCreation
d810: 54 69 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 Time);. }..
d820: 20 20 64 65 76 20 3d 20 4e 61 74 69 76 65 44 65 dev = NativeDe
d830: 76 28 6e 61 74 69 76 65 50 61 74 68 29 3b 0a 20 v(nativePath);.
d840: 20 20 20 6d 6f 64 65 20 3d 20 4e 61 74 69 76 65 mode = Native
d850: 53 74 61 74 4d 6f 64 65 28 61 74 74 72 2c 20 63 StatMode(attr, c
d860: 68 65 63 6b 4c 69 6e 6b 73 2c 20 4e 61 74 69 76 heckLinks, Nativ
d870: 65 49 73 45 78 65 63 28 6e 61 74 69 76 65 50 61 eIsExec(nativePa
d880: 74 68 29 29 3b 0a 20 20 20 20 69 66 20 28 66 69 th));. if (fi
d890: 6c 65 54 79 70 65 20 3d 3d 20 46 49 4c 45 5f 54 leType == FILE_T
d8a0: 59 50 45 5f 43 48 41 52 29 20 7b 0a 20 20 20 20 YPE_CHAR) {.
d8b0: 20 20 20 20 6d 6f 64 65 20 26 3d 20 7e 53 5f 49 mode &= ~S_I
d8c0: 46 4d 54 3b 0a 20 20 20 20 20 20 20 20 6d 6f 64 FMT;. mod
d8d0: 65 20 7c 3d 20 53 5f 49 46 43 48 52 3b 0a 20 20 e |= S_IFCHR;.
d8e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 66 69 6c } else if (fil
d8f0: 65 54 79 70 65 20 3d 3d 20 46 49 4c 45 5f 54 59 eType == FILE_TY
d900: 50 45 5f 44 49 53 4b 29 20 7b 0a 20 20 20 20 20 PE_DISK) {.
d910: 20 20 20 6d 6f 64 65 20 26 3d 20 7e 53 5f 49 46 mode &= ~S_IF
d920: 4d 54 3b 0a 20 20 20 20 20 20 20 20 6d 6f 64 65 MT;. mode
d930: 20 7c 3d 20 53 5f 49 46 42 4c 4b 3b 0a 20 20 20 |= S_IFBLK;.
d940: 20 7d 0a 0a 20 20 20 20 73 74 61 74 50 74 72 2d }.. statPtr-
d950: 3e 73 74 5f 64 65 76 09 3d 20 28 64 65 76 5f 74 >st_dev.= (dev_t
d960: 29 20 64 65 76 3b 0a 20 20 20 20 73 74 61 74 50 ) dev;. statP
d970: 74 72 2d 3e 73 74 5f 69 6e 6f 09 3d 20 69 6e 6f tr->st_ino.= ino
d980: 64 65 3b 0a 20 20 20 20 73 74 61 74 50 74 72 2d de;. statPtr-
d990: 3e 73 74 5f 6d 6f 64 65 09 3d 20 6d 6f 64 65 3b >st_mode.= mode;
d9a0: 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 . statPtr->st
d9b0: 5f 6e 6c 69 6e 6b 09 3d 20 6e 6c 69 6e 6b 3b 0a _nlink.= nlink;.
d9c0: 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f statPtr->st_
d9d0: 75 69 64 09 3d 20 30 3b 0a 20 20 20 20 73 74 61 uid.= 0;. sta
d9e0: 74 50 74 72 2d 3e 73 74 5f 67 69 64 09 3d 20 30 tPtr->st_gid.= 0
d9f0: 3b 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 ;. statPtr->s
da00: 74 5f 72 64 65 76 09 3d 20 28 64 65 76 5f 74 29 t_rdev.= (dev_t)
da10: 20 64 65 76 3b 0a 20 20 20 20 72 65 74 75 72 6e dev;. return
da20: 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 0;.}.../*. *---
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 ---. *. * Native
da80: 44 65 76 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c Dev --. *. *.Cal
da90: 63 75 6c 61 74 65 20 6a 75 73 74 20 74 68 65 20 culate just the
daa0: 27 73 74 5f 64 65 76 27 20 66 69 65 6c 64 20 6f 'st_dev' field o
dab0: 66 20 61 20 27 73 74 61 74 27 20 73 74 72 75 63 f a 'stat' struc
dac0: 74 75 72 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d ture.. *. *-----
dad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
daf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db10: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
db20: 74 0a 4e 61 74 69 76 65 44 65 76 28 0a 20 20 20 t.NativeDev(.
db30: 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 const WCHAR *na
db40: 74 69 76 65 50 61 74 68 29 09 2f 2a 20 46 75 6c tivePath)./* Ful
db50: 6c 20 70 61 74 68 20 6f 66 20 66 69 6c 65 20 74 l path of file t
db60: 6f 20 73 74 61 74 20 2a 2f 0a 7b 0a 20 20 20 20 o stat */.{.
db70: 69 6e 74 20 64 65 76 3b 0a 20 20 20 20 54 63 6c int dev;. Tcl
db80: 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 _DString ds;.
db90: 20 57 43 48 41 52 20 6e 61 74 69 76 65 46 75 6c WCHAR nativeFul
dba0: 6c 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b lPath[MAX_PATH];
dbb0: 0a 20 20 20 20 57 43 48 41 52 20 2a 6e 61 74 69 . WCHAR *nati
dbc0: 76 65 50 61 72 74 3b 0a 20 20 20 20 63 6f 6e 73 vePart;. cons
dbd0: 74 20 63 68 61 72 20 2a 66 75 6c 6c 50 61 74 68 t char *fullPath
dbe0: 3b 0a 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 ;.. GetFullPa
dbf0: 74 68 4e 61 6d 65 57 28 6e 61 74 69 76 65 50 61 thNameW(nativePa
dc00: 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c 20 6e 61 th, MAX_PATH, na
dc10: 74 69 76 65 46 75 6c 6c 50 61 74 68 2c 20 26 6e tiveFullPath, &n
dc20: 61 74 69 76 65 50 61 72 74 29 3b 0a 20 20 20 20 ativePart);.
dc30: 66 75 6c 6c 50 61 74 68 20 3d 20 54 63 6c 5f 57 fullPath = Tcl_W
dc40: 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 54 43 inTCharToUtf((TC
dc50: 48 41 52 20 2a 29 6e 61 74 69 76 65 46 75 6c 6c HAR *)nativeFull
dc60: 50 61 74 68 2c 20 2d 31 2c 20 26 64 73 29 3b 0a Path, -1, &ds);.
dc70: 0a 20 20 20 20 69 66 20 28 28 66 75 6c 6c 50 61 . if ((fullPa
dc80: 74 68 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 th[0] == '\\') &
dc90: 26 20 28 66 75 6c 6c 50 61 74 68 5b 31 5d 20 3d & (fullPath[1] =
dca0: 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 63 6f 6e 73 = '\\')) {..cons
dcb0: 74 20 63 68 61 72 20 2a 70 3b 0a 09 44 57 4f 52 t char *p;..DWOR
dcc0: 44 20 64 77 3b 0a 09 63 6f 6e 73 74 20 57 43 48 D dw;..const WCH
dcd0: 41 52 20 2a 6e 61 74 69 76 65 56 6f 6c 3b 0a 09 AR *nativeVol;..
dce0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 76 6f 6c 53 Tcl_DString volS
dcf0: 74 72 69 6e 67 3b 0a 0a 09 70 20 3d 20 73 74 72 tring;...p = str
dd00: 63 68 72 28 66 75 6c 6c 50 61 74 68 20 2b 20 32 chr(fullPath + 2
dd10: 2c 20 27 5c 5c 27 29 3b 0a 09 70 20 3d 20 73 74 , '\\');..p = st
dd20: 72 63 68 72 28 70 20 2b 20 31 2c 20 27 5c 5c 27 rchr(p + 1, '\\'
dd30: 29 3b 0a 09 69 66 20 28 70 20 3d 3d 20 4e 55 4c );..if (p == NUL
dd40: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 L) {.. /*..
dd50: 20 20 20 2a 20 41 64 64 20 74 65 72 6d 69 6e 61 * Add termina
dd60: 74 69 6e 67 20 62 61 63 6b 73 6c 61 73 68 20 74 ting backslash t
dd70: 6f 20 66 75 6c 6c 70 61 74 68 20 6f 72 20 47 65 o fullpath or Ge
dd80: 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 tVolumeInformati
dd90: 6f 6e 57 28 29 0a 09 20 20 20 20 20 2a 20 77 6f onW().. * wo
dda0: 6e 27 74 20 77 6f 72 6b 2e 0a 09 20 20 20 20 20 n't work...
ddb0: 2a 2f 0a 0a 09 20 20 20 20 66 75 6c 6c 50 61 74 */... fullPat
ddc0: 68 20 3d 20 54 63 6c 44 53 74 72 69 6e 67 41 70 h = TclDStringAp
ddd0: 70 65 6e 64 4c 69 74 65 72 61 6c 28 26 64 73 2c pendLiteral(&ds,
dde0: 20 22 5c 5c 22 29 3b 0a 09 20 20 20 20 70 20 3d "\\");.. p =
ddf0: 20 66 75 6c 6c 50 61 74 68 20 2b 20 54 63 6c 5f fullPath + Tcl_
de00: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 DStringLength(&d
de10: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 s);..} else {..
de20: 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09 6e 61 74 69 p++;..}..nati
de30: 76 65 56 6f 6c 20 3d 20 28 57 43 48 41 52 20 2a veVol = (WCHAR *
de40: 29 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54 43 68 )Tcl_WinUtfToTCh
de50: 61 72 28 66 75 6c 6c 50 61 74 68 2c 20 70 20 2d ar(fullPath, p -
de60: 20 66 75 6c 6c 50 61 74 68 2c 20 26 76 6f 6c 53 fullPath, &volS
de70: 74 72 69 6e 67 29 3b 0a 09 64 77 20 3d 20 28 44 tring);..dw = (D
de80: 57 4f 52 44 29 20 2d 31 3b 0a 09 47 65 74 56 6f WORD) -1;..GetVo
de90: 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 57 lumeInformationW
dea0: 28 6e 61 74 69 76 65 56 6f 6c 2c 20 4e 55 4c 4c (nativeVol, NULL
deb0: 2c 20 30 2c 20 26 64 77 2c 20 4e 55 4c 4c 2c 20 , 0, &dw, NULL,
dec0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a NULL, NULL, 0);.
ded0: 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 46 75 6c 6c ../*.. * GetFull
dee0: 50 61 74 68 4e 61 6d 65 57 28 29 20 74 75 72 6e PathNameW() turn
def0: 73 20 73 70 65 63 69 61 6c 20 64 65 76 69 63 65 s special device
df00: 73 20 6c 69 6b 65 20 22 4e 55 4c 22 20 69 6e 74 s like "NUL" int
df10: 6f 20 22 5c 5c 2e 5c 4e 55 4c 22 2c 0a 09 20 2a o "\\.\NUL",.. *
df20: 20 62 75 74 20 47 65 74 56 6f 6c 75 6d 65 49 6e but GetVolumeIn
df30: 66 6f 72 6d 61 74 69 6f 6e 57 28 29 20 72 65 74 formationW() ret
df40: 75 72 6e 73 20 66 61 69 6c 75 72 65 20 66 6f 72 urns failure for
df50: 20 22 5c 5c 2e 5c 4e 55 4c 22 2e 20 54 68 69 73 "\\.\NUL". This
df60: 20 77 69 6c 6c 0a 09 20 2a 20 63 61 75 73 65 20 will.. * cause
df70: 22 4e 55 4c 22 20 74 6f 20 67 65 74 20 61 20 64 "NUL" to get a d
df80: 72 69 76 65 20 6e 75 6d 62 65 72 20 6f 66 20 2d rive number of -
df90: 31 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 61 1, which makes a
dfa0: 62 6f 75 74 20 61 73 20 6d 75 63 68 0a 09 20 2a bout as much.. *
dfb0: 20 73 65 6e 73 65 20 61 73 20 61 6e 79 74 68 69 sense as anythi
dfc0: 6e 67 20 73 69 6e 63 65 20 74 68 65 20 73 70 65 ng since the spe
dfd0: 63 69 61 6c 20 64 65 76 69 63 65 73 20 64 6f 6e cial devices don
dfe0: 27 74 20 6c 69 76 65 20 6f 6e 20 61 6e 79 0a 09 't live on any..
dff0: 20 2a 20 64 72 69 76 65 2e 0a 09 20 2a 2f 0a 0a * drive... */..
e000: 09 64 65 76 20 3d 20 64 77 3b 0a 09 54 63 6c 5f .dev = dw;..Tcl_
e010: 44 53 74 72 69 6e 67 46 72 65 65 28 26 76 6f 6c DStringFree(&vol
e020: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 7d 20 65 String);. } e
e030: 6c 73 65 20 69 66 20 28 28 66 75 6c 6c 50 61 74 lse if ((fullPat
e040: 68 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 26 26 h[0] != '\0') &&
e050: 20 28 66 75 6c 6c 50 61 74 68 5b 31 5d 20 3d 3d (fullPath[1] ==
e060: 20 27 3a 27 29 29 20 7b 0a 09 64 65 76 20 3d 20 ':')) {..dev =
e070: 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f 77 Tcl_UniCharToLow
e080: 65 72 28 66 75 6c 6c 50 61 74 68 5b 30 5d 29 20 er(fullPath[0])
e090: 2d 20 27 61 27 3b 0a 20 20 20 20 7d 20 65 6c 73 - 'a';. } els
e0a0: 65 20 7b 0a 09 64 65 76 20 3d 20 2d 31 3b 0a 20 e {..dev = -1;.
e0b0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 }. Tcl_DSt
e0c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a ringFree(&ds);..
e0d0: 20 20 20 20 72 65 74 75 72 6e 20 64 65 76 3b 0a return dev;.
e0e0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
e0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
e130: 20 2a 0a 20 2a 20 4e 61 74 69 76 65 53 74 61 74 *. * NativeStat
e140: 4d 6f 64 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Mode --. *. *.Ca
e150: 6c 63 75 6c 61 74 65 20 6a 75 73 74 20 74 68 65 lculate just the
e160: 20 27 73 74 5f 6d 6f 64 65 27 20 66 69 65 6c 64 'st_mode' field
e170: 20 6f 66 20 61 20 27 73 74 61 74 27 20 73 74 72 of a 'stat' str
e180: 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 09 49 6e ucture.. *. *.In
e190: 20 6d 61 6e 79 20 70 6c 61 63 65 73 20 77 65 20 many places we
e1a0: 64 6f 6e 27 74 20 6e 65 65 64 20 74 68 65 20 66 don't need the f
e1b0: 75 6c 6c 20 73 74 61 74 20 73 74 72 75 63 74 75 ull stat structu
e1c0: 72 65 2c 20 61 6e 64 20 69 74 27 73 20 6d 75 63 re, and it's muc
e1d0: 68 0a 20 2a 09 66 61 73 74 65 72 20 6a 75 73 74 h. *.faster just
e1e0: 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 to calculate th
e1f0: 65 73 65 20 70 69 65 63 65 73 2c 20 69 66 20 74 ese pieces, if t
e200: 68 61 74 27 73 20 61 6c 6c 20 77 65 20 6e 65 65 hat's all we nee
e210: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
e220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
e260: 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 */..static unsig
e270: 6e 65 64 20 73 68 6f 72 74 0a 4e 61 74 69 76 65 ned short.Native
e280: 53 74 61 74 4d 6f 64 65 28 0a 20 20 20 20 44 57 StatMode(. DW
e290: 4f 52 44 20 61 74 74 72 2c 0a 20 20 20 20 69 6e ORD attr,. in
e2a0: 74 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a 20 20 t checkLinks,.
e2b0: 20 20 69 6e 74 20 69 73 45 78 65 63 29 0a 7b 0a int isExec).{.
e2c0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 int mode;..
e2d0: 20 20 20 69 66 20 28 63 68 65 63 6b 4c 69 6e 6b if (checkLink
e2e0: 73 20 26 26 20 28 61 74 74 72 20 26 20 46 49 4c s && (attr & FIL
e2f0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 50 41 E_ATTRIBUTE_REPA
e300: 52 53 45 5f 50 4f 49 4e 54 29 29 20 7b 0a 09 2f RSE_POINT)) {../
e310: 2a 0a 09 20 2a 20 49 74 20 69 73 20 61 20 6c 69 *.. * It is a li
e320: 6e 6b 2e 0a 09 20 2a 2f 0a 0a 09 6d 6f 64 65 20 nk... */...mode
e330: 3d 20 53 5f 49 46 4c 4e 4b 3b 0a 20 20 20 20 7d = S_IFLNK;. }
e340: 20 65 6c 73 65 20 7b 0a 09 6d 6f 64 65 20 3d 20 else {..mode =
e350: 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 (attr & FILE_ATT
e360: 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 RIBUTE_DIRECTORY
e370: 29 20 3f 20 53 5f 49 46 44 49 52 7c 53 5f 49 45 ) ? S_IFDIR|S_IE
e380: 58 45 43 20 3a 20 53 5f 49 46 52 45 47 3b 0a 20 XEC : S_IFREG;.
e390: 20 20 20 7d 0a 20 20 20 20 6d 6f 64 65 20 7c 3d }. mode |=
e3a0: 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 (attr & FILE_AT
e3b0: 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 TRIBUTE_READONLY
e3c0: 29 20 3f 20 53 5f 49 52 45 41 44 20 3a 20 53 5f ) ? S_IREAD : S_
e3d0: 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45 3b 0a IREAD|S_IWRITE;.
e3e0: 20 20 20 20 69 66 20 28 69 73 45 78 65 63 29 20 if (isExec)
e3f0: 7b 0a 09 6d 6f 64 65 20 7c 3d 20 53 5f 49 45 58 {..mode |= S_IEX
e400: 45 43 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f EC;. }.. /
e410: 2a 0a 20 20 20 20 20 2a 20 50 72 6f 70 61 67 61 *. * Propaga
e420: 74 65 20 74 68 65 20 53 5f 49 52 45 41 44 2c 20 te the S_IREAD,
e430: 53 5f 49 57 52 49 54 45 2c 20 53 5f 49 45 58 45 S_IWRITE, S_IEXE
e440: 43 20 62 69 74 73 20 74 6f 20 74 68 65 20 67 72 C bits to the gr
e450: 6f 75 70 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 oup and other.
e460: 20 20 20 2a 20 70 6f 73 69 74 69 6f 6e 73 2e 0a * positions..
e470: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 6f 64 */.. mod
e480: 65 20 7c 3d 20 28 6d 6f 64 65 20 26 20 28 53 5f e |= (mode & (S_
e490: 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45 7c 53 IREAD|S_IWRITE|S
e4a0: 5f 49 45 58 45 43 29 29 20 3e 3e 20 33 3b 0a 20 _IEXEC)) >> 3;.
e4b0: 20 20 20 6d 6f 64 65 20 7c 3d 20 28 6d 6f 64 65 mode |= (mode
e4c0: 20 26 20 28 53 5f 49 52 45 41 44 7c 53 5f 49 57 & (S_IREAD|S_IW
e4d0: 52 49 54 45 7c 53 5f 49 45 58 45 43 29 29 20 3e RITE|S_IEXEC)) >
e4e0: 3e 20 36 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 > 6;. return
e4f0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 29 (unsigned short)
e500: 20 6d 6f 64 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a mode;.}.../*. *
e510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e550: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
e560: 6f 43 54 69 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 oCTime --. *. *.
e570: 43 6f 6e 76 65 72 74 73 20 61 20 57 69 6e 64 6f Converts a Windo
e580: 77 73 20 46 49 4c 45 54 49 4d 45 20 74 6f 20 61 ws FILETIME to a
e590: 20 74 69 6d 65 5f 74 20 69 6e 20 55 54 43 2e 0a time_t in UTC..
e5a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
e5b0: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 63 6f *.Returns the co
e5c0: 75 6e 74 20 6f 66 20 73 65 63 6f 6e 64 73 20 66 unt of seconds f
e5d0: 72 6f 6d 20 74 68 65 20 50 6f 73 69 78 20 65 70 rom the Posix ep
e5e0: 6f 63 68 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d och.. *. *------
e5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e630: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 74 --. */..static t
e640: 69 6d 65 5f 74 0a 54 6f 43 54 69 6d 65 28 0a 20 ime_t.ToCTime(.
e650: 20 20 20 46 49 4c 45 54 49 4d 45 20 66 69 6c 65 FILETIME file
e660: 54 69 6d 65 29 09 09 2f 2a 20 55 54 43 20 74 69 Time)../* UTC ti
e670: 6d 65 20 2a 2f 0a 7b 0a 20 20 20 20 4c 41 52 47 me */.{. LARG
e680: 45 5f 49 4e 54 45 47 45 52 20 63 6f 6e 76 65 72 E_INTEGER conver
e690: 74 65 64 54 69 6d 65 3b 0a 0a 20 20 20 20 63 6f tedTime;.. co
e6a0: 6e 76 65 72 74 65 64 54 69 6d 65 2e 4c 6f 77 50 nvertedTime.LowP
e6b0: 61 72 74 20 3d 20 66 69 6c 65 54 69 6d 65 2e 64 art = fileTime.d
e6c0: 77 4c 6f 77 44 61 74 65 54 69 6d 65 3b 0a 20 20 wLowDateTime;.
e6d0: 20 20 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e convertedTime.
e6e0: 48 69 67 68 50 61 72 74 20 3d 20 28 4c 4f 4e 47 HighPart = (LONG
e6f0: 29 20 66 69 6c 65 54 69 6d 65 2e 64 77 48 69 67 ) fileTime.dwHig
e700: 68 44 61 74 65 54 69 6d 65 3b 0a 0a 20 20 20 20 hDateTime;..
e710: 72 65 74 75 72 6e 20 28 74 69 6d 65 5f 74 29 20 return (time_t)
e720: 28 28 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e ((convertedTime.
e730: 51 75 61 64 50 61 72 74 20 2d 0a 09 20 20 20 20 QuadPart -..
e740: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 50 4f (Tcl_WideInt) PO
e750: 53 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c SIX_EPOCH_AS_FIL
e760: 45 54 49 4d 45 29 20 2f 20 28 54 63 6c 5f 57 69 ETIME) / (Tcl_Wi
e770: 64 65 49 6e 74 29 20 31 30 30 30 30 30 30 30 29 deInt) 10000000)
e780: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e7d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 72 6f 6d 43 54 ---. *. * FromCT
e7e0: 69 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e ime --. *. *.Con
e7f0: 76 65 72 74 73 20 61 20 74 69 6d 65 5f 74 20 74 verts a time_t t
e800: 6f 20 61 20 57 69 6e 64 6f 77 73 20 46 49 4c 45 o a Windows FILE
e810: 54 49 4d 45 0a 20 2a 0a 20 2a 20 52 65 73 75 6c TIME. *. * Resul
e820: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 ts:. *.Returns t
e830: 68 65 20 63 6f 75 6e 74 20 6f 66 20 31 30 30 2d he count of 100-
e840: 6e 73 20 74 69 63 6b 73 20 73 65 63 6f 6e 64 73 ns ticks seconds
e850: 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 from the Window
e860: 73 20 65 70 6f 63 68 2e 0a 20 2a 0a 20 2a 2d 2d s epoch.. *. *--
e870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e8b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
e8c0: 69 63 20 76 6f 69 64 0a 46 72 6f 6d 43 54 69 6d ic void.FromCTim
e8d0: 65 28 0a 20 20 20 20 74 69 6d 65 5f 74 20 70 6f e(. time_t po
e8e0: 73 69 78 54 69 6d 65 2c 0a 20 20 20 20 46 49 4c sixTime,. FIL
e8f0: 45 54 49 4d 45 20 2a 66 69 6c 65 54 69 6d 65 29 ETIME *fileTime)
e900: 09 09 2f 2a 20 55 54 43 20 54 69 6d 65 20 2a 2f ../* UTC Time */
e910: 0a 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 .{. LARGE_INT
e920: 45 47 45 52 20 63 6f 6e 76 65 72 74 65 64 54 69 EGER convertedTi
e930: 6d 65 3b 0a 0a 20 20 20 20 63 6f 6e 76 65 72 74 me;.. convert
e940: 65 64 54 69 6d 65 2e 51 75 61 64 50 61 72 74 20 edTime.QuadPart
e950: 3d 20 28 28 4c 4f 4e 47 4c 4f 4e 47 29 20 70 6f = ((LONGLONG) po
e960: 73 69 78 54 69 6d 65 29 20 2a 20 31 30 30 30 30 sixTime) * 10000
e970: 30 30 30 0a 09 20 20 20 20 2b 20 50 4f 53 49 58 000.. + POSIX
e980: 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45 54 49 _EPOCH_AS_FILETI
e990: 4d 45 3b 0a 20 20 20 20 66 69 6c 65 54 69 6d 65 ME;. fileTime
e9a0: 2d 3e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 ->dwLowDateTime
e9b0: 3d 20 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e = convertedTime.
e9c0: 4c 6f 77 50 61 72 74 3b 0a 20 20 20 20 66 69 6c LowPart;. fil
e9d0: 65 54 69 6d 65 2d 3e 64 77 48 69 67 68 44 61 74 eTime->dwHighDat
e9e0: 65 54 69 6d 65 20 3d 20 63 6f 6e 76 65 72 74 65 eTime = converte
e9f0: 64 54 69 6d 65 2e 48 69 67 68 50 61 72 74 3b 0a dTime.HighPart;.
ea00: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ea50: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 47 ----. *. * TclpG
ea60: 65 74 4e 61 74 69 76 65 43 77 64 20 2d 2d 0a 20 etNativeCwd --.
ea70: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
ea80: 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 on replaces the
ea90: 6c 69 62 72 61 72 79 20 76 65 72 73 69 6f 6e 20 library version
eaa0: 6f 66 20 67 65 74 63 77 64 28 29 2e 0a 20 2a 0a of getcwd().. *.
eab0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
eac0: 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 he input and out
ead0: 70 75 74 20 61 72 65 20 66 69 6c 65 73 79 73 74 put are filesyst
eae0: 65 6d 20 70 61 74 68 73 20 69 6e 20 6e 61 74 69 em paths in nati
eaf0: 76 65 20 66 6f 72 6d 2e 20 54 68 65 20 72 65 73 ve form. The res
eb00: 75 6c 74 0a 20 2a 09 69 73 20 65 69 74 68 65 72 ult. *.is either
eb10: 20 74 68 65 20 67 69 76 65 6e 20 63 6c 69 65 6e the given clien
eb20: 74 44 61 74 61 2c 20 69 66 20 74 68 65 20 77 6f tData, if the wo
eb30: 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 rking directory
eb40: 68 61 73 6e 27 74 0a 20 2a 09 63 68 61 6e 67 65 hasn't. *.change
eb50: 64 2c 20 6f 72 20 61 20 6e 65 77 20 63 6c 69 65 d, or a new clie
eb60: 6e 74 44 61 74 61 20 28 6f 77 6e 65 64 20 62 79 ntData (owned by
eb70: 20 6f 75 72 20 63 61 6c 6c 65 72 29 2c 20 67 69 our caller), gi
eb80: 76 69 6e 67 20 74 68 65 20 6e 65 77 0a 20 2a 09 ving the new. *.
eb90: 6e 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 native path, or
eba0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 63 75 72 72 NULL if the curr
ebb0: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 63 6f ent directory co
ebc0: 75 6c 64 20 6e 6f 74 20 62 65 20 64 65 74 65 72 uld not be deter
ebd0: 6d 69 6e 65 64 2e 0a 20 2a 09 49 66 20 4e 55 4c mined.. *.If NUL
ebe0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 L is returned, t
ebf0: 68 65 20 63 61 6c 6c 65 72 20 63 61 6e 20 65 78 he caller can ex
ec00: 61 6d 69 6e 65 20 74 68 65 20 73 74 61 6e 64 61 amine the standa
ec10: 72 64 20 50 6f 73 69 78 20 65 72 72 6f 72 0a 20 rd Posix error.
ec20: 2a 09 63 6f 64 65 73 20 74 6f 20 64 65 74 65 72 *.codes to deter
ec30: 6d 69 6e 65 20 74 68 65 20 63 61 75 73 65 20 6f mine the cause o
ec40: 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 20 f the problem..
ec50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
ec60: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
ec70: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
ec80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ecb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c 69 -------. */..Cli
ecc0: 65 6e 74 44 61 74 61 0a 54 63 6c 70 47 65 74 4e entData.TclpGetN
ecd0: 61 74 69 76 65 43 77 64 28 0a 20 20 20 20 43 6c ativeCwd(. Cl
ece0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
ecf0: 61 74 61 29 0a 7b 0a 20 20 20 20 57 43 48 41 52 ata).{. WCHAR
ed00: 20 62 75 66 66 65 72 5b 4d 41 58 5f 50 41 54 48 buffer[MAX_PATH
ed10: 5d 3b 0a 0a 20 20 20 20 69 66 20 28 47 65 74 43 ];.. if (GetC
ed20: 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 urrentDirectoryW
ed30: 28 4d 41 58 5f 50 41 54 48 2c 20 62 75 66 66 65 (MAX_PATH, buffe
ed40: 72 29 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 57 r) == 0) {..TclW
ed50: 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 inConvertError(G
ed60: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a etLastError());.
ed70: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
ed80: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 6c 69 }.. if (cli
ed90: 65 6e 74 44 61 74 61 20 21 3d 20 4e 55 4c 4c 29 entData != NULL)
eda0: 20 7b 0a 09 69 66 20 28 77 63 73 63 6d 70 28 28 {..if (wcscmp((
edb0: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 20 63 const WCHAR *) c
edc0: 6c 69 65 6e 74 44 61 74 61 2c 20 62 75 66 66 65 lientData, buffe
edd0: 72 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 r) == 0) {..
ede0: 72 65 74 75 72 6e 20 63 6c 69 65 6e 74 44 61 74 return clientDat
edf0: 61 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 a;..}. }..
ee00: 20 72 65 74 75 72 6e 20 54 63 6c 4e 61 74 69 76 return TclNativ
ee10: 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 28 eDupInternalRep(
ee20: 62 75 66 66 65 72 29 3b 0a 7d 0a 0c 0a 69 6e 74 buffer);.}...int
ee30: 0a 54 63 6c 70 4f 62 6a 41 63 63 65 73 73 28 0a .TclpObjAccess(.
ee40: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 Tcl_Obj *pat
ee50: 68 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 6d 6f hPtr,. int mo
ee60: 64 65 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e de).{. return
ee70: 20 4e 61 74 69 76 65 41 63 63 65 73 73 28 28 63 NativeAccess((c
ee80: 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 54 63 6c onst WCHAR *)Tcl
ee90: 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 _FSGetNativePath
eea0: 28 70 61 74 68 50 74 72 29 2c 20 6d 6f 64 65 29 (pathPtr), mode)
eeb0: 3b 0a 7d 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f 62 ;.}...int.TclpOb
eec0: 6a 4c 73 74 61 74 28 0a 20 20 20 20 54 63 6c 5f jLstat(. Tcl_
eed0: 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 Obj *pathPtr,.
eee0: 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 Tcl_StatBuf *s
eef0: 74 61 74 50 74 72 29 0a 7b 0a 20 20 20 20 2f 2a tatPtr).{. /*
ef00: 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 63 . * Ensure c
ef10: 6f 72 72 65 63 74 20 66 69 6c 65 20 73 69 7a 65 orrect file size
ef20: 73 20 62 79 20 66 6f 72 63 69 6e 67 20 74 68 65 s by forcing the
ef30: 20 4f 53 20 74 6f 20 77 72 69 74 65 20 61 6e 79 OS to write any
ef40: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 0a 20 20 pending data.
ef50: 20 20 20 2a 20 74 6f 20 64 69 73 6b 2e 20 54 68 * to disk. Th
ef60: 69 73 20 69 73 20 64 6f 6e 65 20 6f 6e 6c 79 20 is is done only
ef70: 66 6f 72 20 63 68 61 6e 6e 65 6c 73 20 77 68 69 for channels whi
ef80: 63 68 20 61 72 65 20 64 69 72 74 79 2c 20 69 2e ch are dirty, i.
ef90: 65 2e 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 e. have been.
efa0: 20 20 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 73 * written to s
efb0: 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 66 6c ince the last fl
efc0: 75 73 68 20 68 65 72 65 2e 0a 20 20 20 20 20 2a ush here.. *
efd0: 2f 0a 0a 20 20 20 20 54 63 6c 57 69 6e 46 6c 75 /.. TclWinFlu
efe0: 73 68 44 69 72 74 79 43 68 61 6e 6e 65 6c 73 28 shDirtyChannels(
eff0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
f000: 61 74 69 76 65 53 74 61 74 28 28 63 6f 6e 73 74 ativeStat((const
f010: 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 WCHAR *)Tcl_FSG
f020: 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 etNativePath(pat
f030: 68 50 74 72 29 2c 20 73 74 61 74 50 74 72 2c 20 hPtr), statPtr,
f040: 31 29 3b 0a 7d 0a 0c 0a 23 69 66 64 65 66 20 53 1);.}...#ifdef S
f050: 5f 49 46 4c 4e 4b 0a 54 63 6c 5f 4f 62 6a 20 2a _IFLNK.Tcl_Obj *
f060: 0a 54 63 6c 70 4f 62 6a 4c 69 6e 6b 28 0a 20 20 .TclpObjLink(.
f070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 Tcl_Obj *pathP
f080: 74 72 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 tr,. Tcl_Obj
f090: 2a 74 6f 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 *toPtr,. int
f0a0: 6c 69 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 20 linkAction).{.
f0b0: 20 20 69 66 20 28 74 6f 50 74 72 20 21 3d 20 4e if (toPtr != N
f0c0: 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 72 65 73 3b ULL) {..int res;
f0d0: 0a 09 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 4c ..const WCHAR *L
f0e0: 69 6e 6b 54 61 72 67 65 74 3b 0a 09 63 6f 6e 73 inkTarget;..cons
f0f0: 74 20 57 43 48 41 52 20 2a 4c 69 6e 6b 53 6f 75 t WCHAR *LinkSou
f100: 72 63 65 20 3d 20 28 63 6f 6e 73 74 20 57 43 48 rce = (const WCH
f110: 41 52 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e 61 AR *)Tcl_FSGetNa
f120: 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 tivePath(pathPtr
f130: 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 );..Tcl_Obj *nor
f140: 6d 61 6c 69 7a 65 64 54 6f 50 74 72 20 3d 20 54 malizedToPtr = T
f150: 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a cl_FSGetNormaliz
f160: 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 74 6f 50 edPath(NULL, toP
f170: 74 72 29 3b 0a 0a 09 69 66 20 28 6e 6f 72 6d 61 tr);...if (norma
f180: 6c 69 7a 65 64 54 6f 50 74 72 20 3d 3d 20 4e 55 lizedToPtr == NU
f190: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 LL) {.. retur
f1a0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 4c 69 6e n NULL;..}...Lin
f1b0: 6b 54 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 kTarget = (const
f1c0: 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 WCHAR *)Tcl_FSG
f1d0: 65 74 4e 61 74 69 76 65 50 61 74 68 28 6e 6f 72 etNativePath(nor
f1e0: 6d 61 6c 69 7a 65 64 54 6f 50 74 72 29 3b 0a 0a malizedToPtr);..
f1f0: 09 69 66 20 28 4c 69 6e 6b 53 6f 75 72 63 65 20 .if (LinkSource
f200: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 4c 69 6e 6b 54 == NULL || LinkT
f210: 61 72 67 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b arget == NULL) {
f220: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
f230: 4c 3b 0a 09 7d 0a 09 72 65 73 20 3d 20 57 69 6e L;..}..res = Win
f240: 4c 69 6e 6b 28 4c 69 6e 6b 53 6f 75 72 63 65 2c Link(LinkSource,
f250: 20 4c 69 6e 6b 54 61 72 67 65 74 2c 20 6c 69 6e LinkTarget, lin
f260: 6b 41 63 74 69 6f 6e 29 3b 0a 09 69 66 20 28 72 kAction);..if (r
f270: 65 73 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 es == 0) {..
f280: 72 65 74 75 72 6e 20 74 6f 50 74 72 3b 0a 09 7d return toPtr;..}
f290: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 else {.. ret
f2a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 urn NULL;..}.
f2b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 6f 6e 73 74 } else {..const
f2c0: 20 57 43 48 41 52 20 2a 4c 69 6e 6b 53 6f 75 72 WCHAR *LinkSour
f2d0: 63 65 20 3d 20 28 63 6f 6e 73 74 20 57 43 48 41 ce = (const WCHA
f2e0: 52 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e 61 74 R *)Tcl_FSGetNat
f2f0: 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 29 ivePath(pathPtr)
f300: 3b 0a 0a 09 69 66 20 28 4c 69 6e 6b 53 6f 75 72 ;...if (LinkSour
f310: 63 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ce == NULL) {..
f320: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
f330: 09 7d 0a 09 72 65 74 75 72 6e 20 57 69 6e 52 65 .}..return WinRe
f340: 61 64 4c 69 6e 6b 28 4c 69 6e 6b 53 6f 75 72 63 adLink(LinkSourc
f350: 65 29 3b 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 e);. }.}.#end
f360: 69 66 20 2f 2a 20 53 5f 49 46 4c 4e 4b 20 2a 2f if /* S_IFLNK */
f370: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 46 69 ---. *. * TclpFi
f3d0: 6c 65 73 79 73 74 65 6d 50 61 74 68 54 79 70 65 lesystemPathType
f3e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
f3f0: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 unction is part
f400: 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 of the native fi
f410: 6c 65 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 lesystem support
f420: 2c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a , and returns. *
f430: 09 74 68 65 20 70 61 74 68 20 74 79 70 65 20 6f .the path type o
f440: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 74 68 f the given path
f450: 2e 20 52 65 74 75 72 6e 73 20 4e 54 46 53 20 6f . Returns NTFS o
f460: 72 20 46 41 54 20 6f 72 20 77 68 61 74 65 76 65 r FAT or whateve
f470: 72 20 69 73 0a 20 2a 09 72 65 74 75 72 6e 65 64 r is. *.returned
f480: 20 62 79 20 74 68 65 20 27 76 6f 6c 75 6d 65 20 by the 'volume
f490: 69 6e 66 6f 72 6d 61 74 69 6f 6e 27 20 70 72 6f information' pro
f4a0: 63 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 c.. *. * Results
f4b0: 3a 0a 20 2a 09 4e 55 4c 4c 20 61 74 20 70 72 65 :. *.NULL at pre
f4c0: 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sent.. *. * Side
f4d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
f4e0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
f4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f530: 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a ---. */..Tcl_Obj
f540: 20 2a 0a 54 63 6c 70 46 69 6c 65 73 79 73 74 65 *.TclpFilesyste
f550: 6d 50 61 74 68 54 79 70 65 28 0a 20 20 20 20 54 mPathType(. T
f560: 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 cl_Obj *pathPtr)
f570: 0a 7b 0a 23 64 65 66 69 6e 65 20 56 4f 4c 5f 42 .{.#define VOL_B
f580: 55 46 5f 53 49 5a 45 20 33 32 0a 20 20 20 20 69 UF_SIZE 32. i
f590: 6e 74 20 66 6f 75 6e 64 3b 0a 20 20 20 20 57 43 nt found;. WC
f5a0: 48 41 52 20 76 6f 6c 54 79 70 65 5b 56 4f 4c 5f HAR volType[VOL_
f5b0: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 63 BUF_SIZE];. c
f5c0: 68 61 72 20 2a 66 69 72 73 74 53 65 70 61 72 61 har *firstSepara
f5d0: 74 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 tor;. const c
f5e0: 68 61 72 20 2a 70 61 74 68 3b 0a 20 20 20 20 54 har *path;. T
f5f0: 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 50 61 74 68 cl_Obj *normPath
f600: 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d = Tcl_FSGetNorm
f610: 61 6c 69 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c alizedPath(NULL,
f620: 20 70 61 74 68 50 74 72 29 3b 0a 0a 20 20 20 20 pathPtr);..
f630: 69 66 20 28 6e 6f 72 6d 50 61 74 68 20 3d 3d 20 if (normPath ==
f640: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
f650: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
f660: 70 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 path = Tcl_GetSt
f670: 72 69 6e 67 28 6e 6f 72 6d 50 61 74 68 29 3b 0a ring(normPath);.
f680: 20 20 20 20 69 66 20 28 70 61 74 68 20 3d 3d 20 if (path ==
f690: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
f6a0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
f6b0: 20 66 69 72 73 74 53 65 70 61 72 61 74 6f 72 20 firstSeparator
f6c0: 3d 20 73 74 72 63 68 72 28 70 61 74 68 2c 20 27 = strchr(path, '
f6d0: 2f 27 29 3b 0a 20 20 20 20 69 66 20 28 66 69 72 /');. if (fir
f6e0: 73 74 53 65 70 61 72 61 74 6f 72 20 3d 3d 20 4e stSeparator == N
f6f0: 55 4c 4c 29 20 7b 0a 09 66 6f 75 6e 64 20 3d 20 ULL) {..found =
f700: 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 GetVolumeInforma
f710: 74 69 6f 6e 57 28 28 63 6f 6e 73 74 20 57 43 48 tionW((const WCH
f720: 41 52 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e 61 AR *)Tcl_FSGetNa
f730: 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 tivePath(pathPtr
f740: 29 2c 0a 09 09 4e 55 4c 4c 2c 20 30 2c 20 4e 55 ),...NULL, 0, NU
f750: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 LL, NULL, NULL,
f760: 76 6f 6c 54 79 70 65 2c 20 56 4f 4c 5f 42 55 46 volType, VOL_BUF
f770: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 20 65 6c _SIZE);. } el
f780: 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 64 se {..Tcl_Obj *d
f790: 72 69 76 65 4e 61 6d 65 20 3d 20 54 63 6c 5f 4e riveName = Tcl_N
f7a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 ewStringObj(path
f7b0: 2c 20 66 69 72 73 74 53 65 70 61 72 61 74 6f 72 , firstSeparator
f7c0: 20 2d 20 70 61 74 68 2b 31 29 3b 0a 0a 09 54 63 - path+1);...Tc
f7d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 64 l_IncrRefCount(d
f7e0: 72 69 76 65 4e 61 6d 65 29 3b 0a 09 66 6f 75 6e riveName);..foun
f7f0: 64 20 3d 20 47 65 74 56 6f 6c 75 6d 65 49 6e 66 d = GetVolumeInf
f800: 6f 72 6d 61 74 69 6f 6e 57 28 28 63 6f 6e 73 74 ormationW((const
f810: 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 WCHAR *)Tcl_FSG
f820: 65 74 4e 61 74 69 76 65 50 61 74 68 28 64 72 69 etNativePath(dri
f830: 76 65 4e 61 6d 65 29 2c 0a 09 09 4e 55 4c 4c 2c veName),...NULL,
f840: 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 0, NULL, NULL,
f850: 4e 55 4c 4c 2c 20 76 6f 6c 54 79 70 65 2c 20 56 NULL, volType, V
f860: 4f 4c 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 09 54 OL_BUF_SIZE);..T
f870: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
f880: 64 72 69 76 65 4e 61 6d 65 29 3b 0a 20 20 20 20 driveName);.
f890: 7d 0a 0a 20 20 20 20 69 66 20 28 66 6f 75 6e 64 }.. if (found
f8a0: 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e == 0) {..return
f8b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 65 6c 73 NULL;. } els
f8c0: 65 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 e {..Tcl_DString
f8d0: 20 64 73 3b 0a 0a 09 54 63 6c 5f 57 69 6e 54 43 ds;...Tcl_WinTC
f8e0: 68 61 72 54 6f 55 74 66 28 28 54 43 48 41 52 20 harToUtf((TCHAR
f8f0: 2a 29 76 6f 6c 54 79 70 65 2c 20 2d 31 2c 20 26 *)volType, -1, &
f900: 64 73 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c ds);..return Tcl
f910: 44 53 74 72 69 6e 67 54 6f 4f 62 6a 28 26 64 73 DStringToObj(&ds
f920: 29 3b 0a 20 20 20 20 7d 0a 23 75 6e 64 65 66 20 );. }.#undef
f930: 56 4f 4c 5f 42 55 46 5f 53 49 5a 45 0a 7d 0a 0c VOL_BUF_SIZE.}..
f940: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 64 65 66 69 ./*. * This defi
f950: 6e 65 20 63 61 6e 20 62 65 20 74 75 72 6e 65 64 ne can be turned
f960: 20 6f 6e 20 74 6f 20 65 78 70 65 72 69 6d 65 6e on to experimen
f970: 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 t with a differe
f980: 6e 74 20 77 61 79 20 6f 66 0a 20 2a 20 6e 6f 72 nt way of. * nor
f990: 6d 61 6c 69 7a 69 6e 67 20 70 61 74 68 73 20 28 malizing paths (
f9a0: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e using a differen
f9b0: 74 20 57 69 6e 64 6f 77 73 20 41 50 49 29 2e 20 t Windows API).
f9c0: 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79 20 74 68 Unfortunately th
f9d0: 65 20 6e 65 77 0a 20 2a 20 70 61 74 68 20 73 65 e new. * path se
f9e0: 65 6d 73 20 74 6f 20 74 61 6b 65 20 61 6c 6d 6f ems to take almo
f9f0: 73 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 st exactly the s
fa00: 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 ame amount of ti
fa10: 6d 65 20 61 73 20 74 68 65 20 6f 6c 64 20 70 61 me as the old pa
fa20: 74 68 21 0a 20 2a 20 54 68 65 20 70 72 69 6d 61 th!. * The prima
fa30: 72 79 20 74 69 6d 65 20 74 61 6b 65 6e 20 62 79 ry time taken by
fa40: 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 69 normalization i
fa50: 73 20 69 6e 0a 20 2a 20 47 65 74 46 69 6c 65 41 s in. * GetFileA
fa60: 74 74 72 69 62 75 74 65 73 45 78 2f 46 69 6e 64 ttributesEx/Find
fa70: 46 69 72 73 74 46 69 6c 65 20 6f 72 20 47 65 74 FirstFile or Get
fa80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 FileAttributesEx
fa90: 2f 47 65 74 4c 6f 6e 67 50 61 74 68 4e 61 6d 65 /GetLongPathName
faa0: 2e 0a 20 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 20 .. * Conversion
fab0: 74 6f 2f 66 72 6f 6d 20 6e 61 74 69 76 65 20 69 to/from native i
fac0: 73 20 6e 6f 74 20 61 20 73 69 67 6e 69 66 69 63 s not a signific
fad0: 61 6e 74 20 66 61 63 74 6f 72 20 61 74 20 61 6c ant factor at al
fae0: 6c 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 2c 20 73 l.. *. * Also, s
faf0: 69 6e 63 65 20 77 65 20 68 61 76 65 20 74 6f 20 ince we have to
fb00: 63 68 65 63 6b 20 66 6f 72 20 73 79 6d 62 6f 6c check for symbol
fb10: 69 63 20 6c 69 6e 6b 73 20 28 72 65 70 61 72 73 ic links (repars
fb20: 65 20 70 6f 69 6e 74 73 29 20 74 68 65 6e 20 77 e points) then w
fb30: 65 0a 20 2a 20 68 61 76 65 20 74 6f 20 63 61 6c e. * have to cal
fb40: 6c 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 l GetFileAttribu
fb50: 74 65 73 20 6f 6e 20 65 61 63 68 20 70 61 74 68 tes on each path
fb60: 20 73 65 67 6d 65 6e 74 20 61 6e 79 77 61 79 2c segment anyway,
fb70: 20 73 6f 20 74 68 65 72 65 27 73 20 6e 6f 0a 20 so there's no.
fb80: 2a 20 62 65 6e 65 66 69 74 20 74 6f 20 64 6f 69 * benefit to doi
fb90: 6e 67 20 61 6e 79 74 68 69 6e 67 20 63 6c 65 76 ng anything clev
fba0: 65 72 20 74 68 65 72 65 2e 0a 20 2a 2f 0a 0a 2f er there.. */../
fbb0: 2a 20 23 64 65 66 69 6e 65 20 54 63 6c 4e 4f 52 * #define TclNOR
fbc0: 4d 5f 4c 4f 4e 47 5f 50 41 54 48 20 2a 2f 0a 0c M_LONG_PATH */..
fbd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
fbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc20: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 62 6a 4e -. *. * TclpObjN
fc30: 6f 72 6d 61 6c 69 7a 65 50 61 74 68 20 2d 2d 0a ormalizePath --.
fc40: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
fc50: 69 6f 6e 20 73 63 61 6e 73 20 74 68 72 6f 75 67 ion scans throug
fc60: 68 20 61 20 70 61 74 68 20 73 70 65 63 69 66 69 h a path specifi
fc70: 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 70 6c 61 cation and repla
fc80: 63 65 73 20 69 74 2c 20 69 6e 0a 20 2a 09 70 6c ces it, in. *.pl
fc90: 61 63 65 2c 20 77 69 74 68 20 61 20 6e 6f 72 6d ace, with a norm
fca0: 61 6c 69 7a 65 64 20 76 65 72 73 69 6f 6e 2e 20 alized version.
fcb0: 54 68 69 73 20 6d 65 61 6e 73 20 75 73 69 6e 67 This means using
fcc0: 20 74 68 65 20 27 6c 6f 6e 67 6e 61 6d 65 27 2c the 'longname',
fcd0: 20 61 6e 64 0a 20 2a 09 65 78 70 61 6e 64 69 6e and. *.expandin
fce0: 67 20 61 6e 79 20 73 79 6d 62 6f 6c 69 63 20 6c g any symbolic l
fcf0: 69 6e 6b 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 inks contained w
fd00: 69 74 68 69 6e 20 74 68 65 20 70 61 74 68 2e 0a ithin the path..
fd10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
fd20: 2a 09 54 68 65 20 6e 65 77 20 27 6e 65 78 74 43 *.The new 'nextC
fd30: 68 65 63 6b 70 6f 69 6e 74 27 20 76 61 6c 75 65 heckpoint' value
fd40: 2c 20 67 69 76 69 6e 67 20 61 73 20 66 61 72 20 , giving as far
fd50: 61 73 20 77 65 20 63 6f 75 6c 64 20 75 6e 64 65 as we could unde
fd60: 72 73 74 61 6e 64 0a 20 2a 09 69 6e 20 74 68 65 rstand. *.in the
fd70: 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 53 69 64 path.. *. * Sid
fd80: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 e effects:. *.Th
fd90: 65 20 70 61 74 68 50 74 72 20 73 74 72 69 6e 67 e pathPtr string
fda0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 63 6f 6e , which must con
fdb0: 74 61 69 6e 20 61 20 76 61 6c 69 64 20 70 61 74 tain a valid pat
fdc0: 68 2c 20 69 73 20 70 6f 73 73 69 62 6c 79 0a 20 h, is possibly.
fdd0: 2a 09 6d 6f 64 69 66 69 65 64 20 69 6e 20 70 6c *.modified in pl
fde0: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ace.. *. *------
fdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fe00: 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
fe40: 63 6c 70 4f 62 6a 4e 6f 72 6d 61 6c 69 7a 65 50 clpObjNormalizeP
fe50: 61 74 68 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 ath(. Tcl_Int
fe60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 2f 2a 20 erp *interp, /*
fe70: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 not used */.
fe80: 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 Tcl_Obj *pathPtr
fe90: 2c 09 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 ,. /* An
fea0: 75 6e 73 68 61 72 65 64 20 6f 62 6a 65 63 74 20 unshared object
feb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 containing the p
fec0: 61 74 68 20 74 6f 0a 09 09 09 09 20 2a 20 6e 6f ath to..... * no
fed0: 72 6d 61 6c 69 7a 65 20 2a 2f 0a 20 20 20 20 69 rmalize */. i
fee0: 6e 74 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e nt nextCheckpoin
fef0: 74 29 09 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 t). /* of
ff00: 66 73 65 74 20 74 6f 20 73 74 61 72 74 20 61 74 fset to start at
ff10: 20 69 6e 20 70 61 74 68 50 74 72 20 2a 2f 0a 7b in pathPtr */.{
ff20: 0a 20 20 20 20 63 68 61 72 20 2a 6c 61 73 74 56 . char *lastV
ff30: 61 6c 69 64 50 61 74 68 45 6e 64 20 3d 20 4e 55 alidPathEnd = NU
ff40: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 LL;. Tcl_DStr
ff50: 69 6e 67 20 64 73 4e 6f 72 6d 3b 09 09 2f 2a 20 ing dsNorm;../*
ff60: 54 68 69 73 20 77 69 6c 6c 20 68 6f 6c 64 20 74 This will hold t
ff70: 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 73 74 he normalized st
ff80: 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 63 68 61 ring. */. cha
ff90: 72 20 2a 70 61 74 68 2c 20 2a 63 75 72 72 65 6e r *path, *curren
ffa0: 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e tPathEndPosition
ffb0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 ;. Tcl_Obj *t
ffc0: 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 emp = NULL;.
ffd0: 69 6e 74 20 69 73 44 72 69 76 65 20 3d 20 31 3b int isDrive = 1;
ffe0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
fff0: 20 64 73 3b 09 09 2f 2a 20 53 6f 6d 65 20 77 6f ds;../* Some wo
10000 72 6b 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 rkspace. */.
10010 28 76 6f 69 64 29 69 6e 74 65 72 70 3b 0a 0a 20 (void)interp;..
10020 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e Tcl_DStringIn
10030 69 74 28 26 64 73 4e 6f 72 6d 29 3b 0a 20 20 20 it(&dsNorm);.
10040 20 70 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 path = Tcl_GetS
10050 74 72 69 6e 67 28 70 61 74 68 50 74 72 29 3b 0a tring(pathPtr);.
10060 0a 20 20 20 20 63 75 72 72 65 6e 74 50 61 74 68 . currentPath
10070 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 20 70 61 EndPosition = pa
10080 74 68 20 2b 20 6e 65 78 74 43 68 65 63 6b 70 6f th + nextCheckpo
10090 69 6e 74 3b 0a 20 20 20 20 69 66 20 28 2a 63 75 int;. if (*cu
100a0 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 rrentPathEndPosi
100b0 74 69 6f 6e 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 tion == '/') {..
100c0 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f currentPathEndPo
100d0 73 69 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a sition++;. }.
100e0 20 20 20 20 77 68 69 6c 65 20 28 31 29 20 7b 0a while (1) {.
100f0 09 63 68 61 72 20 63 75 72 20 3d 20 2a 63 75 72 .char cur = *cur
10100 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 rentPathEndPosit
10110 69 6f 6e 3b 0a 0a 09 69 66 20 28 28 63 75 72 3d ion;...if ((cur=
10120 3d 27 2f 27 20 7c 7c 20 63 75 72 3d 3d 30 29 20 ='/' || cur==0)
10130 26 26 20 28 70 61 74 68 20 21 3d 20 63 75 72 72 && (path != curr
10140 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 entPathEndPositi
10150 6f 6e 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 on)) {.. /*..
10160 20 20 20 20 20 2a 20 52 65 61 63 68 65 64 20 64 * Reached d
10170 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 irectory separat
10180 6f 72 2c 20 6f 72 20 65 6e 64 20 6f 66 20 73 74 or, or end of st
10190 72 69 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a ring... */..
101a0 09 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f . WIN32_FILE_
101b0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 64 ATTRIBUTE_DATA d
101c0 61 74 61 3b 0a 09 20 20 20 20 63 6f 6e 73 74 20 ata;.. const
101d0 57 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 WCHAR *nativePat
101e0 68 20 3d 20 28 57 43 48 41 52 20 2a 29 54 63 6c h = (WCHAR *)Tcl
101f0 5f 57 69 6e 55 74 66 54 6f 54 43 68 61 72 28 70 _WinUtfToTChar(p
10200 61 74 68 2c 0a 09 09 20 20 20 20 63 75 72 72 65 ath,... curre
10210 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
10220 6e 20 2d 20 70 61 74 68 2c 20 26 64 73 29 3b 0a n - path, &ds);.
10230 0a 09 20 20 20 20 69 66 20 28 47 65 74 46 69 6c .. if (GetFil
10240 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 6e eAttributesExW(n
10250 61 74 69 76 65 50 61 74 68 2c 0a 09 09 20 20 20 ativePath,...
10260 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 GetFileExInfoSt
10270 61 6e 64 61 72 64 2c 20 26 64 61 74 61 29 20 21 andard, &data) !
10280 3d 20 54 52 55 45 29 20 7b 0a 09 09 2f 2a 0a 09 = TRUE) {.../*..
10290 09 20 2a 20 46 69 6c 65 20 64 6f 65 73 6e 27 74 . * File doesn't
102a0 20 65 78 69 73 74 2e 0a 09 09 20 2a 2f 0a 0a 09 exist.... */...
102b0 09 69 66 20 28 69 73 44 72 69 76 65 29 20 7b 0a .if (isDrive) {.
102c0 09 09 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 .. int len =
102d0 57 69 6e 49 73 52 65 73 65 72 76 65 64 28 70 61 WinIsReserved(pa
102e0 74 68 29 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 th);.... if (
102f0 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 09 2f 2a len > 0) {..../*
10300 0a 09 09 09 20 2a 20 41 63 74 75 61 6c 6c 79 20 .... * Actually
10310 69 74 20 64 6f 65 73 20 65 78 69 73 74 20 2d 20 it does exist -
10320 43 4f 4d 31 2c 20 65 74 63 2e 0a 09 09 09 20 2a COM1, etc..... *
10330 2f 0a 0a 09 09 09 69 6e 74 20 69 3b 0a 0a 09 09 /.....int i;....
10340 09 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c 6c 65 .for (i=0 ; i<le
10350 6e 20 3b 20 69 2b 2b 29 20 7b 0a 09 09 09 20 20 n ; i++) {....
10360 20 20 57 43 48 41 52 20 77 63 20 3d 20 28 28 57 WCHAR wc = ((W
10370 43 48 41 52 20 2a 29 6e 61 74 69 76 65 50 61 74 CHAR *)nativePat
10380 68 29 5b 69 5d 3b 0a 0a 09 09 09 20 20 20 20 69 h)[i];..... i
10390 66 20 28 77 63 20 3e 3d 20 27 61 27 29 20 7b 0a f (wc >= 'a') {.
103a0 09 09 09 09 77 63 20 2d 3d 20 28 27 61 27 20 2d ....wc -= ('a' -
103b0 20 27 41 27 29 3b 0a 09 09 09 09 28 28 57 43 48 'A');.....((WCH
103c0 41 52 20 2a 29 20 6e 61 74 69 76 65 50 61 74 68 AR *) nativePath
103d0 29 5b 69 5d 20 3d 20 77 63 3b 0a 09 09 09 20 20 )[i] = wc;....
103e0 20 20 7d 0a 09 09 09 7d 0a 09 09 09 54 63 6c 5f }....}....Tcl_
103f0 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 DStringAppend(&d
10400 73 4e 6f 72 6d 2c 0a 09 09 09 09 28 63 6f 6e 73 sNorm,.....(cons
10410 74 20 63 68 61 72 20 2a 29 6e 61 74 69 76 65 50 t char *)nativeP
10420 61 74 68 2c 0a 09 09 09 09 28 69 6e 74 29 28 73 ath,.....(int)(s
10430 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20 6c izeof(WCHAR) * l
10440 65 6e 29 29 3b 0a 09 09 09 6c 61 73 74 56 61 6c en));....lastVal
10450 69 64 50 61 74 68 45 6e 64 20 3d 20 63 75 72 72 idPathEnd = curr
10460 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 entPathEndPositi
10470 6f 6e 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 on;... } else
10480 20 69 66 20 28 6e 65 78 74 43 68 65 63 6b 70 6f if (nextCheckpo
10490 69 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 2f int == 0) {..../
104a0 2a 0a 09 09 09 20 2a 20 50 61 74 68 20 73 74 61 *.... * Path sta
104b0 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65 rts with a drive
104c0 20 64 65 73 69 67 6e 61 74 69 6f 6e 20 74 68 61 designation tha
104d0 74 27 73 20 6e 6f 74 0a 09 09 09 20 2a 20 61 63 t's not.... * ac
104e0 74 75 61 6c 6c 79 20 6f 6e 20 74 68 65 20 73 79 tually on the sy
104f0 73 74 65 6d 2e 20 57 65 20 73 74 69 6c 6c 20 6d stem. We still m
10500 75 73 74 20 6e 6f 72 6d 61 6c 69 7a 65 20 75 70 ust normalize up
10510 0a 09 09 09 20 2a 20 70 61 73 74 20 74 68 65 20 .... * past the
10520 66 69 72 73 74 20 73 65 70 61 72 61 74 6f 72 2e first separator.
10530 20 5b 42 75 67 20 33 36 30 33 34 33 34 5d 0a 09 [Bug 3603434]..
10540 09 09 20 2a 2f 0a 0a 09 09 09 63 75 72 72 65 6e .. */.....curren
10550 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e tPathEndPosition
10560 2b 2b 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a ++;... }...}.
10570 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
10580 65 28 26 64 73 29 3b 0a 09 09 62 72 65 61 6b 3b e(&ds);...break;
10590 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a .. }... /*
105a0 0a 09 20 20 20 20 20 2a 20 46 69 6c 65 20 27 6e .. * File 'n
105b0 61 74 69 76 65 50 61 74 68 27 20 64 6f 65 73 20 ativePath' does
105c0 65 78 69 73 74 20 69 66 20 77 65 20 67 65 74 20 exist if we get
105d0 68 65 72 65 2e 20 57 65 20 6e 6f 77 20 77 61 6e here. We now wan
105e0 74 20 74 6f 0a 09 20 20 20 20 20 2a 20 63 68 65 t to.. * che
105f0 63 6b 20 69 66 20 69 74 20 69 73 20 61 20 73 79 ck if it is a sy
10600 6d 6c 69 6e 6b 20 61 6e 64 20 6f 74 68 65 72 77 mlink and otherw
10610 69 73 65 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 ise continue wit
10620 68 20 74 68 65 0a 09 20 20 20 20 20 2a 20 72 65 h the.. * re
10630 73 74 20 6f 66 20 74 68 65 20 70 61 74 68 2e 0a st of the path..
10640 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 2f . */... /
10650 2a 0a 09 20 20 20 20 20 2a 20 43 68 65 63 6b 20 *.. * Check
10660 66 6f 72 20 73 79 6d 6c 69 6e 6b 73 2c 20 65 78 for symlinks, ex
10670 63 65 70 74 20 61 74 20 6c 61 73 74 20 63 6f 6d cept at last com
10680 70 6f 6e 65 6e 74 20 6f 66 20 70 61 74 68 20 28 ponent of path (
10690 77 65 20 64 6f 6e 27 74 0a 09 20 20 20 20 20 2a we don't.. *
106a0 20 66 6f 6c 6c 6f 77 20 66 69 6e 61 6c 20 73 79 follow final sy
106b0 6d 6c 69 6e 6b 73 29 2e 20 41 6c 73 6f 20 61 20 mlinks). Also a
106c0 64 72 69 76 65 20 28 43 3a 2f 29 20 66 6f 72 20 drive (C:/) for
106d0 65 78 61 6d 70 6c 65 2c 20 6d 61 79 0a 09 20 20 example, may..
106e0 20 20 20 2a 20 73 6f 6d 65 74 69 6d 65 73 20 68 * sometimes h
106f0 61 76 65 20 74 68 65 20 72 65 70 61 72 73 65 20 ave the reparse
10700 66 6c 61 67 20 73 65 74 20 66 6f 72 20 73 6f 6d flag set for som
10710 65 20 72 65 61 73 6f 6e 20 49 20 64 6f 6e 27 74 e reason I don't
10720 0a 09 20 20 20 20 20 2a 20 75 6e 64 65 72 73 74 .. * underst
10730 61 6e 64 2e 20 57 65 20 74 68 65 72 65 66 6f 72 and. We therefor
10740 65 20 64 6f 6e 27 74 20 70 65 72 66 6f 72 6d 20 e don't perform
10750 74 68 69 73 20 63 68 65 63 6b 20 66 6f 72 20 64 this check for d
10760 72 69 76 65 73 2e 0a 09 20 20 20 20 20 2a 2f 0a rives... */.
10770 0a 09 20 20 20 20 69 66 20 28 63 75 72 20 21 3d .. if (cur !=
10780 20 30 20 26 26 20 21 69 73 44 72 69 76 65 20 26 0 && !isDrive &
10790 26 0a 09 09 20 20 20 20 64 61 74 61 2e 64 77 46 &... data.dwF
107a0 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 26 20 ileAttributes &
107b0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 FILE_ATTRIBUTE_R
107c0 45 50 41 52 53 45 5f 50 4f 49 4e 54 29 7b 0a 09 EPARSE_POINT){..
107d0 09 54 63 6c 5f 4f 62 6a 20 2a 74 6f 20 3d 20 57 .Tcl_Obj *to = W
107e0 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 65 63 74 inReadLinkDirect
107f0 6f 72 79 28 6e 61 74 69 76 65 50 61 74 68 29 3b ory(nativePath);
10800 0a 0a 09 09 69 66 20 28 74 6f 20 21 3d 20 4e 55 ....if (to != NU
10810 4c 4c 29 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 LL) {... /*..
10820 09 20 20 20 20 20 2a 20 52 65 61 64 20 74 68 65 . * Read the
10830 20 72 65 70 61 72 73 65 20 70 6f 69 6e 74 20 6f reparse point o
10840 6b 2e 20 4e 6f 77 2c 20 72 65 70 61 72 73 65 20 k. Now, reparse
10850 70 6f 69 6e 74 73 20 6e 65 65 64 20 6e 6f 74 0a points need not.
10860 09 09 20 20 20 20 20 2a 20 62 65 20 6e 6f 72 6d .. * be norm
10870 61 6c 69 7a 65 64 2c 20 6f 74 68 65 72 77 69 73 alized, otherwis
10880 65 20 77 65 20 63 6f 75 6c 64 20 75 73 65 3a 0a e we could use:.
10890 09 09 20 20 20 20 20 2a 0a 09 09 20 20 20 20 20 .. *...
108a0 2a 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 * Tcl_GetStringF
108b0 72 6f 6d 4f 62 6a 28 74 6f 2c 20 26 70 61 74 68 romObj(to, &path
108c0 4c 65 6e 29 3b 0a 09 09 20 20 20 20 20 2a 20 6e Len);... * n
108d0 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d 20 extCheckpoint =
108e0 70 61 74 68 4c 65 6e 3b 0a 09 09 20 20 20 20 20 pathLen;...
108f0 2a 0a 09 09 20 20 20 20 20 2a 20 53 6f 2c 20 69 *... * So, i
10900 6e 73 74 65 61 64 20 77 65 20 68 61 76 65 20 74 nstead we have t
10910 6f 20 73 74 61 72 74 20 66 72 6f 6d 20 74 68 65 o start from the
10920 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 09 09 20 20 beginning....
10930 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 6e 65 78 */.... nex
10940 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d 20 30 3b tCheckpoint = 0;
10950 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ... Tcl_Appen
10960 64 54 6f 4f 62 6a 28 74 6f 2c 20 63 75 72 72 65 dToObj(to, curre
10970 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
10980 6e 2c 20 2d 31 29 3b 0a 0a 09 09 20 20 20 20 2f n, -1);.... /
10990 2a 0a 09 09 20 20 20 20 20 2a 20 43 6f 6e 76 65 *... * Conve
109a0 72 74 20 6c 69 6e 6b 20 74 6f 20 66 6f 72 77 61 rt link to forwa
109b0 72 64 20 73 6c 61 73 68 65 73 2e 0a 09 09 20 20 rd slashes....
109c0 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 66 6f 72 */.... for
109d0 20 28 70 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 (path = Tcl_Get
109e0 53 74 72 69 6e 67 28 74 6f 29 3b 20 2a 70 61 74 String(to); *pat
109f0 68 20 21 3d 20 30 3b 20 70 61 74 68 2b 2b 29 20 h != 0; path++)
10a00 7b 0a 09 09 09 69 66 20 28 2a 70 61 74 68 20 3d {....if (*path =
10a10 3d 20 27 5c 5c 27 29 20 7b 0a 09 09 09 20 20 20 = '\\') {....
10a20 20 2a 70 61 74 68 20 3d 20 27 2f 27 3b 0a 09 09 *path = '/';...
10a30 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20 .}... }...
10a40 20 70 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 path = Tcl_GetS
10a50 74 72 69 6e 67 28 74 6f 29 3b 0a 09 09 20 20 20 tring(to);...
10a60 20 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 currentPathEndP
10a70 6f 73 69 74 69 6f 6e 20 3d 20 70 61 74 68 20 2b osition = path +
10a80 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 3b nextCheckpoint;
10a90 0a 09 09 20 20 20 20 69 66 20 28 74 65 6d 70 20 ... if (temp
10aa0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 54 63 != NULL) {....Tc
10ab0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 l_DecrRefCount(t
10ac0 65 6d 70 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 emp);... }...
10ad0 20 20 20 20 74 65 6d 70 20 3d 20 74 6f 3b 0a 0a temp = to;..
10ae0 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 20 20 20 .. /*...
10af0 2a 20 52 65 73 65 74 20 76 61 72 69 61 62 6c 65 * Reset variable
10b00 73 20 73 6f 20 77 65 20 63 61 6e 20 72 65 73 74 s so we can rest
10b10 61 72 74 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f art normalizatio
10b20 6e 2e 0a 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 n.... */....
10b30 20 20 20 20 69 73 44 72 69 76 65 20 3d 20 31 3b isDrive = 1;
10b40 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ... Tcl_DStri
10b50 6e 67 46 72 65 65 28 26 64 73 4e 6f 72 6d 29 3b ngFree(&dsNorm);
10b60 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ... Tcl_DStri
10b70 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 20 ngFree(&ds);...
10b80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d continue;...}
10b90 0a 09 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 .. }..#ifndef
10ba0 20 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 TclNORM_LONG_PA
10bb0 54 48 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 TH.. /*..
10bc0 20 2a 20 4e 6f 77 20 77 65 20 63 6f 6e 76 65 72 * Now we conver
10bd0 74 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 t the tail of th
10be0 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 74 e current path t
10bf0 6f 20 69 74 73 20 27 6c 6f 6e 67 20 66 6f 72 6d o its 'long form
10c00 27 2c 0a 09 20 20 20 20 20 2a 20 61 6e 64 20 61 ',.. * and a
10c10 70 70 65 6e 64 20 69 74 20 74 6f 20 27 64 73 4e ppend it to 'dsN
10c20 6f 72 6d 27 20 77 68 69 63 68 20 68 6f 6c 64 73 orm' which holds
10c30 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 72 the current nor
10c40 6d 61 6c 69 7a 65 64 0a 09 20 20 20 20 20 2a 20 malized.. *
10c50 70 61 74 68 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 path.. */...
10c60 20 20 20 20 69 66 20 28 69 73 44 72 69 76 65 29 if (isDrive)
10c70 20 7b 0a 09 09 57 43 48 41 52 20 64 72 69 76 65 {...WCHAR drive
10c80 20 3d 20 28 28 57 43 48 41 52 20 2a 29 20 6e 61 = ((WCHAR *) na
10c90 74 69 76 65 50 61 74 68 29 5b 30 5d 3b 0a 0a 09 tivePath)[0];...
10ca0 09 69 66 20 28 64 72 69 76 65 20 3e 3d 20 27 61 .if (drive >= 'a
10cb0 27 29 20 7b 0a 09 09 20 20 20 20 64 72 69 76 65 ') {... drive
10cc0 20 2d 3d 20 28 27 61 27 20 2d 20 27 41 27 29 3b -= ('a' - 'A');
10cd0 0a 09 09 20 20 20 20 28 28 57 43 48 41 52 20 2a ... ((WCHAR *
10ce0 29 20 6e 61 74 69 76 65 50 61 74 68 29 5b 30 5d ) nativePath)[0]
10cf0 20 3d 20 64 72 69 76 65 3b 0a 09 09 7d 0a 09 09 = drive;...}...
10d00 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e Tcl_DStringAppen
10d10 64 28 26 64 73 4e 6f 72 6d 2c 20 28 63 6f 6e 73 d(&dsNorm, (cons
10d20 74 20 63 68 61 72 20 2a 29 6e 61 74 69 76 65 50 t char *)nativeP
10d30 61 74 68 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 ath,....Tcl_DStr
10d40 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 29 3b ingLength(&ds));
10d50 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
10d60 09 63 68 61 72 20 2a 63 68 65 63 6b 44 6f 74 73 .char *checkDots
10d70 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 69 66 20 28 = NULL;....if (
10d80 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 lastValidPathEnd
10d90 5b 31 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 [1] == '.') {...
10da0 20 20 20 20 63 68 65 63 6b 44 6f 74 73 20 3d 20 checkDots =
10db0 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 lastValidPathEnd
10dc0 20 2b 20 31 3b 0a 09 09 20 20 20 20 77 68 69 6c + 1;... whil
10dd0 65 20 28 63 68 65 63 6b 44 6f 74 73 20 3c 20 63 e (checkDots < c
10de0 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 urrentPathEndPos
10df0 69 74 69 6f 6e 29 20 7b 0a 09 09 09 69 66 20 28 ition) {....if (
10e00 2a 63 68 65 63 6b 44 6f 74 73 20 21 3d 20 27 2e *checkDots != '.
10e10 27 29 20 7b 0a 09 09 09 20 20 20 20 63 68 65 63 ') {.... chec
10e20 6b 44 6f 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 kDots = NULL;...
10e30 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 7d . break;....}
10e40 0a 09 09 09 63 68 65 63 6b 44 6f 74 73 2b 2b 3b ....checkDots++;
10e50 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 69 ... }...}...i
10e60 66 20 28 63 68 65 63 6b 44 6f 74 73 20 21 3d 20 f (checkDots !=
10e70 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 69 6e NULL) {... in
10e80 74 20 64 6f 74 4c 65 6e 20 3d 20 63 75 72 72 65 t dotLen = curre
10e90 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
10ea0 6e 2d 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 n-lastValidPathE
10eb0 6e 64 3b 0a 0a 09 09 20 20 20 20 2f 2a 0a 09 09 nd;.... /*...
10ec0 20 20 20 20 20 2a 20 50 61 74 68 20 69 73 20 6a * Path is j
10ed0 75 73 74 20 64 6f 74 73 2e 20 57 65 20 73 68 6f ust dots. We sho
10ee0 75 6c 64 6e 27 74 20 72 65 61 6c 6c 79 20 65 76 uldn't really ev
10ef0 65 72 20 73 65 65 20 61 20 70 61 74 68 0a 09 09 er see a path...
10f00 20 20 20 20 20 2a 20 6c 69 6b 65 20 74 68 61 74 * like that
10f10 2e 20 48 6f 77 65 76 65 72 2c 20 74 6f 20 62 65 . However, to be
10f20 20 6e 69 63 65 20 77 65 20 61 74 20 6c 65 61 73 nice we at leas
10f30 74 20 64 6f 6e 27 74 20 6d 61 6e 67 6c 65 0a 09 t don't mangle..
10f40 09 20 20 20 20 20 2a 20 74 68 65 20 70 61 74 68 . * the path
10f50 20 2d 20 77 65 20 6a 75 73 74 20 61 64 64 20 74 - we just add t
10f60 68 65 20 64 6f 74 73 20 61 73 20 61 20 70 61 74 he dots as a pat
10f70 68 20 73 65 67 6d 65 6e 74 20 61 6e 64 0a 09 09 h segment and...
10f80 20 20 20 20 20 2a 20 63 6f 6e 74 69 6e 75 65 2e * continue.
10f90 0a 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 ... */....
10fa0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 Tcl_DStringApp
10fb0 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 28 28 63 end(&dsNorm, ((c
10fc0 6f 6e 73 74 20 63 68 61 72 20 2a 29 6e 61 74 69 onst char *)nati
10fd0 76 65 50 61 74 68 29 0a 09 09 09 20 20 20 20 2b vePath).... +
10fe0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 Tcl_DStringLeng
10ff0 74 68 28 26 64 73 29 0a 09 09 09 20 20 20 20 2d th(&ds).... -
11000 20 28 64 6f 74 4c 65 6e 20 2a 20 73 69 7a 65 6f (dotLen * sizeo
11010 66 28 57 43 48 41 52 29 29 2c 0a 09 09 09 20 20 f(WCHAR)),....
11020 20 20 64 6f 74 4c 65 6e 20 2a 20 73 69 7a 65 6f dotLen * sizeo
11030 66 28 57 43 48 41 52 29 29 3b 0a 09 09 7d 20 65 f(WCHAR));...} e
11040 6c 73 65 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 lse {... /*..
11050 09 20 20 20 20 20 2a 20 4e 6f 72 6d 61 6c 20 70 . * Normal p
11060 61 74 68 2e 0a 09 09 20 20 20 20 20 2a 2f 0a 0a ath.... */..
11070 09 09 20 20 20 20 57 49 4e 33 32 5f 46 49 4e 44 .. WIN32_FIND
11080 5f 44 41 54 41 57 20 66 44 61 74 61 3b 0a 09 09 _DATAW fData;...
11090 20 20 20 20 48 41 4e 44 4c 45 20 68 61 6e 64 6c HANDLE handl
110a0 65 3b 0a 0a 09 09 20 20 20 20 68 61 6e 64 6c 65 e;.... handle
110b0 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 = FindFirstFile
110c0 57 28 28 57 43 48 41 52 20 2a 29 20 6e 61 74 69 W((WCHAR *) nati
110d0 76 65 50 61 74 68 2c 20 26 66 44 61 74 61 29 3b vePath, &fData);
110e0 0a 09 09 20 20 20 20 69 66 20 28 68 61 6e 64 6c ... if (handl
110f0 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e e == INVALID_HAN
11100 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 09 09 DLE_VALUE) {....
11110 2f 2a 0a 09 09 09 20 2a 20 54 68 69 73 20 69 73 /*.... * This is
11120 20 75 73 75 61 6c 6c 79 20 74 68 65 20 27 2f 27 usually the '/'
11130 20 69 6e 20 27 63 3a 2f 27 20 61 74 20 65 6e 64 in 'c:/' at end
11140 20 6f 66 20 73 74 72 69 6e 67 2e 0a 09 09 09 20 of string.....
11150 2a 2f 0a 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 */.....Tcl_DStri
11160 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d ngAppend(&dsNorm
11170 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 , (const char *)
11180 20 4c 22 2f 22 2c 0a 09 09 09 09 73 69 7a 65 6f L"/",.....sizeo
11190 66 28 57 43 48 41 52 29 29 3b 0a 09 09 20 20 20 f(WCHAR));...
111a0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 57 43 48 } else {....WCH
111b0 41 52 20 2a 6e 61 74 69 76 65 4e 61 6d 65 3b 0a AR *nativeName;.
111c0 0a 09 09 09 69 66 20 28 66 44 61 74 61 2e 63 46 ....if (fData.cF
111d0 69 6c 65 4e 61 6d 65 5b 30 5d 20 21 3d 20 27 5c ileName[0] != '\
111e0 30 27 29 20 7b 0a 09 09 09 20 20 20 20 6e 61 74 0') {.... nat
111f0 69 76 65 4e 61 6d 65 20 3d 20 66 44 61 74 61 2e iveName = fData.
11200 63 46 69 6c 65 4e 61 6d 65 3b 0a 09 09 09 7d 20 cFileName;....}
11210 65 6c 73 65 20 7b 0a 09 09 09 20 20 20 20 6e 61 else {.... na
11220 74 69 76 65 4e 61 6d 65 20 3d 20 66 44 61 74 61 tiveName = fData
11230 2e 63 41 6c 74 65 72 6e 61 74 65 46 69 6c 65 4e .cAlternateFileN
11240 61 6d 65 3b 0a 09 09 09 7d 0a 09 09 09 46 69 6e ame;....}....Fin
11250 64 43 6c 6f 73 65 28 68 61 6e 64 6c 65 29 3b 0a dClose(handle);.
11260 09 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 ...Tcl_DStringAp
11270 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 28 63 pend(&dsNorm, (c
11280 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4c 22 2f onst char *) L"/
11290 22 2c 0a 09 09 09 09 73 69 7a 65 6f 66 28 57 43 ",.....sizeof(WC
112a0 48 41 52 29 29 3b 0a 09 09 09 54 63 6c 5f 44 53 HAR));....Tcl_DS
112b0 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e tringAppend(&dsN
112c0 6f 72 6d 2c 0a 09 09 09 09 28 63 6f 6e 73 74 20 orm,.....(const
112d0 63 68 61 72 20 2a 29 20 6e 61 74 69 76 65 4e 61 char *) nativeNa
112e0 6d 65 2c 0a 09 09 09 09 28 69 6e 74 29 20 28 77 me,.....(int) (w
112f0 63 73 6c 65 6e 28 6e 61 74 69 76 65 4e 61 6d 65 cslen(nativeName
11300 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 )*sizeof(WCHAR))
11310 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 );... }...}..
11320 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 }.#endif /*
11330 21 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 !TclNORM_LONG_PA
11340 54 48 20 2a 2f 0a 09 20 20 20 20 54 63 6c 5f 44 TH */.. Tcl_D
11350 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
11360 0a 09 20 20 20 20 6c 61 73 74 56 61 6c 69 64 50 .. lastValidP
11370 61 74 68 45 6e 64 20 3d 20 63 75 72 72 65 6e 74 athEnd = current
11380 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b PathEndPosition;
11390 0a 09 20 20 20 20 69 66 20 28 63 75 72 20 3d 3d .. if (cur ==
113a0 20 30 29 20 7b 0a 09 09 62 72 65 61 6b 3b 0a 09 0) {...break;..
113b0 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 }... /*..
113c0 20 20 20 20 20 2a 20 49 66 20 77 65 20 67 65 74 * If we get
113d0 20 68 65 72 65 2c 20 77 65 27 76 65 20 67 6f 74 here, we've got
113e0 20 70 61 73 74 20 6f 6e 65 20 64 69 72 65 63 74 past one direct
113f0 6f 72 79 20 64 65 6c 69 6d 69 74 65 72 2c 20 73 ory delimiter, s
11400 6f 20 77 65 0a 09 20 20 20 20 20 2a 20 6b 6e 6f o we.. * kno
11410 77 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 w it is no longe
11420 72 20 61 20 64 72 69 76 65 2e 0a 09 20 20 20 20 r a drive...
11430 20 2a 2f 0a 0a 09 20 20 20 20 69 73 44 72 69 76 */... isDriv
11440 65 20 3d 20 30 3b 0a 09 7d 0a 09 63 75 72 72 65 e = 0;..}..curre
11450 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
11460 6e 2b 2b 3b 0a 0a 23 69 66 64 65 66 20 54 63 6c n++;..#ifdef Tcl
11470 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 54 48 0a 09 NORM_LONG_PATH..
11480 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72 74 20 74 /*.. * Convert t
11490 68 65 20 65 6e 74 69 72 65 20 6b 6e 6f 77 6e 20 he entire known
114a0 70 61 74 68 20 74 6f 20 6c 6f 6e 67 20 66 6f 72 path to long for
114b0 6d 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 31 29 m... */...if (1)
114c0 20 7b 0a 09 20 20 20 20 57 43 48 41 52 20 77 70 {.. WCHAR wp
114d0 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 09 ath[MAX_PATH];..
114e0 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 const WCHAR
114f0 2a 6e 61 74 69 76 65 50 61 74 68 20 3d 0a 09 09 *nativePath =...
11500 20 20 20 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f Tcl_WinUtfTo
11510 54 43 68 61 72 28 70 61 74 68 2c 20 6c 61 73 74 TChar(path, last
11520 56 61 6c 69 64 50 61 74 68 45 6e 64 20 2d 20 70 ValidPathEnd - p
11530 61 74 68 2c 20 26 64 73 29 3b 0a 09 20 20 20 20 ath, &ds);..
11540 44 57 4f 52 44 20 77 70 61 74 68 6c 65 6e 20 3d DWORD wpathlen =
11550 20 47 65 74 4c 6f 6e 67 50 61 74 68 4e 61 6d 65 GetLongPathName
11560 50 72 6f 63 28 6e 61 74 69 76 65 50 61 74 68 2c Proc(nativePath,
11570 0a 09 09 20 20 20 20 28 57 43 48 41 52 20 2a 29 ... (WCHAR *)
11580 20 77 70 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 wpath, MAX_PATH
11590 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 );... /*..
115a0 20 20 2a 20 57 65 20 68 61 76 65 20 74 6f 20 6d * We have to m
115b0 61 6b 65 20 74 68 65 20 64 72 69 76 65 20 6c 65 ake the drive le
115c0 74 74 65 72 20 75 70 70 65 72 63 61 73 65 2e 0a tter uppercase..
115d0 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 . */... i
115e0 66 20 28 77 70 61 74 68 5b 30 5d 20 3e 3d 20 27 f (wpath[0] >= '
115f0 61 27 29 20 7b 0a 09 09 77 70 61 74 68 5b 30 5d a') {...wpath[0]
11600 20 2d 3d 20 28 27 61 27 20 2d 20 27 41 27 29 3b -= ('a' - 'A');
11610 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c .. }.. Tcl
11620 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 _DStringAppend(&
11630 64 73 4e 6f 72 6d 2c 20 28 63 6f 6e 73 74 20 63 dsNorm, (const c
11640 68 61 72 20 2a 29 20 77 70 61 74 68 2c 0a 09 09 har *) wpath,...
11650 20 20 20 20 77 70 61 74 68 6c 65 6e 20 2a 20 73 wpathlen * s
11660 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 09 izeof(WCHAR));..
11670 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
11680 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e ree(&ds);..}.#en
11690 64 69 66 20 2f 2a 20 54 63 6c 4e 4f 52 4d 5f 4c dif /* TclNORM_L
116a0 4f 4e 47 5f 50 41 54 48 20 2a 2f 0a 20 20 20 20 ONG_PATH */.
116b0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
116c0 20 43 6f 6d 6d 6f 6e 20 63 6f 64 65 20 70 61 74 Common code pat
116d0 68 20 66 6f 72 20 61 6c 6c 20 57 69 6e 64 6f 77 h for all Window
116e0 73 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 20 s platforms..
116f0 20 20 2a 2f 0a 0a 20 20 20 20 6e 65 78 74 43 68 */.. nextCh
11700 65 63 6b 70 6f 69 6e 74 20 3d 20 63 75 72 72 65 eckpoint = curre
11710 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
11720 6e 20 2d 20 70 61 74 68 3b 0a 20 20 20 20 69 66 n - path;. if
11730 20 28 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 (lastValidPathE
11740 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f nd != NULL) {../
11750 2a 0a 09 20 2a 20 43 6f 6e 63 61 74 65 6e 61 74 *.. * Concatenat
11760 65 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 e the normalized
11770 20 73 74 72 69 6e 67 20 69 6e 20 64 73 4e 6f 72 string in dsNor
11780 6d 20 77 69 74 68 20 74 68 65 20 74 61 69 6c 20 m with the tail
11790 6f 66 20 74 68 65 0a 09 20 2a 20 70 61 74 68 20 of the.. * path
117a0 77 68 69 63 68 20 77 65 20 64 69 64 6e 27 74 20 which we didn't
117b0 72 65 63 6f 67 6e 69 73 65 2e 20 54 68 65 20 73 recognise. The s
117c0 74 72 69 6e 67 20 69 6e 20 64 73 4e 6f 72 6d 20 tring in dsNorm
117d0 69 73 20 69 6e 20 74 68 65 0a 09 20 2a 20 6e 61 is in the.. * na
117e0 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 73 tive encoding, s
117f0 6f 20 77 65 20 68 61 76 65 20 74 6f 20 63 6f 6e o we have to con
11800 76 65 72 74 20 69 74 20 74 6f 20 55 74 66 2e 0a vert it to Utf..
11810 09 20 2a 2f 0a 0a 09 54 63 6c 5f 57 69 6e 54 43 . */...Tcl_WinTC
11820 68 61 72 54 6f 55 74 66 28 28 54 43 48 41 52 20 harToUtf((TCHAR
11830 2a 29 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 *) Tcl_DStringVa
11840 6c 75 65 28 26 64 73 4e 6f 72 6d 29 2c 0a 09 09 lue(&dsNorm),...
11850 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 Tcl_DStringLengt
11860 68 28 26 64 73 4e 6f 72 6d 29 2c 20 26 64 73 29 h(&dsNorm), &ds)
11870 3b 0a 09 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e ;..nextCheckpoin
11880 74 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c t = Tcl_DStringL
11890 65 6e 67 74 68 28 26 64 73 29 3b 0a 09 69 66 20 ength(&ds);..if
118a0 28 2a 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 (*lastValidPathE
118b0 6e 64 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 nd != 0) {..
118c0 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 74 20 74 /*.. * Not t
118d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 he end of the st
118e0 72 69 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a ring... */..
118f0 09 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 09 20 . int len;..
11900 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 Tcl_Obj *tmpP
11910 61 74 68 50 74 72 3b 0a 0a 09 20 20 20 20 74 6d athPtr;... tm
11920 70 50 61 74 68 50 74 72 20 3d 20 54 63 6c 5f 4e pPathPtr = Tcl_N
11930 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f ewStringObj(Tcl_
11940 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 DStringValue(&ds
11950 29 2c 0a 09 09 20 20 20 20 6e 65 78 74 43 68 65 ),... nextChe
11960 63 6b 70 6f 69 6e 74 29 3b 0a 09 20 20 20 20 54 ckpoint);.. T
11970 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 74 cl_AppendToObj(t
11980 6d 70 50 61 74 68 50 74 72 2c 20 6c 61 73 74 56 mpPathPtr, lastV
11990 61 6c 69 64 50 61 74 68 45 6e 64 2c 20 2d 31 29 alidPathEnd, -1)
119a0 3b 0a 09 20 20 20 20 70 61 74 68 20 3d 20 54 63 ;.. path = Tc
119b0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
119c0 62 6a 28 74 6d 70 50 61 74 68 50 74 72 2c 20 26 bj(tmpPathPtr, &
119d0 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 len);.. Tcl_S
119e0 65 74 53 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 etStringObj(path
119f0 50 74 72 2c 20 70 61 74 68 2c 20 6c 65 6e 29 3b Ptr, path, len);
11a00 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 .. Tcl_DecrRe
11a10 66 43 6f 75 6e 74 28 74 6d 70 50 61 74 68 50 74 fCount(tmpPathPt
11a20 72 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 r);..} else {..
11a30 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45 6e /*.. * En
11a40 64 20 6f 66 20 73 74 72 69 6e 67 20 77 61 73 20 d of string was
11a50 72 65 61 63 68 65 64 20 61 62 6f 76 65 2e 0a 09 reached above...
11a60 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 */... Tc
11a70 6c 5f 53 65 74 53 74 72 69 6e 67 4f 62 6a 28 70 l_SetStringObj(p
11a80 61 74 68 50 74 72 2c 20 54 63 6c 5f 44 53 74 72 athPtr, Tcl_DStr
11a90 69 6e 67 56 61 6c 75 65 28 26 64 73 29 2c 20 6e ingValue(&ds), n
11aa0 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 29 3b 0a extCheckpoint);.
11ab0 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 .}..Tcl_DStringF
11ac0 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 7d 0a ree(&ds);. }.
11ad0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 Tcl_DStringF
11ae0 72 65 65 28 26 64 73 4e 6f 72 6d 29 3b 0a 0a 20 ree(&dsNorm);..
11af0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 69 /*. * Thi
11b00 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 61 s must be done a
11b10 66 74 65 72 20 77 65 20 61 72 65 20 74 6f 74 61 fter we are tota
11b20 6c 6c 79 20 66 69 6e 69 73 68 65 64 20 77 69 74 lly finished wit
11b30 68 20 27 70 61 74 68 27 20 61 73 20 77 65 20 61 h 'path' as we a
11b40 72 65 0a 20 20 20 20 20 2a 20 73 68 61 72 69 6e re. * sharin
11b50 67 20 74 68 65 20 73 61 6d 65 20 75 6e 64 65 72 g the same under
11b60 6c 79 69 6e 67 20 73 74 72 69 6e 67 2e 0a 20 20 lying string..
11b70 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 74 */.. if (t
11b80 65 6d 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 emp != NULL) {..
11b90 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
11ba0 28 74 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 (temp);. }..
11bb0 20 20 20 72 65 74 75 72 6e 20 6e 65 78 74 43 68 return nextCh
11bc0 65 63 6b 70 6f 69 6e 74 3b 0a 7d 0a 0c 0a 2f 2a eckpoint;.}.../*
11bd0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
11be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
11c20 2a 0a 20 2a 20 54 63 6c 57 69 6e 56 6f 6c 75 6d *. * TclWinVolum
11c30 65 52 65 6c 61 74 69 76 65 4e 6f 72 6d 61 6c 69 eRelativeNormali
11c40 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 4f 6e 6c 79 ze --. *. *.Only
11c50 20 57 69 6e 64 6f 77 73 20 68 61 73 20 76 6f 6c Windows has vol
11c60 75 6d 65 2d 72 65 6c 61 74 69 76 65 20 70 61 74 ume-relative pat
11c70 68 73 2e 20 54 68 65 73 65 20 70 61 74 68 73 20 hs. These paths
11c80 61 72 65 20 72 61 74 68 65 72 20 72 61 72 65 2c are rather rare,
11c90 0a 20 2a 09 62 75 74 20 69 74 20 69 73 20 6e 69 . *.but it is ni
11ca0 63 65 20 69 66 20 54 63 6c 20 63 61 6e 20 68 61 ce if Tcl can ha
11cb0 6e 64 6c 65 20 74 68 65 6d 2e 20 49 74 20 69 73 ndle them. It is
11cc0 20 6d 75 63 68 20 62 65 74 74 65 72 20 69 66 20 much better if
11cd0 77 65 20 63 61 6e 0a 20 2a 09 68 61 6e 64 6c 65 we can. *.handle
11ce0 20 74 68 65 6d 20 68 65 72 65 2c 20 72 61 74 68 them here, rath
11cf0 65 72 20 74 68 61 6e 20 69 6e 20 74 68 65 20 6e er than in the n
11d00 61 74 69 76 65 20 66 73 20 63 6f 64 65 2c 20 62 ative fs code, b
11d10 65 63 61 75 73 65 20 77 65 20 72 65 61 6c 6c 79 ecause we really
11d20 0a 20 2a 09 6e 65 65 64 20 74 6f 20 68 61 76 65 . *.need to have
11d30 20 61 20 72 65 61 6c 20 61 62 73 6f 6c 75 74 65 a real absolute
11d40 20 70 61 74 68 20 6a 75 73 74 20 62 65 6c 6f 77 path just below
11d50 2e 0a 20 2a 0a 20 2a 09 57 65 20 64 6f 20 6e 6f .. *. *.We do no
11d60 74 20 6c 65 74 20 74 68 69 73 20 62 6c 6f 63 6b t let this block
11d70 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 6e 6f 6e 2d compile on non-
11d80 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d Windows platform
11d90 73 20 62 65 63 61 75 73 65 20 74 68 65 0a 20 2a s because the. *
11da0 09 74 65 73 74 20 73 75 69 74 65 27 73 20 6d 61 .test suite's ma
11db0 6e 75 61 6c 20 66 6f 72 63 69 6e 67 20 6f 66 20 nual forcing of
11dc0 74 63 6c 50 6c 61 74 66 6f 72 6d 20 63 61 6e 20 tclPlatform can
11dd0 6f 74 68 65 72 77 69 73 65 20 63 61 75 73 65 20 otherwise cause
11de0 74 68 69 73 0a 20 2a 09 63 6f 64 65 20 70 61 74 this. *.code pat
11df0 68 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 h to be executed
11e00 2c 20 63 61 75 73 69 6e 67 20 76 61 72 69 6f 75 , causing variou
11e10 73 20 65 72 72 6f 72 73 20 62 65 63 61 75 73 65 s errors because
11e20 0a 20 2a 09 76 6f 6c 75 6d 65 2d 72 65 6c 61 74 . *.volume-relat
11e30 69 76 65 20 70 61 74 68 73 20 72 65 61 6c 6c 79 ive paths really
11e40 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 do not exist..
11e50 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
11e60 09 41 20 76 61 6c 69 64 20 6e 6f 72 6d 61 6c 69 .A valid normali
11e70 7a 65 64 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 zed path.. *. *
11e80 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
11e90 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
11ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11ee0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c -------. */..Tcl
11ef0 5f 4f 62 6a 20 2a 0a 54 63 6c 57 69 6e 56 6f 6c _Obj *.TclWinVol
11f00 75 6d 65 52 65 6c 61 74 69 76 65 4e 6f 72 6d 61 umeRelativeNorma
11f10 6c 69 7a 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e lize(. Tcl_In
11f20 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
11f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 const char *pa
11f40 74 68 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 th,. Tcl_Obj
11f50 2a 2a 75 73 65 54 68 69 73 43 77 64 50 74 72 29 **useThisCwdPtr)
11f60 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a .{. Tcl_Obj *
11f70 61 62 73 6f 6c 75 74 65 50 61 74 68 2c 20 2a 75 absolutePath, *u
11f80 73 65 54 68 69 73 43 77 64 3b 0a 0a 20 20 20 20 seThisCwd;..
11f90 75 73 65 54 68 69 73 43 77 64 20 3d 20 54 63 6c useThisCwd = Tcl
11fa0 5f 46 53 47 65 74 43 77 64 28 69 6e 74 65 72 70 _FSGetCwd(interp
11fb0 29 3b 0a 20 20 20 20 69 66 20 28 75 73 65 54 68 );. if (useTh
11fc0 69 73 43 77 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b isCwd == NULL) {
11fd0 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
11fe0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 70 61 }.. if (pa
11ff0 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 29 20 7b 0a th[0] == '/') {.
12000 09 2f 2a 0a 09 20 2a 20 50 61 74 68 20 6f 66 20 ./*.. * Path of
12010 66 6f 72 6d 20 2f 66 6f 6f 2f 62 61 72 20 77 68 form /foo/bar wh
12020 69 63 68 20 69 73 20 61 20 70 61 74 68 20 69 6e ich is a path in
12030 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74 the root direct
12040 6f 72 79 20 6f 66 20 74 68 65 0a 09 20 2a 20 63 ory of the.. * c
12050 75 72 72 65 6e 74 20 76 6f 6c 75 6d 65 2e 0a 09 urrent volume...
12060 20 2a 2f 0a 0a 09 63 6f 6e 73 74 20 63 68 61 72 */...const char
12070 20 2a 64 72 69 76 65 20 3d 20 54 63 6c 5f 47 65 *drive = Tcl_Ge
12080 74 53 74 72 69 6e 67 28 75 73 65 54 68 69 73 43 tString(useThisC
12090 77 64 29 3b 0a 0a 09 61 62 73 6f 6c 75 74 65 50 wd);...absoluteP
120a0 61 74 68 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 ath = Tcl_NewStr
120b0 69 6e 67 4f 62 6a 28 64 72 69 76 65 2c 32 29 3b ingObj(drive,2);
120c0 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 ..Tcl_AppendToOb
120d0 6a 28 61 62 73 6f 6c 75 74 65 50 61 74 68 2c 20 j(absolutePath,
120e0 70 61 74 68 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f path, -1);..Tcl_
120f0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 62 73 IncrRefCount(abs
12100 6f 6c 75 74 65 50 61 74 68 29 3b 0a 0a 09 2f 2a olutePath);.../*
12110 0a 09 20 2a 20 57 65 20 68 61 76 65 20 61 20 72 .. * We have a r
12120 65 66 43 6f 75 6e 74 20 6f 6e 20 74 68 65 20 63 efCount on the c
12130 77 64 2e 0a 09 20 2a 2f 0a 20 20 20 20 7d 20 65 wd... */. } e
12140 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 50 61 lse {../*.. * Pa
12150 74 68 20 6f 66 20 66 6f 72 6d 20 43 3a 66 6f 6f th of form C:foo
12160 2f 62 61 72 2c 20 62 75 74 20 74 68 69 73 20 6f /bar, but this o
12170 6e 6c 79 20 6d 61 6b 65 73 20 73 65 6e 73 65 20 nly makes sense
12180 69 66 20 74 68 65 20 63 77 64 20 69 73 0a 09 20 if the cwd is..
12190 2a 20 61 6c 73 6f 20 6f 6e 20 64 72 69 76 65 20 * also on drive
121a0 43 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20 63 77 C... */...int cw
121b0 64 4c 65 6e 3b 0a 09 63 6f 6e 73 74 20 63 68 61 dLen;..const cha
121c0 72 20 2a 64 72 69 76 65 20 3d 0a 09 09 54 63 6c r *drive =...Tcl
121d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
121e0 6a 28 75 73 65 54 68 69 73 43 77 64 2c 20 26 63 j(useThisCwd, &c
121f0 77 64 4c 65 6e 29 3b 0a 09 63 68 61 72 20 64 72 wdLen);..char dr
12200 69 76 65 5f 63 75 72 20 3d 20 70 61 74 68 5b 30 ive_cur = path[0
12210 5d 3b 0a 0a 09 69 66 20 28 64 72 69 76 65 5f 63 ];...if (drive_c
12220 75 72 20 3e 3d 20 27 61 27 29 20 7b 0a 09 20 20 ur >= 'a') {..
12230 20 20 64 72 69 76 65 5f 63 75 72 20 2d 3d 20 28 drive_cur -= (
12240 27 61 27 20 2d 20 27 41 27 29 3b 0a 09 7d 0a 09 'a' - 'A');..}..
12250 69 66 20 28 64 72 69 76 65 5b 30 5d 20 3d 3d 20 if (drive[0] ==
12260 64 72 69 76 65 5f 63 75 72 29 20 7b 0a 09 20 20 drive_cur) {..
12270 20 20 61 62 73 6f 6c 75 74 65 50 61 74 68 20 3d absolutePath =
12280 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 Tcl_DuplicateOb
12290 6a 28 75 73 65 54 68 69 73 43 77 64 29 3b 0a 0a j(useThisCwd);..
122a0 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
122b0 57 65 20 68 61 76 65 20 61 20 72 65 66 43 6f 75 We have a refCou
122c0 6e 74 20 6f 6e 20 74 68 65 20 63 77 64 2c 20 77 nt on the cwd, w
122d0 68 69 63 68 20 77 65 20 77 69 6c 6c 20 72 65 6c hich we will rel
122e0 65 61 73 65 20 6c 61 74 65 72 2e 0a 09 20 20 20 ease later...
122f0 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 64 */... if (d
12300 72 69 76 65 5b 63 77 64 4c 65 6e 2d 31 5d 20 21 rive[cwdLen-1] !
12310 3d 20 27 2f 27 20 26 26 20 28 70 61 74 68 5b 32 = '/' && (path[2
12320 5d 20 21 3d 20 27 5c 30 27 29 29 20 7b 0a 09 09 ] != '\0')) {...
12330 2f 2a 0a 09 09 20 2a 20 4f 6e 6c 79 20 61 64 64 /*... * Only add
12340 20 61 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 a trailing '/'
12350 69 66 20 6e 65 65 64 65 64 2c 20 77 68 69 63 68 if needed, which
12360 20 69 73 20 69 66 20 74 68 65 72 65 20 69 73 6e is if there isn
12370 27 74 0a 09 09 20 2a 20 6f 6e 65 20 61 6c 72 65 't... * one alre
12380 61 64 79 2c 20 61 6e 64 20 69 66 20 77 65 20 61 ady, and if we a
12390 72 65 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 re going to be a
123a0 64 64 69 6e 67 20 73 6f 6d 65 20 6d 6f 72 65 0a dding some more.
123b0 09 09 20 2a 20 63 68 61 72 61 63 74 65 72 73 2e .. * characters.
123c0 0a 09 09 20 2a 2f 0a 0a 09 09 54 63 6c 5f 41 70 ... */....Tcl_Ap
123d0 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 pendToObj(absolu
123e0 74 65 50 61 74 68 2c 20 22 2f 22 2c 20 31 29 3b tePath, "/", 1);
123f0 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 .. }..} else
12400 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 {.. Tcl_DecrR
12410 65 66 43 6f 75 6e 74 28 75 73 65 54 68 69 73 43 efCount(useThisC
12420 77 64 29 3b 0a 09 20 20 20 20 75 73 65 54 68 69 wd);.. useThi
12430 73 43 77 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 20 sCwd = NULL;...
12440 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 /*.. * Th
12450 65 20 70 61 74 68 20 69 73 20 6e 6f 74 20 69 6e e path is not in
12460 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 72 69 the current dri
12470 76 65 2c 20 62 75 74 20 69 73 20 76 6f 6c 75 6d ve, but is volum
12480 65 2d 72 65 6c 61 74 69 76 65 2e 0a 09 20 20 20 e-relative...
12490 20 20 2a 20 54 68 65 20 77 61 79 20 54 63 6c 20 * The way Tcl
124a0 38 2e 33 20 68 61 6e 64 6c 65 73 20 74 68 69 73 8.3 handles this
124b0 20 69 73 20 74 68 61 74 20 69 74 20 74 72 65 61 is that it trea
124c0 74 73 20 73 75 63 68 20 61 20 70 61 74 68 20 61 ts such a path a
124d0 73 0a 09 20 20 20 20 20 2a 20 72 65 6c 61 74 69 s.. * relati
124e0 76 65 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f ve to the root o
124f0 66 20 74 68 65 20 64 72 69 76 65 2e 20 57 65 20 f the drive. We
12500 74 68 65 72 65 66 6f 72 65 20 62 65 68 61 76 65 therefore behave
12510 20 74 68 65 20 73 61 6d 65 0a 09 20 20 20 20 20 the same..
12520 2a 20 68 65 72 65 2e 20 54 68 69 73 20 62 65 68 * here. This beh
12530 61 76 69 6f 75 72 20 69 73 2c 20 68 6f 77 65 76 aviour is, howev
12540 65 72 2c 20 64 69 66 66 65 72 65 6e 74 20 74 6f er, different to
12550 20 74 68 61 74 20 6f 66 20 74 68 65 0a 09 20 20 that of the..
12560 20 20 20 2a 20 77 69 6e 64 6f 77 73 20 63 6f 6d * windows com
12570 6d 61 6e 64 2d 6c 69 6e 65 2e 20 49 66 20 77 65 mand-line. If we
12580 20 77 61 6e 74 20 74 6f 20 66 69 78 20 74 68 69 want to fix thi
12590 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 s at some point
125a0 69 6e 0a 09 20 20 20 20 20 2a 20 74 68 65 20 66 in.. * the f
125b0 75 74 75 72 65 20 28 61 74 20 74 68 65 20 65 78 uture (at the ex
125c0 70 65 6e 73 65 20 6f 66 20 61 20 62 65 68 61 76 pense of a behav
125d0 69 6f 75 72 20 63 68 61 6e 67 65 20 74 6f 20 54 iour change to T
125e0 63 6c 29 2c 20 77 65 0a 09 20 20 20 20 20 2a 20 cl), we.. *
125f0 63 6f 75 6c 64 20 75 73 65 20 74 68 65 20 27 5f could use the '_
12600 64 67 65 74 64 63 77 64 27 20 57 69 6e 33 32 20 dgetdcwd' Win32
12610 41 50 49 20 74 6f 20 67 65 74 20 74 68 65 20 64 API to get the d
12620 72 69 76 65 27 73 20 63 77 64 2e 0a 09 20 20 20 rive's cwd...
12630 20 20 2a 2f 0a 0a 09 20 20 20 20 61 62 73 6f 6c */... absol
12640 75 74 65 50 61 74 68 20 3d 20 54 63 6c 5f 4e 65 utePath = Tcl_Ne
12650 77 53 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 2c wStringObj(path,
12660 20 32 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 2);.. Tcl_Ap
12670 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 pendToObj(absolu
12680 74 65 50 61 74 68 2c 20 22 2f 22 2c 20 31 29 3b tePath, "/", 1);
12690 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 ..}..Tcl_IncrRef
126a0 43 6f 75 6e 74 28 61 62 73 6f 6c 75 74 65 50 61 Count(absolutePa
126b0 74 68 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 th);..Tcl_Append
126c0 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 65 50 61 ToObj(absolutePa
126d0 74 68 2c 20 70 61 74 68 2b 32 2c 20 2d 31 29 3b th, path+2, -1);
126e0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 75 73 65 54 . }. *useT
126f0 68 69 73 43 77 64 50 74 72 20 3d 20 75 73 65 54 hisCwdPtr = useT
12700 68 69 73 43 77 64 3b 0a 20 20 20 20 72 65 74 75 hisCwd;. retu
12710 72 6e 20 61 62 73 6f 6c 75 74 65 50 61 74 68 3b rn absolutePath;
12720 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12770 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 -----. *. * Tclp
12780 4e 61 74 69 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a NativeToNormaliz
12790 65 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 ed --. *. *.Conv
127a0 65 72 74 20 6e 61 74 69 76 65 20 66 6f 72 6d 61 ert native forma
127b0 74 20 74 6f 20 61 20 6e 6f 72 6d 61 6c 69 7a 65 t to a normalize
127c0 64 20 70 61 74 68 20 6f 62 6a 65 63 74 2c 20 77 d path object, w
127d0 69 74 68 20 72 65 66 43 6f 75 6e 74 20 6f 66 0a ith refCount of.
127e0 20 2a 09 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 09 43 *.zero.. *. *.C
127f0 75 72 72 65 6e 74 6c 79 20 61 73 73 75 6d 65 73 urrently assumes
12800 20 61 6c 6c 20 6e 61 74 69 76 65 20 70 61 74 68 all native path
12810 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 6e s are actually n
12820 6f 72 6d 61 6c 69 7a 65 64 20 61 6c 72 65 61 64 ormalized alread
12830 79 2c 20 73 6f 0a 20 2a 09 69 66 20 74 68 65 20 y, so. *.if the
12840 70 61 74 68 20 67 69 76 65 6e 20 69 73 20 6e 6f path given is no
12850 74 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 74 68 69 t normalized thi
12860 73 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 s will actually
12870 6a 75 73 74 20 63 6f 6e 76 65 72 74 20 74 6f 0a just convert to.
12880 20 2a 09 61 20 76 61 6c 69 64 20 73 74 72 69 6e *.a valid strin
12890 67 20 70 61 74 68 2c 20 62 75 74 20 6e 6f 74 20 g path, but not
128a0 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 6e 6f necessarily a no
128b0 72 6d 61 6c 69 7a 65 64 20 6f 6e 65 2e 0a 20 2a rmalized one.. *
128c0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
128d0 41 20 76 61 6c 69 64 20 6e 6f 72 6d 61 6c 69 7a A valid normaliz
128e0 65 64 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 53 ed path.. *. * S
128f0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
12900 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12950 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f ------. */..Tcl_
12960 4f 62 6a 20 2a 0a 54 63 6c 70 4e 61 74 69 76 65 Obj *.TclpNative
12970 54 6f 4e 6f 72 6d 61 6c 69 7a 65 64 28 0a 20 20 ToNormalized(.
12980 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
12990 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20 20 20 54 entData).{. T
129a0 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 cl_DString ds;.
129b0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 Tcl_Obj *objP
129c0 74 72 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b tr;. int len;
129d0 0a 20 20 20 20 63 68 61 72 20 2a 63 6f 70 79 2c . char *copy,
129e0 20 2a 70 3b 0a 0a 20 20 20 20 54 63 6c 5f 57 69 *p;.. Tcl_Wi
129f0 6e 54 43 68 61 72 54 6f 55 74 66 28 28 54 43 48 nTCharToUtf((TCH
12a00 41 52 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 AR *) clientData
12a10 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 20 20 20 20 , -1, &ds);.
12a20 63 6f 70 79 20 3d 20 54 63 6c 5f 44 53 74 72 69 copy = Tcl_DStri
12a30 6e 67 56 61 6c 75 65 28 26 64 73 29 3b 0a 20 20 ngValue(&ds);.
12a40 20 20 6c 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 len = Tcl_DStr
12a50 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 3b 0a ingLength(&ds);.
12a60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 . /*. * C
12a70 65 72 74 61 69 6e 20 6e 61 74 69 76 65 20 70 61 ertain native pa
12a80 74 68 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f th representatio
12a90 6e 73 20 6f 6e 20 57 69 6e 64 6f 77 73 20 68 61 ns on Windows ha
12aa0 76 65 20 74 68 69 73 20 73 70 65 63 69 61 6c 20 ve this special
12ab0 70 72 65 66 69 78 0a 20 20 20 20 20 2a 20 74 6f prefix. * to
12ac0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 indicate that t
12ad0 68 65 79 20 61 72 65 20 74 6f 20 62 65 20 74 72 hey are to be tr
12ae0 65 61 74 65 64 20 73 70 65 63 69 61 6c 6c 79 2e eated specially.
12af0 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a 20 20 20 For example.
12b00 20 20 2a 20 65 78 74 72 65 6d 65 6c 79 20 6c 6f * extremely lo
12b10 6e 67 20 70 61 74 68 73 2c 20 6f 72 20 73 79 6d ng paths, or sym
12b20 6c 69 6e 6b 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a links.. */..
12b30 20 20 20 20 69 66 20 28 2a 63 6f 70 79 20 3d 3d if (*copy ==
12b40 20 27 5c 5c 27 29 20 7b 0a 09 69 66 20 28 30 20 '\\') {..if (0
12b50 3d 3d 20 73 74 72 6e 63 6d 70 28 63 6f 70 79 2c == strncmp(copy,
12b60 22 5c 5c 3f 3f 5c 5c 22 2c 34 29 29 20 7b 0a 09 "\\??\\",4)) {..
12b70 20 20 20 20 63 6f 70 79 20 2b 3d 20 34 3b 0a 09 copy += 4;..
12b80 20 20 20 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d len -= 4;..}
12b90 20 65 6c 73 65 20 69 66 20 28 30 20 3d 3d 20 73 else if (0 == s
12ba0 74 72 6e 63 6d 70 28 63 6f 70 79 2c 22 5c 5c 5c trncmp(copy,"\\\
12bb0 5c 3f 5c 5c 22 2c 34 29 29 20 7b 0a 09 20 20 20 \?\\",4)) {..
12bc0 20 63 6f 70 79 20 2b 3d 20 34 3b 0a 09 20 20 20 copy += 4;..
12bd0 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d 0a 20 20 len -= 4;..}.
12be0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
12bf0 20 2a 20 45 6e 73 75 72 65 20 77 65 20 61 72 65 * Ensure we are
12c00 20 75 73 69 6e 67 20 66 6f 72 77 61 72 64 20 73 using forward s
12c10 6c 61 73 68 65 73 20 6f 6e 6c 79 2e 0a 20 20 20 lashes only..
12c20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 70 */.. for (p
12c30 20 3d 20 63 6f 70 79 3b 20 2a 70 20 21 3d 20 27 = copy; *p != '
12c40 5c 30 27 3b 20 70 2b 2b 29 20 7b 0a 09 69 66 20 \0'; p++) {..if
12c50 28 2a 70 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 (*p == '\\') {..
12c60 20 20 20 20 2a 70 20 3d 20 27 2f 27 3b 0a 09 7d *p = '/';..}
12c70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 . }.. objP
12c80 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 tr = Tcl_NewStri
12c90 6e 67 4f 62 6a 28 63 6f 70 79 2c 6c 65 6e 29 3b ngObj(copy,len);
12ca0 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
12cb0 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 Free(&ds);..
12cc0 72 65 74 75 72 6e 20 6f 62 6a 50 74 72 3b 0a 7d return objPtr;.}
12cd0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
12ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d20 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4e 61 74 ---. *. * TclNat
12d30 69 76 65 43 72 65 61 74 65 4e 61 74 69 76 65 52 iveCreateNativeR
12d40 65 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 ep --. *. *.Crea
12d50 74 65 20 61 20 6e 61 74 69 76 65 20 72 65 70 72 te a native repr
12d60 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 esentation for t
12d70 68 65 20 67 69 76 65 6e 20 70 61 74 68 2e 0a 20 he given path..
12d80 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
12d90 09 54 68 65 20 6e 61 74 69 76 65 50 61 74 68 20 .The nativePath
12da0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a representation..
12db0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
12dc0 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 77 69 ts:. *.Memory wi
12dd0 6c 6c 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e ll be allocated.
12de0 20 54 68 65 20 70 61 74 68 20 6d 69 67 68 74 20 The path might
12df0 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0a 20 be normalized..
12e00 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
12e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
12e50 20 2a 2f 0a 0a 43 6c 69 65 6e 74 44 61 74 61 0a */..ClientData.
12e60 54 63 6c 4e 61 74 69 76 65 43 72 65 61 74 65 4e TclNativeCreateN
12e70 61 74 69 76 65 52 65 70 28 0a 20 20 20 20 54 63 ativeRep(. Tc
12e80 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 0a l_Obj *pathPtr).
12e90 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 6e 61 74 {. WCHAR *nat
12ea0 69 76 65 50 61 74 68 50 74 72 20 3d 20 4e 55 4c ivePathPtr = NUL
12eb0 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 L;. const cha
12ec0 72 20 2a 73 74 72 3b 0a 20 20 20 20 54 63 6c 5f r *str;. Tcl_
12ed0 4f 62 6a 20 2a 76 61 6c 69 64 50 61 74 68 50 74 Obj *validPathPt
12ee0 72 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 r;. size_t le
12ef0 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 2a 77 70 n;. WCHAR *wp
12f00 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 46 53 ;.. if (TclFS
12f10 43 77 64 49 73 4e 61 74 69 76 65 28 29 29 20 7b CwdIsNative()) {
12f20 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 63 77 64 ../*.. * The cwd
12f30 20 69 73 20 6e 61 74 69 76 65 2c 20 77 68 69 63 is native, whic
12f40 68 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 75 h means we can u
12f50 73 65 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 se the translate
12f60 64 20 70 61 74 68 0a 09 20 2a 20 77 69 74 68 6f d path.. * witho
12f70 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 ut worrying abou
12f80 74 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 t normalization
12f90 28 74 68 69 73 20 77 69 6c 6c 20 61 6c 73 6f 20 (this will also
12fa0 75 73 75 61 6c 6c 79 20 62 65 0a 09 20 2a 20 73 usually be.. * s
12fb0 68 6f 72 74 65 72 20 73 6f 20 74 68 65 20 75 74 horter so the ut
12fc0 66 2d 74 6f 2d 65 78 74 65 72 6e 61 6c 20 63 6f f-to-external co
12fd0 6e 76 65 72 73 69 6f 6e 20 77 69 6c 6c 20 62 65 nversion will be
12fe0 20 73 6f 6d 65 77 68 61 74 20 66 61 73 74 65 72 somewhat faster
12ff0 29 2e 0a 09 20 2a 2f 0a 0a 09 76 61 6c 69 64 50 )... */...validP
13000 61 74 68 50 74 72 20 3d 20 54 63 6c 5f 46 53 47 athPtr = Tcl_FSG
13010 65 74 54 72 61 6e 73 6c 61 74 65 64 50 61 74 68 etTranslatedPath
13020 28 4e 55 4c 4c 2c 20 70 61 74 68 50 74 72 29 3b (NULL, pathPtr);
13030 0a 09 69 66 20 28 76 61 6c 69 64 50 61 74 68 50 ..if (validPathP
13040 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 tr == NULL) {..
13050 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a return NULL;.
13060 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 72 65 66 43 .}.../*.. * refC
13070 6f 75 6e 74 20 6f 66 20 76 61 6c 69 64 50 61 74 ount of validPat
13080 68 50 74 72 20 77 61 73 20 61 6c 72 65 61 64 79 hPtr was already
13090 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 69 6e 0a incremented in.
130a0 09 20 2a 20 54 63 6c 5f 46 53 47 65 74 54 72 61 . * Tcl_FSGetTra
130b0 6e 73 6c 61 74 65 64 50 61 74 68 0a 09 20 2a 2f nslatedPath.. */
130c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
130d0 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 *.. * Make sure
130e0 74 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 the normalized p
130f0 61 74 68 20 69 73 20 73 65 74 2e 0a 09 20 2a 2f ath is set... */
13100 0a 0a 09 76 61 6c 69 64 50 61 74 68 50 74 72 20 ...validPathPtr
13110 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 = Tcl_FSGetNorma
13120 6c 69 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 lizedPath(NULL,
13130 70 61 74 68 50 74 72 29 3b 0a 09 69 66 20 28 76 pathPtr);..if (v
13140 61 6c 69 64 50 61 74 68 50 74 72 20 3d 3d 20 4e alidPathPtr == N
13150 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ULL) {.. retu
13160 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a rn NULL;..}.../*
13170 0a 09 20 2a 20 76 61 6c 69 64 50 61 74 68 50 74 .. * validPathPt
13180 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 r returned from
13190 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 Tcl_FSGetNormali
131a0 7a 65 64 50 61 74 68 20 69 73 20 6f 77 6e 65 64 zedPath is owned
131b0 20 62 79 20 54 63 6c 2c 0a 09 20 2a 20 73 6f 20 by Tcl,.. * so
131c0 69 6e 63 72 20 72 65 66 43 6f 75 6e 74 20 68 65 incr refCount he
131d0 72 65 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e re.. */...Tcl_In
131e0 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c 69 64 crRefCount(valid
131f0 50 61 74 68 50 74 72 29 3b 0a 20 20 20 20 7d 0a PathPtr);. }.
13200 0a 20 20 20 20 73 74 72 20 3d 20 54 63 6c 5f 47 . str = Tcl_G
13210 65 74 53 74 72 69 6e 67 28 76 61 6c 69 64 50 61 etString(validPa
13220 74 68 50 74 72 29 3b 0a 20 20 20 20 6c 65 6e 20 thPtr);. len
13230 3d 20 76 61 6c 69 64 50 61 74 68 50 74 72 2d 3e = validPathPtr->
13240 6c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 69 66 20 length;.. if
13250 28 73 74 72 6c 65 6e 28 73 74 72 29 20 21 3d 20 (strlen(str) !=
13260 6c 65 6e 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 len) {../*.. * S
13270 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 4e tring contains N
13280 55 4c 2d 62 79 74 65 73 2e 20 54 68 69 73 20 69 UL-bytes. This i
13290 73 20 69 6e 76 61 6c 69 64 2e 0a 09 20 2a 2f 0a s invalid... */.
132a0 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 ..goto done;.
132b0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
132c0 2a 20 46 6f 72 20 61 20 72 65 73 65 72 76 65 64 * For a reserved
132d0 20 64 65 76 69 63 65 2c 20 73 74 72 69 70 20 61 device, strip a
132e0 20 70 6f 73 73 69 62 6c 65 20 70 6f 73 74 66 69 possible postfi
132f0 78 20 27 3a 27 0a 20 20 20 20 20 2a 2f 0a 0a 20 x ':'. */..
13300 20 20 20 6c 65 6e 20 3d 20 57 69 6e 49 73 52 65 len = WinIsRe
13310 73 65 72 76 65 64 28 73 74 72 29 3b 0a 20 20 20 served(str);.
13320 20 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b if (len == 0) {
13330 0a 09 2f 2a 0a 09 20 2a 20 4c 65 74 20 4d 75 6c ../*.. * Let Mul
13340 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 tiByteToWideChar
13350 20 63 68 65 63 6b 20 66 6f 72 20 6f 74 68 65 72 check for other
13360 20 69 6e 76 61 6c 69 64 20 73 65 71 75 65 6e 63 invalid sequenc
13370 65 73 2c 20 6c 69 6b 65 0a 09 20 2a 20 30 78 43 es, like.. * 0xC
13380 30 20 30 78 38 30 20 28 3d 3d 20 6f 76 65 72 6c 0 0x80 (== overl
13390 6f 6e 67 20 4e 55 4c 29 2e 20 53 65 65 20 62 75 ong NUL). See bu
133a0 67 20 5b 33 31 31 38 34 38 39 5d 3a 20 4e 55 4c g [3118489]: NUL
133b0 20 69 6e 20 66 69 6c 65 6e 61 6d 65 73 0a 09 20 in filenames..
133c0 2a 2f 0a 0a 09 6c 65 6e 20 3d 20 4d 75 6c 74 69 */...len = Multi
133d0 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 ByteToWideChar(C
133e0 50 5f 55 54 46 38 2c 20 4d 42 5f 45 52 52 5f 49 P_UTF8, MB_ERR_I
133f0 4e 56 41 4c 49 44 5f 43 48 41 52 53 2c 20 73 74 NVALID_CHARS, st
13400 72 2c 20 2d 31 2c 20 30 2c 20 30 29 3b 0a 09 69 r, -1, 0, 0);..i
13410 66 20 28 6c 65 6e 3d 3d 30 29 20 7b 0a 09 20 20 f (len==0) {..
13420 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a goto done;..}.
13430 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
13440 20 20 20 2a 20 4f 76 65 72 61 6c 6c 6f 63 61 74 * Overallocat
13450 65 20 36 20 63 68 61 72 73 2c 20 6d 61 6b 69 6e e 6 chars, makin
13460 67 20 73 6f 6d 65 20 72 6f 6f 6d 20 66 6f 72 20 g some room for
13470 65 78 74 65 6e 64 65 64 20 70 61 74 68 73 0a 20 extended paths.
13480 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77 70 20 3d */.. wp =
13490 20 6e 61 74 69 76 65 50 61 74 68 50 74 72 20 3d nativePathPtr =
134a0 20 28 57 43 48 41 52 20 2a 29 63 6b 61 6c 6c 6f (WCHAR *)ckallo
134b0 63 28 28 6c 65 6e 20 2b 20 36 29 20 2a 20 73 69 c((len + 6) * si
134c0 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 20 20 zeof(WCHAR));.
134d0 20 20 69 66 20 28 6e 61 74 69 76 65 50 61 74 68 if (nativePath
134e0 50 74 72 3d 3d 30 29 20 7b 0a 20 20 20 20 20 20 Ptr==0) {.
134f0 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d goto done;. }
13500 0a 20 20 20 20 4d 75 6c 74 69 42 79 74 65 54 6f . MultiByteTo
13510 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 WideChar(CP_UTF8
13520 2c 20 4d 42 5f 45 52 52 5f 49 4e 56 41 4c 49 44 , MB_ERR_INVALID
13530 5f 43 48 41 52 53 2c 20 73 74 72 2c 20 2d 31 2c _CHARS, str, -1,
13540 20 6e 61 74 69 76 65 50 61 74 68 50 74 72 2c 0a nativePathPtr,.
13550 09 20 20 20 20 6c 65 6e 20 2b 20 32 29 3b 0a 20 . len + 2);.
13560 20 20 20 6e 61 74 69 76 65 50 61 74 68 50 74 72 nativePathPtr
13570 5b 6c 65 6e 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 [len] = 0;..
13580 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 70 61 74 /*. * If pat
13590 68 20 73 74 61 72 74 73 20 77 69 74 68 20 22 2f h starts with "/
135a0 2f 3f 2f 22 20 6f 72 20 22 5c 5c 3f 5c 22 20 28 /?/" or "\\?\" (
135b0 65 78 74 65 6e 64 65 64 20 70 61 74 68 29 2c 20 extended path),
135c0 74 72 61 6e 73 6c 61 74 65 20 61 6e 79 0a 20 20 translate any.
135d0 20 20 20 2a 20 73 6c 61 73 68 65 73 20 74 6f 20 * slashes to
135e0 62 61 63 6b 73 6c 61 73 68 65 73 20 62 75 74 20 backslashes but
135f0 6c 65 61 76 65 20 74 68 65 20 27 3f 27 20 69 6e leave the '?' in
13600 74 61 63 74 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 tact. */..
13610 20 20 69 66 20 28 28 73 74 72 5b 30 5d 20 3d 3d if ((str[0] ==
13620 20 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 30 5d 20 '\\' || str[0]
13630 3d 3d 20 27 2f 27 29 20 26 26 20 28 73 74 72 5b == '/') && (str[
13640 31 5d 20 3d 3d 20 27 5c 5c 27 20 7c 7c 20 73 74 1] == '\\' || st
13650 72 5b 31 5d 20 3d 3d 20 27 2f 27 29 0a 09 20 20 r[1] == '/')..
13660 20 20 26 26 20 73 74 72 5b 32 5d 20 3d 3d 20 27 && str[2] == '
13670 3f 27 20 26 26 20 28 73 74 72 5b 33 5d 20 3d 3d ?' && (str[3] ==
13680 20 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 33 5d 20 '\\' || str[3]
13690 3d 3d 20 27 2f 27 29 29 20 7b 0a 09 77 70 5b 30 == '/')) {..wp[0
136a0 5d 20 3d 20 77 70 5b 31 5d 20 3d 20 77 70 5b 33 ] = wp[1] = wp[3
136b0 5d 20 3d 20 27 5c 5c 27 3b 0a 09 73 74 72 20 2b ] = '\\';..str +
136c0 3d 20 34 3b 0a 09 77 70 20 2b 3d 20 34 3b 0a 20 = 4;..wp += 4;.
136d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
136e0 20 20 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 * If there is
136f0 6e 6f 20 22 5c 5c 3f 5c 22 20 70 72 65 66 69 78 no "\\?\" prefix
13700 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 but there is a
13710 64 72 69 76 65 20 6f 72 20 55 4e 43 20 70 61 74 drive or UNC pat
13720 68 20 70 72 65 66 69 78 0a 20 20 20 20 20 2a 20 h prefix. *
13730 61 6e 64 20 74 68 65 20 70 61 74 68 20 69 73 20 and the path is
13740 6c 61 72 67 65 72 20 74 68 61 6e 20 4d 41 58 5f larger than MAX_
13750 50 41 54 48 20 63 68 61 72 73 2c 20 6e 6f 20 57 PATH chars, no W
13760 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f in32 API functio
13770 6e 20 63 61 6e 0a 20 20 20 20 20 2a 20 68 61 6e n can. * han
13780 64 6c 65 20 74 68 61 74 20 75 6e 6c 65 73 73 20 dle that unless
13790 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 it is prefixed w
137a0 69 74 68 20 74 68 65 20 65 78 74 65 6e 64 65 64 ith the extended
137b0 20 70 61 74 68 20 70 72 65 66 69 78 2e 20 53 65 path prefix. Se
137c0 65 3a 0a 20 20 20 20 20 2a 20 3c 68 74 74 70 73 e:. * <https
137d0 3a 2f 2f 64 6f 63 73 2e 6d 69 63 72 6f 73 6f 66 ://docs.microsof
137e0 74 2e 63 6f 6d 2f 65 6e 2d 75 73 2f 77 69 6e 64 t.com/en-us/wind
137f0 6f 77 73 2f 77 69 6e 33 32 2f 66 69 6c 65 69 6f ows/win32/fileio
13800 2f 6e 61 6d 69 6e 67 2d 61 2d 66 69 6c 65 23 6d /naming-a-file#m
13810 61 78 70 61 74 68 3e 0a 20 20 20 20 20 2a 2f 0a axpath>. */.
13820 0a 20 20 20 20 69 66 20 28 28 28 73 74 72 5b 30 . if (((str[0
13830 5d 20 3e 3d 20 27 41 27 20 26 26 20 73 74 72 5b ] >= 'A' && str[
13840 30 5d 20 3c 3d 20 27 5a 27 29 20 7c 7c 20 28 73 0] <= 'Z') || (s
13850 74 72 5b 30 5d 20 3e 3d 20 27 61 27 20 26 26 20 tr[0] >= 'a' &&
13860 73 74 72 5b 30 5d 20 3c 3d 20 27 7a 27 29 29 0a str[0] <= 'z')).
13870 09 20 20 20 20 26 26 20 73 74 72 5b 31 5d 20 3d . && str[1] =
13880 3d 20 27 3a 27 29 20 7b 0a 09 69 66 20 28 77 70 = ':') {..if (wp
13890 20 3d 3d 20 6e 61 74 69 76 65 50 61 74 68 50 74 == nativePathPt
138a0 72 20 26 26 20 6c 65 6e 20 3e 20 4d 41 58 5f 50 r && len > MAX_P
138b0 41 54 48 0a 09 09 26 26 20 28 73 74 72 5b 32 5d ATH...&& (str[2]
138c0 20 3d 3d 20 27 5c 5c 27 20 7c 7c 20 73 74 72 5b == '\\' || str[
138d0 32 5d 20 3d 3d 20 27 2f 27 29 29 20 7b 0a 09 20 2] == '/')) {..
138e0 20 20 20 6d 65 6d 6d 6f 76 65 28 77 70 20 2b 20 memmove(wp +
138f0 34 2c 20 77 70 2c 20 6c 65 6e 20 2a 20 73 69 7a 4, wp, len * siz
13900 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 09 20 20 eof(WCHAR));..
13910 20 20 6d 65 6d 63 70 79 28 77 70 2c 20 4c 22 5c memcpy(wp, L"\
13920 5c 5c 5c 3f 5c 5c 22 2c 20 34 20 2a 20 73 69 7a \\\?\\", 4 * siz
13930 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 09 20 20 eof(WCHAR));..
13940 20 20 77 70 20 2b 3d 20 34 3b 0a 09 7d 0a 0a 09 wp += 4;..}...
13950 2f 2a 0a 09 20 2a 20 49 66 20 28 72 65 6d 61 69 /*.. * If (remai
13960 6e 64 65 72 20 6f 66 29 20 70 61 74 68 20 73 74 nder of) path st
13970 61 72 74 73 20 77 69 74 68 20 22 3c 64 72 69 76 arts with "<driv
13980 65 3e 3a 22 2c 20 6c 65 61 76 65 20 74 68 65 20 e>:", leave the
13990 27 3a 27 0a 09 20 2a 20 69 6e 74 61 63 74 2e 0a ':'.. * intact..
139a0 09 20 2a 2f 0a 0a 09 77 70 20 2b 3d 20 32 3b 0a . */...wp += 2;.
139b0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 } else if (w
139c0 70 20 3d 3d 20 6e 61 74 69 76 65 50 61 74 68 50 p == nativePathP
139d0 74 72 20 26 26 20 6c 65 6e 20 3e 20 4d 41 58 5f tr && len > MAX_
139e0 50 41 54 48 0a 09 20 20 20 20 26 26 20 28 73 74 PATH.. && (st
139f0 72 5b 30 5d 20 3d 3d 20 27 5c 5c 27 20 7c 7c 20 r[0] == '\\' ||
13a00 73 74 72 5b 30 5d 20 3d 3d 20 27 2f 27 29 0a 09 str[0] == '/')..
13a10 20 20 20 20 26 26 20 28 73 74 72 5b 31 5d 20 3d && (str[1] =
13a20 3d 20 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 31 5d = '\\' || str[1]
13a30 20 3d 3d 20 27 2f 27 29 20 26 26 20 73 74 72 5b == '/') && str[
13a40 32 5d 20 21 3d 20 27 3f 27 29 20 7b 0a 09 6d 65 2] != '?') {..me
13a50 6d 6d 6f 76 65 28 77 70 20 2b 20 36 2c 20 77 70 mmove(wp + 6, wp
13a60 2c 20 6c 65 6e 20 2a 20 73 69 7a 65 6f 66 28 57 , len * sizeof(W
13a70 43 48 41 52 29 29 3b 0a 09 6d 65 6d 63 70 79 28 CHAR));..memcpy(
13a80 77 70 2c 20 4c 22 5c 5c 5c 5c 3f 5c 5c 55 4e 43 wp, L"\\\\?\\UNC
13a90 22 2c 20 37 20 2a 20 73 69 7a 65 6f 66 28 57 43 ", 7 * sizeof(WC
13aa0 48 41 52 29 29 3b 0a 09 77 70 20 2b 3d 20 37 3b HAR));..wp += 7;
13ab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
13ac0 20 20 20 20 2a 20 49 6e 20 74 68 65 20 72 65 6d * In the rem
13ad0 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 ainder of the pa
13ae0 74 68 2c 20 74 72 61 6e 73 6c 61 74 65 20 69 6e th, translate in
13af0 76 61 6c 69 64 20 63 68 61 72 61 63 74 65 72 73 valid characters
13b00 20 74 6f 0a 20 20 20 20 20 2a 20 63 68 61 72 61 to. * chara
13b10 63 74 65 72 73 20 69 6e 20 74 68 65 20 55 6e 69 cters in the Uni
13b20 63 6f 64 65 20 70 72 69 76 61 74 65 20 75 73 65 code private use
13b30 20 61 72 65 61 2e 0a 20 20 20 20 20 2a 2f 0a 0a area.. */..
13b40 20 20 20 20 77 68 69 6c 65 20 28 2a 77 70 20 21 while (*wp !
13b50 3d 20 27 5c 30 27 29 20 7b 0a 09 69 66 20 28 28 = '\0') {..if ((
13b60 2a 77 70 20 3c 20 27 20 27 29 20 7c 7c 20 77 63 *wp < ' ') || wc
13b70 73 63 68 72 28 4c 22 5c 22 2a 3a 3c 3e 3f 7c 22 schr(L"\"*:<>?|"
13b80 2c 20 2a 77 70 29 29 20 7b 0a 09 20 20 20 20 2a , *wp)) {.. *
13b90 77 70 20 7c 3d 20 30 78 46 30 30 30 3b 0a 09 7d wp |= 0xF000;..}
13ba0 20 65 6c 73 65 20 69 66 20 28 2a 77 70 20 3d 3d else if (*wp ==
13bb0 20 27 2f 27 29 20 7b 0a 09 20 20 20 20 2a 77 70 '/') {.. *wp
13bc0 20 3d 20 27 5c 5c 27 3b 0a 09 7d 0a 09 2b 2b 77 = '\\';..}..++w
13bd0 70 3b 0a 20 20 20 20 7d 0a 0a 20 20 64 6f 6e 65 p;. }.. done
13be0 3a 0a 20 20 20 20 54 63 6c 44 65 63 72 52 65 66 :. TclDecrRef
13bf0 43 6f 75 6e 74 28 76 61 6c 69 64 50 61 74 68 50 Count(validPathP
13c00 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 tr);. return
13c10 6e 61 74 69 76 65 50 61 74 68 50 74 72 3b 0a 7d nativePathPtr;.}
13c20 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
13c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c70 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4e 61 74 ---. *. * TclNat
13c80 69 76 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 iveDupInternalRe
13c90 70 20 2d 2d 0a 20 2a 0a 20 2a 09 44 75 70 6c 69 p --. *. *.Dupli
13ca0 63 61 74 65 20 74 68 65 20 6e 61 74 69 76 65 20 cate the native
13cb0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a representation..
13cc0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
13cd0 2a 09 54 68 65 20 63 6f 70 69 65 64 20 6e 61 74 *.The copied nat
13ce0 69 76 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 ive representati
13cf0 6f 6e 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 on, or NULL if i
13d00 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c t is not possibl
13d10 65 20 74 6f 0a 20 2a 09 63 6f 70 79 20 74 68 65 e to. *.copy the
13d20 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e representation.
13d30 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
13d40 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 61 cts:. *.Memory a
13d50 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 llocation for th
13d60 65 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d e copy.. *. *---
13d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13db0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c --------. */..Cl
13dc0 69 65 6e 74 44 61 74 61 0a 54 63 6c 4e 61 74 69 ientData.TclNati
13dd0 76 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 veDupInternalRep
13de0 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 (. ClientData
13df0 20 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 clientData).{.
13e00 20 20 20 63 68 61 72 20 2a 63 6f 70 79 3b 0a 20 char *copy;.
13e10 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 0a size_t len;..
13e20 20 20 20 20 69 66 20 28 63 6c 69 65 6e 74 44 61 if (clientDa
13e30 74 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 ta == NULL) {..r
13e40 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
13e50 7d 0a 0a 20 20 20 20 6c 65 6e 20 3d 20 73 69 7a }.. len = siz
13e60 65 6f 66 28 57 43 48 41 52 29 20 2a 20 28 77 63 eof(WCHAR) * (wc
13e70 73 6c 65 6e 28 28 63 6f 6e 73 74 20 57 43 48 41 slen((const WCHA
13e80 52 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 29 R *) clientData)
13e90 20 2b 20 31 29 3b 0a 0a 20 20 20 20 63 6f 70 79 + 1);.. copy
13ea0 20 3d 20 28 63 68 61 72 20 2a 29 63 6b 61 6c 6c = (char *)ckall
13eb0 6f 63 28 6c 65 6e 29 3b 0a 20 20 20 20 6d 65 6d oc(len);. mem
13ec0 63 70 79 28 63 6f 70 79 2c 20 63 6c 69 65 6e 74 cpy(copy, client
13ed0 44 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 Data, len);.
13ee0 72 65 74 75 72 6e 20 63 6f 70 79 3b 0a 7d 0a 0c return copy;.}..
13ef0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f40 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 55 74 69 6d -. *. * TclpUtim
13f50 65 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 74 20 74 e --. *. *.Set t
13f60 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 he modification
13f70 64 61 74 65 20 66 6f 72 20 61 20 66 69 6c 65 2e date for a file.
13f80 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13f90 20 2a 09 30 20 6f 6e 20 73 75 63 63 65 73 73 2c *.0 on success,
13fa0 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a -1 on error.. *
13fb0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
13fc0 3a 0a 20 2a 09 53 65 74 73 20 65 72 72 6e 6f 20 :. *.Sets errno
13fd0 74 6f 20 61 20 72 65 70 72 65 73 65 6e 74 61 74 to a representat
13fe0 69 6f 6e 20 6f 66 20 61 6e 79 20 57 69 6e 64 6f ion of any Windo
13ff0 77 73 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 27 ws problem that'
14000 73 20 6f 62 73 65 72 76 65 64 0a 20 2a 09 69 6e s observed. *.in
14010 20 74 68 65 20 70 72 6f 63 65 73 73 2e 0a 20 2a the process.. *
14020 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
14070 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 55 74 69 6d */..int.TclpUtim
14080 65 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a e(. Tcl_Obj *
14090 70 61 74 68 50 74 72 2c 09 09 2f 2a 20 46 69 6c pathPtr,../* Fil
140a0 65 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 e to modify */.
140b0 20 20 20 73 74 72 75 63 74 20 75 74 69 6d 62 75 struct utimbu
140c0 66 20 2a 74 76 61 6c 29 09 2f 2a 20 4e 65 77 20 f *tval)./* New
140d0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 64 61 74 modification dat
140e0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7b e structure */.{
140f0 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 . int res = 0
14100 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 66 69 6c ;. HANDLE fil
14110 65 48 61 6e 64 6c 65 3b 0a 20 20 20 20 63 6f 6e eHandle;. con
14120 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 st WCHAR *native
14130 3b 0a 20 20 20 20 44 57 4f 52 44 20 61 74 74 72 ;. DWORD attr
14140 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 = 0;. DWORD
14150 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 41 54 54 flags = FILE_ATT
14160 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 RIBUTE_NORMAL;.
14170 20 20 20 46 49 4c 45 54 49 4d 45 20 6c 61 73 74 FILETIME last
14180 41 63 63 65 73 73 54 69 6d 65 2c 20 6c 61 73 74 AccessTime, last
14190 4d 6f 64 54 69 6d 65 3b 0a 0a 20 20 20 20 46 72 ModTime;.. Fr
141a0 6f 6d 43 54 69 6d 65 28 74 76 61 6c 2d 3e 61 63 omCTime(tval->ac
141b0 74 69 6d 65 2c 20 26 6c 61 73 74 41 63 63 65 73 time, &lastAcces
141c0 73 54 69 6d 65 29 3b 0a 20 20 20 20 46 72 6f 6d sTime);. From
141d0 43 54 69 6d 65 28 74 76 61 6c 2d 3e 6d 6f 64 74 CTime(tval->modt
141e0 69 6d 65 2c 20 26 6c 61 73 74 4d 6f 64 54 69 6d ime, &lastModTim
141f0 65 29 3b 0a 0a 20 20 20 20 6e 61 74 69 76 65 20 e);.. native
14200 3d 20 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a = (const WCHAR *
14210 29 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 )Tcl_FSGetNative
14220 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a 0a Path(pathPtr);..
14230 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 attr = GetFi
14240 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 6e 61 leAttributesW(na
14250 74 69 76 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 tive);.. if (
14260 61 74 74 72 20 21 3d 20 49 4e 56 41 4c 49 44 5f attr != INVALID_
14270 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 FILE_ATTRIBUTES
14280 26 26 20 61 74 74 72 20 26 20 46 49 4c 45 5f 41 && attr & FILE_A
14290 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f TTRIBUTE_DIRECTO
142a0 52 59 29 20 7b 0a 09 66 6c 61 67 73 20 3d 20 46 RY) {..flags = F
142b0 49 4c 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f ILE_FLAG_BACKUP_
142c0 53 45 4d 41 4e 54 49 43 53 3b 0a 20 20 20 20 7d SEMANTICS;. }
142d0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
142e0 57 65 20 75 73 65 20 74 68 65 20 6e 61 74 69 76 We use the nativ
142f0 65 20 41 50 49 73 20 28 6e 6f 74 20 27 75 74 69 e APIs (not 'uti
14300 6d 65 27 29 20 62 65 63 61 75 73 65 20 74 68 65 me') because the
14310 72 65 20 61 72 65 20 73 6f 6d 65 20 64 61 79 6c re are some dayl
14320 69 67 68 74 0a 20 20 20 20 20 2a 20 73 61 76 69 ight. * savi
14330 6e 67 73 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e ngs complication
14340 73 20 74 68 61 74 20 75 74 69 6d 65 20 67 65 74 s that utime get
14350 73 20 77 72 6f 6e 67 2e 0a 20 20 20 20 20 2a 2f s wrong.. */
14360 0a 0a 20 20 20 20 66 69 6c 65 48 61 6e 64 6c 65 .. fileHandle
14370 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 6e = CreateFileW(n
14380 61 74 69 76 65 2c 20 46 49 4c 45 5f 57 52 49 54 ative, FILE_WRIT
14390 45 5f 41 54 54 52 49 42 55 54 45 53 2c 20 30 2c E_ATTRIBUTES, 0,
143a0 20 4e 55 4c 4c 2c 0a 09 20 20 20 20 4f 50 45 4e NULL,.. OPEN
143b0 5f 45 58 49 53 54 49 4e 47 2c 20 66 6c 61 67 73 _EXISTING, flags
143c0 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 , NULL);.. if
143d0 20 28 66 69 6c 65 48 61 6e 64 6c 65 20 3d 3d 20 (fileHandle ==
143e0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
143f0 41 4c 55 45 20 7c 7c 0a 09 20 20 20 20 21 53 65 ALUE ||.. !Se
14400 74 46 69 6c 65 54 69 6d 65 28 66 69 6c 65 48 61 tFileTime(fileHa
14410 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 26 6c 61 73 ndle, NULL, &las
14420 74 41 63 63 65 73 73 54 69 6d 65 2c 20 26 6c 61 tAccessTime, &la
14430 73 74 4d 6f 64 54 69 6d 65 29 29 20 7b 0a 09 54 stModTime)) {..T
14440 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
14450 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
14460 29 3b 0a 09 72 65 73 20 3d 20 2d 31 3b 0a 20 20 );..res = -1;.
14470 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 6c 65 }. if (file
14480 48 61 6e 64 6c 65 20 21 3d 20 49 4e 56 41 4c 49 Handle != INVALI
14490 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 D_HANDLE_VALUE)
144a0 7b 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 66 {..CloseHandle(f
144b0 69 6c 65 48 61 6e 64 6c 65 29 3b 0a 20 20 20 20 ileHandle);.
144c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 }. return res
144d0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14520 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
14530 57 69 6e 46 69 6c 65 4f 77 6e 65 64 20 2d 2d 0a WinFileOwned --.
14540 20 2a 0a 20 2a 09 52 65 74 75 72 6e 73 20 31 20 *. *.Returns 1
14550 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 if the specified
14560 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 file exists and
14570 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 is owned by the
14580 20 63 75 72 72 65 6e 74 0a 20 2a 20 20 20 20 20 current. *
14590 20 75 73 65 72 20 61 6e 64 20 30 20 6f 74 68 65 user and 0 othe
145a0 72 77 69 73 65 2e 20 4c 69 6b 65 20 74 68 65 20 rwise. Like the
145b0 55 6e 69 78 20 63 61 73 65 2c 20 74 68 65 20 63 Unix case, the c
145c0 68 65 63 6b 20 69 73 20 6d 61 64 65 20 75 73 69 heck is made usi
145d0 6e 67 0a 20 2a 20 20 20 20 20 20 74 68 65 20 72 ng. * the r
145e0 65 61 6c 20 70 72 6f 63 65 73 73 20 53 49 44 2c eal process SID,
145f0 20 6e 6f 74 20 74 68 65 20 65 66 66 65 63 74 69 not the effecti
14600 76 65 20 28 69 6d 70 65 72 73 6f 6e 61 74 69 6f ve (impersonatio
14610 6e 29 20 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d n) one.. *. *---
14620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14660 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
14670 74 0a 54 63 6c 57 69 6e 46 69 6c 65 4f 77 6e 65 t.TclWinFileOwne
14680 64 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a d(. Tcl_Obj *
14690 70 61 74 68 50 74 72 29 09 09 2f 2a 20 46 69 6c pathPtr)../* Fil
146a0 65 20 77 68 6f 73 65 20 6f 77 6e 65 72 73 68 69 e whose ownershi
146b0 70 20 69 73 20 74 6f 20 62 65 20 63 68 65 63 6b p is to be check
146c0 65 64 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73 ed */.{. cons
146d0 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 3b t WCHAR *native;
146e0 0a 20 20 20 20 50 53 49 44 20 6f 77 6e 65 72 53 . PSID ownerS
146f0 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 50 id = NULL;. P
14700 53 45 43 55 52 49 54 59 5f 44 45 53 43 52 49 50 SECURITY_DESCRIP
14710 54 4f 52 20 73 65 63 64 20 3d 20 4e 55 4c 4c 3b TOR secd = NULL;
14720 0a 20 20 20 20 48 41 4e 44 4c 45 20 74 6f 6b 65 . HANDLE toke
14730 6e 3b 0a 20 20 20 20 4c 50 42 59 54 45 20 62 75 n;. LPBYTE bu
14740 66 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 44 57 f = NULL;. DW
14750 4f 52 44 20 62 75 66 73 7a 3b 0a 20 20 20 20 69 ORD bufsz;. i
14760 6e 74 20 6f 77 6e 65 64 20 3d 20 30 3b 0a 0a 20 nt owned = 0;..
14770 20 20 20 6e 61 74 69 76 65 20 3d 20 28 63 6f 6e native = (con
14780 73 74 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 st WCHAR *)Tcl_F
14790 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 SGetNativePath(p
147a0 61 74 68 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 athPtr);.. if
147b0 20 28 47 65 74 4e 61 6d 65 64 53 65 63 75 72 69 (GetNamedSecuri
147c0 74 79 49 6e 66 6f 57 28 28 4c 50 57 53 54 52 29 tyInfoW((LPWSTR)
147d0 20 6e 61 74 69 76 65 2c 20 53 45 5f 46 49 4c 45 native, SE_FILE
147e0 5f 4f 42 4a 45 43 54 2c 0a 09 20 20 20 20 4f 57 _OBJECT,.. OW
147f0 4e 45 52 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 NER_SECURITY_INF
14800 4f 52 4d 41 54 49 4f 4e 2c 20 26 6f 77 6e 65 72 ORMATION, &owner
14810 53 69 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c Sid, NULL, NULL,
14820 20 4e 55 4c 4c 2c 0a 09 20 20 20 20 26 73 65 63 NULL,.. &sec
14830 64 29 20 21 3d 20 45 52 52 4f 52 5f 53 55 43 43 d) != ERROR_SUCC
14840 45 53 53 29 20 7b 0a 20 20 20 20 20 20 20 20 2f ESS) {. /
14850 2a 0a 09 20 2a 20 45 69 74 68 65 72 20 6e 6f 74 *.. * Either not
14860 20 61 20 66 69 6c 65 2c 20 6f 72 20 77 65 20 64 a file, or we d
14870 6f 20 6e 6f 74 20 68 61 76 65 20 61 63 63 65 73 o not have acces
14880 73 20 74 6f 20 69 74 20 69 6e 20 77 68 69 63 68 s to it in which
14890 20 63 61 73 65 20 77 65 0a 09 20 2a 20 61 72 65 case we.. * are
148a0 20 69 6e 20 61 6c 6c 20 6c 69 6b 65 6c 69 68 6f in all likeliho
148b0 6f 64 20 6e 6f 74 20 74 68 65 20 6f 77 6e 65 72 od not the owner
148c0 2e 0a 09 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 ... */..
148d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
148e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 47 . /*. * G
148f0 65 74 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 etting the curre
14900 6e 74 20 70 72 6f 63 65 73 73 20 53 49 44 20 69 nt process SID i
14910 73 20 61 20 6d 75 6c 74 69 2d 73 74 65 70 20 70 s a multi-step p
14920 72 6f 63 65 73 73 2e 20 20 57 65 20 6d 61 6b 65 rocess. We make
14930 20 74 68 65 0a 20 20 20 20 20 2a 20 61 73 73 75 the. * assu
14940 6d 70 74 69 6f 6e 20 74 68 61 74 20 69 66 20 61 mption that if a
14950 20 63 61 6c 6c 20 66 61 69 6c 73 2c 20 74 68 69 call fails, thi
14960 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 6f 20 s process is so
14970 75 6e 64 65 72 70 72 69 76 69 6c 65 67 65 64 20 underprivileged
14980 69 74 0a 20 20 20 20 20 2a 20 63 6f 75 6c 64 20 it. * could
14990 6e 6f 74 20 70 6f 73 73 69 62 6c 79 20 6f 77 6e not possibly own
149a0 20 61 6e 79 74 68 69 6e 67 2e 20 4e 6f 72 6d 61 anything. Norma
149b0 6c 6c 79 20 61 20 70 72 6f 63 65 73 73 20 63 61 lly a process ca
149c0 6e 20 2a 61 6c 77 61 79 73 2a 20 6c 6f 6f 6b 0a n *always* look.
149d0 20 20 20 20 20 2a 20 75 70 20 69 74 73 20 6f 77 * up its ow
149e0 6e 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 2a 2f n token.. */
149f0 0a 0a 20 20 20 20 69 66 20 28 4f 70 65 6e 50 72 .. if (OpenPr
14a00 6f 63 65 73 73 54 6f 6b 65 6e 28 47 65 74 43 75 ocessToken(GetCu
14a10 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 2c 20 rrentProcess(),
14a20 54 4f 4b 45 4e 5f 51 55 45 52 59 2c 20 26 74 6f TOKEN_QUERY, &to
14a30 6b 65 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 ken)) {.
14a40 2f 2a 0a 09 20 2a 20 46 69 6e 64 20 6f 75 74 20 /*.. * Find out
14a50 68 6f 77 20 62 69 67 20 74 68 65 20 62 75 66 66 how big the buff
14a60 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 2e 0a er needs to be..
14a70 09 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 62 75 . */.. bu
14a80 66 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 fsz = 0;.
14a90 20 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 72 6d 61 GetTokenInforma
14aa0 74 69 6f 6e 28 74 6f 6b 65 6e 2c 20 54 6f 6b 65 tion(token, Toke
14ab0 6e 55 73 65 72 2c 20 4e 55 4c 4c 2c 20 30 2c 20 nUser, NULL, 0,
14ac0 26 62 75 66 73 7a 29 3b 0a 20 20 20 20 20 20 20 &bufsz);.
14ad0 20 69 66 20 28 62 75 66 73 7a 29 20 7b 0a 20 20 if (bufsz) {.
14ae0 20 20 20 20 20 20 20 20 20 20 62 75 66 20 3d 20 buf =
14af0 28 4c 50 42 59 54 45 29 63 6b 61 6c 6c 6f 63 28 (LPBYTE)ckalloc(
14b00 62 75 66 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 bufsz);.
14b10 20 20 20 20 69 66 20 28 47 65 74 54 6f 6b 65 6e if (GetToken
14b20 49 6e 66 6f 72 6d 61 74 69 6f 6e 28 74 6f 6b 65 Information(toke
14b30 6e 2c 20 54 6f 6b 65 6e 55 73 65 72 2c 20 62 75 n, TokenUser, bu
14b40 66 2c 20 62 75 66 73 7a 2c 20 26 62 75 66 73 7a f, bufsz, &bufsz
14b50 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 )) {.
14b60 20 20 20 20 20 6f 77 6e 65 64 20 3d 20 45 71 75 owned = Equ
14b70 61 6c 53 69 64 28 6f 77 6e 65 72 53 69 64 2c 20 alSid(ownerSid,
14b80 28 28 50 54 4f 4b 45 4e 5f 55 53 45 52 29 20 62 ((PTOKEN_USER) b
14b90 75 66 29 2d 3e 55 73 65 72 2e 53 69 64 29 3b 0a uf)->User.Sid);.
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 }.
14bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
14bc0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 74 6f 6b 65 CloseHandle(toke
14bd0 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f n);. }.. /
14be0 2a 0a 20 20 20 20 20 2a 20 46 72 65 65 20 61 6c *. * Free al
14bf0 6c 6f 63 61 74 69 6f 6e 73 20 61 6e 64 20 62 65 locations and be
14c00 20 64 6f 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a done.. */..
14c10 20 20 20 20 69 66 20 28 73 65 63 64 29 20 7b 0a if (secd) {.
14c20 20 20 20 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 LocalFre
14c30 65 28 73 65 63 64 29 3b 20 20 20 20 20 20 20 20 e(secd);
14c40 20 20 20 20 2f 2a 20 41 6c 73 6f 20 66 72 65 65 /* Also free
14c50 73 20 6f 77 6e 65 72 53 69 64 20 2a 2f 0a 20 20 s ownerSid */.
14c60 20 20 7d 0a 20 20 20 20 69 66 20 28 62 75 66 29 }. if (buf)
14c70 20 7b 0a 20 20 20 20 20 20 20 20 63 6b 66 72 65 {. ckfre
14c80 65 28 62 75 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 e(buf);. }..
14c90 20 20 20 72 65 74 75 72 6e 20 28 6f 77 6e 65 64 return (owned
14ca0 20 21 3d 20 30 29 3b 20 20 20 20 20 20 20 20 2f != 0); /
14cb0 2a 20 43 6f 6e 76 65 72 74 20 6e 6f 6e 2d 30 20 * Convert non-0
14cc0 74 6f 20 31 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 to 1 */.}.../*.
14cd0 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 * Local Variable
14ce0 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 0a 20 2a s:. * mode: c. *
14cf0 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 65 74 3a c-basic-offset:
14d00 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75 6d 4. * fill-colum
14d10 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a 0a 20 2a n: 78. * End:. *
14d20 2f 0a /.