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 2f 2a 20 lude <lm.h>../*
0230: 46 6f 72 20 54 63 6c 70 47 65 74 55 73 65 72 48 For TclpGetUserH
0240: 6f 6d 65 28 29 2e 20 2a 2f 0a 0a 2f 2a 0a 20 2a ome(). */../*. *
0250: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 31 The number of 1
0260: 30 30 2d 6e 73 20 69 6e 74 65 72 76 61 6c 73 20 00-ns intervals
0270: 62 65 74 77 65 65 6e 20 74 68 65 20 57 69 6e 64 between the Wind
0280: 6f 77 73 20 73 79 73 74 65 6d 20 65 70 6f 63 68 ows system epoch
0290: 20 28 31 36 30 31 2d 30 31 2d 30 31 0a 20 2a 20 (1601-01-01. *
02a0: 6f 6e 20 74 68 65 20 70 72 6f 6c 65 70 74 69 63 on the proleptic
02b0: 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e Gregorian calen
02c0: 64 61 72 29 20 61 6e 64 20 74 68 65 20 50 6f 73 dar) and the Pos
02d0: 69 78 20 65 70 6f 63 68 20 28 31 39 37 30 2d 30 ix epoch (1970-0
02e0: 31 2d 30 31 29 2e 0a 20 2a 2f 0a 0a 23 64 65 66 1-01).. */..#def
02f0: 69 6e 65 20 50 4f 53 49 58 5f 45 50 4f 43 48 5f ine POSIX_EPOCH_
0300: 41 53 5f 46 49 4c 45 54 49 4d 45 09 5c 0a 09 28 AS_FILETIME.\..(
0310: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 31 31 (Tcl_WideInt) 11
0320: 36 34 34 34 37 33 36 20 2a 20 28 54 63 6c 5f 57 6444736 * (Tcl_W
0330: 69 64 65 49 6e 74 29 20 31 30 30 30 30 30 30 30 ideInt) 10000000
0340: 30 30 29 0a 0a 2f 2a 0a 20 2a 20 44 65 63 6c 61 00)../*. * Decla
0350: 72 61 74 69 6f 6e 73 20 66 6f 72 20 27 6c 69 6e rations for 'lin
0360: 6b 27 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 k' related infor
0370: 6d 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 66 mation. This inf
0380: 6f 72 6d 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 ormation should
0390: 63 6f 6d 65 0a 20 2a 20 77 69 74 68 20 56 43 2b come. * with VC+
03a0: 2b 20 36 2e 30 2c 20 62 75 74 20 69 73 20 6e 6f + 6.0, but is no
03b0: 74 20 69 6e 20 73 6f 6d 65 20 6f 6c 64 65 72 20 t in some older
03c0: 53 44 4b 73 2e 20 49 6e 20 61 6e 79 20 63 61 73 SDKs. In any cas
03d0: 65 20 69 74 20 69 73 20 6e 6f 74 20 77 65 6c 6c e it is not well
03e0: 0a 20 2a 20 64 6f 63 75 6d 65 6e 74 65 64 2e 0a . * documented..
03f0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 49 4f 5f */..#ifndef IO_
0400: 52 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 REPARSE_TAG_RESE
0410: 52 56 45 44 5f 4f 4e 45 0a 23 20 20 64 65 66 69 RVED_ONE.# defi
0420: 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 ne IO_REPARSE_TA
0430: 47 5f 52 45 53 45 52 56 45 44 5f 4f 4e 45 09 30 G_RESERVED_ONE.0
0440: 78 30 30 30 30 30 30 30 30 31 0a 23 65 6e 64 69 x000000001.#endi
0450: 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 f.#ifndef IO_REP
0460: 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 45 ARSE_TAG_RESERVE
0470: 44 5f 52 41 4e 47 45 0a 23 20 20 64 65 66 69 6e D_RANGE.# defin
0480: 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 e IO_REPARSE_TAG
0490: 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45 09 _RESERVED_RANGE.
04a0: 30 78 30 30 30 30 30 30 30 30 31 0a 23 65 6e 64 0x000000001.#end
04b0: 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 if.#ifndef IO_RE
04c0: 50 41 52 53 45 5f 54 41 47 5f 56 41 4c 49 44 5f PARSE_TAG_VALID_
04d0: 56 41 4c 55 45 53 0a 23 20 20 64 65 66 69 6e 65 VALUES.# define
04e0: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f IO_REPARSE_TAG_
04f0: 56 41 4c 49 44 5f 56 41 4c 55 45 53 09 30 78 30 VALID_VALUES.0x0
0500: 45 30 30 30 46 46 46 46 0a 23 65 6e 64 69 66 0a E000FFFF.#endif.
0510: 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 #ifndef IO_REPAR
0520: 53 45 5f 54 41 47 5f 48 53 4d 0a 23 20 20 64 65 SE_TAG_HSM.# de
0530: 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f fine IO_REPARSE_
0540: 54 41 47 5f 48 53 4d 09 09 30 78 30 43 30 30 30 TAG_HSM..0x0C000
0550: 30 30 30 34 0a 23 65 6e 64 69 66 0a 23 69 66 6e 0004.#endif.#ifn
0560: 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 def IO_REPARSE_T
0570: 41 47 5f 4e 53 53 0a 23 20 20 64 65 66 69 6e 65 AG_NSS.# define
0580: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f IO_REPARSE_TAG_
0590: 4e 53 53 09 09 30 78 30 38 30 30 30 30 30 30 35 NSS..0x080000005
05a0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
05b0: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 4e IO_REPARSE_TAG_N
05c0: 53 53 52 45 43 4f 56 45 52 0a 23 20 20 64 65 66 SSRECOVER.# def
05d0: 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 ine IO_REPARSE_T
05e0: 41 47 5f 4e 53 53 52 45 43 4f 56 45 52 09 30 78 AG_NSSRECOVER.0x
05f0: 30 38 30 30 30 30 30 30 36 0a 23 65 6e 64 69 66 080000006.#endif
0600: 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 .#ifndef IO_REPA
0610: 52 53 45 5f 54 41 47 5f 53 49 53 0a 23 20 20 64 RSE_TAG_SIS.# d
0620: 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 efine IO_REPARSE
0630: 5f 54 41 47 5f 53 49 53 09 09 30 78 30 38 30 30 _TAG_SIS..0x0800
0640: 30 30 30 30 37 0a 23 65 6e 64 69 66 0a 23 69 66 00007.#endif.#if
0650: 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f ndef IO_REPARSE_
0660: 54 41 47 5f 44 46 53 0a 23 20 20 64 65 66 69 6e TAG_DFS.# defin
0670: 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 e IO_REPARSE_TAG
0680: 5f 44 46 53 09 09 30 78 30 38 30 30 30 30 30 30 _DFS..0x08000000
0690: 38 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 8.#endif..#ifnde
06a0: 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 f IO_REPARSE_TAG
06b0: 5f 52 45 53 45 52 56 45 44 5f 5a 45 52 4f 0a 23 _RESERVED_ZERO.#
06c0: 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 define IO_REPA
06d0: 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 45 44 RSE_TAG_RESERVED
06e0: 5f 5a 45 52 4f 09 30 78 30 30 30 30 30 30 30 30 _ZERO.0x00000000
06f0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
0700: 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52 FILE_FLAG_OPEN_R
0710: 45 50 41 52 53 45 5f 50 4f 49 4e 54 0a 23 20 20 EPARSE_POINT.#
0720: 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 define FILE_FLAG
0730: 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f 50 4f _OPEN_REPARSE_PO
0740: 49 4e 54 09 30 78 30 30 32 30 30 30 30 30 0a 23 INT.0x00200000.#
0750: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f endif.#ifndef IO
0760: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 _REPARSE_TAG_MOU
0770: 4e 54 5f 50 4f 49 4e 54 0a 23 20 20 64 65 66 69 NT_POINT.# defi
0780: 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 ne IO_REPARSE_TA
0790: 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54 09 30 78 G_MOUNT_POINT.0x
07a0: 41 30 30 30 30 30 30 33 0a 23 65 6e 64 69 66 0a A0000003.#endif.
07b0: 23 69 66 6e 64 65 66 20 49 73 52 65 70 61 72 73 #ifndef IsRepars
07c0: 65 54 61 67 56 61 6c 69 64 0a 23 20 20 64 65 66 eTagValid.# def
07d0: 69 6e 65 20 49 73 52 65 70 61 72 73 65 54 61 67 ine IsReparseTag
07e0: 56 61 6c 69 64 28 78 29 20 5c 0a 20 20 20 20 28 Valid(x) \. (
07f0: 21 28 28 78 29 26 7e 49 4f 5f 52 45 50 41 52 53 !((x)&~IO_REPARS
0800: 45 5f 54 41 47 5f 56 41 4c 49 44 5f 56 41 4c 55 E_TAG_VALID_VALU
0810: 45 53 29 26 26 28 28 78 29 3e 49 4f 5f 52 45 50 ES)&&((x)>IO_REP
0820: 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 45 ARSE_TAG_RESERVE
0830: 44 5f 52 41 4e 47 45 29 29 0a 23 65 6e 64 69 66 D_RANGE)).#endif
0840: 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 .#ifndef IO_REPA
0850: 52 53 45 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43 RSE_TAG_SYMBOLIC
0860: 5f 4c 49 4e 4b 0a 23 20 20 64 65 66 69 6e 65 20 _LINK.# define
0870: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 53 IO_REPARSE_TAG_S
0880: 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 09 49 4f 5f YMBOLIC_LINK.IO_
0890: 52 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 REPARSE_TAG_RESE
08a0: 52 56 45 44 5f 5a 45 52 4f 0a 23 65 6e 64 69 66 RVED_ZERO.#endif
08b0: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 53 50 .#ifndef FILE_SP
08c0: 45 43 49 41 4c 5f 41 43 43 45 53 53 0a 23 20 20 ECIAL_ACCESS.#
08d0: 64 65 66 69 6e 65 20 46 49 4c 45 5f 53 50 45 43 define FILE_SPEC
08e0: 49 41 4c 5f 41 43 43 45 53 53 09 09 28 46 49 4c IAL_ACCESS..(FIL
08f0: 45 5f 41 4e 59 5f 41 43 43 45 53 53 29 0a 23 65 E_ANY_ACCESS).#e
0900: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 46 53 43 ndif.#ifndef FSC
0910: 54 4c 5f 53 45 54 5f 52 45 50 41 52 53 45 5f 50 TL_SET_REPARSE_P
0920: 4f 49 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 46 OINT.# define F
0930: 53 43 54 4c 5f 53 45 54 5f 52 45 50 41 52 53 45 SCTL_SET_REPARSE
0940: 5f 50 4f 49 4e 54 20 5c 0a 20 20 20 20 43 54 4c _POINT \. CTL
0950: 5f 43 4f 44 45 28 46 49 4c 45 5f 44 45 56 49 43 _CODE(FILE_DEVIC
0960: 45 5f 46 49 4c 45 5f 53 59 53 54 45 4d 2c 20 34 E_FILE_SYSTEM, 4
0970: 31 2c 20 4d 45 54 48 4f 44 5f 42 55 46 46 45 52 1, METHOD_BUFFER
0980: 45 44 2c 20 46 49 4c 45 5f 53 50 45 43 49 41 4c ED, FILE_SPECIAL
0990: 5f 41 43 43 45 53 53 29 0a 23 20 20 64 65 66 69 _ACCESS).# defi
09a0: 6e 65 20 46 53 43 54 4c 5f 47 45 54 5f 52 45 50 ne FSCTL_GET_REP
09b0: 41 52 53 45 5f 50 4f 49 4e 54 20 5c 0a 20 20 20 ARSE_POINT \.
09c0: 20 43 54 4c 5f 43 4f 44 45 28 46 49 4c 45 5f 44 CTL_CODE(FILE_D
09d0: 45 56 49 43 45 5f 46 49 4c 45 5f 53 59 53 54 45 EVICE_FILE_SYSTE
09e0: 4d 2c 20 34 32 2c 20 4d 45 54 48 4f 44 5f 42 55 M, 42, METHOD_BU
09f0: 46 46 45 52 45 44 2c 20 46 49 4c 45 5f 41 4e 59 FFERED, FILE_ANY
0a00: 5f 41 43 43 45 53 53 29 0a 23 20 20 64 65 66 69 _ACCESS).# defi
0a10: 6e 65 20 46 53 43 54 4c 5f 44 45 4c 45 54 45 5f ne FSCTL_DELETE_
0a20: 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 5c 0a REPARSE_POINT \.
0a30: 20 20 20 20 43 54 4c 5f 43 4f 44 45 28 46 49 4c CTL_CODE(FIL
0a40: 45 5f 44 45 56 49 43 45 5f 46 49 4c 45 5f 53 59 E_DEVICE_FILE_SY
0a50: 53 54 45 4d 2c 20 34 33 2c 20 4d 45 54 48 4f 44 STEM, 43, METHOD
0a60: 5f 42 55 46 46 45 52 45 44 2c 20 46 49 4c 45 5f _BUFFERED, FILE_
0a70: 53 50 45 43 49 41 4c 5f 41 43 43 45 53 53 29 0a SPECIAL_ACCESS).
0a80: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 #endif.#ifndef I
0a90: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 NVALID_FILE_ATTR
0aa0: 49 42 55 54 45 53 0a 23 64 65 66 69 6e 65 20 49 IBUTES.#define I
0ab0: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 NVALID_FILE_ATTR
0ac0: 49 42 55 54 45 53 09 09 28 28 44 57 4f 52 44 29 IBUTES..((DWORD)
0ad0: 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 -1).#endif../*.
0ae0: 2a 20 4d 61 78 69 6d 75 6d 20 72 65 70 61 72 73 * Maximum repars
0af0: 65 20 62 75 66 66 65 72 20 69 6e 66 6f 20 73 69 e buffer info si
0b00: 7a 65 2e 20 54 68 65 20 6d 61 78 20 75 73 65 72 ze. The max user
0b10: 20 64 65 66 69 6e 65 64 20 72 65 70 61 72 73 65 defined reparse
0b20: 20 64 61 74 61 20 69 73 0a 20 2a 20 31 36 4b 42 data is. * 16KB
0b30: 2c 20 70 6c 75 73 20 74 68 65 72 65 27 73 20 61 , plus there's a
0b40: 20 68 65 61 64 65 72 2e 0a 20 2a 2f 0a 0a 23 64 header.. */..#d
0b50: 65 66 69 6e 65 20 4d 41 58 5f 52 45 50 41 52 53 efine MAX_REPARS
0b60: 45 5f 53 49 5a 45 09 09 31 37 30 30 30 0a 0a 2f E_SIZE..17000../
0b70: 2a 0a 20 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 *. * Undocumente
0b80: 64 20 52 45 50 41 52 53 45 5f 4d 4f 55 4e 54 50 d REPARSE_MOUNTP
0b90: 4f 49 4e 54 5f 48 45 41 44 45 52 5f 53 49 5a 45 OINT_HEADER_SIZE
0ba0: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e structure defin
0bb0: 69 74 69 6f 6e 2e 20 54 68 69 73 20 69 73 0a 20 ition. This is.
0bc0: 2a 20 66 6f 75 6e 64 20 69 6e 20 77 69 6e 6e 74 * found in winnt
0bd0: 2e 68 2e 0a 20 2a 0a 20 2a 20 49 4d 50 4f 52 54 .h.. *. * IMPORT
0be0: 41 4e 54 3a 20 63 61 75 74 69 6f 6e 20 77 68 65 ANT: caution whe
0bf0: 6e 20 75 73 69 6e 67 20 74 68 69 73 20 73 74 72 n using this str
0c00: 75 63 74 75 72 65 2c 20 73 69 6e 63 65 20 74 68 ucture, since th
0c10: 65 20 61 63 74 75 61 6c 20 73 74 72 75 63 74 75 e actual structu
0c20: 72 65 73 0a 20 2a 20 75 73 65 64 20 77 69 6c 6c res. * used will
0c30: 20 77 61 6e 74 20 74 6f 20 73 74 6f 72 65 20 61 want to store a
0c40: 20 66 75 6c 6c 20 70 61 74 68 20 69 6e 20 74 68 full path in th
0c50: 65 20 27 50 61 74 68 42 75 66 66 65 72 27 20 66 e 'PathBuffer' f
0c60: 69 65 6c 64 2c 20 62 75 74 20 74 68 65 72 65 0a ield, but there.
0c70: 20 2a 20 69 73 6e 27 74 20 72 6f 6f 6d 20 28 74 * isn't room (t
0c80: 68 65 72 65 27 73 20 6f 6e 6c 79 20 61 20 73 69 here's only a si
0c90: 6e 67 6c 65 20 57 43 48 41 52 21 29 2e 20 54 68 ngle WCHAR!). Th
0ca0: 65 72 65 66 6f 72 65 20 6f 6e 65 20 6d 75 73 74 erefore one must
0cb0: 20 61 72 74 69 66 69 63 69 61 6c 6c 79 0a 20 2a artificially. *
0cc0: 20 63 72 65 61 74 65 20 61 20 6c 61 72 67 65 72 create a larger
0cd0: 20 73 70 61 63 65 20 6f 66 20 6d 65 6d 6f 72 79 space of memory
0ce0: 20 61 6e 64 20 74 68 65 6e 20 63 61 73 74 20 69 and then cast i
0cf0: 74 20 74 6f 20 74 68 69 73 20 74 79 70 65 2e 20 t to this type.
0d00: 57 65 20 75 73 65 20 74 68 65 0a 20 2a 20 27 44 We use the. * 'D
0d10: 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 UMMY_REPARSE_BUF
0d20: 46 45 52 27 20 73 74 72 75 63 74 20 6a 75 73 74 FER' struct just
0d30: 20 62 65 6c 6f 77 20 74 6f 20 64 65 61 6c 20 77 below to deal w
0d40: 69 74 68 20 74 68 69 73 20 70 72 6f 62 6c 65 6d ith this problem
0d50: 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 52 .. */..#define R
0d60: 45 50 41 52 53 45 5f 4d 4f 55 4e 54 50 4f 49 4e EPARSE_MOUNTPOIN
0d70: 54 5f 48 45 41 44 45 52 5f 53 49 5a 45 09 20 38 T_HEADER_SIZE. 8
0d80: 0a 23 69 66 6e 64 65 66 20 52 45 50 41 52 53 45 .#ifndef REPARSE
0d90: 5f 44 41 54 41 5f 42 55 46 46 45 52 5f 48 45 41 _DATA_BUFFER_HEA
0da0: 44 45 52 5f 53 49 5a 45 0a 74 79 70 65 64 65 66 DER_SIZE.typedef
0db0: 20 73 74 72 75 63 74 20 5f 52 45 50 41 52 53 45 struct _REPARSE
0dc0: 5f 44 41 54 41 5f 42 55 46 46 45 52 20 7b 0a 20 _DATA_BUFFER {.
0dd0: 20 20 20 44 57 4f 52 44 20 52 65 70 61 72 73 65 DWORD Reparse
0de0: 54 61 67 3b 0a 20 20 20 20 57 4f 52 44 20 52 65 Tag;. WORD Re
0df0: 70 61 72 73 65 44 61 74 61 4c 65 6e 67 74 68 3b parseDataLength;
0e00: 0a 20 20 20 20 57 4f 52 44 20 52 65 73 65 72 76 . WORD Reserv
0e10: 65 64 3b 0a 20 20 20 20 75 6e 69 6f 6e 20 7b 0a ed;. union {.
0e20: 09 73 74 72 75 63 74 20 7b 0a 09 20 20 20 20 57 .struct {.. W
0e30: 4f 52 44 20 53 75 62 73 74 69 74 75 74 65 4e 61 ORD SubstituteNa
0e40: 6d 65 4f 66 66 73 65 74 3b 0a 09 20 20 20 20 57 meOffset;.. W
0e50: 4f 52 44 20 53 75 62 73 74 69 74 75 74 65 4e 61 ORD SubstituteNa
0e60: 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 57 meLength;.. W
0e70: 4f 52 44 20 50 72 69 6e 74 4e 61 6d 65 4f 66 66 ORD PrintNameOff
0e80: 73 65 74 3b 0a 09 20 20 20 20 57 4f 52 44 20 50 set;.. WORD P
0e90: 72 69 6e 74 4e 61 6d 65 4c 65 6e 67 74 68 3b 0a rintNameLength;.
0ea0: 09 20 20 20 20 55 4c 4f 4e 47 20 46 6c 61 67 73 . ULONG Flags
0eb0: 3b 0a 09 20 20 20 20 57 43 48 41 52 20 50 61 74 ;.. WCHAR Pat
0ec0: 68 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20 53 hBuffer[1];..} S
0ed0: 79 6d 62 6f 6c 69 63 4c 69 6e 6b 52 65 70 61 72 ymbolicLinkRepar
0ee0: 73 65 42 75 66 66 65 72 3b 0a 09 73 74 72 75 63 seBuffer;..struc
0ef0: 74 20 7b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 t {.. WORD Su
0f00: 62 73 74 69 74 75 74 65 4e 61 6d 65 4f 66 66 73 bstituteNameOffs
0f10: 65 74 3b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 et;.. WORD Su
0f20: 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 bstituteNameLeng
0f30: 74 68 3b 0a 09 20 20 20 20 57 4f 52 44 20 50 72 th;.. WORD Pr
0f40: 69 6e 74 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 intNameOffset;..
0f50: 20 20 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 WORD PrintNa
0f60: 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 57 meLength;.. 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 4d 6f 75 6e 74 50 6f 69 6e 1];..} MountPoin
0f90: 74 52 65 70 61 72 73 65 42 75 66 66 65 72 3b 0a tReparseBuffer;.
0fa0: 09 73 74 72 75 63 74 20 7b 0a 09 20 20 20 20 42 .struct {.. B
0fb0: 59 54 45 20 44 61 74 61 42 75 66 66 65 72 5b 31 YTE DataBuffer[1
0fc0: 5d 3b 0a 09 7d 20 47 65 6e 65 72 69 63 52 65 70 ];..} GenericRep
0fd0: 61 72 73 65 42 75 66 66 65 72 3b 0a 20 20 20 20 arseBuffer;.
0fe0: 7d 3b 0a 7d 20 52 45 50 41 52 53 45 5f 44 41 54 };.} REPARSE_DAT
0ff0: 41 5f 42 55 46 46 45 52 3b 0a 23 65 6e 64 69 66 A_BUFFER;.#endif
1000: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
1010: 20 7b 0a 20 20 20 20 52 45 50 41 52 53 45 5f 44 {. REPARSE_D
1020: 41 54 41 5f 42 55 46 46 45 52 20 64 75 6d 6d 79 ATA_BUFFER dummy
1030: 3b 0a 20 20 20 20 57 43 48 41 52 20 64 75 6d 6d ;. WCHAR dumm
1040: 79 42 75 66 5b 4d 41 58 5f 50 41 54 48 20 2a 20 yBuf[MAX_PATH *
1050: 33 5d 3b 0a 7d 20 44 55 4d 4d 59 5f 52 45 50 41 3];.} DUMMY_REPA
1060: 52 53 45 5f 42 55 46 46 45 52 3b 0a 0a 2f 2a 0a RSE_BUFFER;../*.
1070: 20 2a 20 4f 74 68 65 72 20 74 79 70 65 64 65 66 * Other typedef
1080: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 s required by th
1090: 69 73 20 63 6f 64 65 2e 0a 20 2a 2f 0a 0a 73 74 is code.. */..st
10a0: 61 74 69 63 20 74 69 6d 65 5f 74 09 09 54 6f 43 atic time_t..ToC
10b0: 54 69 6d 65 28 46 49 4c 45 54 49 4d 45 20 66 69 Time(FILETIME fi
10c0: 6c 65 54 69 6d 65 29 3b 0a 73 74 61 74 69 63 20 leTime);.static
10d0: 76 6f 69 64 09 09 46 72 6f 6d 43 54 69 6d 65 28 void..FromCTime(
10e0: 74 69 6d 65 5f 74 20 70 6f 73 69 78 54 69 6d 65 time_t posixTime
10f0: 2c 20 46 49 4c 45 54 49 4d 45 20 2a 66 69 6c 65 , FILETIME *file
1100: 54 69 6d 65 29 3b 0a 0a 2f 2a 0a 20 2a 20 44 65 Time);../*. * De
1110: 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 6c clarations for l
1120: 6f 63 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20 64 ocal functions d
1130: 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 efined in this f
1140: 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ile:. */..static
1150: 20 69 6e 74 09 09 4e 61 74 69 76 65 41 63 63 65 int..NativeAcce
1160: 73 73 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a ss(const TCHAR *
1170: 70 61 74 68 2c 20 69 6e 74 20 6d 6f 64 65 29 3b path, int mode);
1180: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74 .static int..Nat
1190: 69 76 65 44 65 76 28 63 6f 6e 73 74 20 54 43 48 iveDev(const TCH
11a0: 41 52 20 2a 70 61 74 68 29 3b 0a 73 74 61 74 69 AR *path);.stati
11b0: 63 20 69 6e 74 09 09 4e 61 74 69 76 65 53 74 61 c int..NativeSta
11c0: 74 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 70 t(const TCHAR *p
11d0: 61 74 68 2c 20 54 63 6c 5f 53 74 61 74 42 75 66 ath, Tcl_StatBuf
11e0: 20 2a 73 74 61 74 50 74 72 2c 0a 09 09 09 20 20 *statPtr,....
11f0: 20 20 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 int checkLinks
1200: 29 3b 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e );.static unsign
1210: 65 64 20 73 68 6f 72 74 09 4e 61 74 69 76 65 53 ed short.NativeS
1220: 74 61 74 4d 6f 64 65 28 44 57 4f 52 44 20 61 74 tatMode(DWORD at
1230: 74 72 2c 20 69 6e 74 20 63 68 65 63 6b 4c 69 6e tr, int checkLin
1240: 6b 73 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 69 ks,.... int i
1250: 73 45 78 65 63 29 3b 0a 73 74 61 74 69 63 20 69 sExec);.static i
1260: 6e 74 09 09 4e 61 74 69 76 65 49 73 45 78 65 63 nt..NativeIsExec
1270: 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 70 61 (const TCHAR *pa
1280: 74 68 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 th);.static int.
1290: 09 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 72 .NativeReadRepar
12a0: 73 65 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a se(const TCHAR *
12b0: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 2c 0a 09 LinkDirectory,..
12c0: 09 09 20 20 20 20 52 45 50 41 52 53 45 5f 44 41 .. REPARSE_DA
12d0: 54 41 5f 42 55 46 46 45 52 20 2a 62 75 66 66 65 TA_BUFFER *buffe
12e0: 72 2c 20 44 57 4f 52 44 20 64 65 73 69 72 65 64 r, DWORD desired
12f0: 41 63 63 65 73 73 29 3b 0a 73 74 61 74 69 63 20 Access);.static
1300: 69 6e 74 09 09 4e 61 74 69 76 65 57 72 69 74 65 int..NativeWrite
1310: 52 65 70 61 72 73 65 28 63 6f 6e 73 74 20 54 43 Reparse(const TC
1320: 48 41 52 20 2a 4c 69 6e 6b 44 69 72 65 63 74 6f HAR *LinkDirecto
1330: 72 79 2c 0a 09 09 09 20 20 20 20 52 45 50 41 52 ry,.... REPAR
1340: 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a SE_DATA_BUFFER *
1350: 62 75 66 66 65 72 29 3b 0a 73 74 61 74 69 63 20 buffer);.static
1360: 69 6e 74 09 09 4e 61 74 69 76 65 4d 61 74 63 68 int..NativeMatch
1370: 54 79 70 65 28 69 6e 74 20 69 73 44 72 69 76 65 Type(int isDrive
1380: 2c 20 44 57 4f 52 44 20 61 74 74 72 2c 0a 09 09 , DWORD attr,...
1390: 09 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 . const TCHAR
13a0: 20 2a 6e 61 74 69 76 65 4e 61 6d 65 2c 20 54 63 *nativeName, Tc
13b0: 6c 5f 47 6c 6f 62 54 79 70 65 44 61 74 61 20 2a l_GlobTypeData *
13c0: 74 79 70 65 73 29 3b 0a 73 74 61 74 69 63 20 69 types);.static i
13d0: 6e 74 09 09 57 69 6e 49 73 44 72 69 76 65 28 63 nt..WinIsDrive(c
13e0: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c onst char *name,
13f0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 29 3b 0a 73 int nameLen);.s
1400: 74 61 74 69 63 20 69 6e 74 09 09 57 69 6e 49 73 tatic int..WinIs
1410: 52 65 73 65 72 76 65 64 28 63 6f 6e 73 74 20 63 Reserved(const c
1420: 68 61 72 20 2a 70 61 74 68 29 3b 0a 73 74 61 74 har *path);.stat
1430: 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 09 57 69 6e ic Tcl_Obj *.Win
1440: 52 65 61 64 4c 69 6e 6b 28 63 6f 6e 73 74 20 54 ReadLink(const T
1450: 43 48 41 52 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 CHAR *LinkSource
1460: 29 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 );.static Tcl_Ob
1470: 6a 20 2a 09 57 69 6e 52 65 61 64 4c 69 6e 6b 44 j *.WinReadLinkD
1480: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 54 irectory(const T
1490: 43 48 41 52 20 2a 4c 69 6e 6b 44 69 72 65 63 74 CHAR *LinkDirect
14a0: 6f 72 79 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 ory);.static int
14b0: 09 09 57 69 6e 4c 69 6e 6b 28 63 6f 6e 73 74 20 ..WinLink(const
14c0: 54 43 48 41 52 20 2a 4c 69 6e 6b 53 6f 75 72 63 TCHAR *LinkSourc
14d0: 65 2c 0a 09 09 09 20 20 20 20 63 6f 6e 73 74 20 e,.... const
14e0: 54 43 48 41 52 20 2a 4c 69 6e 6b 54 61 72 67 65 TCHAR *LinkTarge
14f0: 74 2c 20 69 6e 74 20 6c 69 6e 6b 41 63 74 69 6f t, int linkActio
1500: 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 n);.static int..
1510: 57 69 6e 53 79 6d 4c 69 6e 6b 44 69 72 65 63 74 WinSymLinkDirect
1520: 6f 72 79 28 63 6f 6e 73 74 20 54 43 48 41 52 20 ory(const TCHAR
1530: 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 2c 0a *LinkDirectory,.
1540: 09 09 09 20 20 20 20 63 6f 6e 73 74 20 54 43 48 ... const TCH
1550: 41 52 20 2a 4c 69 6e 6b 54 61 72 67 65 74 29 3b AR *LinkTarget);
1560: 0a 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 76 6f .MODULE_SCOPE vo
1570: 69 64 09 74 63 6c 57 69 6e 44 65 62 75 67 50 61 id.tclWinDebugPa
1580: 6e 69 63 28 63 6f 6e 73 74 20 63 68 61 72 20 2a nic(const char *
1590: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 3b 0a 0c 0a format, ...);...
15a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
15f0: 57 69 6e 4c 69 6e 6b 20 2d 2d 0a 20 2a 0a 20 2a WinLink --. *. *
1600: 09 4d 61 6b 65 20 61 20 6c 69 6e 6b 20 66 72 6f .Make a link fro
1610: 6d 20 73 6f 75 72 63 65 20 74 6f 20 74 61 72 67 m source to targ
1620: 65 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d et.. *. *-------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1670: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 /..static int.Wi
1680: 6e 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74 nLink(. const
1690: 20 54 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72 TCHAR *linkSour
16a0: 63 65 50 61 74 68 2c 0a 20 20 20 20 63 6f 6e 73 cePath,. cons
16b0: 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b 54 61 72 t TCHAR *linkTar
16c0: 67 65 74 50 61 74 68 2c 0a 20 20 20 20 69 6e 74 getPath,. int
16d0: 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 linkAction).{.
16e0: 20 20 20 54 43 48 41 52 20 74 65 6d 70 46 69 6c TCHAR tempFil
16f0: 65 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b eName[MAX_PATH];
1700: 0a 20 20 20 20 54 43 48 41 52 20 2a 74 65 6d 70 . TCHAR *temp
1710: 46 69 6c 65 50 61 72 74 3b 0a 20 20 20 20 44 57 FilePart;. DW
1720: 4f 52 44 20 61 74 74 72 3b 0a 0a 20 20 20 20 2f ORD attr;.. /
1730: 2a 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 *. * Get the
1740: 20 66 75 6c 6c 20 70 61 74 68 20 72 65 66 65 72 full path refer
1750: 65 6e 63 65 64 20 62 79 20 74 68 65 20 74 61 72 enced by the tar
1760: 67 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 get.. */..
1770: 20 20 69 66 20 28 21 47 65 74 46 75 6c 6c 50 61 if (!GetFullPa
1780: 74 68 4e 61 6d 65 28 6c 69 6e 6b 54 61 72 67 65 thName(linkTarge
1790: 74 50 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c tPath, MAX_PATH,
17a0: 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 0a 09 tempFileName,..
17b0: 20 20 20 20 26 74 65 6d 70 46 69 6c 65 50 61 72 &tempFilePar
17c0: 74 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e t)) {../*.. * In
17d0: 76 61 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a 2f valid file... */
17e0: 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 ...TclWinConvert
17f0: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 Error(GetLastErr
1800: 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d or());..return -
1810: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 1;. }.. /*
1820: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 . * Make sur
1830: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 64 6f e source file do
1840: 65 73 6e 27 74 20 65 78 69 73 74 2e 0a 20 20 20 esn't exist..
1850: 20 20 2a 2f 0a 0a 20 20 20 20 61 74 74 72 20 3d */.. attr =
1860: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 GetFileAttribut
1870: 65 73 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 es(linkSourcePat
1880: 68 29 3b 0a 20 20 20 20 69 66 20 28 61 74 74 72 h);. if (attr
1890: 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 != INVALID_FILE
18a0: 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a 09 _ATTRIBUTES) {..
18b0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 45 58 Tcl_SetErrno(EEX
18c0: 49 53 54 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 IST);..return -1
18d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
18e0: 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 66 * Get the f
18f0: 75 6c 6c 20 70 61 74 68 20 72 65 66 65 72 65 6e ull path referen
1900: 63 65 64 20 62 79 20 74 68 65 20 73 6f 75 72 63 ced by the sourc
1910: 65 20 66 69 6c 65 2f 64 69 72 65 63 74 6f 72 79 e file/directory
1920: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
1930: 66 20 28 21 47 65 74 46 75 6c 6c 50 61 74 68 4e f (!GetFullPathN
1940: 61 6d 65 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 ame(linkSourcePa
1950: 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c 20 74 65 th, MAX_PATH, te
1960: 6d 70 46 69 6c 65 4e 61 6d 65 2c 0a 09 20 20 20 mpFileName,..
1970: 20 26 74 65 6d 70 46 69 6c 65 50 61 72 74 29 29 &tempFilePart))
1980: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e 76 61 6c {../*.. * Inval
1990: 69 64 20 66 69 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 id file... */...
19a0: 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 TclWinConvertErr
19b0: 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 or(GetLastError(
19c0: 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a ));..return -1;.
19d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
19e0: 20 20 20 2a 20 43 68 65 63 6b 20 74 68 65 20 74 * Check the t
19f0: 61 72 67 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a arget.. */..
1a00: 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 attr = GetFi
1a10: 6c 65 41 74 74 72 69 62 75 74 65 73 28 6c 69 6e leAttributes(lin
1a20: 6b 54 61 72 67 65 74 50 61 74 68 29 3b 0a 20 20 kTargetPath);.
1a30: 20 20 69 66 20 28 61 74 74 72 20 3d 3d 20 49 4e if (attr == IN
1a40: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 VALID_FILE_ATTRI
1a50: 42 55 54 45 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a BUTES) {../*.. *
1a60: 20 54 68 65 20 74 61 72 67 65 74 20 64 6f 65 73 The target does
1a70: 6e 27 74 20 65 78 69 73 74 2e 0a 09 20 2a 2f 0a n't exist... */.
1a80: 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 ..TclWinConvertE
1a90: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f rror(GetLastErro
1aa0: 72 28 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 r());. } else
1ab0: 20 69 66 20 28 28 61 74 74 72 20 26 20 46 49 4c if ((attr & FIL
1ac0: 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 E_ATTRIBUTE_DIRE
1ad0: 43 54 4f 52 59 29 20 3d 3d 20 30 29 20 7b 0a 09 CTORY) == 0) {..
1ae0: 2f 2a 0a 09 20 2a 20 49 74 20 69 73 20 61 20 66 /*.. * It is a f
1af0: 69 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 ile... */...if (
1b00: 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20 54 43 4c linkAction & TCL
1b10: 5f 43 52 45 41 54 45 5f 48 41 52 44 5f 4c 49 4e _CREATE_HARD_LIN
1b20: 4b 29 20 7b 0a 09 20 20 20 20 69 66 20 28 43 72 K) {.. if (Cr
1b30: 65 61 74 65 48 61 72 64 4c 69 6e 6b 28 6c 69 6e eateHardLink(lin
1b40: 6b 53 6f 75 72 63 65 50 61 74 68 2c 20 6c 69 6e kSourcePath, lin
1b50: 6b 54 61 72 67 65 74 50 61 74 68 2c 20 4e 55 4c kTargetPath, NUL
1b60: 4c 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 L)) {.../*... *
1b70: 53 75 63 63 65 73 73 21 0a 09 09 20 2a 2f 0a 0a Success!... */..
1b80: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 ..return 0;..
1b90: 20 7d 0a 0a 09 20 20 20 20 54 63 6c 57 69 6e 43 }... TclWinC
1ba0: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c onvertError(GetL
1bb0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 7d 20 astError());..}
1bc0: 65 6c 73 65 20 69 66 20 28 6c 69 6e 6b 41 63 74 else if (linkAct
1bd0: 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 41 54 45 ion & TCL_CREATE
1be0: 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 29 20 _SYMBOLIC_LINK)
1bf0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
1c00: 2a 20 43 61 6e 27 74 20 73 79 6d 6c 69 6e 6b 20 * Can't symlink
1c10: 66 69 6c 65 73 2e 0a 09 20 20 20 20 20 2a 2f 0a files... */.
1c20: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
1c30: 6e 6f 28 45 4e 4f 54 44 49 52 29 3b 0a 09 7d 20 no(ENOTDIR);..}
1c40: 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f else {.. Tcl_
1c50: 53 65 74 45 72 72 6e 6f 28 45 4e 4f 44 45 56 29 SetErrno(ENODEV)
1c60: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
1c70: 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 27 76 65 20 {../*.. * We've
1c80: 67 6f 74 20 61 20 64 69 72 65 63 74 6f 72 79 2e got a directory.
1c90: 20 4e 6f 77 20 63 68 65 63 6b 20 77 68 65 74 68 Now check wheth
1ca0: 65 72 20 77 68 61 74 20 77 65 27 72 65 20 74 72 er what we're tr
1cb0: 79 69 6e 67 20 74 6f 20 64 6f 20 69 73 0a 09 20 ying to do is..
1cc0: 2a 20 72 65 61 73 6f 6e 61 62 6c 65 2e 0a 09 20 * reasonable...
1cd0: 2a 2f 0a 0a 09 69 66 20 28 6c 69 6e 6b 41 63 74 */...if (linkAct
1ce0: 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 41 54 45 ion & TCL_CREATE
1cf0: 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 29 20 _SYMBOLIC_LINK)
1d00: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 57 69 {.. return Wi
1d10: 6e 53 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 nSymLinkDirector
1d20: 79 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 y(linkSourcePath
1d30: 2c 20 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 , linkTargetPath
1d40: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 );...} else if (
1d50: 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20 54 43 4c linkAction & TCL
1d60: 5f 43 52 45 41 54 45 5f 48 41 52 44 5f 4c 49 4e _CREATE_HARD_LIN
1d70: 4b 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 K) {.. /*..
1d80: 20 20 20 2a 20 43 61 6e 27 74 20 68 61 72 64 20 * Can't hard
1d90: 6c 69 6e 6b 20 64 69 72 65 63 74 6f 72 69 65 73 link directories
1da0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
1db0: 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 Tcl_SetErrno(EI
1dc0: 53 44 49 52 29 3b 0a 09 7d 20 65 6c 73 65 20 7b SDIR);..} else {
1dd0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
1de0: 6e 6f 28 45 4e 4f 44 45 56 29 3b 0a 09 7d 0a 20 no(ENODEV);..}.
1df0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
1e00: 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d -1;.}.../*. *---
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e50: 2d 0a 20 2a 0a 20 2a 20 57 69 6e 52 65 61 64 4c -. *. * WinReadL
1e60: 69 6e 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 68 61 ink --. *. *.Wha
1e70: 74 20 64 6f 65 73 20 27 4c 69 6e 6b 53 6f 75 72 t does 'LinkSour
1e80: 63 65 27 20 70 6f 69 6e 74 20 74 6f 3f 0a 20 2a ce' point to?. *
1e90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ed0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
1ee0: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 0a 57 69 tic Tcl_Obj *.Wi
1ef0: 6e 52 65 61 64 4c 69 6e 6b 28 0a 20 20 20 20 63 nReadLink(. c
1f00: 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b onst TCHAR *link
1f10: 53 6f 75 72 63 65 50 61 74 68 29 0a 7b 0a 20 20 SourcePath).{.
1f20: 20 20 54 43 48 41 52 20 74 65 6d 70 46 69 6c 65 TCHAR tempFile
1f30: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a Name[MAX_PATH];.
1f40: 20 20 20 20 54 43 48 41 52 20 2a 74 65 6d 70 46 TCHAR *tempF
1f50: 69 6c 65 50 61 72 74 3b 0a 20 20 20 20 44 57 4f ilePart;. DWO
1f60: 52 44 20 61 74 74 72 3b 0a 0a 20 20 20 20 2f 2a RD attr;.. /*
1f70: 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 . * Get the
1f80: 66 75 6c 6c 20 70 61 74 68 20 72 65 66 65 72 65 full path refere
1f90: 6e 63 65 64 20 62 79 20 74 68 65 20 74 61 72 67 nced by the targ
1fa0: 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 et.. */..
1fb0: 20 69 66 20 28 21 47 65 74 46 75 6c 6c 50 61 74 if (!GetFullPat
1fc0: 68 4e 61 6d 65 28 6c 69 6e 6b 53 6f 75 72 63 65 hName(linkSource
1fd0: 50 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c 20 Path, MAX_PATH,
1fe0: 74 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 0a 09 20 tempFileName,..
1ff0: 20 20 20 26 74 65 6d 70 46 69 6c 65 50 61 72 74 &tempFilePart
2000: 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e 76 )) {../*.. * Inv
2010: 61 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a 2f 0a alid file... */.
2020: 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 ..TclWinConvertE
2030: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f rror(GetLastErro
2040: 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 r());..return NU
2050: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
2060: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 *. * Make su
2070: 72 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 64 re source file d
2080: 6f 65 73 20 65 78 69 73 74 2e 0a 20 20 20 20 20 oes exist..
2090: 2a 2f 0a 0a 20 20 20 20 61 74 74 72 20 3d 20 47 */.. attr = G
20a0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 etFileAttributes
20b0: 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 29 (linkSourcePath)
20c0: 3b 0a 20 20 20 20 69 66 20 28 61 74 74 72 20 3d ;. if (attr =
20d0: 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 = INVALID_FILE_A
20e0: 54 54 52 49 42 55 54 45 53 29 20 7b 0a 09 2f 2a TTRIBUTES) {../*
20f0: 0a 09 20 2a 20 54 68 65 20 73 6f 75 72 63 65 20 .. * The source
2100: 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a 09 doesn't exist...
2110: 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 */...TclWinConv
2120: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 ertError(GetLast
2130: 45 72 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 Error());..retur
2140: 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 7d 20 65 n NULL;.. } e
2150: 6c 73 65 20 69 66 20 28 28 61 74 74 72 20 26 20 lse if ((attr &
2160: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 FILE_ATTRIBUTE_D
2170: 49 52 45 43 54 4f 52 59 29 20 3d 3d 20 30 29 20 IRECTORY) == 0)
2180: 7b 0a 09 2f 2a 0a 09 20 2a 20 49 74 20 69 73 20 {../*.. * It is
2190: 61 20 66 69 6c 65 20 2d 20 74 68 69 73 20 69 73 a file - this is
21a0: 20 6e 6f 74 20 79 65 74 20 73 75 70 70 6f 72 74 not yet support
21b0: 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 53 ed... */...Tcl_S
21c0: 65 74 45 72 72 6e 6f 28 45 4e 4f 54 44 49 52 29 etErrno(ENOTDIR)
21d0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
21e0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
21f0: 6e 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 n WinReadLinkDir
2200: 65 63 74 6f 72 79 28 6c 69 6e 6b 53 6f 75 72 63 ectory(linkSourc
2210: 65 50 61 74 68 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ePath);.}.../*.
2220: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2260: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 69 6e 53 -----. *. * WinS
2270: 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 ymLinkDirectory
2280: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f --. *. *.This ro
2290: 75 74 69 6e 65 20 63 72 65 61 74 65 73 20 61 20 utine creates a
22a0: 4e 54 46 53 20 6a 75 6e 63 74 69 6f 6e 2c 20 75 NTFS junction, u
22b0: 73 69 6e 67 20 74 68 65 20 75 6e 64 6f 63 75 6d sing the undocum
22c0: 65 6e 74 65 64 0a 20 2a 09 46 53 43 54 4c 5f 53 ented. *.FSCTL_S
22d0: 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 ET_REPARSE_POINT
22e0: 20 73 74 72 75 63 74 75 72 65 20 57 69 6e 32 4b structure Win2K
22f0: 20 75 73 65 73 20 66 6f 72 20 6d 6f 75 6e 74 20 uses for mount
2300: 70 6f 69 6e 74 73 20 61 6e 64 0a 20 2a 09 6a 75 points and. *.ju
2310: 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 41 nctions.. *. *.A
2320: 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 6c ssumption that l
2330: 69 6e 6b 54 61 72 67 65 74 50 61 74 68 20 69 73 inkTargetPath is
2340: 20 61 20 76 61 6c 69 64 2c 20 65 78 69 73 74 69 a valid, existi
2350: 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a ng directory.. *
2360: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
2370: 5a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e Zero on success.
2380: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
23d0: 73 74 61 74 69 63 20 69 6e 74 0a 57 69 6e 53 79 static int.WinSy
23e0: 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 0a mLinkDirectory(.
23f0: 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 const TCHAR
2400: 2a 6c 69 6e 6b 44 69 72 50 61 74 68 2c 0a 20 20 *linkDirPath,.
2410: 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c const TCHAR *l
2420: 69 6e 6b 54 61 72 67 65 74 50 61 74 68 29 0a 7b inkTargetPath).{
2430: 0a 20 20 20 20 44 55 4d 4d 59 5f 52 45 50 41 52 . DUMMY_REPAR
2440: 53 45 5f 42 55 46 46 45 52 20 64 75 6d 6d 79 3b SE_BUFFER dummy;
2450: 0a 20 20 20 20 52 45 50 41 52 53 45 5f 44 41 54 . REPARSE_DAT
2460: 41 5f 42 55 46 46 45 52 20 2a 72 65 70 61 72 73 A_BUFFER *repars
2470: 65 42 75 66 66 65 72 20 3d 20 28 52 45 50 41 52 eBuffer = (REPAR
2480: 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a SE_DATA_BUFFER *
2490: 29 20 26 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e ) &dummy;. in
24a0: 74 20 6c 65 6e 3b 0a 20 20 20 20 57 43 48 41 52 t len;. WCHAR
24b0: 20 6e 61 74 69 76 65 54 61 72 67 65 74 5b 4d 41 nativeTarget[MA
24c0: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 57 43 48 X_PATH];. WCH
24d0: 41 52 20 2a 6c 6f 6f 70 3b 0a 0a 20 20 20 20 2f AR *loop;.. /
24e0: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 74 68 *. * Make th
24f0: 65 20 6e 61 74 69 76 65 20 74 61 72 67 65 74 20 e native target
2500: 6e 61 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 name.. */..
2510: 20 20 20 6d 65 6d 63 70 79 28 6e 61 74 69 76 65 memcpy(native
2520: 54 61 72 67 65 74 2c 20 4c 22 5c 5c 3f 3f 5c 5c Target, L"\\??\\
2530: 22 2c 20 34 20 2a 20 73 69 7a 65 6f 66 28 57 43 ", 4 * sizeof(WC
2540: 48 41 52 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 HAR));. memcp
2550: 79 28 6e 61 74 69 76 65 54 61 72 67 65 74 20 2b y(nativeTarget +
2560: 20 34 2c 20 6c 69 6e 6b 54 61 72 67 65 74 50 61 4, linkTargetPa
2570: 74 68 2c 0a 09 20 20 20 73 69 7a 65 6f 66 28 57 th,.. sizeof(W
2580: 43 48 41 52 29 20 2a 20 28 31 2b 77 63 73 6c 65 CHAR) * (1+wcsle
2590: 6e 28 28 57 43 48 41 52 20 2a 29 20 6c 69 6e 6b n((WCHAR *) link
25a0: 54 61 72 67 65 74 50 61 74 68 29 29 29 3b 0a 20 TargetPath)));.
25b0: 20 20 20 6c 65 6e 20 3d 20 77 63 73 6c 65 6e 28 len = wcslen(
25c0: 6e 61 74 69 76 65 54 61 72 67 65 74 29 3b 0a 0a nativeTarget);..
25d0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
25e0: 20 6d 75 73 74 20 68 61 76 65 20 62 61 63 6b 73 must have backs
25f0: 6c 61 73 68 65 73 20 6f 6e 6c 79 2e 20 54 68 69 lashes only. Thi
2600: 73 20 69 73 20 56 45 52 59 20 49 4d 50 4f 52 54 s is VERY IMPORT
2610: 41 4e 54 2e 20 49 66 20 77 65 20 68 61 76 65 20 ANT. If we have
2620: 61 6e 79 0a 20 20 20 20 20 2a 20 66 6f 72 77 61 any. * forwa
2630: 72 64 20 73 6c 61 73 68 65 73 20 65 76 65 72 79 rd slashes every
2640: 74 68 69 6e 67 20 61 70 70 65 61 72 73 20 74 6f thing appears to
2650: 20 77 6f 72 6b 2c 20 62 75 74 20 74 68 65 20 72 work, but the r
2660: 65 73 75 6c 74 69 6e 67 20 73 79 6d 6c 69 6e 6b esulting symlink
2670: 0a 20 20 20 20 20 2a 20 69 73 20 75 73 65 6c 65 . * is usele
2680: 73 73 21 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ss!. */..
2690: 20 66 6f 72 20 28 6c 6f 6f 70 20 3d 20 6e 61 74 for (loop = nat
26a0: 69 76 65 54 61 72 67 65 74 3b 20 2a 6c 6f 6f 70 iveTarget; *loop
26b0: 20 21 3d 20 30 3b 20 6c 6f 6f 70 2b 2b 29 20 7b != 0; loop++) {
26c0: 0a 09 69 66 20 28 2a 6c 6f 6f 70 20 3d 3d 20 4c ..if (*loop == L
26d0: 27 2f 27 29 20 7b 0a 09 20 20 20 20 2a 6c 6f 6f '/') {.. *loo
26e0: 70 20 3d 20 4c 27 5c 5c 27 3b 0a 09 7d 0a 20 20 p = L'\\';..}.
26f0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6e 61 74 }. if ((nat
2700: 69 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d 31 5d iveTarget[len-1]
2710: 20 3d 3d 20 4c 27 5c 5c 27 29 20 26 26 20 28 6e == L'\\') && (n
2720: 61 74 69 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d ativeTarget[len-
2730: 32 5d 20 21 3d 20 4c 27 3a 27 29 29 20 7b 0a 09 2] != L':')) {..
2740: 6e 61 74 69 76 65 54 61 72 67 65 74 5b 6c 65 6e nativeTarget[len
2750: 2d 31 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a -1] = 0;. }..
2760: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 75 /*. * Bu
2770: 69 6c 64 20 74 68 65 20 72 65 70 61 72 73 65 20 ild the reparse
2780: 69 6e 66 6f 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 info.. */..
2790: 20 20 20 6d 65 6d 73 65 74 28 72 65 70 61 72 73 memset(repars
27a0: 65 42 75 66 66 65 72 2c 20 30 2c 20 73 69 7a 65 eBuffer, 0, size
27b0: 6f 66 28 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 of(DUMMY_REPARSE
27c0: 5f 42 55 46 46 45 52 29 29 3b 0a 20 20 20 20 72 _BUFFER));. r
27d0: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 52 65 eparseBuffer->Re
27e0: 70 61 72 73 65 54 61 67 20 3d 20 49 4f 5f 52 45 parseTag = IO_RE
27f0: 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f PARSE_TAG_MOUNT_
2800: 50 4f 49 4e 54 3b 0a 20 20 20 20 72 65 70 61 72 POINT;. repar
2810: 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 seBuffer->MountP
2820: 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 ointReparseBuffe
2830: 72 2e 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 r.SubstituteName
2840: 4c 65 6e 67 74 68 20 3d 0a 09 20 20 20 20 77 63 Length =.. wc
2850: 73 6c 65 6e 28 6e 61 74 69 76 65 54 61 72 67 65 slen(nativeTarge
2860: 74 29 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 t) * sizeof(WCHA
2870: 52 29 3b 0a 20 20 20 20 72 65 70 61 72 73 65 42 R);. reparseB
2880: 75 66 66 65 72 2d 3e 52 65 73 65 72 76 65 64 20 uffer->Reserved
2890: 3d 20 30 3b 0a 20 20 20 20 72 65 70 61 72 73 65 = 0;. reparse
28a0: 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 Buffer->MountPoi
28b0: 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 2e ntReparseBuffer.
28c0: 50 72 69 6e 74 4e 61 6d 65 4c 65 6e 67 74 68 20 PrintNameLength
28d0: 3d 20 30 3b 0a 20 20 20 20 72 65 70 61 72 73 65 = 0;. reparse
28e0: 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 Buffer->MountPoi
28f0: 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 2e ntReparseBuffer.
2900: 50 72 69 6e 74 4e 61 6d 65 4f 66 66 73 65 74 20 PrintNameOffset
2910: 3d 0a 09 20 20 20 20 72 65 70 61 72 73 65 42 75 =.. reparseBu
2920: 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 ffer->MountPoint
2930: 52 65 70 61 72 73 65 42 75 66 66 65 72 2e 53 75 ReparseBuffer.Su
2940: 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 bstituteNameLeng
2950: 74 68 0a 09 20 20 20 20 2b 20 73 69 7a 65 6f 66 th.. + sizeof
2960: 28 57 43 48 41 52 29 3b 0a 20 20 20 20 6d 65 6d (WCHAR);. mem
2970: 63 70 79 28 72 65 70 61 72 73 65 42 75 66 66 65 cpy(reparseBuffe
2980: 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 r->MountPointRep
2990: 61 72 73 65 42 75 66 66 65 72 2e 50 61 74 68 42 arseBuffer.PathB
29a0: 75 66 66 65 72 2c 20 6e 61 74 69 76 65 54 61 72 uffer, nativeTar
29b0: 67 65 74 2c 0a 09 20 20 20 20 73 69 7a 65 6f 66 get,.. sizeof
29c0: 28 57 43 48 41 52 29 0a 09 20 20 20 20 2b 20 72 (WCHAR).. + r
29d0: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f eparseBuffer->Mo
29e0: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 untPointReparseB
29f0: 75 66 66 65 72 2e 53 75 62 73 74 69 74 75 74 65 uffer.Substitute
2a00: 4e 61 6d 65 4c 65 6e 67 74 68 29 3b 0a 20 20 20 NameLength);.
2a10: 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e reparseBuffer->
2a20: 52 65 70 61 72 73 65 44 61 74 61 4c 65 6e 67 74 ReparseDataLengt
2a30: 68 20 3d 0a 09 20 20 20 20 72 65 70 61 72 73 65 h =.. reparse
2a40: 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 Buffer->MountPoi
2a50: 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 2e ntReparseBuffer.
2a60: 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 SubstituteNameLe
2a70: 6e 67 74 68 2b 31 32 3b 0a 0a 20 20 20 20 72 65 ngth+12;.. re
2a80: 74 75 72 6e 20 4e 61 74 69 76 65 57 72 69 74 65 turn NativeWrite
2a90: 52 65 70 61 72 73 65 28 6c 69 6e 6b 44 69 72 50 Reparse(linkDirP
2aa0: 61 74 68 2c 20 72 65 70 61 72 73 65 42 75 66 66 ath, reparseBuff
2ab0: 65 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d er);.}.../*. *--
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b00: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 57 69 6e 53 --. *. * TclWinS
2b10: 79 6d 4c 69 6e 6b 43 6f 70 79 44 69 72 65 63 74 ymLinkCopyDirect
2b20: 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 70 ory --. *. *.Cop
2b30: 79 20 61 20 57 69 6e 64 6f 77 73 20 4e 54 46 53 y a Windows NTFS
2b40: 20 6a 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 junction. This
2b50: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 function assumes
2b60: 20 74 68 61 74 20 4c 69 6e 6b 4f 72 69 67 69 6e that LinkOrigin
2b70: 61 6c 0a 20 2a 09 65 78 69 73 74 73 20 61 6e 64 al. *.exists and
2b80: 20 69 73 20 61 20 76 61 6c 69 64 20 6a 75 6e 63 is a valid junc
2b90: 74 69 6f 6e 20 70 6f 69 6e 74 2c 20 61 6e 64 20 tion point, and
2ba0: 74 68 61 74 20 4c 69 6e 6b 43 6f 70 79 20 64 6f that LinkCopy do
2bb0: 65 73 20 6e 6f 74 0a 20 2a 09 65 78 69 73 74 2e es not. *.exist.
2bc0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
2bd0: 20 2a 09 5a 65 72 6f 20 6f 6e 20 73 75 63 63 65 *.Zero on succe
2be0: 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ss.. *. *-------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
2c30: 2f 0a 0a 69 6e 74 0a 54 63 6c 57 69 6e 53 79 6d /..int.TclWinSym
2c40: 4c 69 6e 6b 43 6f 70 79 44 69 72 65 63 74 6f 72 LinkCopyDirector
2c50: 79 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 y(. const TCH
2c60: 41 52 20 2a 6c 69 6e 6b 4f 72 69 67 50 61 74 68 AR *linkOrigPath
2c70: 2c 09 2f 2a 20 45 78 69 73 74 69 6e 67 20 6a 75 ,./* Existing ju
2c80: 6e 63 74 69 6f 6e 20 2d 20 72 65 70 61 72 73 65 nction - reparse
2c90: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 63 6f point */. co
2ca0: 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b 43 nst TCHAR *linkC
2cb0: 6f 70 79 50 61 74 68 29 09 2f 2a 20 57 69 6c 6c opyPath)./* Will
2cc0: 20 62 65 63 6f 6d 65 20 61 20 64 75 70 6c 69 63 become a duplic
2cd0: 61 74 65 20 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a ate junction */.
2ce0: 7b 0a 20 20 20 20 44 55 4d 4d 59 5f 52 45 50 41 {. DUMMY_REPA
2cf0: 52 53 45 5f 42 55 46 46 45 52 20 64 75 6d 6d 79 RSE_BUFFER dummy
2d00: 3b 0a 20 20 20 20 52 45 50 41 52 53 45 5f 44 41 ;. REPARSE_DA
2d10: 54 41 5f 42 55 46 46 45 52 20 2a 72 65 70 61 72 TA_BUFFER *repar
2d20: 73 65 42 75 66 66 65 72 20 3d 20 28 52 45 50 41 seBuffer = (REPA
2d30: 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 RSE_DATA_BUFFER
2d40: 2a 29 20 26 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 *) &dummy;..
2d50: 69 66 20 28 4e 61 74 69 76 65 52 65 61 64 52 65 if (NativeReadRe
2d60: 70 61 72 73 65 28 6c 69 6e 6b 4f 72 69 67 50 61 parse(linkOrigPa
2d70: 74 68 2c 20 72 65 70 61 72 73 65 42 75 66 66 65 th, reparseBuffe
2d80: 72 2c 20 47 45 4e 45 52 49 43 5f 52 45 41 44 29 r, GENERIC_READ)
2d90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a ) {..return -1;.
2da0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
2db0: 20 4e 61 74 69 76 65 57 72 69 74 65 52 65 70 61 NativeWriteRepa
2dc0: 72 73 65 28 6c 69 6e 6b 43 6f 70 79 50 61 74 68 rse(linkCopyPath
2dd0: 2c 20 72 65 70 61 72 73 65 42 75 66 66 65 72 29 , reparseBuffer)
2de0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2e30: 20 2a 0a 20 2a 20 54 63 6c 57 69 6e 53 79 6d 4c *. * TclWinSymL
2e40: 69 6e 6b 44 65 6c 65 74 65 20 2d 2d 0a 20 2a 0a inkDelete --. *.
2e50: 20 2a 09 44 65 6c 65 74 65 20 61 20 57 69 6e 64 *.Delete a Wind
2e60: 6f 77 73 20 4e 54 46 53 20 6a 75 6e 63 74 69 6f ows NTFS junctio
2e70: 6e 2e 20 4f 6e 63 65 20 74 68 65 20 6a 75 6e 63 n. Once the junc
2e80: 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e tion information
2e90: 20 69 73 0a 20 2a 09 64 65 6c 65 74 65 64 2c 20 is. *.deleted,
2ea0: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 6f the filesystem o
2eb0: 62 6a 65 63 74 20 62 65 63 6f 6d 65 73 20 61 6e bject becomes an
2ec0: 20 6f 72 64 69 6e 61 72 79 20 64 69 72 65 63 74 ordinary direct
2ed0: 6f 72 79 2e 20 55 6e 6c 65 73 73 0a 20 2a 09 27 ory. Unless. *.'
2ee0: 6c 69 6e 6b 4f 6e 6c 79 27 20 69 73 20 67 69 76 linkOnly' is giv
2ef0: 65 6e 2c 20 74 68 61 74 20 64 69 72 65 63 74 6f en, that directo
2f00: 72 79 20 69 73 20 61 6c 73 6f 20 72 65 6d 6f 76 ry is also remov
2f10: 65 64 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d 70 ed.. *. *.Assump
2f20: 74 69 6f 6e 20 74 68 61 74 20 4c 69 6e 6b 4f 72 tion that LinkOr
2f30: 69 67 69 6e 61 6c 20 69 73 20 61 20 76 61 6c 69 iginal is a vali
2f40: 64 2c 20 65 78 69 73 74 69 6e 67 20 6a 75 6e 63 d, existing junc
2f50: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 tion.. *. * Retu
2f60: 72 6e 73 3a 0a 20 2a 09 5a 65 72 6f 20 6f 6e 20 rns:. *.Zero on
2f70: 73 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d success.. *. *--
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fc0: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 57 --. */..int.TclW
2fd0: 69 6e 53 79 6d 4c 69 6e 6b 44 65 6c 65 74 65 28 inSymLinkDelete(
2fe0: 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 . const TCHAR
2ff0: 20 2a 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 0a *linkOrigPath,.
3000: 20 20 20 20 69 6e 74 20 6c 69 6e 6b 4f 6e 6c 79 int linkOnly
3010: 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 ).{. /*.
3020: 2a 20 49 74 20 69 73 20 61 20 73 79 6d 62 6f 6c * It is a symbol
3030: 69 63 20 6c 69 6e 6b 20 2d 20 72 65 6d 6f 76 65 ic link - remove
3040: 20 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 it.. */..
3050: 20 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f DUMMY_REPARSE_
3060: 42 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 BUFFER dummy;.
3070: 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 REPARSE_DATA_B
3080: 55 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 UFFER *reparseBu
3090: 66 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f ffer = (REPARSE_
30a0: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 DATA_BUFFER *) &
30b0: 64 75 6d 6d 79 3b 0a 20 20 20 20 48 41 4e 44 4c dummy;. HANDL
30c0: 45 20 68 46 69 6c 65 3b 0a 20 20 20 20 44 57 4f E hFile;. DWO
30d0: 52 44 20 72 65 74 75 72 6e 65 64 4c 65 6e 67 74 RD returnedLengt
30e0: 68 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 72 h;.. memset(r
30f0: 65 70 61 72 73 65 42 75 66 66 65 72 2c 20 30 2c eparseBuffer, 0,
3100: 20 73 69 7a 65 6f 66 28 44 55 4d 4d 59 5f 52 45 sizeof(DUMMY_RE
3110: 50 41 52 53 45 5f 42 55 46 46 45 52 29 29 3b 0a PARSE_BUFFER));.
3120: 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 reparseBuffe
3130: 72 2d 3e 52 65 70 61 72 73 65 54 61 67 20 3d 20 r->ReparseTag =
3140: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 4d IO_REPARSE_TAG_M
3150: 4f 55 4e 54 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 OUNT_POINT;.
3160: 68 46 69 6c 65 20 3d 20 43 72 65 61 74 65 46 69 hFile = CreateFi
3170: 6c 65 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c le(linkOrigPath,
3180: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20 GENERIC_WRITE,
3190: 30 2c 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 0, NULL, OPEN_EX
31a0: 49 53 54 49 4e 47 2c 0a 09 20 20 20 20 46 49 4c ISTING,.. FIL
31b0: 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 E_FLAG_OPEN_REPA
31c0: 52 53 45 5f 50 4f 49 4e 54 20 7c 20 46 49 4c 45 RSE_POINT | FILE
31d0: 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d _FLAG_BACKUP_SEM
31e0: 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 3b 0a 0a ANTICS, NULL);..
31f0: 20 20 20 20 69 66 20 28 68 46 69 6c 65 20 21 3d if (hFile !=
3200: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f INVALID_HANDLE_
3210: 56 41 4c 55 45 29 20 7b 0a 09 69 66 20 28 21 44 VALUE) {..if (!D
3220: 65 76 69 63 65 49 6f 43 6f 6e 74 72 6f 6c 28 68 eviceIoControl(h
3230: 46 69 6c 65 2c 20 46 53 43 54 4c 5f 44 45 4c 45 File, FSCTL_DELE
3240: 54 45 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 TE_REPARSE_POINT
3250: 2c 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2c , reparseBuffer,
3260: 0a 09 09 52 45 50 41 52 53 45 5f 4d 4f 55 4e 54 ...REPARSE_MOUNT
3270: 50 4f 49 4e 54 5f 48 45 41 44 45 52 5f 53 49 5a POINT_HEADER_SIZ
3280: 45 2c 4e 55 4c 4c 2c 30 2c 26 72 65 74 75 72 6e E,NULL,0,&return
3290: 65 64 4c 65 6e 67 74 68 2c 4e 55 4c 4c 29 29 20 edLength,NULL))
32a0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
32b0: 2a 20 45 72 72 6f 72 20 73 65 74 74 69 6e 67 20 * Error setting
32c0: 6a 75 6e 63 74 69 6f 6e 2e 0a 09 20 20 20 20 20 junction...
32d0: 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 57 69 6e 43 */... TclWinC
32e0: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c onvertError(GetL
32f0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20 astError());..
3300: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 46 CloseHandle(hF
3310: 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ile);..} else {.
3320: 09 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 . CloseHandle
3330: 28 68 46 69 6c 65 29 3b 0a 09 20 20 20 20 69 66 (hFile);.. if
3340: 20 28 21 6c 69 6e 6b 4f 6e 6c 79 29 20 7b 0a 09 (!linkOnly) {..
3350: 09 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 .RemoveDirectory
3360: 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 29 3b 0a (linkOrigPath);.
3370: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 . }.. retu
3380: 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 rn 0;..}. }.
3390: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a return -1;.}.
33a0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
33f0: 2a 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 * WinReadLinkDir
3400: 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a 09 ectory --. *. *.
3410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 This routine rea
3420: 64 73 20 61 20 4e 54 46 53 20 6a 75 6e 63 74 69 ds a NTFS juncti
3430: 6f 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 75 6e on, using the un
3440: 64 6f 63 75 6d 65 6e 74 65 64 0a 20 2a 09 46 53 documented. *.FS
3450: 43 54 4c 5f 47 45 54 5f 52 45 50 41 52 53 45 5f CTL_GET_REPARSE_
3460: 50 4f 49 4e 54 20 73 74 72 75 63 74 75 72 65 20 POINT structure
3470: 57 69 6e 32 4b 20 75 73 65 73 20 66 6f 72 20 6d Win2K uses for m
3480: 6f 75 6e 74 20 70 6f 69 6e 74 73 20 61 6e 64 0a ount points and.
3490: 20 2a 09 6a 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a *.junctions.. *
34a0: 0a 20 2a 09 41 73 73 75 6d 70 74 69 6f 6e 20 74 . *.Assumption t
34b0: 68 61 74 20 4c 69 6e 6b 44 69 72 65 63 74 6f 72 hat LinkDirector
34c0: 79 20 69 73 20 61 20 76 61 6c 69 64 2c 20 65 78 y is a valid, ex
34d0: 69 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 79 isting directory
34e0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
34f0: 0a 20 2a 09 41 20 54 63 6c 5f 4f 62 6a 20 77 69 . *.A Tcl_Obj wi
3500: 74 68 20 72 65 66 43 6f 75 6e 74 20 6f 66 20 31 th refCount of 1
3510: 20 28 69 2e 65 2e 20 6f 77 6e 65 64 20 62 79 20 (i.e. owned by
3520: 74 68 65 20 63 61 6c 6c 65 72 29 2c 20 6f 72 20 the caller), or
3530: 4e 55 4c 4c 20 69 66 0a 20 2a 09 61 6e 79 74 68 NULL if. *.anyth
3540: 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67 2e 0a ing went wrong..
3550: 20 2a 0a 20 2a 09 49 6e 20 74 68 65 20 66 75 74 *. *.In the fut
3560: 75 72 65 20 77 65 20 73 68 6f 75 6c 64 20 65 6e ure we should en
3570: 68 61 6e 63 65 20 74 68 69 73 20 74 6f 20 72 65 hance this to re
3580: 74 75 72 6e 20 61 20 70 61 74 68 20 6f 62 6a 65 turn a path obje
3590: 63 74 20 72 61 74 68 65 72 0a 20 2a 09 74 68 61 ct rather. *.tha
35a0: 6e 20 61 20 73 74 72 69 6e 67 2e 0a 20 2a 0a 20 n a string.. *.
35b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
3600: 63 20 54 63 6c 5f 4f 62 6a 20 2a 0a 57 69 6e 52 c Tcl_Obj *.WinR
3610: 65 61 64 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 eadLinkDirectory
3620: 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 (. const TCHA
3630: 52 20 2a 6c 69 6e 6b 44 69 72 50 61 74 68 29 0a R *linkDirPath).
3640: 7b 0a 20 20 20 20 69 6e 74 20 61 74 74 72 2c 20 {. int attr,
3650: 6c 65 6e 2c 20 6f 66 66 73 65 74 3b 0a 20 20 20 len, offset;.
3660: 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 DUMMY_REPARSE_B
3670: 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 UFFER dummy;.
3680: 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 REPARSE_DATA_BU
3690: 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 66 FFER *reparseBuf
36a0: 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f 44 fer = (REPARSE_D
36b0: 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 64 ATA_BUFFER *) &d
36c0: 75 6d 6d 79 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 ummy;. Tcl_Ob
36d0: 6a 20 2a 72 65 74 56 61 6c 3b 0a 20 20 20 20 54 j *retVal;. T
36e0: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 cl_DString ds;.
36f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 const char *c
3700: 6f 70 79 3b 0a 0a 20 20 20 20 61 74 74 72 20 3d opy;.. attr =
3710: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 GetFileAttribut
3720: 65 73 28 6c 69 6e 6b 44 69 72 50 61 74 68 29 3b es(linkDirPath);
3730: 0a 20 20 20 20 69 66 20 28 21 28 61 74 74 72 20 . if (!(attr
3740: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 & FILE_ATTRIBUTE
3750: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 29 29 _REPARSE_POINT))
3760: 20 7b 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 {..goto invalid
3770: 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 Error;. }.
3780: 20 69 66 20 28 4e 61 74 69 76 65 52 65 61 64 52 if (NativeReadR
3790: 65 70 61 72 73 65 28 6c 69 6e 6b 44 69 72 50 61 eparse(linkDirPa
37a0: 74 68 2c 20 72 65 70 61 72 73 65 42 75 66 66 65 th, reparseBuffe
37b0: 72 2c 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e r, 0)) {..return
37c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
37d0: 20 20 73 77 69 74 63 68 20 28 72 65 70 61 72 73 switch (repars
37e0: 65 42 75 66 66 65 72 2d 3e 52 65 70 61 72 73 65 eBuffer->Reparse
37f0: 54 61 67 29 20 7b 0a 20 20 20 20 63 61 73 65 20 Tag) {. case
3800: 30 78 38 30 30 30 30 30 30 30 7c 49 4f 5f 52 45 0x80000000|IO_RE
3810: 50 41 52 53 45 5f 54 41 47 5f 53 59 4d 42 4f 4c PARSE_TAG_SYMBOL
3820: 49 43 5f 4c 49 4e 4b 3a 0a 20 20 20 20 63 61 73 IC_LINK:. cas
3830: 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 e IO_REPARSE_TAG
3840: 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 3a 0a _SYMBOLIC_LINK:.
3850: 20 20 20 20 63 61 73 65 20 49 4f 5f 52 45 50 41 case IO_REPA
3860: 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f RSE_TAG_MOUNT_PO
3870: 49 4e 54 3a 0a 09 2f 2a 0a 09 20 2a 20 43 65 72 INT:../*.. * Cer
3880: 74 61 69 6e 20 6e 61 74 69 76 65 20 70 61 74 68 tain native path
3890: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 representations
38a0: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 68 61 76 65 on Windows have
38b0: 20 61 20 73 70 65 63 69 61 6c 0a 09 20 2a 20 70 a special.. * p
38c0: 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74 refix to indicat
38d0: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 e that they are
38e0: 74 6f 20 62 65 20 74 72 65 61 74 65 64 20 73 70 to be treated sp
38f0: 65 63 69 61 6c 6c 79 2e 20 46 6f 72 0a 09 20 2a ecially. For.. *
3900: 20 65 78 61 6d 70 6c 65 20 65 78 74 72 65 6d 65 example extreme
3910: 6c 79 20 6c 6f 6e 67 20 70 61 74 68 73 2c 20 6f ly long paths, o
3920: 72 20 73 79 6d 6c 69 6e 6b 73 2c 20 6f 72 20 76 r symlinks, or v
3930: 6f 6c 75 6d 65 73 20 6d 6f 75 6e 74 65 64 0a 09 olumes mounted..
3940: 20 2a 20 69 6e 73 69 64 65 20 64 69 72 65 63 74 * inside direct
3950: 6f 72 69 65 73 2e 0a 09 20 2a 0a 09 20 2a 20 54 ories... *.. * T
3960: 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 75 6d here is an assum
3970: 70 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f ption in this co
3980: 64 65 20 74 68 61 74 20 27 77 69 64 65 27 20 69 de that 'wide' i
3990: 6e 74 65 72 66 61 63 65 73 20 61 72 65 0a 09 20 nterfaces are..
39a0: 2a 20 62 65 69 6e 67 20 75 73 65 64 20 28 73 65 * being used (se
39b0: 65 20 74 63 6c 57 69 6e 33 32 44 6c 6c 2e 63 29 e tclWin32Dll.c)
39c0: 2c 20 77 68 69 63 68 20 69 73 20 74 72 75 65 20 , which is true
39d0: 66 6f 72 20 74 68 65 20 6f 6e 6c 79 20 73 79 73 for the only sys
39e0: 74 65 6d 73 0a 09 20 2a 20 77 68 69 63 68 20 73 tems.. * which s
39f0: 75 70 70 6f 72 74 20 72 65 70 61 72 73 65 20 74 upport reparse t
3a00: 61 67 73 20 61 74 20 70 72 65 73 65 6e 74 2e 20 ags at present.
3a10: 49 66 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 If that changes
3a20: 69 6e 20 74 68 65 0a 09 20 2a 20 66 75 74 75 72 in the.. * futur
3a30: 65 2c 20 74 68 69 73 20 63 6f 64 65 20 77 69 6c e, this code wil
3a40: 6c 20 68 61 76 65 20 74 6f 20 62 65 20 67 65 6e l have to be gen
3a50: 65 72 61 6c 69 73 65 64 2e 0a 09 20 2a 2f 0a 0a eralised... */..
3a60: 09 6f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69 66 .offset = 0;.#if
3a70: 64 65 66 20 55 4e 49 43 4f 44 45 0a 09 69 66 20 def UNICODE..if
3a80: 28 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e (reparseBuffer->
3a90: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 MountPointRepars
3aa0: 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 eBuffer.PathBuff
3ab0: 65 72 5b 30 5d 20 3d 3d 20 4c 27 5c 5c 27 29 20 er[0] == L'\\')
3ac0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
3ad0: 2a 20 43 68 65 63 6b 20 77 68 65 74 68 65 72 20 * Check whether
3ae0: 74 68 69 73 20 69 73 20 61 20 6d 6f 75 6e 74 65 this is a mounte
3af0: 64 20 76 6f 6c 75 6d 65 2e 0a 09 20 20 20 20 20 d volume...
3b00: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 77 63 73 */... if (wcs
3b10: 6e 63 6d 70 28 72 65 70 61 72 73 65 42 75 66 66 ncmp(reparseBuff
3b20: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 er->MountPointRe
3b30: 70 61 72 73 65 42 75 66 66 65 72 2e 50 61 74 68 parseBuffer.Path
3b40: 42 75 66 66 65 72 2c 0a 09 09 20 20 20 20 4c 22 Buffer,... L"
3b50: 5c 5c 3f 3f 5c 5c 56 6f 6c 75 6d 65 7b 22 2c 31 \\??\\Volume{",1
3b60: 31 29 20 3d 3d 20 30 29 20 7b 0a 09 09 63 68 61 1) == 0) {...cha
3b70: 72 20 64 72 69 76 65 3b 0a 0a 09 09 2f 2a 0a 09 r drive;..../*..
3b80: 09 20 2a 20 54 68 65 72 65 20 69 73 20 73 6f 6d . * There is som
3b90: 65 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 74 77 e confusion betw
3ba0: 65 65 6e 20 5c 3f 3f 5c 20 61 6e 64 20 5c 5c 3f een \??\ and \\?
3bb0: 5c 20 77 68 69 63 68 20 77 65 20 68 61 76 65 0a \ which we have.
3bc0: 09 09 20 2a 20 74 6f 20 66 69 78 20 68 65 72 65 .. * to fix here
3bd0: 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 73 65 65 . It doesn't see
3be0: 6d 20 76 65 72 79 20 77 65 6c 6c 20 64 6f 63 75 m very well docu
3bf0: 6d 65 6e 74 65 64 2e 0a 09 09 20 2a 2f 0a 0a 09 mented.... */...
3c00: 09 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e .reparseBuffer->
3c10: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 MountPointRepars
3c20: 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 eBuffer.PathBuff
3c30: 65 72 5b 31 5d 3d 4c 27 5c 5c 27 3b 0a 0a 09 09 er[1]=L'\\';....
3c40: 2f 2a 0a 09 09 20 2a 20 43 68 65 63 6b 20 69 66 /*... * Check if
3c50: 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 a corresponding
3c60: 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 65 78 drive letter ex
3c70: 69 73 74 73 2c 20 61 6e 64 20 75 73 65 20 74 68 ists, and use th
3c80: 61 74 0a 09 09 20 2a 20 69 66 20 69 74 20 69 73 at... * if it is
3c90: 20 66 6f 75 6e 64 0a 09 09 20 2a 2f 0a 0a 09 09 found... */....
3ca0: 64 72 69 76 65 20 3d 20 54 63 6c 57 69 6e 44 72 drive = TclWinDr
3cb0: 69 76 65 4c 65 74 74 65 72 46 6f 72 56 6f 6c 4d iveLetterForVolM
3cc0: 6f 75 6e 74 50 6f 69 6e 74 28 0a 09 09 09 72 65 ountPoint(....re
3cd0: 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 parseBuffer->Mou
3ce0: 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 ntPointReparseBu
3cf0: 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 29 ffer.PathBuffer)
3d00: 3b 0a 09 09 69 66 20 28 64 72 69 76 65 20 21 3d ;...if (drive !=
3d10: 20 2d 31 29 20 7b 0a 09 09 20 20 20 20 63 68 61 -1) {... cha
3d20: 72 20 64 72 69 76 65 53 70 65 63 5b 33 5d 20 3d r driveSpec[3] =
3d30: 20 7b 0a 09 09 09 27 5c 30 27 2c 20 27 3a 27 2c {....'\0', ':',
3d40: 20 27 5c 30 27 0a 09 09 20 20 20 20 7d 3b 0a 0a '\0'... };..
3d50: 09 09 20 20 20 20 64 72 69 76 65 53 70 65 63 5b .. driveSpec[
3d60: 30 5d 20 3d 20 64 72 69 76 65 3b 0a 09 09 20 20 0] = drive;...
3d70: 20 20 72 65 74 56 61 6c 20 3d 20 54 63 6c 5f 4e retVal = Tcl_N
3d80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 64 72 69 76 ewStringObj(driv
3d90: 65 53 70 65 63 2c 32 29 3b 0a 09 09 20 20 20 20 eSpec,2);...
3da0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
3db0: 28 72 65 74 56 61 6c 29 3b 0a 09 09 20 20 20 20 (retVal);...
3dc0: 72 65 74 75 72 6e 20 72 65 74 56 61 6c 3b 0a 09 return retVal;..
3dd0: 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 54 68 .}..../*... * Th
3de0: 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 is is actually a
3df0: 20 6d 6f 75 6e 74 65 64 20 64 72 69 76 65 2c 20 mounted drive,
3e00: 77 68 69 63 68 20 64 6f 65 73 6e 27 74 20 65 78 which doesn't ex
3e10: 69 73 74 73 20 61 73 20 61 0a 09 09 20 2a 20 44 ists as a... * D
3e20: 4f 53 20 64 72 69 76 65 20 6c 65 74 74 65 72 2e OS drive letter.
3e30: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 This means the
3e40: 70 61 74 68 20 69 73 6e 27 74 20 61 63 74 75 61 path isn't actua
3e50: 6c 6c 79 20 61 0a 09 09 20 2a 20 6c 69 6e 6b 2c lly a... * link,
3e60: 20 61 6c 74 68 6f 75 67 68 20 77 65 20 70 61 72 although we par
3e70: 74 69 61 6c 6c 79 20 74 72 65 61 74 20 69 74 20 tially treat it
3e80: 6c 69 6b 65 20 6f 6e 65 20 28 27 66 69 6c 65 20 like one ('file
3e90: 74 79 70 65 27 0a 09 09 20 2a 20 77 69 6c 6c 20 type'... * will
3ea0: 72 65 74 75 72 6e 20 27 6c 69 6e 6b 27 29 2c 20 return 'link'),
3eb0: 62 75 74 20 74 68 65 6e 20 74 68 65 20 6c 69 6e but then the lin
3ec0: 6b 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 k will actually
3ed0: 6a 75 73 74 0a 09 09 20 2a 20 62 65 20 74 72 65 just... * be tre
3ee0: 61 74 65 64 20 6c 69 6b 65 20 61 6e 20 6f 72 64 ated like an ord
3ef0: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e inary directory.
3f00: 20 49 20 64 6f 6e 27 74 20 62 65 6c 69 65 76 65 I don't believe
3f10: 20 61 6e 79 0a 09 09 20 2a 20 73 65 72 69 6f 75 any... * seriou
3f20: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 20 s inconsistency
3f30: 77 69 6c 6c 20 61 72 69 73 65 20 66 72 6f 6d 20 will arise from
3f40: 74 68 69 73 2c 20 62 75 74 20 69 74 20 69 73 0a this, but it is.
3f50: 09 09 20 2a 20 73 6f 6d 65 74 68 69 6e 67 20 74 .. * something t
3f60: 6f 20 62 65 20 61 77 61 72 65 20 6f 66 2e 0a 09 o be aware of...
3f70: 09 20 2a 2f 0a 0a 09 09 67 6f 74 6f 20 69 6e 76 . */....goto inv
3f80: 61 6c 69 64 45 72 72 6f 72 3b 0a 09 20 20 20 20 alidError;..
3f90: 7d 20 65 6c 73 65 20 69 66 20 28 77 63 73 6e 63 } else if (wcsnc
3fa0: 6d 70 28 72 65 70 61 72 73 65 42 75 66 66 65 72 mp(reparseBuffer
3fb0: 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 ->MountPointRepa
3fc0: 72 73 65 42 75 66 66 65 72 0a 09 09 20 20 20 20 rseBuffer...
3fd0: 2e 50 61 74 68 42 75 66 66 65 72 2c 20 4c 22 5c .PathBuffer, L"\
3fe0: 5c 5c 5c 3f 5c 5c 22 2c 34 29 20 3d 3d 20 30 29 \\\?\\",4) == 0)
3ff0: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 53 74 72 {.../*... * Str
4000: 69 70 20 6f 66 66 20 74 68 65 20 70 72 65 66 69 ip off the prefi
4010: 78 2e 0a 09 09 20 2a 2f 0a 0a 09 09 6f 66 66 73 x.... */....offs
4020: 65 74 20 3d 20 34 3b 0a 09 20 20 20 20 7d 20 65 et = 4;.. } e
4030: 6c 73 65 20 69 66 20 28 77 63 73 6e 63 6d 70 28 lse if (wcsncmp(
4040: 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d reparseBuffer->M
4050: 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 ountPointReparse
4060: 42 75 66 66 65 72 0a 09 09 20 20 20 20 2e 50 61 Buffer... .Pa
4070: 74 68 42 75 66 66 65 72 2c 20 4c 22 5c 5c 3f 3f thBuffer, L"\\??
4080: 5c 5c 22 2c 34 29 20 3d 3d 20 30 29 20 7b 0a 09 \\",4) == 0) {..
4090: 09 2f 2a 0a 09 09 20 2a 20 53 74 72 69 70 20 6f ./*... * Strip o
40a0: 66 66 20 74 68 65 20 70 72 65 66 69 78 2e 0a 09 ff the prefix...
40b0: 09 20 2a 2f 0a 0a 09 09 6f 66 66 73 65 74 20 3d . */....offset =
40c0: 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 23 65 4;.. }..}.#e
40d0: 6e 64 69 66 20 2f 2a 20 55 4e 49 43 4f 44 45 20 ndif /* UNICODE
40e0: 2a 2f 0a 0a 09 54 63 6c 5f 57 69 6e 54 43 68 61 */...Tcl_WinTCha
40f0: 72 54 6f 55 74 66 28 28 63 6f 6e 73 74 20 54 43 rToUtf((const TC
4100: 48 41 52 20 2a 29 0a 09 09 72 65 70 61 72 73 65 HAR *)...reparse
4110: 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 Buffer->MountPoi
4120: 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 2e ntReparseBuffer.
4130: 50 61 74 68 42 75 66 66 65 72 2c 0a 09 09 28 69 PathBuffer,...(i
4140: 6e 74 29 20 72 65 70 61 72 73 65 42 75 66 66 65 nt) reparseBuffe
4150: 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 r->MountPointRep
4160: 61 72 73 65 42 75 66 66 65 72 0a 09 09 2e 53 75 arseBuffer....Su
4170: 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 bstituteNameLeng
4180: 74 68 2c 20 26 64 73 29 3b 0a 0a 09 63 6f 70 79 th, &ds);...copy
4190: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 = Tcl_DStringVa
41a0: 6c 75 65 28 26 64 73 29 2b 6f 66 66 73 65 74 3b lue(&ds)+offset;
41b0: 0a 09 6c 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 ..len = Tcl_DStr
41c0: 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 2d 6f ingLength(&ds)-o
41d0: 66 66 73 65 74 3b 0a 09 72 65 74 56 61 6c 20 3d ffset;..retVal =
41e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
41f0: 6a 28 63 6f 70 79 2c 6c 65 6e 29 3b 0a 09 54 63 j(copy,len);..Tc
4200: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 l_IncrRefCount(r
4210: 65 74 56 61 6c 29 3b 0a 09 54 63 6c 5f 44 53 74 etVal);..Tcl_DSt
4220: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
4230: 72 65 74 75 72 6e 20 72 65 74 56 61 6c 3b 0a 20 return retVal;.
4240: 20 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 45 }.. invalidE
4250: 72 72 6f 72 3a 0a 20 20 20 20 54 63 6c 5f 53 65 rror:. Tcl_Se
4260: 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a tErrno(EINVAL);.
4270: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
4280: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
42d0: 2a 0a 20 2a 20 4e 61 74 69 76 65 52 65 61 64 52 *. * NativeReadR
42e0: 65 70 61 72 73 65 20 2d 2d 0a 20 2a 0a 20 2a 09 eparse --. *. *.
42f0: 52 65 61 64 20 74 68 65 20 6a 75 6e 63 74 69 6f Read the junctio
4300: 6e 2f 72 65 70 61 72 73 65 20 69 6e 66 6f 72 6d n/reparse inform
4310: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 67 69 76 ation from a giv
4320: 65 6e 20 4e 54 46 53 20 64 69 72 65 63 74 6f 72 en NTFS director
4330: 79 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d 70 74 y.. *. *.Assumpt
4340: 69 6f 6e 20 74 68 61 74 20 6c 69 6e 6b 44 69 72 ion that linkDir
4350: 50 61 74 68 20 69 73 20 61 20 76 61 6c 69 64 2c Path is a valid,
4360: 20 65 78 69 73 74 69 6e 67 20 64 69 72 65 63 74 existing direct
4370: 6f 72 79 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ory.. *. * Retur
4380: 6e 73 3a 0a 20 2a 09 5a 65 72 6f 20 6f 6e 20 73 ns:. *.Zero on s
4390: 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d uccess.. *. *---
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43e0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
43f0: 74 0a 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 t.NativeReadRepa
4400: 72 73 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 rse(. const T
4410: 43 48 41 52 20 2a 6c 69 6e 6b 44 69 72 50 61 74 CHAR *linkDirPat
4420: 68 2c 09 2f 2a 20 54 68 65 20 6a 75 6e 63 74 69 h,./* The juncti
4430: 6f 6e 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 on to read */.
4440: 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 REPARSE_DATA_B
4450: 55 46 46 45 52 20 2a 62 75 66 66 65 72 2c 2f 2a UFFER *buffer,/*
4460: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 Pointer to buff
4470: 65 72 2e 20 43 61 6e 6e 6f 74 20 62 65 20 4e 55 er. Cannot be NU
4480: 4c 4c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 LL */. DWORD
4490: 64 65 73 69 72 65 64 41 63 63 65 73 73 29 0a 7b desiredAccess).{
44a0: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 46 69 6c . HANDLE hFil
44b0: 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 72 65 74 e;. DWORD ret
44c0: 75 72 6e 65 64 4c 65 6e 67 74 68 3b 0a 0a 20 20 urnedLength;..
44d0: 20 20 68 46 69 6c 65 20 3d 20 43 72 65 61 74 65 hFile = Create
44e0: 46 69 6c 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 File(linkDirPath
44f0: 2c 20 64 65 73 69 72 65 64 41 63 63 65 73 73 2c , desiredAccess,
4500: 20 30 2c 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 0, NULL, OPEN_E
4510: 58 49 53 54 49 4e 47 2c 0a 09 20 20 20 20 46 49 XISTING,.. FI
4520: 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 LE_FLAG_OPEN_REP
4530: 41 52 53 45 5f 50 4f 49 4e 54 20 7c 20 46 49 4c ARSE_POINT | FIL
4540: 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 E_FLAG_BACKUP_SE
4550: 4d 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 3b 0a MANTICS, NULL);.
4560: 0a 20 20 20 20 69 66 20 28 68 46 69 6c 65 20 3d . if (hFile =
4570: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 = INVALID_HANDLE
4580: 5f 56 41 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09 20 _VALUE) {../*..
4590: 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e 67 * Error creating
45a0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a 2f directory... */
45b0: 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 ...TclWinConvert
45c0: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 Error(GetLastErr
45d0: 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d or());..return -
45e0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 1;. }.. /*
45f0: 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 . * Get the
4600: 6c 69 6e 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 link.. */..
4610: 20 20 20 69 66 20 28 21 44 65 76 69 63 65 49 6f if (!DeviceIo
4620: 43 6f 6e 74 72 6f 6c 28 68 46 69 6c 65 2c 20 46 Control(hFile, F
4630: 53 43 54 4c 5f 47 45 54 5f 52 45 50 41 52 53 45 SCTL_GET_REPARSE
4640: 5f 50 4f 49 4e 54 2c 20 4e 55 4c 4c 2c 20 30 2c _POINT, NULL, 0,
4650: 20 62 75 66 66 65 72 2c 0a 09 20 20 20 20 73 69 buffer,.. si
4660: 7a 65 6f 66 28 44 55 4d 4d 59 5f 52 45 50 41 52 zeof(DUMMY_REPAR
4670: 53 45 5f 42 55 46 46 45 52 29 2c 20 26 72 65 74 SE_BUFFER), &ret
4680: 75 72 6e 65 64 4c 65 6e 67 74 68 2c 20 4e 55 4c urnedLength, NUL
4690: 4c 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 L)) {../*.. * Er
46a0: 72 6f 72 20 73 65 74 74 69 6e 67 20 6a 75 6e 63 ror setting junc
46b0: 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c tion... */...Tcl
46c0: 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 WinConvertError(
46d0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b GetLastError());
46e0: 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 46 ..CloseHandle(hF
46f0: 69 6c 65 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 ile);..return -1
4700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 6c 6f 73 ;. }. Clos
4710: 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a eHandle(hFile);.
4720: 0a 20 20 20 20 69 66 20 28 21 49 73 52 65 70 61 . if (!IsRepa
4730: 72 73 65 54 61 67 56 61 6c 69 64 28 62 75 66 66 rseTagValid(buff
4740: 65 72 2d 3e 52 65 70 61 72 73 65 54 61 67 29 29 er->ReparseTag))
4750: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f {..Tcl_SetErrno
4760: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 (EINVAL);..retur
4770: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 n -1;. }.
4780: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a return 0;.}.../*
4790: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 -------. *. * Na
47e0: 74 69 76 65 57 72 69 74 65 52 65 70 61 72 73 65 tiveWriteReparse
47f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 --. *. *.Write
4800: 74 68 65 20 72 65 70 61 72 73 65 20 69 6e 66 6f the reparse info
4810: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 67 69 rmation for a gi
4820: 76 65 6e 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 ven directory..
4830: 2a 0a 20 2a 09 41 73 73 75 6d 70 74 69 6f 6e 20 *. *.Assumption
4840: 74 68 61 74 20 4c 69 6e 6b 44 69 72 65 63 74 6f that LinkDirecto
4850: 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 ry does not exis
4860: 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d t.. *. *--------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
48b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 ..static int.Nat
48c0: 69 76 65 57 72 69 74 65 52 65 70 61 72 73 65 28 iveWriteReparse(
48d0: 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 . const TCHAR
48e0: 20 2a 6c 69 6e 6b 44 69 72 50 61 74 68 2c 0a 20 *linkDirPath,.
48f0: 20 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f REPARSE_DATA_
4900: 42 55 46 46 45 52 20 2a 62 75 66 66 65 72 29 0a BUFFER *buffer).
4910: 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 46 69 {. HANDLE hFi
4920: 6c 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 72 65 le;. DWORD re
4930: 74 75 72 6e 65 64 4c 65 6e 67 74 68 3b 0a 0a 20 turnedLength;..
4940: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 /*. * Cre
4950: 61 74 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 ate the director
4960: 79 20 2d 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 y - it must not
4970: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 20 already exist..
4980: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
4990: 43 72 65 61 74 65 44 69 72 65 63 74 6f 72 79 28 CreateDirectory(
49a0: 6c 69 6e 6b 44 69 72 50 61 74 68 2c 20 4e 55 4c linkDirPath, NUL
49b0: 4c 29 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 L) == 0) {../*..
49c0: 20 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e * Error creatin
49d0: 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a g directory... *
49e0: 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 /...TclWinConver
49f0: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 tError(GetLastEr
4a00: 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 ror());..return
4a10: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 46 -1;. }. hF
4a20: 69 6c 65 20 3d 20 43 72 65 61 74 65 46 69 6c 65 ile = CreateFile
4a30: 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c 20 47 45 (linkDirPath, GE
4a40: 4e 45 52 49 43 5f 57 52 49 54 45 2c 20 30 2c 20 NERIC_WRITE, 0,
4a50: 4e 55 4c 4c 2c 0a 09 20 20 20 20 4f 50 45 4e 5f NULL,.. OPEN_
4a60: 45 58 49 53 54 49 4e 47 2c 20 46 49 4c 45 5f 46 EXISTING, FILE_F
4a70: 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 LAG_OPEN_REPARSE
4a80: 5f 50 4f 49 4e 54 0a 09 20 20 20 20 7c 20 46 49 _POINT.. | FI
4a90: 4c 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f 53 LE_FLAG_BACKUP_S
4aa0: 45 4d 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 3b EMANTICS, NULL);
4ab0: 0a 20 20 20 20 69 66 20 28 68 46 69 6c 65 20 3d . if (hFile =
4ac0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 = INVALID_HANDLE
4ad0: 5f 56 41 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09 20 _VALUE) {../*..
4ae0: 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e 67 * Error creating
4af0: 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a 2f directory... */
4b00: 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 ...TclWinConvert
4b10: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 Error(GetLastErr
4b20: 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d or());..return -
4b30: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 1;. }.. /*
4b40: 0a 20 20 20 20 20 2a 20 53 65 74 20 74 68 65 20 . * Set the
4b50: 6c 69 6e 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 link.. */..
4b60: 20 20 20 69 66 20 28 21 44 65 76 69 63 65 49 6f if (!DeviceIo
4b70: 43 6f 6e 74 72 6f 6c 28 68 46 69 6c 65 2c 20 46 Control(hFile, F
4b80: 53 43 54 4c 5f 53 45 54 5f 52 45 50 41 52 53 45 SCTL_SET_REPARSE
4b90: 5f 50 4f 49 4e 54 2c 20 62 75 66 66 65 72 2c 0a _POINT, buffer,.
4ba0: 09 20 20 20 20 28 44 57 4f 52 44 29 20 62 75 66 . (DWORD) buf
4bb0: 66 65 72 2d 3e 52 65 70 61 72 73 65 44 61 74 61 fer->ReparseData
4bc0: 4c 65 6e 67 74 68 20 2b 20 52 45 50 41 52 53 45 Length + REPARSE
4bd0: 5f 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 _MOUNTPOINT_HEAD
4be0: 45 52 5f 53 49 5a 45 2c 0a 09 20 20 20 20 4e 55 ER_SIZE,.. NU
4bf0: 4c 4c 2c 20 30 2c 20 26 72 65 74 75 72 6e 65 64 LL, 0, &returned
4c00: 4c 65 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20 7b Length, NULL)) {
4c10: 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 73 ../*.. * Error s
4c20: 65 74 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e etting junction.
4c30: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f .. */...TclWinCo
4c40: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 nvertError(GetLa
4c50: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c 6f stError());..Clo
4c60: 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b seHandle(hFile);
4c70: 0a 09 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 ..RemoveDirector
4c80: 79 28 6c 69 6e 6b 44 69 72 50 61 74 68 29 3b 0a y(linkDirPath);.
4c90: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 .return -1;.
4ca0: 7d 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c }. CloseHandl
4cb0: 65 28 68 46 69 6c 65 29 3b 0a 0a 20 20 20 20 2f e(hFile);.. /
4cc0: 2a 0a 20 20 20 20 20 2a 20 57 65 20 73 75 63 63 *. * We succ
4cd0: 65 65 64 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a eeded.. */..
4ce0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
4cf0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4d40: 0a 20 2a 20 74 63 6c 57 69 6e 44 65 62 75 67 50 . * tclWinDebugP
4d50: 61 6e 69 63 20 2d 2d 0a 20 2a 0a 20 2a 09 44 69 anic --. *. *.Di
4d60: 73 70 6c 61 79 20 61 20 6d 65 73 73 61 67 65 2e splay a message.
4d70: 20 49 66 20 61 20 64 65 62 75 67 67 65 72 20 69 If a debugger i
4d80: 73 20 70 72 65 73 65 6e 74 2c 20 70 72 65 73 65 s present, prese
4d90: 6e 74 20 69 74 20 64 69 72 65 63 74 6c 79 20 74 nt it directly t
4da0: 6f 0a 20 2a 09 74 68 65 20 64 65 62 75 67 67 65 o. *.the debugge
4db0: 72 2c 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 r, otherwise use
4dc0: 20 61 20 4d 65 73 73 61 67 65 42 6f 78 2e 0a 20 a MessageBox..
4dd0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4de0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
4df0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
4e00: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4e50: 20 2a 2f 0a 0a 76 6f 69 64 0a 74 63 6c 57 69 6e */..void.tclWin
4e60: 44 65 62 75 67 50 61 6e 69 63 28 0a 20 20 20 20 DebugPanic(.
4e70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d const char *form
4e80: 61 74 2c 20 2e 2e 2e 29 0a 7b 0a 23 64 65 66 69 at, ...).{.#defi
4e90: 6e 65 20 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f ne TCL_MAX_WARN_
4ea0: 4c 45 4e 20 31 30 32 34 0a 20 20 20 20 76 61 5f LEN 1024. va_
4eb0: 6c 69 73 74 20 61 72 67 4c 69 73 74 3b 0a 20 20 list argList;.
4ec0: 20 20 63 68 61 72 20 62 75 66 5b 54 43 4c 5f 4d char buf[TCL_M
4ed0: 41 58 5f 57 41 52 4e 5f 4c 45 4e 20 2a 20 54 43 AX_WARN_LEN * TC
4ee0: 4c 5f 55 54 46 5f 4d 41 58 5d 3b 0a 20 20 20 20 L_UTF_MAX];.
4ef0: 57 43 48 41 52 20 6d 73 67 53 74 72 69 6e 67 5b WCHAR msgString[
4f00: 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f 4c 45 4e TCL_MAX_WARN_LEN
4f10: 5d 3b 0a 0a 20 20 20 20 76 61 5f 73 74 61 72 74 ];.. va_start
4f20: 28 61 72 67 4c 69 73 74 2c 20 66 6f 72 6d 61 74 (argList, format
4f30: 29 3b 0a 20 20 20 20 76 73 6e 70 72 69 6e 74 66 );. vsnprintf
4f40: 28 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 (buf, sizeof(buf
4f50: 29 2c 20 66 6f 72 6d 61 74 2c 20 61 72 67 4c 69 ), format, argLi
4f60: 73 74 29 3b 0a 0a 20 20 20 20 6d 73 67 53 74 72 st);.. msgStr
4f70: 69 6e 67 5b 54 43 4c 5f 4d 41 58 5f 57 41 52 4e ing[TCL_MAX_WARN
4f80: 5f 4c 45 4e 2d 31 5d 20 3d 20 4c 27 5c 30 27 3b _LEN-1] = L'\0';
4f90: 0a 20 20 20 20 4d 75 6c 74 69 42 79 74 65 54 6f . MultiByteTo
4fa0: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 WideChar(CP_UTF8
4fb0: 2c 20 30 2c 20 62 75 66 2c 20 2d 31 2c 20 6d 73 , 0, buf, -1, ms
4fc0: 67 53 74 72 69 6e 67 2c 20 54 43 4c 5f 4d 41 58 gString, TCL_MAX
4fd0: 5f 57 41 52 4e 5f 4c 45 4e 29 3b 0a 0a 20 20 20 _WARN_LEN);..
4fe0: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 72 75 6e 63 /*. * Trunc
4ff0: 61 74 65 20 4d 65 73 73 61 67 65 42 6f 78 20 73 ate MessageBox s
5000: 74 72 69 6e 67 20 69 66 20 69 74 20 69 73 20 74 tring if it is t
5010: 6f 6f 20 6c 6f 6e 67 20 74 6f 20 6e 6f 74 20 6f oo long to not o
5020: 76 65 72 66 6c 6f 77 20 74 68 65 20 73 63 72 65 verflow the scre
5030: 65 6e 0a 20 20 20 20 20 2a 20 61 6e 64 20 63 61 en. * and ca
5040: 75 73 65 20 70 6f 73 73 69 62 6c 65 20 6f 76 65 use possible ove
5050: 72 73 69 7a 65 64 20 77 69 6e 64 6f 77 20 65 72 rsized window er
5060: 72 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ror.. */..
5070: 20 20 69 66 20 28 6d 73 67 53 74 72 69 6e 67 5b if (msgString[
5080: 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f 4c 45 4e TCL_MAX_WARN_LEN
5090: 2d 31 5d 20 21 3d 20 4c 27 5c 30 27 29 20 7b 0a -1] != L'\0') {.
50a0: 09 6d 65 6d 63 70 79 28 6d 73 67 53 74 72 69 6e .memcpy(msgStrin
50b0: 67 20 2b 20 28 54 43 4c 5f 4d 41 58 5f 57 41 52 g + (TCL_MAX_WAR
50c0: 4e 5f 4c 45 4e 20 2d 20 35 29 2c 20 4c 22 20 2e N_LEN - 5), L" .
50d0: 2e 2e 22 2c 20 35 20 2a 20 73 69 7a 65 6f 66 28 ..", 5 * sizeof(
50e0: 57 43 48 41 52 29 29 3b 0a 20 20 20 20 7d 0a 20 WCHAR));. }.
50f0: 20 20 20 69 66 20 28 49 73 44 65 62 75 67 67 65 if (IsDebugge
5100: 72 50 72 65 73 65 6e 74 28 29 29 20 7b 0a 09 4f rPresent()) {..O
5110: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 utputDebugString
5120: 57 28 6d 73 67 53 74 72 69 6e 67 29 3b 0a 20 20 W(msgString);.
5130: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 4d 65 73 73 } else {..Mess
5140: 61 67 65 42 65 65 70 28 4d 42 5f 49 43 4f 4e 45 ageBeep(MB_ICONE
5150: 58 43 4c 41 4d 41 54 49 4f 4e 29 3b 0a 09 4d 65 XCLAMATION);..Me
5160: 73 73 61 67 65 42 6f 78 57 28 4e 55 4c 4c 2c 20 ssageBoxW(NULL,
5170: 6d 73 67 53 74 72 69 6e 67 2c 20 4c 22 46 61 74 msgString, L"Fat
5180: 61 6c 20 45 72 72 6f 72 22 2c 0a 09 09 4d 42 5f al Error",...MB_
5190: 49 43 4f 4e 53 54 4f 50 20 7c 20 4d 42 5f 4f 4b ICONSTOP | MB_OK
51a0: 20 7c 20 4d 42 5f 54 41 53 4b 4d 4f 44 41 4c 20 | MB_TASKMODAL
51b0: 7c 20 4d 42 5f 53 45 54 46 4f 52 45 47 52 4f 55 | MB_SETFOREGROU
51c0: 4e 44 29 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 ND);. }.#if d
51d0: 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
51e0: 0a 20 20 20 20 5f 5f 62 75 69 6c 74 69 6e 5f 74 . __builtin_t
51f0: 72 61 70 28 29 3b 0a 23 65 6c 69 66 20 64 65 66 rap();.#elif def
5200: 69 6e 65 64 28 5f 57 49 4e 36 34 29 0a 20 20 20 ined(_WIN64).
5210: 20 5f 5f 64 65 62 75 67 62 72 65 61 6b 28 29 3b __debugbreak();
5220: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f .#elif defined(_
5230: 4d 53 43 5f 56 45 52 29 0a 20 20 20 20 5f 61 73 MSC_VER). _as
5240: 6d 20 7b 69 6e 74 20 33 7d 0a 23 65 6c 73 65 0a m {int 3}.#else.
5250: 20 20 20 20 44 65 62 75 67 42 72 65 61 6b 28 29 DebugBreak()
5260: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 62 6f ;.#endif. abo
5270: 72 74 28 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rt();.}../*. *--
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
52d0: 54 63 6c 70 46 69 6e 64 45 78 65 63 75 74 61 62 TclpFindExecutab
52e0: 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 le --. *. *.This
52f0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75 74 function comput
5300: 65 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 es the absolute
5310: 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 path name of the
5320: 20 63 75 72 72 65 6e 74 0a 20 2a 09 61 70 70 6c current. *.appl
5330: 69 63 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 ication.. *. * R
5340: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
5350: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
5360: 63 74 73 3a 0a 20 2a 09 54 68 65 20 63 6f 6d 70 cts:. *.The comp
5370: 75 74 65 64 20 70 61 74 68 20 69 73 20 73 74 6f uted path is sto
5380: 72 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d red.. *. *------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a -----. */..void.
53e0: 54 63 6c 70 46 69 6e 64 45 78 65 63 75 74 61 62 TclpFindExecutab
53f0: 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 le(. const ch
5400: 61 72 20 2a 61 72 67 76 30 29 09 09 2f 2a 20 49 ar *argv0)../* I
5410: 66 20 4e 55 4c 4c 2c 20 69 6e 73 74 61 6c 6c 20 f NULL, install
5420: 50 61 6e 69 63 4d 65 73 73 61 67 65 42 6f 78 2c PanicMessageBox,
5430: 20 6f 74 68 65 72 77 69 73 65 0a 09 09 09 09 20 otherwise.....
5440: 2a 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 7b 0a 20 * ignore. */.{.
5450: 20 20 20 57 43 48 41 52 20 77 4e 61 6d 65 5b 4d WCHAR wName[M
5460: 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 63 68 AX_PATH];. ch
5470: 61 72 20 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 ar name[MAX_PATH
5480: 20 2a 20 54 43 4c 5f 55 54 46 5f 4d 41 58 5d 3b * TCL_UTF_MAX];
5490: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
54a0: 55 6e 64 65 72 20 57 69 6e 64 6f 77 73 20 77 65 Under Windows we
54b0: 20 69 67 6e 6f 72 65 20 61 72 67 76 30 2c 20 61 ignore argv0, a
54c0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 nd return the pa
54d0: 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 th for the file
54e0: 75 73 65 64 20 74 6f 0a 20 20 20 20 20 2a 20 63 used to. * c
54f0: 72 65 61 74 65 20 74 68 69 73 20 70 72 6f 63 65 reate this proce
5500: 73 73 2e 20 4f 6e 6c 79 20 69 66 20 69 74 20 69 ss. Only if it i
5510: 73 20 4e 55 4c 4c 2c 20 69 6e 73 74 61 6c 6c 20 s NULL, install
5520: 61 20 6e 65 77 20 70 61 6e 69 63 20 68 61 6e 64 a new panic hand
5530: 6c 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ler.. */..
5540: 20 20 69 66 20 28 61 72 67 76 30 20 3d 3d 20 4e if (argv0 == N
5550: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 50 ULL) {..Tcl_SetP
5560: 61 6e 69 63 50 72 6f 63 28 74 63 6c 57 69 6e 44 anicProc(tclWinD
5570: 65 62 75 67 50 61 6e 69 63 29 3b 0a 20 20 20 20 ebugPanic);.
5580: 7d 0a 0a 23 69 66 64 65 66 20 55 4e 49 43 4f 44 }..#ifdef UNICOD
5590: 45 0a 20 20 20 20 47 65 74 4d 6f 64 75 6c 65 46 E. GetModuleF
55a0: 69 6c 65 4e 61 6d 65 57 28 4e 55 4c 4c 2c 20 77 ileNameW(NULL, w
55b0: 4e 61 6d 65 2c 20 4d 41 58 5f 50 41 54 48 29 3b Name, MAX_PATH);
55c0: 0a 23 65 6c 73 65 0a 20 20 20 20 47 65 74 4d 6f .#else. GetMo
55d0: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 41 28 4e 55 duleFileNameA(NU
55e0: 4c 4c 2c 20 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 LL, name, sizeof
55f0: 28 6e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a (name));.. /*
5600: 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65 72 74 20 . * Convert
5610: 74 6f 20 57 43 48 41 52 20 74 6f 20 67 65 74 20 to WCHAR to get
5620: 6f 75 74 20 6f 66 20 41 4e 53 49 20 63 6f 64 65 out of ANSI code
5630: 70 61 67 65 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 page. */..
5640: 20 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 MultiByteToWid
5650: 65 43 68 61 72 28 43 50 5f 41 43 50 2c 20 30 2c eChar(CP_ACP, 0,
5660: 20 6e 61 6d 65 2c 20 2d 31 2c 20 77 4e 61 6d 65 name, -1, wName
5670: 2c 20 4d 41 58 5f 50 41 54 48 29 3b 0a 23 65 6e , MAX_PATH);.#en
5680: 64 69 66 0a 20 20 20 20 57 69 64 65 43 68 61 72 dif. WideChar
5690: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 ToMultiByte(CP_U
56a0: 54 46 38 2c 20 30 2c 20 77 4e 61 6d 65 2c 20 2d TF8, 0, wName, -
56b0: 31 2c 20 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28 1, name, sizeof(
56c0: 6e 61 6d 65 29 2c 20 4e 55 4c 4c 2c 20 4e 55 4c name), NULL, NUL
56d0: 4c 29 3b 0a 20 20 20 20 54 63 6c 57 69 6e 4e 6f L);. TclWinNo
56e0: 42 61 63 6b 73 6c 61 73 68 28 6e 61 6d 65 29 3b Backslash(name);
56f0: 0a 20 20 20 20 54 63 6c 53 65 74 4f 62 6a 4e 61 . TclSetObjNa
5700: 6d 65 4f 66 45 78 65 63 75 74 61 62 6c 65 28 54 meOfExecutable(T
5710: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5720: 6e 61 6d 65 2c 20 2d 31 29 2c 20 4e 55 4c 4c 29 name, -1), NULL)
5730: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4d 61 74 63 -. *. * TclpMatc
5790: 68 49 6e 44 69 72 65 63 74 6f 72 79 20 2d 2d 0a hInDirectory --.
57a0: 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74 69 *. *.This routi
57b0: 6e 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 ne is used by th
57c0: 65 20 67 6c 6f 62 62 69 6e 67 20 63 6f 64 65 20 e globbing code
57d0: 74 6f 20 73 65 61 72 63 68 20 61 20 64 69 72 65 to search a dire
57e0: 63 74 6f 72 79 20 66 6f 72 0a 20 2a 09 61 6c 6c ctory for. *.all
57f0: 20 66 69 6c 65 73 20 77 68 69 63 68 20 6d 61 74 files which mat
5800: 63 68 20 61 20 67 69 76 65 6e 20 70 61 74 74 65 ch a given patte
5810: 72 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 rn.. *. * Result
5820: 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e s:. *.The return
5830: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 61 6e value is a stan
5840: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 dard Tcl result
5850: 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 indicating wheth
5860: 65 72 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6f er an error. *.o
5870: 63 63 75 72 72 65 64 20 69 6e 20 67 6c 6f 62 62 ccurred in globb
5880: 69 6e 67 2e 20 45 72 72 6f 72 73 20 61 72 65 20 ing. Errors are
5890: 6c 65 66 74 20 69 6e 20 69 6e 74 65 72 70 2c 20 left in interp,
58a0: 67 6f 6f 64 20 72 65 73 75 6c 74 73 20 61 72 65 good results are
58b0: 0a 20 2a 09 6c 61 70 70 65 6e 64 65 64 20 74 6f . *.lappended to
58c0: 20 72 65 73 75 6c 74 50 74 72 20 28 77 68 69 63 resultPtr (whic
58d0: 68 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 h must be a vali
58e0: 64 20 6f 62 6a 65 63 74 29 2e 0a 20 2a 0a 20 2a d object).. *. *
58f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5900: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d *.None.. *. *---
5910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5950: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
5960: 70 4d 61 74 63 68 49 6e 44 69 72 65 63 74 6f 72 pMatchInDirector
5970: 79 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 y(. Tcl_Inter
5980: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49 p *interp,../* I
5990: 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20 72 65 nterpreter to re
59a0: 63 65 69 76 65 20 65 72 72 6f 72 73 2e 20 2a 2f ceive errors. */
59b0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
59c0: 73 75 6c 74 50 74 72 2c 09 09 2f 2a 20 4c 69 73 sultPtr,../* Lis
59d0: 74 20 6f 62 6a 65 63 74 20 74 6f 20 6c 61 70 70 t object to lapp
59e0: 65 6e 64 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a end results. */.
59f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 Tcl_Obj *pat
5a00: 68 50 74 72 2c 09 09 2f 2a 20 43 6f 6e 74 61 69 hPtr,../* Contai
5a10: 6e 73 20 70 61 74 68 20 74 6f 20 64 69 72 65 63 ns path to direc
5a20: 74 6f 72 79 20 74 6f 20 73 65 61 72 63 68 2e 20 tory to search.
5a30: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 */. const cha
5a40: 72 20 2a 70 61 74 74 65 72 6e 2c 09 2f 2a 20 50 r *pattern,./* P
5a50: 61 74 74 65 72 6e 20 74 6f 20 6d 61 74 63 68 20 attern to match
5a60: 61 67 61 69 6e 73 74 2e 20 2a 2f 0a 20 20 20 20 against. */.
5a70: 54 63 6c 5f 47 6c 6f 62 54 79 70 65 44 61 74 61 Tcl_GlobTypeData
5a80: 20 2a 74 79 70 65 73 29 09 2f 2a 20 4f 62 6a 65 *types)./* Obje
5a90: 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c 69 ct containing li
5aa0: 73 74 20 6f 66 20 61 63 63 65 70 74 61 62 6c 65 st of acceptable
5ab0: 20 74 79 70 65 73 2e 0a 09 09 09 09 20 2a 20 4d types...... * M
5ac0: 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 6e 20 70 ay be NULL. In p
5ad0: 61 72 74 69 63 75 6c 61 72 20 74 68 65 20 64 69 articular the di
5ae0: 72 65 63 74 6f 72 79 0a 09 09 09 09 20 2a 20 66 rectory..... * f
5af0: 6c 61 67 20 69 73 20 76 65 72 79 20 69 6d 70 6f lag is very impo
5b00: 72 74 61 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 rtant. */.{.
5b10: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 74 const TCHAR *nat
5b20: 69 76 65 3b 0a 0a 20 20 20 20 69 66 20 28 74 79 ive;.. if (ty
5b30: 70 65 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 pes != NULL && t
5b40: 79 70 65 73 2d 3e 74 79 70 65 20 3d 3d 20 54 43 ypes->type == TC
5b50: 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 4d 4f 55 4e L_GLOB_TYPE_MOUN
5b60: 54 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 T) {../*.. * The
5b70: 20 6e 61 74 69 76 65 20 66 69 6c 65 73 79 73 74 native filesyst
5b80: 65 6d 20 6e 65 76 65 72 20 61 64 64 73 20 6d 6f em never adds mo
5b90: 75 6e 74 73 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 unts... */...ret
5ba0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 urn TCL_OK;.
5bb0: 7d 0a 0a 20 20 20 20 69 66 20 28 70 61 74 74 65 }.. if (patte
5bc0: 72 6e 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 2a rn == NULL || (*
5bd0: 70 61 74 74 65 72 6e 20 3d 3d 20 27 5c 30 27 29 pattern == '\0')
5be0: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 6f ) {..Tcl_Obj *no
5bf0: 72 6d 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f rm = Tcl_FSGetNo
5c00: 72 6d 61 6c 69 7a 65 64 50 61 74 68 28 4e 55 4c rmalizedPath(NUL
5c10: 4c 2c 20 70 61 74 68 50 74 72 29 3b 0a 0a 09 69 L, pathPtr);...i
5c20: 66 20 28 6e 6f 72 6d 20 21 3d 20 4e 55 4c 4c 29 f (norm != NULL)
5c30: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
5c40: 20 2a 20 4d 61 74 63 68 20 61 20 73 69 6e 67 6c * Match a singl
5c50: 65 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e e file directly.
5c60: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
5c70: 69 6e 74 20 6c 65 6e 3b 0a 09 20 20 20 20 44 57 int len;.. DW
5c80: 4f 52 44 20 61 74 74 72 3b 0a 09 20 20 20 20 57 ORD attr;.. W
5c90: 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 IN32_FILE_ATTRIB
5ca0: 55 54 45 5f 44 41 54 41 20 64 61 74 61 3b 0a 09 UTE_DATA data;..
5cb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
5cc0: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 str = Tcl_GetStr
5cd0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6e 6f 72 6d 2c ingFromObj(norm,
5ce0: 26 6c 65 6e 29 3b 0a 0a 09 20 20 20 20 6e 61 74 &len);... nat
5cf0: 69 76 65 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e ive = Tcl_FSGetN
5d00: 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 ativePath(pathPt
5d10: 72 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 47 65 r);... if (Ge
5d20: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 tFileAttributesE
5d30: 78 28 6e 61 74 69 76 65 2c 0a 09 09 20 20 20 20 x(native,...
5d40: 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 GetFileExInfoSta
5d50: 6e 64 61 72 64 2c 20 26 64 61 74 61 29 20 21 3d ndard, &data) !=
5d60: 20 54 52 55 45 29 20 7b 0a 09 09 72 65 74 75 72 TRUE) {...retur
5d70: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d n TCL_OK;.. }
5d80: 0a 09 20 20 20 20 61 74 74 72 20 3d 20 64 61 74 .. attr = dat
5d90: 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 a.dwFileAttribut
5da0: 65 73 3b 0a 0a 09 20 20 20 20 69 66 20 28 4e 61 es;... if (Na
5db0: 74 69 76 65 4d 61 74 63 68 54 79 70 65 28 57 69 tiveMatchType(Wi
5dc0: 6e 49 73 44 72 69 76 65 28 73 74 72 2c 6c 65 6e nIsDrive(str,len
5dd0: 29 2c 20 61 74 74 72 2c 20 6e 61 74 69 76 65 2c ), attr, native,
5de0: 20 74 79 70 65 73 29 29 20 7b 0a 09 09 54 63 6c types)) {...Tcl
5df0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c _ListObjAppendEl
5e00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 ement(interp, re
5e10: 73 75 6c 74 50 74 72 2c 20 70 61 74 68 50 74 72 sultPtr, pathPtr
5e20: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 );.. }..}..re
5e30: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
5e40: 20 7d 20 65 6c 73 65 20 7b 0a 09 44 57 4f 52 44 } else {..DWORD
5e50: 20 61 74 74 72 3b 0a 09 48 41 4e 44 4c 45 20 68 attr;..HANDLE h
5e60: 61 6e 64 6c 65 3b 0a 09 57 49 4e 33 32 5f 46 49 andle;..WIN32_FI
5e70: 4e 44 5f 44 41 54 41 20 64 61 74 61 3b 0a 09 63 ND_DATA data;..c
5e80: 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 72 4e 61 onst char *dirNa
5e90: 6d 65 3b 09 2f 2a 20 55 54 46 2d 38 20 64 69 72 me;./* UTF-8 dir
5ea0: 20 6e 61 6d 65 2c 20 6c 61 74 65 72 20 77 69 74 name, later wit
5eb0: 68 20 70 61 74 74 65 72 6e 0a 09 09 09 09 20 2a h pattern..... *
5ec0: 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 09 69 appended. */..i
5ed0: 6e 74 20 64 69 72 4c 65 6e 67 74 68 3b 0a 09 69 nt dirLength;..i
5ee0: 6e 74 20 6d 61 74 63 68 53 70 65 63 69 61 6c 44 nt matchSpecialD
5ef0: 6f 74 73 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e ots;..Tcl_DStrin
5f00: 67 20 64 73 3b 09 09 2f 2a 20 4e 61 74 69 76 65 g ds;../* Native
5f10: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 64 69 72 encoding of dir
5f20: 2c 20 61 6c 73 6f 20 75 73 65 64 0a 09 09 09 09 , also used.....
5f30: 20 2a 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 66 * temporarily f
5f40: 6f 72 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2e or other things.
5f50: 20 2a 2f 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 */..Tcl_DString
5f60: 20 64 73 4f 72 69 67 3b 09 2f 2a 20 55 54 46 2d dsOrig;./* UTF-
5f70: 38 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 64 69 8 encoding of di
5f80: 72 2e 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a r. */..Tcl_Obj *
5f90: 66 69 6c 65 4e 61 6d 65 50 74 72 3b 0a 09 63 68 fileNamePtr;..ch
5fa0: 61 72 20 6c 61 73 74 43 68 61 72 3b 0a 0a 09 2f ar lastChar;.../
5fb0: 2a 0a 09 20 2a 20 47 65 74 20 74 68 65 20 6e 6f *.. * Get the no
5fc0: 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 72 65 rmalized path re
5fd0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 74 68 presentation (th
5fe0: 65 20 6d 61 69 6e 20 74 68 69 6e 67 20 69 73 20 e main thing is
5ff0: 77 65 20 64 6f 6e 74 0a 09 20 2a 20 77 61 6e 74 we dont.. * want
6000: 20 61 6e 79 20 27 7e 27 20 73 65 71 75 65 6e 63 any '~' sequenc
6010: 65 73 29 2e 0a 09 20 2a 2f 0a 0a 09 66 69 6c 65 es)... */...file
6020: 4e 61 6d 65 50 74 72 20 3d 20 54 63 6c 5f 46 53 NamePtr = Tcl_FS
6030: 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 61 74 GetNormalizedPat
6040: 68 28 69 6e 74 65 72 70 2c 20 70 61 74 68 50 74 h(interp, pathPt
6050: 72 29 3b 0a 09 69 66 20 28 66 69 6c 65 4e 61 6d r);..if (fileNam
6060: 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a ePtr == NULL) {.
6070: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6080: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 ERROR;..}.../*..
6090: 20 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 * Verify that t
60a0: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 he specified pat
60b0: 68 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 h exists and is
60c0: 61 63 74 75 61 6c 6c 79 20 61 20 64 69 72 65 63 actually a direc
60d0: 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 6e 61 74 tory... */...nat
60e0: 69 76 65 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e ive = Tcl_FSGetN
60f0: 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 ativePath(pathPt
6100: 72 29 3b 0a 09 69 66 20 28 6e 61 74 69 76 65 20 r);..if (native
6110: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
6120: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 return TCL_OK;..
6130: 7d 0a 09 61 74 74 72 20 3d 20 47 65 74 46 69 6c }..attr = GetFil
6140: 65 41 74 74 72 69 62 75 74 65 73 28 6e 61 74 69 eAttributes(nati
6150: 76 65 29 3b 0a 0a 09 69 66 20 28 28 61 74 74 72 ve);...if ((attr
6160: 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 == INVALID_FILE
6170: 5f 41 54 54 52 49 42 55 54 45 53 29 0a 09 20 20 _ATTRIBUTES)..
6180: 20 20 7c 7c 20 28 28 61 74 74 72 20 26 20 46 49 || ((attr & FI
6190: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 LE_ATTRIBUTE_DIR
61a0: 45 43 54 4f 52 59 29 20 3d 3d 20 30 29 29 20 7b ECTORY) == 0)) {
61b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
61c0: 5f 4f 4b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a _OK;..}.../*.. *
61d0: 20 42 75 69 6c 64 20 75 70 20 74 68 65 20 64 69 Build up the di
61e0: 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 66 6f 72 rectory name for
61f0: 20 73 65 61 72 63 68 69 6e 67 2c 20 69 6e 63 6c searching, incl
6200: 75 64 69 6e 67 20 61 20 74 72 61 69 6c 69 6e 67 uding a trailing
6210: 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79 20 73 .. * directory s
6220: 65 70 61 72 61 74 6f 72 2e 0a 09 20 2a 2f 0a 0a eparator... */..
6230: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 .Tcl_DStringInit
6240: 28 26 64 73 4f 72 69 67 29 3b 0a 09 64 69 72 4e (&dsOrig);..dirN
6250: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
6260: 69 6e 67 46 72 6f 6d 4f 62 6a 28 66 69 6c 65 4e ingFromObj(fileN
6270: 61 6d 65 50 74 72 2c 20 26 64 69 72 4c 65 6e 67 amePtr, &dirLeng
6280: 74 68 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e th);..Tcl_DStrin
6290: 67 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67 2c gAppend(&dsOrig,
62a0: 20 64 69 72 4e 61 6d 65 2c 20 64 69 72 4c 65 6e dirName, dirLen
62b0: 67 74 68 29 3b 0a 0a 09 6c 61 73 74 43 68 61 72 gth);...lastChar
62c0: 20 3d 20 64 69 72 4e 61 6d 65 5b 64 69 72 4c 65 = dirName[dirLe
62d0: 6e 67 74 68 20 2d 31 5d 3b 0a 09 69 66 20 28 28 ngth -1];..if ((
62e0: 6c 61 73 74 43 68 61 72 20 21 3d 20 27 5c 5c 27 lastChar != '\\'
62f0: 29 20 26 26 20 28 6c 61 73 74 43 68 61 72 20 21 ) && (lastChar !
6300: 3d 20 27 2f 27 29 20 26 26 20 28 6c 61 73 74 43 = '/') && (lastC
6310: 68 61 72 20 21 3d 20 27 3a 27 29 29 20 7b 0a 09 har != ':')) {..
6320: 20 20 20 20 54 63 6c 44 53 74 72 69 6e 67 41 70 TclDStringAp
6330: 70 65 6e 64 4c 69 74 65 72 61 6c 28 26 64 73 4f pendLiteral(&dsO
6340: 72 69 67 2c 20 22 2f 22 29 3b 0a 09 20 20 20 20 rig, "/");..
6350: 64 69 72 4c 65 6e 67 74 68 2b 2b 3b 0a 09 7d 0a dirLength++;..}.
6360: 09 64 69 72 4e 61 6d 65 20 3d 20 54 63 6c 5f 44 .dirName = Tcl_D
6370: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 4f StringValue(&dsO
6380: 72 69 67 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 rig);.../*.. * W
6390: 65 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 e need to check
63a0: 61 6c 6c 20 66 69 6c 65 73 20 69 6e 20 74 68 65 all files in the
63b0: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 77 directory, so w
63c0: 65 20 61 70 70 65 6e 64 20 27 2a 2e 2a 27 20 74 e append '*.*' t
63d0: 6f 0a 09 20 2a 20 74 68 65 20 70 61 74 68 2c 20 o.. * the path,
63e0: 75 6e 6c 65 73 73 20 74 68 65 20 70 61 74 74 65 unless the patte
63f0: 72 6e 20 77 65 27 76 65 20 62 65 65 6e 20 67 69 rn we've been gi
6400: 76 65 6e 20 69 73 20 72 61 74 68 65 72 20 73 69 ven is rather si
6410: 6d 70 6c 65 2c 0a 09 20 2a 20 77 68 65 6e 20 77 mple,.. * when w
6420: 65 20 63 61 6e 20 75 73 65 20 74 68 61 74 20 69 e can use that i
6430: 6e 73 74 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69 nstead... */...i
6440: 66 20 28 73 74 72 70 62 72 6b 28 70 61 74 74 65 f (strpbrk(patte
6450: 72 6e 2c 20 22 5b 5d 5c 5c 22 29 20 3d 3d 20 4e rn, "[]\\") == N
6460: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 ULL) {.. /*..
6470: 20 20 20 20 20 2a 20 54 68 65 20 70 61 74 74 65 * The patte
6480: 72 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6f rn is a simple o
6490: 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6a 75 ne containing ju
64a0: 73 74 20 27 2a 27 20 61 6e 64 2f 6f 72 20 27 3f st '*' and/or '?
64b0: 27 2e 0a 09 20 20 20 20 20 2a 20 54 68 69 73 20 '... * This
64c0: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 67 65 74 means we can get
64d0: 20 74 68 65 20 4f 53 20 74 6f 20 68 65 6c 70 20 the OS to help
64e0: 75 73 2c 20 62 79 20 70 61 73 73 69 6e 67 20 69 us, by passing i
64f0: 74 20 74 68 65 0a 09 20 20 20 20 20 2a 20 70 61 t the.. * pa
6500: 74 74 65 72 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a ttern... */.
6510: 0a 09 20 20 20 20 64 69 72 4e 61 6d 65 20 3d 20 .. dirName =
6520: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e Tcl_DStringAppen
6530: 64 28 26 64 73 4f 72 69 67 2c 20 70 61 74 74 65 d(&dsOrig, patte
6540: 72 6e 2c 20 2d 31 29 3b 0a 09 7d 20 65 6c 73 65 rn, -1);..} else
6550: 20 7b 0a 09 20 20 20 20 64 69 72 4e 61 6d 65 20 {.. dirName
6560: 3d 20 54 63 6c 44 53 74 72 69 6e 67 41 70 70 65 = TclDStringAppe
6570: 6e 64 4c 69 74 65 72 61 6c 28 26 64 73 4f 72 69 ndLiteral(&dsOri
6580: 67 2c 20 22 2a 2e 2a 22 29 3b 0a 09 7d 0a 0a 09 g, "*.*");..}...
6590: 6e 61 74 69 76 65 20 3d 20 54 63 6c 5f 57 69 6e native = Tcl_Win
65a0: 55 74 66 54 6f 54 43 68 61 72 28 64 69 72 4e 61 UtfToTChar(dirNa
65b0: 6d 65 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 09 69 me, -1, &ds);..i
65c0: 66 20 28 28 74 79 70 65 73 20 3d 3d 20 4e 55 4c f ((types == NUL
65d0: 4c 29 20 7c 7c 20 28 74 79 70 65 73 2d 3e 74 79 L) || (types->ty
65e0: 70 65 20 21 3d 20 54 43 4c 5f 47 4c 4f 42 5f 54 pe != TCL_GLOB_T
65f0: 59 50 45 5f 44 49 52 29 29 20 7b 0a 09 20 20 20 YPE_DIR)) {..
6600: 20 68 61 6e 64 6c 65 20 3d 20 46 69 6e 64 46 69 handle = FindFi
6610: 72 73 74 46 69 6c 65 28 6e 61 74 69 76 65 2c 20 rstFile(native,
6620: 26 64 61 74 61 29 3b 0a 09 7d 20 65 6c 73 65 20 &data);..} else
6630: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
6640: 2a 20 57 65 20 63 61 6e 20 62 65 20 6d 6f 72 65 * We can be more
6650: 20 65 66 66 69 63 69 65 6e 74 2c 20 66 6f 72 20 efficient, for
6660: 70 75 72 65 20 64 69 72 65 63 74 6f 72 79 20 72 pure directory r
6670: 65 71 75 65 73 74 73 2e 0a 09 20 20 20 20 20 2a equests... *
6680: 2f 0a 0a 09 20 20 20 20 68 61 6e 64 6c 65 20 3d /... handle =
6690: 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 45 78 FindFirstFileEx
66a0: 28 6e 61 74 69 76 65 2c 0a 09 09 20 20 20 20 46 (native,... F
66b0: 69 6e 64 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 indExInfoStandar
66c0: 64 2c 20 26 64 61 74 61 2c 0a 09 09 20 20 20 20 d, &data,...
66d0: 46 69 6e 64 45 78 53 65 61 72 63 68 4c 69 6d 69 FindExSearchLimi
66e0: 74 54 6f 44 69 72 65 63 74 6f 72 69 65 73 2c 20 tToDirectories,
66f0: 4e 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a 09 69 NULL, 0);..}...i
6700: 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 f (handle == INV
6710: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
6720: 45 29 20 7b 0a 09 20 20 20 20 44 57 4f 52 44 20 E) {.. DWORD
6730: 65 72 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 err = GetLastErr
6740: 6f 72 28 29 3b 0a 0a 09 20 20 20 20 54 63 6c 5f or();... Tcl_
6750: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
6760: 3b 0a 09 20 20 20 20 69 66 20 28 65 72 72 20 3d ;.. if (err =
6770: 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 = ERROR_FILE_NOT
6780: 5f 46 4f 55 4e 44 29 20 7b 0a 09 09 2f 2a 0a 09 _FOUND) {.../*..
6790: 09 20 2a 20 57 65 20 75 73 65 64 20 6f 75 72 20 . * We used our
67a0: 27 70 61 74 74 65 72 6e 27 20 61 62 6f 76 65 2c 'pattern' above,
67b0: 20 61 6e 64 20 6d 61 74 63 68 65 64 20 6e 6f 74 and matched not
67c0: 68 69 6e 67 2e 20 54 68 69 73 0a 09 09 20 2a 20 hing. This... *
67d0: 6d 65 61 6e 73 20 77 65 20 6a 75 73 74 20 72 65 means we just re
67e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 2c 20 69 6e 64 turn TCL_OK, ind
67f0: 69 63 61 74 69 6e 67 20 6e 6f 20 72 65 73 75 6c icating no resul
6800: 74 73 20 66 6f 75 6e 64 2e 0a 09 09 20 2a 2f 0a ts found.... */.
6810: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
6820: 65 65 28 26 64 73 4f 72 69 67 29 3b 0a 09 09 72 ee(&dsOrig);...r
6830: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 eturn TCL_OK;..
6840: 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c 57 69 }... TclWi
6850: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 65 72 nConvertError(er
6860: 72 29 3b 0a 09 20 20 20 20 69 66 20 28 69 6e 74 r);.. if (int
6870: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 erp != NULL) {..
6880: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
6890: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
68a0: 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 63 6f 75 jPrintf(...."cou
68b0: 6c 64 6e 27 74 20 72 65 61 64 20 64 69 72 65 63 ldn't read direc
68c0: 74 6f 72 79 20 5c 22 25 73 5c 22 3a 20 25 73 22 tory \"%s\": %s"
68d0: 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 ,....Tcl_DString
68e0: 56 61 6c 75 65 28 26 64 73 4f 72 69 67 29 2c 20 Value(&dsOrig),
68f0: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 Tcl_PosixError(i
6900: 6e 74 65 72 70 29 29 29 3b 0a 09 20 20 20 20 7d nterp)));.. }
6910: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
6920: 67 46 72 65 65 28 26 64 73 4f 72 69 67 29 3b 0a gFree(&dsOrig);.
6930: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
6940: 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 6c 5f 44 ERROR;..}..Tcl_D
6950: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
6960: 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6d 61 79 .../*.. * We may
6970: 20 75 73 65 20 74 68 69 73 20 6c 61 74 65 72 2c use this later,
6980: 20 73 6f 20 77 65 20 6d 75 73 74 20 72 65 73 74 so we must rest
6990: 6f 72 65 20 69 74 20 74 6f 20 69 74 73 20 6c 65 ore it to its le
69a0: 6e 67 74 68 0a 09 20 2a 20 69 6e 63 6c 75 64 69 ngth.. * includi
69b0: 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 ng the directory
69c0: 20 64 65 6c 69 6d 69 74 65 72 2e 0a 09 20 2a 2f delimiter... */
69d0: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 ...Tcl_DStringSe
69e0: 74 4c 65 6e 67 74 68 28 26 64 73 4f 72 69 67 2c tLength(&dsOrig,
69f0: 20 64 69 72 4c 65 6e 67 74 68 29 3b 0a 0a 09 2f dirLength);.../
6a00: 2a 0a 09 20 2a 20 43 68 65 63 6b 20 74 6f 20 73 *.. * Check to s
6a10: 65 65 20 69 66 20 74 68 65 20 70 61 74 74 65 72 ee if the patter
6a20: 6e 20 73 68 6f 75 6c 64 20 6d 61 74 63 68 20 74 n should match t
6a30: 68 65 20 73 70 65 63 69 61 6c 20 2e 20 61 6e 64 he special . and
6a40: 0a 09 20 2a 20 2e 2e 20 6e 61 6d 65 73 2c 20 72 .. * .. names, r
6a50: 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 65 20 eferring to the
6a60: 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 current director
6a70: 79 2c 20 6f 72 20 74 68 65 20 64 69 72 65 63 74 y, or the direct
6a80: 6f 72 79 0a 09 20 2a 20 61 62 6f 76 65 2e 20 57 ory.. * above. W
6a90: 65 20 6e 65 65 64 20 61 20 73 70 65 63 69 61 6c e need a special
6aa0: 20 63 68 65 63 6b 20 66 6f 72 20 74 68 69 73 20 check for this
6ab0: 62 65 63 61 75 73 65 20 70 61 74 68 73 20 62 65 because paths be
6ac0: 67 69 6e 6e 69 6e 67 0a 09 20 2a 20 77 69 74 68 ginning.. * with
6ad0: 20 61 20 64 6f 74 20 61 72 65 20 6e 6f 74 20 63 a dot are not c
6ae0: 6f 6e 73 69 64 65 72 65 64 20 68 69 64 64 65 6e onsidered hidden
6af0: 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6e 64 on Windows, and
6b00: 20 73 6f 20 6f 74 68 65 72 77 69 73 65 20 61 0a so otherwise a.
6b10: 09 20 2a 20 72 65 6c 61 74 69 76 65 20 67 6c 6f . * relative glo
6b20: 62 20 6c 69 6b 65 20 27 67 6c 6f 62 20 2d 6a 6f b like 'glob -jo
6b30: 69 6e 20 2a 20 2a 27 20 77 69 6c 6c 20 61 63 74 in * *' will act
6b40: 75 61 6c 6c 79 20 72 65 74 75 72 6e 0a 09 20 2a ually return.. *
6b50: 20 27 2e 2f 2e 20 2e 2e 2f 2e 2e 27 20 65 74 63 './. ../..' etc
6b60: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 70 61 ... */...if ((pa
6b70: 74 74 65 72 6e 5b 30 5d 20 3d 3d 20 27 2e 27 29 ttern[0] == '.')
6b80: 0a 09 09 7c 7c 20 28 28 70 61 74 74 65 72 6e 5b ...|| ((pattern[
6b90: 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 26 20 28 0] == '\\') && (
6ba0: 70 61 74 74 65 72 6e 5b 31 5d 20 3d 3d 20 27 2e pattern[1] == '.
6bb0: 27 29 29 29 20 7b 0a 09 20 20 20 20 6d 61 74 63 '))) {.. matc
6bc0: 68 53 70 65 63 69 61 6c 44 6f 74 73 20 3d 20 31 hSpecialDots = 1
6bd0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
6be0: 20 6d 61 74 63 68 53 70 65 63 69 61 6c 44 6f 74 matchSpecialDot
6bf0: 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 s = 0;..}.../*..
6c00: 20 2a 20 4e 6f 77 20 69 74 65 72 61 74 65 20 6f * Now iterate o
6c10: 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 ver all of the f
6c20: 69 6c 65 73 20 69 6e 20 74 68 65 20 64 69 72 65 iles in the dire
6c30: 63 74 6f 72 79 2c 20 73 74 61 72 74 69 6e 67 20 ctory, starting
6c40: 77 69 74 68 0a 09 20 2a 20 74 68 65 20 66 69 72 with.. * the fir
6c50: 73 74 20 6f 6e 65 20 77 65 20 66 6f 75 6e 64 2e st one we found.
6c60: 0a 09 20 2a 2f 0a 0a 09 64 6f 20 7b 0a 09 20 20 .. */...do {..
6c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 74 const char *ut
6c80: 66 6e 61 6d 65 3b 0a 09 20 20 20 20 69 6e 74 20 fname;.. int
6c90: 63 68 65 63 6b 44 72 69 76 65 20 3d 20 30 2c 20 checkDrive = 0,
6ca0: 69 73 44 72 69 76 65 3b 0a 09 20 20 20 20 44 57 isDrive;.. DW
6cb0: 4f 52 44 20 61 74 74 72 3b 0a 0a 09 20 20 20 20 ORD attr;...
6cc0: 6e 61 74 69 76 65 20 3d 20 64 61 74 61 2e 63 46 native = data.cF
6cd0: 69 6c 65 4e 61 6d 65 3b 0a 09 20 20 20 20 61 74 ileName;.. at
6ce0: 74 72 20 3d 20 64 61 74 61 2e 64 77 46 69 6c 65 tr = data.dwFile
6cf0: 41 74 74 72 69 62 75 74 65 73 3b 0a 09 20 20 20 Attributes;..
6d00: 20 75 74 66 6e 61 6d 65 20 3d 20 54 63 6c 5f 57 utfname = Tcl_W
6d10: 69 6e 54 43 68 61 72 54 6f 55 74 66 28 6e 61 74 inTCharToUtf(nat
6d20: 69 76 65 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 0a ive, -1, &ds);..
6d30: 09 20 20 20 20 69 66 20 28 21 6d 61 74 63 68 53 . if (!matchS
6d40: 70 65 63 69 61 6c 44 6f 74 73 29 20 7b 0a 09 09 pecialDots) {...
6d50: 2f 2a 0a 09 09 20 2a 20 49 66 20 69 74 20 69 73 /*... * If it is
6d60: 20 65 78 61 63 74 6c 79 20 27 2e 27 20 6f 72 20 exactly '.' or
6d70: 27 2e 2e 27 20 74 68 65 6e 20 77 65 20 69 67 6e '..' then we ign
6d80: 6f 72 65 20 69 74 2e 0a 09 09 20 2a 2f 0a 0a 09 ore it.... */...
6d90: 09 69 66 20 28 28 75 74 66 6e 61 6d 65 5b 30 5d .if ((utfname[0]
6da0: 20 3d 3d 20 27 2e 27 29 20 26 26 20 28 75 74 66 == '.') && (utf
6db0: 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27 5c 30 27 0a name[1] == '\0'.
6dc0: 09 09 09 7c 7c 20 28 75 74 66 6e 61 6d 65 5b 31 ...|| (utfname[1
6dd0: 5d 20 3d 3d 20 27 2e 27 20 26 26 20 75 74 66 6e ] == '.' && utfn
6de0: 61 6d 65 5b 32 5d 20 3d 3d 20 27 5c 30 27 29 29 ame[2] == '\0'))
6df0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 ) {... Tcl_DS
6e00: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
6e10: 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a .. continue;.
6e20: 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 ..}.. } else
6e30: 69 66 20 28 75 74 66 6e 61 6d 65 5b 30 5d 20 3d if (utfname[0] =
6e40: 3d 20 27 2e 27 20 26 26 20 75 74 66 6e 61 6d 65 = '.' && utfname
6e50: 5b 31 5d 20 3d 3d 20 27 2e 27 0a 09 09 20 20 20 [1] == '.'...
6e60: 20 26 26 20 75 74 66 6e 61 6d 65 5b 32 5d 20 3d && utfname[2] =
6e70: 3d 20 27 5c 30 27 29 20 7b 0a 09 09 2f 2a 0a 09 = '\0') {.../*..
6e80: 09 20 2a 20 48 61 76 65 20 74 6f 20 63 68 65 63 . * Have to chec
6e90: 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64 k if this is a d
6ea0: 72 69 76 65 20 62 65 6c 6f 77 2c 20 73 6f 20 77 rive below, so w
6eb0: 65 20 63 61 6e 20 63 6f 72 72 65 63 74 6c 79 0a e can correctly.
6ec0: 09 09 20 2a 20 6d 61 74 63 68 20 27 68 69 64 64 .. * match 'hidd
6ed0: 65 6e 27 20 61 6e 64 20 6e 6f 74 20 68 69 64 64 en' and not hidd
6ee0: 65 6e 20 66 69 6c 65 73 2e 0a 09 09 20 2a 2f 0a en files.... */.
6ef0: 0a 09 09 63 68 65 63 6b 44 72 69 76 65 20 3d 20 ...checkDrive =
6f00: 31 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 1;.. }...
6f10: 2f 2a 0a 09 20 20 20 20 20 2a 20 43 68 65 63 6b /*.. * Check
6f20: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 66 to see if the f
6f30: 69 6c 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 ile matches the
6f40: 70 61 74 74 65 72 6e 2e 20 4e 6f 74 65 20 74 68 pattern. Note th
6f50: 61 74 20 77 65 20 61 72 65 0a 09 20 20 20 20 20 at we are..
6f60: 2a 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 63 * ignoring the c
6f70: 61 73 65 20 73 65 6e 73 69 74 69 76 69 74 79 20 ase sensitivity
6f80: 66 6c 61 67 20 62 65 63 61 75 73 65 20 57 69 6e flag because Win
6f90: 64 6f 77 73 20 64 6f 65 73 6e 27 74 0a 09 20 20 dows doesn't..
6fa0: 20 20 20 2a 20 68 6f 6e 6f 72 20 63 61 73 65 20 * honor case
6fb0: 65 76 65 6e 20 69 66 20 74 68 65 20 76 6f 6c 75 even if the volu
6fc0: 6d 65 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 me is case sensi
6fd0: 74 69 76 65 2e 20 49 66 20 74 68 65 20 76 6f 6c tive. If the vol
6fe0: 75 6d 65 0a 09 20 20 20 20 20 2a 20 61 6c 73 6f ume.. * also
6ff0: 20 64 6f 65 73 6e 27 74 20 70 72 65 73 65 72 76 doesn't preserv
7000: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 77 65 20 e case, then we
7010: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 previously retur
7020: 6e 65 64 20 74 68 65 0a 09 20 20 20 20 20 2a 20 ned the.. *
7030: 6c 6f 77 65 72 20 63 61 73 65 20 66 6f 72 6d 20 lower case form
7040: 6f 66 20 74 68 65 20 6e 61 6d 65 2e 20 54 68 69 of the name. Thi
7050: 73 20 64 69 64 6e 27 74 20 73 65 65 6d 20 71 75 s didn't seem qu
7060: 69 74 65 20 72 69 67 68 74 20 73 69 6e 63 65 0a ite right since.
7070: 09 20 20 20 20 20 2a 20 74 68 65 72 65 20 61 72 . * there ar
7080: 65 20 6e 6f 6e 2d 63 61 73 65 2d 70 72 65 73 65 e non-case-prese
7090: 72 76 69 6e 67 20 76 6f 6c 75 6d 65 73 20 74 68 rving volumes th
70a0: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 74 75 at actually retu
70b0: 72 6e 0a 09 20 20 20 20 20 2a 20 6d 69 78 65 64 rn.. * mixed
70c0: 20 63 61 73 65 2e 20 53 6f 20 6e 6f 77 20 77 65 case. So now we
70d0: 20 61 72 65 20 72 65 74 75 72 6e 69 6e 67 20 65 are returning e
70e0: 78 61 63 74 6c 79 20 77 68 61 74 20 77 65 20 67 xactly what we g
70f0: 65 74 20 66 72 6f 6d 0a 09 20 20 20 20 20 2a 20 et from.. *
7100: 74 68 65 20 73 79 73 74 65 6d 2e 0a 09 20 20 20 the system...
7110: 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 54 */... if (T
7120: 63 6c 5f 53 74 72 69 6e 67 43 61 73 65 4d 61 74 cl_StringCaseMat
7130: 63 68 28 75 74 66 6e 61 6d 65 2c 20 70 61 74 74 ch(utfname, patt
7140: 65 72 6e 2c 20 31 29 29 20 7b 0a 09 09 2f 2a 0a ern, 1)) {.../*.
7150: 09 09 20 2a 20 49 66 20 74 68 65 20 66 69 6c 65 .. * If the file
7160: 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 77 matches, then w
7170: 65 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73 e need to proces
7180: 73 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 0a s the remainder.
7190: 09 09 20 2a 20 6f 66 20 74 68 65 20 70 61 74 68 .. * of the path
71a0: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 63 .... */....if (c
71b0: 68 65 63 6b 44 72 69 76 65 29 20 7b 0a 09 09 20 heckDrive) {...
71c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 const char *f
71d0: 75 6c 6c 6e 61 6d 65 20 3d 20 54 63 6c 5f 44 53 ullname = Tcl_DS
71e0: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4f tringAppend(&dsO
71f0: 72 69 67 2c 20 75 74 66 6e 61 6d 65 2c 0a 09 09 rig, utfname,...
7200: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
7210: 4c 65 6e 67 74 68 28 26 64 73 29 29 3b 0a 0a 09 Length(&ds));...
7220: 09 20 20 20 20 69 73 44 72 69 76 65 20 3d 20 57 . isDrive = W
7230: 69 6e 49 73 44 72 69 76 65 28 66 75 6c 6c 6e 61 inIsDrive(fullna
7240: 6d 65 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c me, Tcl_DStringL
7250: 65 6e 67 74 68 28 26 64 73 4f 72 69 67 29 29 3b ength(&dsOrig));
7260: 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ... Tcl_DStri
7270: 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 64 73 4f ngSetLength(&dsO
7280: 72 69 67 2c 20 64 69 72 4c 65 6e 67 74 68 29 3b rig, dirLength);
7290: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 ...} else {...
72a0: 20 20 69 73 44 72 69 76 65 20 3d 20 30 3b 0a 09 isDrive = 0;..
72b0: 09 7d 0a 09 09 69 66 20 28 4e 61 74 69 76 65 4d .}...if (NativeM
72c0: 61 74 63 68 54 79 70 65 28 69 73 44 72 69 76 65 atchType(isDrive
72d0: 2c 20 61 74 74 72 2c 20 6e 61 74 69 76 65 2c 20 , attr, native,
72e0: 74 79 70 65 73 29 29 20 7b 0a 09 09 20 20 20 20 types)) {...
72f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e Tcl_ListObjAppen
7300: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c dElement(interp,
7310: 20 72 65 73 75 6c 74 50 74 72 2c 0a 09 09 09 20 resultPtr,....
7320: 20 20 20 54 63 6c 4e 65 77 46 53 50 61 74 68 4f TclNewFSPathO
7330: 62 6a 28 70 61 74 68 50 74 72 2c 20 75 74 66 6e bj(pathPtr, utfn
7340: 61 6d 65 2c 0a 09 09 09 09 20 20 20 20 54 63 6c ame,..... Tcl
7350: 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 _DStringLength(&
7360: 64 73 29 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 ds)));...}..
7370: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 }... /*..
7380: 20 2a 20 46 72 65 65 20 64 73 20 68 65 72 65 20 * Free ds here
7390: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 6e to ensure that n
73a0: 61 74 69 76 65 20 69 73 20 76 61 6c 69 64 20 61 ative is valid a
73b0: 62 6f 76 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a bove... */..
73c0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
73d0: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 20 77 68 Free(&ds);..} wh
73e0: 69 6c 65 20 28 46 69 6e 64 4e 65 78 74 46 69 6c ile (FindNextFil
73f0: 65 28 68 61 6e 64 6c 65 2c 20 26 64 61 74 61 29 e(handle, &data)
7400: 20 3d 3d 20 54 52 55 45 29 3b 0a 0a 09 46 69 6e == TRUE);...Fin
7410: 64 43 6c 6f 73 65 28 68 61 6e 64 6c 65 29 3b 0a dClose(handle);.
7420: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
7430: 28 26 64 73 4f 72 69 67 29 3b 0a 09 72 65 74 75 (&dsOrig);..retu
7440: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d rn TCL_OK;. }
7450: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 44 6f 65 73 20 .}.../*. * Does
7460: 74 68 65 20 67 69 76 65 6e 20 70 61 74 68 20 72 the given path r
7470: 65 70 72 65 73 65 6e 74 20 61 20 72 6f 6f 74 20 epresent a root
7480: 76 6f 6c 75 6d 65 3f 20 57 65 20 6e 65 65 64 20 volume? We need
7490: 74 68 69 73 20 73 70 65 63 69 61 6c 20 63 61 73 this special cas
74a0: 65 0a 20 2a 20 62 65 63 61 75 73 65 20 66 6f 72 e. * because for
74b0: 20 4e 54 46 53 20 72 6f 6f 74 20 76 6f 6c 75 6d NTFS root volum
74c0: 65 73 2c 20 74 68 65 20 67 65 74 46 69 6c 65 41 es, the getFileA
74d0: 74 74 72 69 62 75 74 65 73 50 72 6f 63 20 72 65 ttributesProc re
74e0: 74 75 72 6e 73 20 61 20 27 68 69 64 64 65 6e 27 turns a 'hidden'
74f0: 0a 20 2a 20 61 74 74 72 69 62 75 74 65 20 77 68 . * attribute wh
7500: 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 en it should not
7510: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e .. */..static in
7520: 74 0a 57 69 6e 49 73 44 72 69 76 65 28 0a 20 20 t.WinIsDrive(.
7530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 const char *na
7540: 6d 65 2c 09 09 2f 2a 20 4e 61 6d 65 20 28 55 54 me,../* Name (UT
7550: 46 2d 38 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 F-8) */. int
7560: 6c 65 6e 29 09 09 09 2f 2a 20 4c 65 6e 67 74 68 len).../* Length
7570: 20 6f 66 20 6e 61 6d 65 20 2a 2f 0a 7b 0a 20 20 of name */.{.
7580: 20 20 69 6e 74 20 72 65 6d 6f 76 65 20 3d 20 30 int remove = 0
7590: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 65 ;.. while (le
75a0: 6e 20 3e 20 34 29 20 7b 0a 09 69 66 20 28 28 6e n > 4) {..if ((n
75b0: 61 6d 65 5b 6c 65 6e 2d 31 5d 20 21 3d 20 27 2e ame[len-1] != '.
75c0: 27 20 7c 7c 20 6e 61 6d 65 5b 6c 65 6e 2d 32 5d ' || name[len-2]
75d0: 20 21 3d 20 27 2e 27 29 0a 09 09 7c 7c 20 28 6e != '.')...|| (n
75e0: 61 6d 65 5b 6c 65 6e 2d 33 5d 20 21 3d 20 27 2f ame[len-3] != '/
75f0: 27 20 26 26 20 6e 61 6d 65 5b 6c 65 6e 2d 33 5d ' && name[len-3]
7600: 20 21 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20 20 != '\\')) {..
7610: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 /*.. * We
7620: 64 6f 6e 27 74 20 68 61 76 65 20 27 2f 2e 2e 27 don't have '/..'
7630: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 09 20 20 at the end...
7640: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 */... if (
7650: 72 65 6d 6f 76 65 20 3d 3d 20 30 29 20 7b 0a 09 remove == 0) {..
7660: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 .break;.. }..
7670: 20 20 20 20 72 65 6d 6f 76 65 2d 2d 3b 0a 09 20 remove--;..
7680: 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 20 while (len >
7690: 30 29 20 7b 0a 09 09 6c 65 6e 2d 2d 3b 0a 09 09 0) {...len--;...
76a0: 69 66 20 28 6e 61 6d 65 5b 6c 65 6e 5d 20 3d 3d if (name[len] ==
76b0: 20 27 2f 27 20 7c 7c 20 6e 61 6d 65 5b 6c 65 6e '/' || name[len
76c0: 5d 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 09 20 ] == '\\') {...
76d0: 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 break;...}..
76e0: 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 6c 65 }.. if (le
76f0: 6e 20 3c 20 34 29 20 7b 0a 09 09 6c 65 6e 2b 2b n < 4) {...len++
7700: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
7710: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 }..} else {..
7720: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 64 /*.. * We d
7730: 6f 20 68 61 76 65 20 27 2f 2e 2e 27 0a 09 20 20 o have '/..'..
7740: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 6c 65 6e 20 */... len
7750: 2d 3d 20 33 3b 0a 09 20 20 20 20 72 65 6d 6f 76 -= 3;.. remov
7760: 65 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 e++;..}. }..
7770: 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 34 29 20 if (len < 4)
7780: 7b 0a 09 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 {..if (len == 0)
7790: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
77a0: 20 2a 20 4e 6f 74 20 73 75 72 65 20 69 66 20 74 * Not sure if t
77b0: 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c his is possible,
77c0: 20 62 75 74 20 77 65 20 70 61 73 73 20 69 74 20 but we pass it
77d0: 6f 6e 20 61 6e 79 77 61 79 2e 0a 09 20 20 20 20 on anyway...
77e0: 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 */..} else if (
77f0: 6c 65 6e 20 3d 3d 20 31 20 26 26 20 28 6e 61 6d len == 1 && (nam
7800: 65 5b 30 5d 20 3d 3d 20 27 2f 27 20 7c 7c 20 6e e[0] == '/' || n
7810: 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 29 ame[0] == '\\'))
7820: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
7830: 20 2a 20 50 61 74 68 20 69 73 20 70 6f 69 6e 74 * Path is point
7840: 69 6e 67 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 ing to the root
7850: 76 6f 6c 75 6d 65 2e 0a 09 20 20 20 20 20 2a 2f volume... */
7860: 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b ... return 1;
7870: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 28 6e 61 ..} else if ((na
7880: 6d 65 5b 31 5d 20 3d 3d 20 27 3a 27 29 0a 09 09 me[1] == ':')...
7890: 20 20 20 26 26 20 28 6c 65 6e 20 3d 3d 20 32 20 && (len == 2
78a0: 7c 7c 20 28 6e 61 6d 65 5b 32 5d 20 3d 3d 20 27 || (name[2] == '
78b0: 2f 27 20 7c 7c 20 6e 61 6d 65 5b 32 5d 20 3d 3d /' || name[2] ==
78c0: 20 27 5c 5c 27 29 29 29 20 7b 0a 09 20 20 20 20 '\\'))) {..
78d0: 2f 2a 0a 09 20 20 20 20 20 2a 20 50 61 74 68 20 /*.. * Path
78e0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 27 is of the form '
78f0: 78 3a 27 20 6f 72 20 27 78 3a 2f 27 20 6f 72 20 x:' or 'x:/' or
7900: 27 78 3a 5c 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 'x:\'.. */..
7910: 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 . return 1;..
7920: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 }. }.. ret
7930: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a urn 0;.}.../*. *
7940: 20 44 6f 65 73 20 74 68 65 20 67 69 76 65 6e 20 Does the given
7950: 70 61 74 68 20 72 65 70 72 65 73 65 6e 74 20 61 path represent a
7960: 20 72 65 73 65 72 76 65 64 20 77 69 6e 64 6f 77 reserved window
7970: 20 70 61 74 68 20 6e 61 6d 65 3f 20 49 66 20 6e path name? If n
7980: 6f 74 20 72 65 74 75 72 6e 20 30 2c 0a 20 2a 20 ot return 0,. *
7990: 69 66 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20 if true, return
79a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 the number of ch
79b0: 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 aracters of the
79c0: 70 61 74 68 20 74 68 61 74 20 77 65 20 61 63 74 path that we act
79d0: 75 61 6c 6c 79 20 77 61 6e 74 0a 20 2a 20 28 6e ually want. * (n
79e0: 6f 74 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 ot any trailing
79f0: 3a 29 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 :).. */..static
7a00: 69 6e 74 0a 57 69 6e 49 73 52 65 73 65 72 76 65 int.WinIsReserve
7a10: 64 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 d(. const cha
7a20: 72 20 2a 70 61 74 68 29 09 09 2f 2a 20 50 61 74 r *path)../* Pat
7a30: 68 20 69 6e 20 55 54 46 2d 38 20 2a 2f 0a 7b 0a h in UTF-8 */.{.
7a40: 20 20 20 20 69 66 20 28 28 70 61 74 68 5b 30 5d if ((path[0]
7a50: 20 3d 3d 20 27 63 27 20 7c 7c 20 70 61 74 68 5b == 'c' || path[
7a60: 30 5d 20 3d 3d 20 27 43 27 29 0a 09 20 20 20 20 0] == 'C')..
7a70: 26 26 20 28 70 61 74 68 5b 31 5d 20 3d 3d 20 27 && (path[1] == '
7a80: 6f 27 20 7c 7c 20 70 61 74 68 5b 31 5d 20 3d 3d o' || path[1] ==
7a90: 20 27 4f 27 29 29 20 7b 0a 09 69 66 20 28 28 70 'O')) {..if ((p
7aa0: 61 74 68 5b 32 5d 20 3d 3d 20 27 6d 27 20 7c 7c ath[2] == 'm' ||
7ab0: 20 70 61 74 68 5b 32 5d 20 3d 3d 20 27 4d 27 29 path[2] == 'M')
7ac0: 0a 09 09 26 26 20 70 61 74 68 5b 33 5d 20 3e 3d ...&& path[3] >=
7ad0: 20 27 31 27 20 26 26 20 70 61 74 68 5b 33 5d 20 '1' && path[3]
7ae0: 3c 3d 20 27 34 27 29 20 7b 0a 09 20 20 20 20 2f <= '4') {.. /
7af0: 2a 0a 09 20 20 20 20 20 2a 20 4d 61 79 20 68 61 *.. * May ha
7b00: 76 65 20 6d 61 74 63 68 20 66 6f 72 20 27 63 6f ve match for 'co
7b10: 6d 5b 31 2d 34 5d 3a 3f 27 2c 20 77 68 69 63 68 m[1-4]:?', which
7b20: 20 69 73 20 61 20 73 65 72 69 61 6c 20 70 6f 72 is a serial por
7b30: 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 t... */...
7b40: 20 20 69 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d if (path[4] ==
7b50: 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 '\0') {...retur
7b60: 6e 20 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 n 4;.. } else
7b70: 20 69 66 20 28 70 61 74 68 20 5b 34 5d 20 3d 3d if (path [4] ==
7b80: 20 27 3a 27 20 26 26 20 70 61 74 68 5b 35 5d 20 ':' && path[5]
7b90: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 == '\0') {...ret
7ba0: 75 72 6e 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d urn 4;.. }..}
7bb0: 20 65 6c 73 65 20 69 66 20 28 28 70 61 74 68 5b else if ((path[
7bc0: 32 5d 20 3d 3d 20 27 6e 27 20 7c 7c 20 70 61 74 2] == 'n' || pat
7bd0: 68 5b 32 5d 20 3d 3d 20 27 4e 27 29 20 26 26 20 h[2] == 'N') &&
7be0: 70 61 74 68 5b 33 5d 20 3d 3d 20 27 5c 30 27 29 path[3] == '\0')
7bf0: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
7c00: 20 2a 20 48 61 76 65 20 6d 61 74 63 68 20 66 6f * Have match fo
7c10: 72 20 27 63 6f 6e 27 0a 09 20 20 20 20 20 2a 2f r 'con'.. */
7c20: 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 33 3b ... return 3;
7c30: 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ..}.. } else
7c40: 69 66 20 28 28 70 61 74 68 5b 30 5d 20 3d 3d 20 if ((path[0] ==
7c50: 27 6c 27 20 7c 7c 20 70 61 74 68 5b 30 5d 20 3d 'l' || path[0] =
7c60: 3d 20 27 4c 27 29 0a 09 20 20 20 20 26 26 20 28 = 'L').. && (
7c70: 70 61 74 68 5b 31 5d 20 3d 3d 20 27 70 27 20 7c path[1] == 'p' |
7c80: 7c 20 70 61 74 68 5b 31 5d 20 3d 3d 20 27 50 27 | path[1] == 'P'
7c90: 29 0a 09 20 20 20 20 26 26 20 28 70 61 74 68 5b ).. && (path[
7ca0: 32 5d 20 3d 3d 20 27 74 27 20 7c 7c 20 70 61 74 2] == 't' || pat
7cb0: 68 5b 32 5d 20 3d 3d 20 27 54 27 29 29 20 7b 0a h[2] == 'T')) {.
7cc0: 09 69 66 20 28 70 61 74 68 5b 33 5d 20 3e 3d 20 .if (path[3] >=
7cd0: 27 31 27 20 26 26 20 70 61 74 68 5b 33 5d 20 3c '1' && path[3] <
7ce0: 3d 20 27 33 27 29 20 7b 0a 09 20 20 20 20 2f 2a = '3') {.. /*
7cf0: 0a 09 20 20 20 20 20 2a 20 4d 61 79 20 68 61 76 .. * May hav
7d00: 65 20 6d 61 74 63 68 20 66 6f 72 20 27 6c 70 74 e match for 'lpt
7d10: 5b 31 2d 33 5d 3a 3f 27 0a 09 20 20 20 20 20 2a [1-3]:?'.. *
7d20: 2f 0a 0a 09 20 20 20 20 69 66 20 28 70 61 74 68 /... if (path
7d30: 5b 34 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 [4] == '\0') {..
7d40: 09 72 65 74 75 72 6e 20 34 3b 0a 09 20 20 20 20 .return 4;..
7d50: 7d 20 65 6c 73 65 20 69 66 20 28 70 61 74 68 20 } else if (path
7d60: 5b 34 5d 20 3d 3d 20 27 3a 27 20 26 26 20 70 61 [4] == ':' && pa
7d70: 74 68 5b 35 5d 20 3d 3d 20 27 5c 30 27 29 20 7b th[5] == '\0') {
7d80: 0a 09 09 72 65 74 75 72 6e 20 34 3b 0a 09 20 20 ...return 4;..
7d90: 20 20 7d 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c }..}.. } el
7da0: 73 65 20 69 66 20 28 21 73 74 72 63 61 73 65 63 se if (!strcasec
7db0: 6d 70 28 70 61 74 68 2c 20 22 70 72 6e 22 29 20 mp(path, "prn")
7dc0: 7c 7c 20 21 73 74 72 63 61 73 65 63 6d 70 28 70 || !strcasecmp(p
7dd0: 61 74 68 2c 20 22 6e 75 6c 22 29 0a 09 20 20 20 ath, "nul")..
7de0: 20 7c 7c 20 21 73 74 72 63 61 73 65 63 6d 70 28 || !strcasecmp(
7df0: 70 61 74 68 2c 20 22 61 75 78 22 29 29 20 7b 0a path, "aux")) {.
7e00: 09 2f 2a 0a 09 20 2a 20 48 61 76 65 20 6d 61 74 ./*.. * Have mat
7e10: 63 68 20 66 6f 72 20 27 70 72 6e 27 2c 20 27 6e ch for 'prn', 'n
7e20: 75 6c 27 20 6f 72 20 27 61 75 78 27 2e 0a 09 20 ul' or 'aux'...
7e30: 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 33 3b 0a 20 */...return 3;.
7e40: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
7e50: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ea0: 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 4d --. *. * NativeM
7eb0: 61 74 63 68 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 atchType --. *.
7ec0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
7ed0: 6e 65 65 64 73 20 61 20 73 70 65 63 69 61 6c 20 needs a special
7ee0: 63 61 73 65 20 66 6f 72 20 61 20 70 61 74 68 20 case for a path
7ef0: 77 68 69 63 68 20 69 73 20 61 20 72 6f 6f 74 20 which is a root
7f00: 76 6f 6c 75 6d 65 2c 0a 20 2a 09 62 65 63 61 75 volume,. *.becau
7f10: 73 65 20 66 6f 72 20 4e 54 46 53 20 72 6f 6f 74 se for NTFS root
7f20: 20 76 6f 6c 75 6d 65 73 2c 20 74 68 65 20 67 65 volumes, the ge
7f30: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 50 tFileAttributesP
7f40: 72 6f 63 20 72 65 74 75 72 6e 73 20 61 0a 20 2a roc returns a. *
7f50: 09 27 68 69 64 64 65 6e 27 20 61 74 74 72 69 62 .'hidden' attrib
7f60: 75 74 65 20 77 68 65 6e 20 69 74 20 73 68 6f 75 ute when it shou
7f70: 6c 64 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 09 57 65 ld not.. *. *.We
7f80: 20 6e 65 76 65 72 20 6d 61 6b 65 20 61 6e 79 20 never make any
7f90: 63 61 6c 6c 73 20 74 6f 20 61 20 27 67 65 74 20 calls to a 'get
7fa0: 61 74 74 72 69 62 75 74 65 73 27 20 72 6f 75 74 attributes' rout
7fb0: 69 6e 65 20 68 65 72 65 2c 20 73 69 6e 63 65 20 ine here, since
7fc0: 77 65 0a 20 2a 09 68 61 76 65 20 61 72 72 61 6e we. *.have arran
7fd0: 67 65 64 20 74 68 69 6e 67 73 20 73 6f 20 74 68 ged things so th
7fe0: 61 74 20 6f 75 72 20 63 61 6c 6c 65 72 20 61 6c at our caller al
7ff0: 72 65 61 64 79 20 6b 6e 6f 77 73 20 73 75 63 68 ready knows such
8000: 0a 20 2a 09 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e . *.information.
8010: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8020: 20 2a 09 30 20 3d 20 66 69 6c 65 20 64 6f 65 73 *.0 = file does
8030: 6e 27 74 20 6d 61 74 63 68 0a 20 2a 09 31 20 3d n't match. *.1 =
8040: 20 66 69 6c 65 20 6d 61 74 63 68 65 73 0a 20 2a file matches. *
8050: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
80a0: 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 tatic int.Native
80b0: 4d 61 74 63 68 54 79 70 65 28 0a 20 20 20 20 69 MatchType(. i
80c0: 6e 74 20 69 73 44 72 69 76 65 2c 09 09 2f 2a 20 nt isDrive,../*
80d0: 49 73 20 74 68 69 73 20 61 20 64 72 69 76 65 2e Is this a drive.
80e0: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 61 74 */. DWORD at
80f0: 74 72 2c 09 09 09 2f 2a 20 57 65 20 61 6c 72 65 tr,.../* We alre
8100: 61 64 79 20 6b 6e 6f 77 20 74 68 65 20 61 74 74 ady know the att
8110: 72 69 62 75 74 65 73 20 66 6f 72 20 74 68 65 0a ributes for the.
8120: 09 09 09 09 20 2a 20 66 69 6c 65 2e 20 2a 2f 0a .... * file. */.
8130: 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 const TCHAR
8140: 2a 6e 61 74 69 76 65 4e 61 6d 65 2c 09 2f 2a 20 *nativeName,./*
8150: 4e 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 63 Native path to c
8160: 68 65 63 6b 2e 20 2a 2f 0a 20 20 20 20 54 63 6c heck. */. Tcl
8170: 5f 47 6c 6f 62 54 79 70 65 44 61 74 61 20 2a 74 _GlobTypeData *t
8180: 79 70 65 73 29 09 2f 2a 20 54 79 70 65 20 64 65 ypes)./* Type de
8190: 73 63 72 69 70 74 69 6f 6e 20 74 6f 20 6d 61 74 scription to mat
81a0: 63 68 20 61 67 61 69 6e 73 74 2e 20 2a 2f 0a 7b ch against. */.{
81b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 27 . /*. * '
81c0: 61 74 74 72 27 20 72 65 70 72 65 73 65 6e 74 73 attr' represents
81d0: 20 74 68 65 20 61 74 74 72 69 62 75 74 65 73 20 the attributes
81e0: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 of the file, but
81f0: 20 77 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f we only want to
8200: 0a 20 20 20 20 20 2a 20 72 65 74 72 69 65 76 65 . * retrieve
8210: 20 74 68 69 73 20 69 6e 66 6f 20 69 66 20 69 74 this info if it
8220: 20 69 73 20 61 62 73 6f 6c 75 74 65 6c 79 20 6e is absolutely n
8230: 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 ecessary because
8240: 20 69 74 20 69 73 20 61 6e 0a 20 20 20 20 20 2a it is an. *
8250: 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 2e expensive call.
8260: 20 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79 2c 20 Unfortunately,
8270: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 68 69 64 to deal with hid
8280: 64 65 6e 20 66 69 6c 65 73 20 70 72 6f 70 65 72 den files proper
8290: 6c 79 2c 20 77 65 0a 20 20 20 20 20 2a 20 6d 75 ly, we. * mu
82a0: 73 74 20 61 6c 77 61 79 73 20 72 65 74 72 69 65 st always retrie
82b0: 76 65 20 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a ve it.. */..
82c0: 20 20 20 20 69 66 20 28 74 79 70 65 73 20 3d 3d if (types ==
82d0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
82e0: 20 49 66 20 69 6e 76 69 73 69 62 6c 65 2c 20 64 If invisible, d
82f0: 6f 6e 27 74 20 72 65 74 75 72 6e 20 74 68 65 20 on't return the
8300: 66 69 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 file... */...ret
8310: 75 72 6e 20 21 28 61 74 74 72 20 26 20 46 49 4c urn !(attr & FIL
8320: 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 E_ATTRIBUTE_HIDD
8330: 45 4e 20 26 26 20 21 69 73 44 72 69 76 65 29 3b EN && !isDrive);
8340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
8350: 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 attr & FILE_ATTR
8360: 49 42 55 54 45 5f 48 49 44 44 45 4e 20 26 26 20 IBUTE_HIDDEN &&
8370: 21 69 73 44 72 69 76 65 29 20 7b 0a 09 2f 2a 0a !isDrive) {../*.
8380: 09 20 2a 20 49 66 20 69 6e 76 69 73 69 62 6c 65 . * If invisible
8390: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 74 79 ... */...if ((ty
83a0: 70 65 73 2d 3e 70 65 72 6d 20 3d 3d 20 30 29 20 pes->perm == 0)
83b0: 7c 7c 20 21 28 74 79 70 65 73 2d 3e 70 65 72 6d || !(types->perm
83c0: 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d & TCL_GLOB_PERM
83d0: 5f 48 49 44 44 45 4e 29 29 20 7b 0a 09 20 20 20 _HIDDEN)) {..
83e0: 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 return 0;..}.
83f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 } else {../*..
8400: 20 2a 20 56 69 73 69 62 6c 65 2e 0a 09 20 2a 2f * Visible... */
8410: 0a 0a 09 69 66 20 28 74 79 70 65 73 2d 3e 70 65 ...if (types->pe
8420: 72 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 rm & TCL_GLOB_PE
8430: 52 4d 5f 48 49 44 44 45 4e 29 20 7b 0a 09 20 20 RM_HIDDEN) {..
8440: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 return 0;..}.
8450: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 79 }.. if (ty
8460: 70 65 73 2d 3e 70 65 72 6d 20 21 3d 20 30 29 20 pes->perm != 0)
8470: 7b 0a 09 69 66 20 28 28 28 74 79 70 65 73 2d 3e {..if (((types->
8480: 70 65 72 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f perm & TCL_GLOB_
8490: 50 45 52 4d 5f 52 4f 4e 4c 59 29 20 26 26 0a 09 PERM_RONLY) &&..
84a0: 09 20 20 20 20 21 28 61 74 74 72 20 26 20 46 49 . !(attr & FI
84b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 LE_ATTRIBUTE_REA
84c0: 44 4f 4e 4c 59 29 29 20 7c 7c 0a 09 09 28 28 74 DONLY)) ||...((t
84d0: 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c ypes->perm & TCL
84e0: 5f 47 4c 4f 42 5f 50 45 52 4d 5f 52 29 20 26 26 _GLOB_PERM_R) &&
84f0: 0a 09 09 20 20 20 20 28 30 20 2f 2a 20 46 69 6c ... (0 /* Fil
8500: 65 20 65 78 69 73 74 73 20 3d 3e 20 52 5f 4f 4b e exists => R_OK
8510: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 2a 2f 29 29 on Windows */))
8520: 20 7c 7c 0a 09 09 28 28 74 79 70 65 73 2d 3e 70 ||...((types->p
8530: 65 72 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 erm & TCL_GLOB_P
8540: 45 52 4d 5f 57 29 20 26 26 0a 09 09 20 20 20 20 ERM_W) &&...
8550: 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 (attr & FILE_ATT
8560: 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 RIBUTE_READONLY)
8570: 29 20 7c 7c 0a 09 09 28 28 74 79 70 65 73 2d 3e ) ||...((types->
8580: 70 65 72 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f perm & TCL_GLOB_
8590: 50 45 52 4d 5f 58 29 20 26 26 0a 09 09 20 20 20 PERM_X) &&...
85a0: 20 28 21 28 61 74 74 72 20 26 20 46 49 4c 45 5f (!(attr & FILE_
85b0: 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 ATTRIBUTE_DIRECT
85c0: 4f 52 59 29 0a 09 09 20 20 20 20 26 26 20 21 4e ORY)... && !N
85d0: 61 74 69 76 65 49 73 45 78 65 63 28 6e 61 74 69 ativeIsExec(nati
85e0: 76 65 4e 61 6d 65 29 29 29 29 20 7b 0a 09 20 20 veName)))) {..
85f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 return 0;..}.
8600: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 74 }.. if ((t
8610: 79 70 65 73 2d 3e 74 79 70 65 20 26 20 54 43 4c ypes->type & TCL
8620: 5f 47 4c 4f 42 5f 54 59 50 45 5f 44 49 52 29 0a _GLOB_TYPE_DIR).
8630: 09 20 20 20 20 26 26 20 28 61 74 74 72 20 26 20 . && (attr &
8640: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 FILE_ATTRIBUTE_D
8650: 49 52 45 43 54 4f 52 59 29 29 20 7b 0a 09 2f 2a IRECTORY)) {../*
8660: 0a 09 20 2a 20 51 75 69 63 6b 65 72 20 74 65 73 .. * Quicker tes
8670: 74 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79 2c t for directory,
8680: 20 77 68 69 63 68 20 69 73 20 61 20 63 6f 6d 6d which is a comm
8690: 6f 6e 20 63 61 73 65 2e 0a 09 20 2a 2f 0a 0a 09 on case... */...
86a0: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 20 20 7d return 1;.. }
86b0: 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 73 2d else if (types-
86c0: 3e 74 79 70 65 20 21 3d 20 30 29 20 7b 0a 09 75 >type != 0) {..u
86d0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 73 74 nsigned short st
86e0: 5f 6d 6f 64 65 3b 0a 09 69 6e 74 20 69 73 45 78 _mode;..int isEx
86f0: 65 63 20 3d 20 4e 61 74 69 76 65 49 73 45 78 65 ec = NativeIsExe
8700: 63 28 6e 61 74 69 76 65 4e 61 6d 65 29 3b 0a 0a c(nativeName);..
8710: 09 73 74 5f 6d 6f 64 65 20 3d 20 4e 61 74 69 76 .st_mode = Nativ
8720: 65 53 74 61 74 4d 6f 64 65 28 61 74 74 72 2c 20 eStatMode(attr,
8730: 30 2c 20 69 73 45 78 65 63 29 3b 0a 0a 09 2f 2a 0, isExec);.../*
8740: 0a 09 20 2a 20 49 6e 20 6f 72 64 65 72 20 62 63 .. * In order bc
8750: 64 70 66 6c 73 20 61 73 20 69 6e 20 27 66 69 6e dpfls as in 'fin
8760: 64 20 2d 74 27 0a 09 20 2a 2f 0a 0a 09 69 66 20 d -t'.. */...if
8770: 28 28 28 74 79 70 65 73 2d 3e 74 79 70 65 26 54 (((types->type&T
8780: 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 42 4c 4f CL_GLOB_TYPE_BLO
8790: 43 4b 29 20 20 20 20 26 26 20 53 5f 49 53 42 4c CK) && S_ISBL
87a0: 4b 28 73 74 5f 6d 6f 64 65 29 29 20 7c 7c 0a 09 K(st_mode)) ||..
87b0: 09 28 28 74 79 70 65 73 2d 3e 74 79 70 65 26 54 .((types->type&T
87c0: 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 43 48 41 CL_GLOB_TYPE_CHA
87d0: 52 29 20 26 26 20 53 5f 49 53 43 48 52 28 73 74 R) && S_ISCHR(st
87e0: 5f 6d 6f 64 65 29 29 20 7c 7c 0a 09 09 28 28 74 _mode)) ||...((t
87f0: 79 70 65 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47 ypes->type&TCL_G
8800: 4c 4f 42 5f 54 59 50 45 5f 44 49 52 29 20 20 26 LOB_TYPE_DIR) &
8810: 26 20 53 5f 49 53 44 49 52 28 73 74 5f 6d 6f 64 & S_ISDIR(st_mod
8820: 65 29 29 20 7c 7c 0a 09 09 28 28 74 79 70 65 73 e)) ||...((types
8830: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f ->type&TCL_GLOB_
8840: 54 59 50 45 5f 50 49 50 45 29 20 26 26 20 53 5f TYPE_PIPE) && S_
8850: 49 53 46 49 46 4f 28 73 74 5f 6d 6f 64 65 29 29 ISFIFO(st_mode))
8860: 20 7c 7c 0a 23 69 66 64 65 66 20 53 5f 49 53 53 ||.#ifdef S_ISS
8870: 4f 43 4b 0a 09 09 28 28 74 79 70 65 73 2d 3e 74 OCK...((types->t
8880: 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 ype&TCL_GLOB_TYP
8890: 45 5f 53 4f 43 4b 29 20 26 26 20 53 5f 49 53 53 E_SOCK) && S_ISS
88a0: 4f 43 4b 28 73 74 5f 6d 6f 64 65 29 29 20 7c 7c OCK(st_mode)) ||
88b0: 0a 23 65 6e 64 69 66 0a 09 09 28 28 74 79 70 65 .#endif...((type
88c0: 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 s->type&TCL_GLOB
88d0: 5f 54 59 50 45 5f 46 49 4c 45 29 20 26 26 20 53 _TYPE_FILE) && S
88e0: 5f 49 53 52 45 47 28 73 74 5f 6d 6f 64 65 29 29 _ISREG(st_mode))
88f0: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 ) {.. /*..
8900: 20 20 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2d * Do nothing -
8910: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 6f 6b this file is ok
8920: 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 7d 20 65 6c ... */..} el
8930: 73 65 20 7b 0a 23 69 66 64 65 66 20 53 5f 49 53 se {.#ifdef S_IS
8940: 4c 4e 4b 0a 09 20 20 20 20 69 66 20 28 74 79 70 LNK.. if (typ
8950: 65 73 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47 es->type & TCL_G
8960: 4c 4f 42 5f 54 59 50 45 5f 4c 49 4e 4b 29 20 7b LOB_TYPE_LINK) {
8970: 0a 09 09 73 74 5f 6d 6f 64 65 20 3d 20 4e 61 74 ...st_mode = Nat
8980: 69 76 65 53 74 61 74 4d 6f 64 65 28 61 74 74 72 iveStatMode(attr
8990: 2c 20 31 2c 20 69 73 45 78 65 63 29 3b 0a 09 09 , 1, isExec);...
89a0: 69 66 20 28 53 5f 49 53 4c 4e 4b 28 73 74 5f 6d if (S_ISLNK(st_m
89b0: 6f 64 65 29 29 20 7b 0a 09 09 20 20 20 20 72 65 ode)) {... re
89c0: 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 09 20 20 20 turn 1;...}..
89d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 5f 49 }.#endif /* S_I
89e0: 53 4c 4e 4b 20 2a 2f 0a 09 20 20 20 20 72 65 74 SLNK */.. ret
89f0: 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a urn 0;..}. }.
8a00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a return 1;.}.
8a10: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
8a60: 0a 20 2a 20 54 63 6c 70 47 65 74 55 73 65 72 48 . * TclpGetUserH
8a70: 6f 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 ome --. *. *.Thi
8a80: 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 s function takes
8a90: 20 74 68 65 20 70 61 73 73 65 64 20 69 6e 20 75 the passed in u
8aa0: 73 65 72 20 6e 61 6d 65 20 61 6e 64 20 66 69 6e ser name and fin
8ab0: 64 73 20 74 68 65 0a 20 2a 09 63 6f 72 72 65 73 ds the. *.corres
8ac0: 70 6f 6e 64 69 6e 67 20 68 6f 6d 65 20 64 69 72 ponding home dir
8ad0: 65 63 74 6f 72 79 20 73 70 65 63 69 66 69 65 64 ectory specified
8ae0: 20 69 6e 20 74 68 65 20 70 61 73 73 77 6f 72 64 in the password
8af0: 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 file.. *. * Res
8b00: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 73 ults:. *.The res
8b10: 75 6c 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 ult is a pointer
8b20: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 73 70 65 to a string spe
8b30: 63 69 66 79 69 6e 67 20 74 68 65 20 75 73 65 72 cifying the user
8b40: 27 73 20 68 6f 6d 65 0a 20 2a 09 64 69 72 65 63 's home. *.direc
8b50: 74 6f 72 79 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 tory, or NULL if
8b60: 20 74 68 65 20 75 73 65 72 27 73 20 68 6f 6d 65 the user's home
8b70: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 75 6c 64 directory could
8b80: 20 6e 6f 74 20 62 65 0a 20 2a 09 64 65 74 65 72 not be. *.deter
8b90: 6d 69 6e 65 64 2e 20 53 74 6f 72 61 67 65 20 66 mined. Storage f
8ba0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 74 or the result st
8bb0: 72 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 ring is allocate
8bc0: 64 20 69 6e 20 62 75 66 66 65 72 50 74 72 3b 0a d in bufferPtr;.
8bd0: 20 2a 09 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 *.the caller mu
8be0: 73 74 20 63 61 6c 6c 20 54 63 6c 5f 44 53 74 72 st call Tcl_DStr
8bf0: 69 6e 67 46 72 65 65 28 29 20 77 68 65 6e 20 74 ingFree() when t
8c00: 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 20 he result is no
8c10: 6c 6f 6e 67 65 72 0a 20 2a 09 6e 65 65 64 65 64 longer. *.needed
8c20: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8c30: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ects:. *.None..
8c40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
8c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 0a 54 63 6c const char *.Tcl
8ca0: 70 47 65 74 55 73 65 72 48 6f 6d 65 28 0a 20 20 pGetUserHome(.
8cb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 const char *na
8cc0: 6d 65 2c 09 09 2f 2a 20 55 73 65 72 20 6e 61 6d me,../* User nam
8cd0: 65 20 66 6f 72 20 64 65 73 69 72 65 64 20 68 6f e for desired ho
8ce0: 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f me directory. */
8cf0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
8d00: 20 2a 62 75 66 66 65 72 50 74 72 29 09 2f 2a 20 *bufferPtr)./*
8d10: 55 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 Uninitialized or
8d20: 20 66 72 65 65 20 44 53 74 72 69 6e 67 20 66 69 free DString fi
8d30: 6c 6c 65 64 20 77 69 74 68 0a 09 09 09 09 20 2a lled with..... *
8d40: 20 6e 61 6d 65 20 6f 66 20 75 73 65 72 27 73 20 name of user's
8d50: 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 2e 20 home directory.
8d60: 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 */.{. const c
8d70: 68 61 72 20 2a 72 65 73 75 6c 74 20 3d 20 4e 55 har *result = NU
8d80: 4c 4c 3b 0a 20 20 20 20 55 53 45 52 5f 49 4e 46 LL;. USER_INF
8d90: 4f 5f 31 20 2a 75 69 50 74 72 2c 20 2a 2a 75 69 O_1 *uiPtr, **ui
8da0: 50 74 72 50 74 72 20 3d 20 26 75 69 50 74 72 3b PtrPtr = &uiPtr;
8db0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
8dc0: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6e 61 6d ds;. int nam
8dd0: 65 4c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 69 eLen = -1;. i
8de0: 6e 74 20 62 61 64 44 6f 6d 61 69 6e 20 3d 20 30 nt badDomain = 0
8df0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 64 6f 6d 61 ;. char *doma
8e00: 69 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 2a 77 in;. WCHAR *w
8e10: 4e 61 6d 65 2c 20 2a 77 48 6f 6d 65 44 69 72 2c Name, *wHomeDir,
8e20: 20 2a 77 44 6f 6d 61 69 6e 2c 20 2a 2a 77 44 6f *wDomain, **wDo
8e30: 6d 61 69 6e 50 74 72 20 3d 20 26 77 44 6f 6d 61 mainPtr = &wDoma
8e40: 69 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 62 75 in;. WCHAR bu
8e50: 66 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 0a 20 20 f[MAX_PATH];..
8e60: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 Tcl_DStringIni
8e70: 74 28 62 75 66 66 65 72 50 74 72 29 3b 0a 20 20 t(bufferPtr);.
8e80: 20 20 77 44 6f 6d 61 69 6e 20 3d 20 4e 55 4c 4c wDomain = NULL
8e90: 3b 0a 20 20 20 20 64 6f 6d 61 69 6e 20 3d 20 73 ;. domain = s
8ea0: 74 72 63 68 72 28 6e 61 6d 65 2c 20 27 40 27 29 trchr(name, '@')
8eb0: 3b 0a 20 20 20 20 69 66 20 28 64 6f 6d 61 69 6e ;. if (domain
8ec0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
8ed0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 _DStringInit(&ds
8ee0: 29 3b 0a 09 77 4e 61 6d 65 20 3d 20 54 63 6c 5f );..wName = Tcl_
8ef0: 55 74 66 54 6f 55 6e 69 43 68 61 72 44 53 74 72 UtfToUniCharDStr
8f00: 69 6e 67 28 64 6f 6d 61 69 6e 20 2b 20 31 2c 20 ing(domain + 1,
8f10: 2d 31 2c 20 26 64 73 29 3b 0a 09 62 61 64 44 6f -1, &ds);..badDo
8f20: 6d 61 69 6e 20 3d 20 4e 65 74 47 65 74 44 43 4e main = NetGetDCN
8f30: 61 6d 65 28 4e 55 4c 4c 2c 20 77 4e 61 6d 65 2c ame(NULL, wName,
8f40: 20 28 4c 50 42 59 54 45 20 2a 29 20 77 44 6f 6d (LPBYTE *) wDom
8f50: 61 69 6e 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 ainPtr);..Tcl_DS
8f60: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
8f70: 09 6e 61 6d 65 4c 65 6e 20 3d 20 64 6f 6d 61 69 .nameLen = domai
8f80: 6e 20 2d 20 6e 61 6d 65 3b 0a 20 20 20 20 7d 0a n - name;. }.
8f90: 20 20 20 20 69 66 20 28 62 61 64 44 6f 6d 61 69 if (badDomai
8fa0: 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 44 n == 0) {..Tcl_D
8fb0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b StringInit(&ds);
8fc0: 0a 09 77 4e 61 6d 65 20 3d 20 54 63 6c 5f 55 74 ..wName = Tcl_Ut
8fd0: 66 54 6f 55 6e 69 43 68 61 72 44 53 74 72 69 6e fToUniCharDStrin
8fe0: 67 28 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2c g(name, nameLen,
8ff0: 20 26 64 73 29 3b 0a 09 69 66 20 28 4e 65 74 55 &ds);..if (NetU
9000: 73 65 72 47 65 74 49 6e 66 6f 28 77 44 6f 6d 61 serGetInfo(wDoma
9010: 69 6e 2c 20 77 4e 61 6d 65 2c 20 31 2c 20 28 4c in, wName, 1, (L
9020: 50 42 59 54 45 20 2a 29 20 75 69 50 74 72 50 74 PBYTE *) uiPtrPt
9030: 72 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 r) == 0) {..
9040: 77 48 6f 6d 65 44 69 72 20 3d 20 75 69 50 74 72 wHomeDir = uiPtr
9050: 2d 3e 75 73 72 69 31 5f 68 6f 6d 65 5f 64 69 72 ->usri1_home_dir
9060: 3b 0a 09 20 20 20 20 69 66 20 28 28 77 48 6f 6d ;.. if ((wHom
9070: 65 44 69 72 20 21 3d 20 4e 55 4c 4c 29 20 26 26 eDir != NULL) &&
9080: 20 28 77 48 6f 6d 65 44 69 72 5b 30 5d 20 21 3d (wHomeDir[0] !=
9090: 20 4c 27 5c 30 27 29 29 20 7b 0a 09 09 54 63 6c L'\0')) {...Tcl
90a0: 5f 55 6e 69 43 68 61 72 54 6f 55 74 66 44 53 74 _UniCharToUtfDSt
90b0: 72 69 6e 67 28 77 48 6f 6d 65 44 69 72 2c 20 6c ring(wHomeDir, l
90c0: 73 74 72 6c 65 6e 57 28 77 48 6f 6d 65 44 69 72 strlenW(wHomeDir
90d0: 29 2c 0a 09 09 09 62 75 66 66 65 72 50 74 72 29 ),....bufferPtr)
90e0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
90f0: 09 09 2f 2a 0a 09 09 20 2a 20 55 73 65 72 20 65 ../*... * User e
9100: 78 69 73 74 73 20 62 75 74 20 68 61 73 20 6e 6f xists but has no
9110: 20 68 6f 6d 65 20 64 69 72 2e 20 52 65 74 75 72 home dir. Retur
9120: 6e 0a 09 09 20 2a 20 22 7b 57 69 6e 64 6f 77 73 n... * "{Windows
9130: 20 44 72 69 76 65 7d 3a 2f 75 73 65 72 73 2f 64 Drive}:/users/d
9140: 65 66 61 75 6c 74 22 2e 0a 09 09 20 2a 2f 0a 0a efault".... */..
9150: 09 09 47 65 74 57 69 6e 64 6f 77 73 44 69 72 65 ..GetWindowsDire
9160: 63 74 6f 72 79 57 28 62 75 66 2c 20 4d 41 58 5f ctoryW(buf, MAX_
9170: 50 41 54 48 29 3b 0a 09 09 54 63 6c 5f 55 6e 69 PATH);...Tcl_Uni
9180: 43 68 61 72 54 6f 55 74 66 44 53 74 72 69 6e 67 CharToUtfDString
9190: 28 62 75 66 2c 20 32 2c 20 62 75 66 66 65 72 50 (buf, 2, bufferP
91a0: 74 72 29 3b 0a 09 09 54 63 6c 44 53 74 72 69 6e tr);...TclDStrin
91b0: 67 41 70 70 65 6e 64 4c 69 74 65 72 61 6c 28 62 gAppendLiteral(b
91c0: 75 66 66 65 72 50 74 72 2c 20 22 2f 75 73 65 72 ufferPtr, "/user
91d0: 73 2f 64 65 66 61 75 6c 74 22 29 3b 0a 09 20 20 s/default");..
91e0: 20 20 7d 0a 09 20 20 20 20 72 65 73 75 6c 74 20 }.. result
91f0: 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c = Tcl_DStringVal
9200: 75 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a 09 ue(bufferPtr);..
9210: 20 20 20 20 4e 65 74 41 70 69 42 75 66 66 65 72 NetApiBuffer
9220: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 20 75 69 Free((void *) ui
9230: 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 Ptr);..}..Tcl_DS
9240: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
9250: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 77 44 }. if (wD
9260: 6f 6d 61 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b omain != NULL) {
9270: 0a 09 4e 65 74 41 70 69 42 75 66 66 65 72 46 72 ..NetApiBufferFr
9280: 65 65 28 28 76 6f 69 64 20 2a 29 20 77 44 6f 6d ee((void *) wDom
9290: 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ain);. }.
92a0: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 if (result == NU
92b0: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4c 6f LL) {../*.. * Lo
92c0: 6f 6b 20 69 6e 20 74 68 65 20 22 50 61 73 73 77 ok in the "Passw
92d0: 6f 72 64 20 4c 69 73 74 73 22 20 73 65 63 74 69 ord Lists" secti
92e0: 6f 6e 20 6f 66 20 73 79 73 74 65 6d 2e 69 6e 69 on of system.ini
92f0: 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 6c 0a 09 for the local..
9300: 20 2a 20 75 73 65 72 2e 20 54 68 65 72 65 20 61 * user. There a
9310: 72 65 20 61 6c 73 6f 20 65 6e 74 72 69 65 73 20 re also entries
9320: 69 6e 20 74 68 61 74 20 73 65 63 74 69 6f 6e 20 in that section
9330: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 that begin with
9340: 61 20 22 2a 22 0a 09 20 2a 20 63 68 61 72 61 63 a "*".. * charac
9350: 74 65 72 20 74 68 61 74 20 61 72 65 20 75 73 65 ter that are use
9360: 64 20 62 79 20 57 69 6e 64 6f 77 73 20 66 6f 72 d by Windows for
9370: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 3b other purposes;
9380: 20 69 67 6e 6f 72 65 20 75 73 65 72 0a 09 20 2a ignore user.. *
9390: 20 6e 61 6d 65 73 20 62 65 67 69 6e 6e 69 6e 67 names beginning
93a0: 20 77 69 74 68 20 61 20 22 2a 22 2e 0a 09 20 2a with a "*"... *
93b0: 2f 0a 0a 09 63 68 61 72 20 62 75 66 5b 4d 41 58 /...char buf[MAX
93c0: 5f 50 41 54 48 5d 3b 0a 0a 09 69 66 20 28 6e 61 _PATH];...if (na
93d0: 6d 65 5b 30 5d 20 21 3d 20 27 2a 27 29 20 7b 0a me[0] != '*') {.
93e0: 09 20 20 20 20 69 66 20 28 47 65 74 50 72 69 76 . if (GetPriv
93f0: 61 74 65 50 72 6f 66 69 6c 65 53 74 72 69 6e 67 ateProfileString
9400: 41 28 22 50 61 73 73 77 6f 72 64 20 4c 69 73 74 A("Password List
9410: 73 22 2c 20 6e 61 6d 65 2c 20 22 22 2c 20 62 75 s", name, "", bu
9420: 66 2c 0a 09 09 20 20 20 20 4d 41 58 5f 50 41 54 f,... MAX_PAT
9430: 48 2c 20 22 73 79 73 74 65 6d 2e 69 6e 69 22 29 H, "system.ini")
9440: 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 > 0) {.../*...
9450: 2a 20 55 73 65 72 20 65 78 69 73 74 73 2c 20 62 * User exists, b
9460: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 ut there is no s
9470: 75 63 68 20 74 68 69 6e 67 20 61 73 20 61 20 68 uch thing as a h
9480: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 09 09 ome directory...
9490: 20 2a 20 69 6e 20 73 79 73 74 65 6d 2e 69 6e 69 * in system.ini
94a0: 2e 20 52 65 74 75 72 6e 20 22 7b 57 69 6e 64 6f . Return "{Windo
94b0: 77 73 20 64 72 69 76 65 7d 3a 2f 22 2e 0a 09 09 ws drive}:/"....
94c0: 20 2a 2f 0a 0a 09 09 47 65 74 57 69 6e 64 6f 77 */....GetWindow
94d0: 73 44 69 72 65 63 74 6f 72 79 41 28 62 75 66 2c sDirectoryA(buf,
94e0: 20 4d 41 58 5f 50 41 54 48 29 3b 0a 09 09 54 63 MAX_PATH);...Tc
94f0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 l_DStringAppend(
9500: 62 75 66 66 65 72 50 74 72 2c 20 62 75 66 2c 20 bufferPtr, buf,
9510: 33 29 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20 54 3);...result = T
9520: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
9530: 62 75 66 66 65 72 50 74 72 29 3b 0a 09 20 20 20 bufferPtr);..
9540: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }..}. }..
9550: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a return result;.
9560: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 ----. *. * Nativ
95c0: 65 41 63 63 65 73 73 20 2d 2d 0a 20 2a 0a 20 2a eAccess --. *. *
95d0: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 .This function r
95e0: 65 70 6c 61 63 65 73 20 74 68 65 20 6c 69 62 72 eplaces the libr
95f0: 61 72 79 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 ary version of a
9600: 63 63 65 73 73 28 29 2c 20 66 69 78 69 6e 67 20 ccess(), fixing
9610: 74 68 65 0a 20 2a 09 66 6f 6c 6c 6f 77 69 6e 67 the. *.following
9620: 20 62 75 67 73 3a 0a 20 2a 0a 20 2a 09 31 2e 20 bugs:. *. *.1.
9630: 61 63 63 65 73 73 28 29 20 72 65 74 75 72 6e 73 access() returns
9640: 20 74 68 61 74 20 61 6c 6c 20 66 69 6c 65 73 20 that all files
9650: 68 61 76 65 20 65 78 65 63 75 74 65 20 70 65 72 have execute per
9660: 6d 69 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 mission.. *. * R
9670: 65 73 75 6c 74 73 3a 0a 20 2a 09 53 65 65 20 61 esults:. *.See a
9680: 63 63 65 73 73 20 64 6f 63 75 6d 65 6e 74 61 74 ccess documentat
9690: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ion.. *. * Side
96a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 effects:. *.See
96b0: 61 63 63 65 73 73 20 64 6f 63 75 6d 65 6e 74 61 access documenta
96c0: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d tion.. *. *-----
96d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9710: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
9720: 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 41 63 63 ic int.NativeAcc
9730: 65 73 73 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 ess(. const T
9740: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 CHAR *nativePath
9750: 2c 09 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c ,./* Path of fil
9760: 65 20 74 6f 20 61 63 63 65 73 73 2c 20 6e 61 74 e to access, nat
9770: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f ive encoding. */
9780: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 29 09 09 . int mode)..
9790: 09 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 20 73 ./* Permission s
97a0: 65 74 74 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20 etting. */.{.
97b0: 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 0a 20 20 DWORD attr;..
97c0: 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65 attr = GetFile
97d0: 41 74 74 72 69 62 75 74 65 73 28 6e 61 74 69 76 Attributes(nativ
97e0: 65 50 61 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 ePath);.. if
97f0: 28 61 74 74 72 20 3d 3d 20 49 4e 56 41 4c 49 44 (attr == INVALID
9800: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 _FILE_ATTRIBUTES
9810: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 46 69 6c 65 ) {../*.. * File
9820: 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 might not exist
9830: 2e 0a 09 20 2a 2f 0a 0a 09 44 57 4f 52 44 20 6c ... */...DWORD l
9840: 61 73 74 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 asterror = GetLa
9850: 73 74 45 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 stError();..if (
9860: 6c 61 73 74 65 72 72 6f 72 20 21 3d 20 45 52 52 lasterror != ERR
9870: 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 OR_SHARING_VIOLA
9880: 54 49 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c TION) {.. Tcl
9890: 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 WinConvertError(
98a0: 6c 61 73 74 65 72 72 6f 72 29 3b 0a 09 20 20 20 lasterror);..
98b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
98c0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f }.. if (mo
98d0: 64 65 20 3d 3d 20 46 5f 4f 4b 29 20 7b 0a 09 2f de == F_OK) {../
98e0: 2a 0a 09 20 2a 20 46 69 6c 65 20 65 78 69 73 74 *.. * File exist
98f0: 73 2c 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 s, nothing else
9900: 74 6f 20 63 68 65 63 6b 2e 0a 09 20 2a 2f 0a 0a to check... */..
9910: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
9920: 0a 0a 20 20 20 20 69 66 20 28 28 6d 6f 64 65 20 .. if ((mode
9930: 26 20 57 5f 4f 4b 29 0a 09 26 26 20 28 61 74 74 & W_OK)..&& (att
9940: 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 r & FILE_ATTRIBU
9950: 54 45 5f 52 45 41 44 4f 4e 4c 59 29 0a 09 26 26 TE_READONLY)..&&
9960: 20 21 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 !(attr & FILE_A
9970: 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f TTRIBUTE_DIRECTO
9980: 52 59 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 RY)) {../*.. * T
9990: 68 65 20 61 74 74 72 69 62 75 74 65 73 20 73 61 he attributes sa
99a0: 79 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f y the file is no
99b0: 74 20 77 72 69 74 61 62 6c 65 2e 09 20 49 66 20 t writable.. If
99c0: 74 68 65 20 66 69 6c 65 20 69 73 20 61 0a 09 20 the file is a..
99d0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 20 28 * regular file (
99e0: 69 2e 65 2e 2c 20 6e 6f 74 20 61 20 64 69 72 65 i.e., not a dire
99f0: 63 74 6f 72 79 29 2c 20 74 68 65 6e 20 74 68 65 ctory), then the
9a00: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 09 20 2a file is not.. *
9a10: 20 77 72 69 74 61 62 6c 65 2c 20 66 75 6c 6c 20 writable, full
9a20: 73 74 6f 70 2e 09 20 46 6f 72 20 64 69 72 65 63 stop.. For direc
9a30: 74 6f 72 69 65 73 2c 20 74 68 65 20 72 65 61 64 tories, the read
9a40: 2d 6f 6e 6c 79 20 62 69 74 20 69 73 0a 09 20 2a -only bit is.. *
9a50: 20 28 6d 6f 73 74 6c 79 29 20 69 67 6e 6f 72 65 (mostly) ignore
9a60: 64 20 62 79 20 57 69 6e 64 6f 77 73 2c 20 73 6f d by Windows, so
9a70: 20 77 65 20 63 61 6e 27 74 20 61 73 63 65 72 74 we can't ascert
9a80: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 61 62 6f ain anything abo
9a90: 75 74 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79 ut.. * directory
9aa0: 20 61 63 63 65 73 73 20 66 72 6f 6d 20 74 68 65 access from the
9ab0: 20 61 74 74 72 69 62 20 64 61 74 61 2e 20 20 48 attrib data. H
9ac0: 6f 77 65 76 65 72 2c 20 69 66 20 77 65 20 68 61 owever, if we ha
9ad0: 76 65 20 74 68 65 0a 09 20 2a 20 61 64 76 61 6e ve the.. * advan
9ae0: 63 65 64 20 27 67 65 74 46 69 6c 65 53 65 63 75 ced 'getFileSecu
9af0: 72 69 74 79 50 72 6f 63 27 2c 20 74 68 65 6e 20 rityProc', then
9b00: 6d 6f 72 65 20 72 6f 62 75 73 74 20 41 43 4c 20 more robust ACL
9b10: 63 68 65 63 6b 73 0a 09 20 2a 20 77 69 6c 6c 20 checks.. * will
9b20: 62 65 20 64 6f 6e 65 20 62 65 6c 6f 77 2e 0a 09 be done below...
9b30: 20 2a 2f 0a 0a 09 54 63 6c 5f 53 65 74 45 72 72 */...Tcl_SetErr
9b40: 6e 6f 28 45 41 43 43 45 53 29 3b 0a 09 72 65 74 no(EACCES);..ret
9b50: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 urn -1;. }..
9b60: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 58 5f if (mode & X_
9b70: 4f 4b 29 20 7b 0a 09 69 66 20 28 21 28 61 74 74 OK) {..if (!(att
9b80: 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 r & FILE_ATTRIBU
9b90: 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20 26 26 TE_DIRECTORY) &&
9ba0: 20 21 4e 61 74 69 76 65 49 73 45 78 65 63 28 6e !NativeIsExec(n
9bb0: 61 74 69 76 65 50 61 74 68 29 29 20 7b 0a 09 20 ativePath)) {..
9bc0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 74 /*.. * It
9bd0: 27 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74 6f 's not a directo
9be0: 72 79 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 68 ry and doesn't h
9bf0: 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 ave the correct
9c00: 65 78 74 65 6e 73 69 6f 6e 2e 0a 09 20 20 20 20 extension...
9c10: 20 2a 20 54 68 65 72 65 66 6f 72 65 20 69 74 20 * Therefore it
9c20: 63 61 6e 27 74 20 62 65 20 65 78 65 63 75 74 61 can't be executa
9c30: 62 6c 65 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 ble.. */...
9c40: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 Tcl_SetErrno(
9c50: 45 41 43 43 45 53 29 3b 0a 09 20 20 20 20 72 65 EACCES);.. re
9c60: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 turn -1;..}.
9c70: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
9c80: 20 49 74 20 6c 6f 6f 6b 73 20 61 73 20 69 66 20 It looks as if
9c90: 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 the permissions
9ca0: 61 72 65 20 6f 6b 2c 20 62 75 74 20 69 66 20 77 are ok, but if w
9cb0: 65 20 61 72 65 20 6f 6e 20 4e 54 2c 20 32 30 30 e are on NT, 200
9cc0: 30 20 6f 72 20 58 50 2c 0a 20 20 20 20 20 2a 20 0 or XP,. *
9cd0: 77 65 20 68 61 76 65 20 61 20 6d 6f 72 65 20 63 we have a more c
9ce0: 6f 6d 70 6c 65 78 20 70 65 72 6d 69 73 73 69 6f omplex permissio
9cf0: 6e 73 20 73 74 72 75 63 74 75 72 65 20 73 6f 20 ns structure so
9d00: 77 65 20 74 72 79 20 74 6f 20 63 68 65 63 6b 20 we try to check
9d10: 74 68 61 74 2e 0a 20 20 20 20 20 2a 20 54 68 65 that.. * The
9d20: 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 72 code below is r
9d30: 65 6d 61 72 6b 61 62 6c 79 20 63 6f 6d 70 6c 65 emarkably comple
9d40: 78 20 66 6f 72 20 73 75 63 68 20 61 20 73 69 6d x for such a sim
9d50: 70 6c 65 20 74 68 69 6e 67 20 61 73 20 66 69 6e ple thing as fin
9d60: 64 69 6e 67 0a 20 20 20 20 20 2a 20 77 68 61 74 ding. * what
9d70: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 permissions the
9d80: 20 4f 53 20 68 61 73 20 73 65 74 20 66 6f 72 20 OS has set for
9d90: 61 20 66 69 6c 65 2e 0a 20 20 20 20 20 2a 2f 0a a file.. */.
9da0: 0a 23 69 66 64 65 66 20 55 4e 49 43 4f 44 45 0a .#ifdef UNICODE.
9db0: 20 20 20 20 7b 0a 09 53 45 43 55 52 49 54 59 5f {..SECURITY_
9dc0: 44 45 53 43 52 49 50 54 4f 52 20 2a 73 64 50 74 DESCRIPTOR *sdPt
9dd0: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 r = NULL;..unsig
9de0: 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 3b 0a 09 ned long size;..
9df0: 50 53 49 44 20 70 53 69 64 20 3d 20 30 3b 0a 09 PSID pSid = 0;..
9e00: 42 4f 4f 4c 20 53 69 64 44 65 66 61 75 6c 74 65 BOOL SidDefaulte
9e10: 64 3b 0a 09 53 49 44 5f 49 44 45 4e 54 49 46 49 d;..SID_IDENTIFI
9e20: 45 52 5f 41 55 54 48 4f 52 49 54 59 20 73 61 6d ER_AUTHORITY sam
9e30: 62 61 5f 75 6e 6d 61 70 70 65 64 20 3d 20 7b 7b ba_unmapped = {{
9e40: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 32 0, 0, 0, 0, 0, 2
9e50: 32 7d 7d 3b 0a 09 47 45 4e 45 52 49 43 5f 4d 41 2}};..GENERIC_MA
9e60: 50 50 49 4e 47 20 67 65 6e 4d 61 70 3b 0a 09 48 PPING genMap;..H
9e70: 41 4e 44 4c 45 20 68 54 6f 6b 65 6e 20 3d 20 4e ANDLE hToken = N
9e80: 55 4c 4c 3b 0a 09 44 57 4f 52 44 20 64 65 73 69 ULL;..DWORD desi
9e90: 72 65 64 41 63 63 65 73 73 20 3d 20 30 2c 20 67 redAccess = 0, g
9ea0: 72 61 6e 74 65 64 41 63 63 65 73 73 20 3d 20 30 rantedAccess = 0
9eb0: 3b 0a 09 42 4f 4f 4c 20 61 63 63 65 73 73 59 65 ;..BOOL accessYe
9ec0: 73 4e 6f 20 3d 20 46 41 4c 53 45 3b 0a 09 50 52 sNo = FALSE;..PR
9ed0: 49 56 49 4c 45 47 45 5f 53 45 54 20 70 72 69 76 IVILEGE_SET priv
9ee0: 53 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 69 76 Set;..DWORD priv
9ef0: 53 65 74 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 SetSize = sizeof
9f00: 28 50 52 49 56 49 4c 45 47 45 5f 53 45 54 29 3b (PRIVILEGE_SET);
9f10: 0a 09 69 6e 74 20 65 72 72 6f 72 3b 0a 0a 09 2f ..int error;.../
9f20: 2a 0a 09 20 2a 20 46 69 72 73 74 20 66 69 6e 64 *.. * First find
9f30: 20 6f 75 74 20 68 6f 77 20 62 69 67 20 74 68 65 out how big the
9f40: 20 62 75 66 66 65 72 20 6e 65 65 64 73 20 74 6f buffer needs to
9f50: 20 62 65 2e 0a 09 20 2a 2f 0a 0a 09 73 69 7a 65 be... */...size
9f60: 20 3d 20 30 3b 0a 09 47 65 74 46 69 6c 65 53 65 = 0;..GetFileSe
9f70: 63 75 72 69 74 79 28 6e 61 74 69 76 65 50 61 74 curity(nativePat
9f80: 68 2c 0a 09 09 4f 57 4e 45 52 5f 53 45 43 55 52 h,...OWNER_SECUR
9f90: 49 54 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 ITY_INFORMATION
9fa0: 7c 20 47 52 4f 55 50 5f 53 45 43 55 52 49 54 59 | GROUP_SECURITY
9fb0: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c _INFORMATION...|
9fc0: 20 44 41 43 4c 5f 53 45 43 55 52 49 54 59 5f 49 DACL_SECURITY_I
9fd0: 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 NFORMATION | LAB
9fe0: 45 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f EL_SECURITY_INFO
9ff0: 52 4d 41 54 49 4f 4e 2c 0a 09 09 30 2c 20 30 2c RMATION,...0, 0,
a000: 20 26 73 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 09 20 &size);.../*..
a010: 2a 20 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61 * Should have fa
a020: 69 6c 65 64 20 77 69 74 68 20 45 52 52 4f 52 5f iled with ERROR_
a030: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 INSUFFICIENT_BUF
a040: 46 45 52 0a 09 20 2a 2f 0a 0a 09 65 72 72 6f 72 FER.. */...error
a050: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 = GetLastError(
a060: 29 3b 0a 09 69 66 20 28 65 72 72 6f 72 20 21 3d );..if (error !=
a070: 20 45 52 52 4f 52 5f 49 4e 53 55 46 46 49 43 49 ERROR_INSUFFICI
a080: 45 4e 54 5f 42 55 46 46 45 52 29 20 7b 0a 09 20 ENT_BUFFER) {..
a090: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 6f /*.. * Mo
a0a0: 73 74 20 6c 69 6b 65 6c 79 20 63 61 73 65 20 69 st likely case i
a0b0: 73 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 s ERROR_ACCESS_D
a0c0: 45 4e 49 45 44 2c 20 77 68 69 63 68 20 77 65 20 ENIED, which we
a0d0: 77 69 6c 6c 20 63 6f 6e 76 65 72 74 0a 09 20 20 will convert..
a0e0: 20 20 20 2a 20 74 6f 20 45 41 43 43 45 53 20 2d * to EACCES -
a0f0: 20 6a 75 73 74 20 77 68 61 74 20 77 65 20 77 61 just what we wa
a100: 6e 74 21 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 nt!.. */...
a110: 20 20 20 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 TclWinConvert
a120: 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20 65 72 Error((DWORD) er
a130: 72 6f 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ror);.. retur
a140: 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 n -1;..}.../*..
a150: 2a 20 4e 6f 77 20 73 69 7a 65 20 63 6f 6e 74 61 * Now size conta
a160: 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 ins the size of
a170: 62 75 66 66 65 72 20 6e 65 65 64 65 64 2e 0a 09 buffer needed...
a180: 20 2a 2f 0a 0a 09 73 64 50 74 72 20 3d 20 28 53 */...sdPtr = (S
a190: 45 43 55 52 49 54 59 5f 44 45 53 43 52 49 50 54 ECURITY_DESCRIPT
a1a0: 4f 52 20 2a 29 20 48 65 61 70 41 6c 6c 6f 63 28 OR *) HeapAlloc(
a1b0: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 GetProcessHeap()
a1c0: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 , 0, size);...if
a1d0: 20 28 73 64 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 (sdPtr == NULL)
a1e0: 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 61 63 63 {.. goto acc
a1f0: 65 73 73 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f essError;..}.../
a200: 2a 0a 09 20 2a 20 43 61 6c 6c 20 47 65 74 46 69 *.. * Call GetFi
a210: 6c 65 53 65 63 75 72 69 74 79 28 29 20 66 6f 72 leSecurity() for
a220: 20 72 65 61 6c 2e 0a 09 20 2a 2f 0a 0a 09 69 66 real... */...if
a230: 20 28 21 47 65 74 46 69 6c 65 53 65 63 75 72 69 (!GetFileSecuri
a240: 74 79 28 6e 61 74 69 76 65 50 61 74 68 2c 0a 09 ty(nativePath,..
a250: 09 4f 57 4e 45 52 5f 53 45 43 55 52 49 54 59 5f .OWNER_SECURITY_
a260: 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 47 52 INFORMATION | GR
a270: 4f 55 50 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 OUP_SECURITY_INF
a280: 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c 20 44 41 43 ORMATION...| DAC
a290: 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 L_SECURITY_INFOR
a2a0: 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 45 4c 5f 53 MATION | LABEL_S
a2b0: 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41 54 ECURITY_INFORMAT
a2c0: 49 4f 4e 2c 0a 09 09 73 64 50 74 72 2c 20 73 69 ION,...sdPtr, si
a2d0: 7a 65 2c 20 26 73 69 7a 65 29 29 20 7b 0a 09 20 ze, &size)) {..
a2e0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45 72 /*.. * Er
a2f0: 72 6f 72 20 67 65 74 74 69 6e 67 20 6f 77 6e 65 ror getting owne
a300: 72 20 53 44 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 r SD.. */...
a310: 20 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73 45 goto accessE
a320: 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 rror;..}.../*..
a330: 2a 20 41 73 20 6f 66 20 53 61 6d 62 61 20 33 2e * As of Samba 3.
a340: 30 2e 32 33 20 28 31 30 2d 4a 75 6c 2d 32 30 30 0.23 (10-Jul-200
a350: 36 29 2c 20 75 6e 6d 61 70 70 65 64 20 75 73 65 6), unmapped use
a360: 72 73 20 61 6e 64 20 67 72 6f 75 70 73 20 61 72 rs and groups ar
a370: 65 0a 09 20 2a 20 61 73 73 69 67 6e 65 64 20 74 e.. * assigned t
a380: 6f 20 53 49 44 20 64 6f 6d 61 69 6e 73 20 53 2d o SID domains S-
a390: 31 2d 32 32 2d 31 20 61 6e 64 20 53 2d 31 2d 32 1-22-1 and S-1-2
a3a0: 32 2d 32 2c 20 77 68 65 72 65 20 22 32 32 22 20 2-2, where "22"
a3b0: 69 73 20 74 68 65 0a 09 20 2a 20 74 6f 70 2d 6c is the.. * top-l
a3c0: 65 76 65 6c 20 61 75 74 68 6f 72 69 74 79 2e 09 evel authority..
a3d0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 77 6e If the file own
a3e0: 65 72 20 61 6e 64 20 67 72 6f 75 70 20 69 73 20 er and group is
a3f0: 75 6e 6d 61 70 70 65 64 20 74 68 65 6e 0a 09 20 unmapped then..
a400: 2a 20 74 68 65 20 41 43 4c 20 61 63 63 65 73 73 * the ACL access
a410: 20 63 68 65 63 6b 20 62 65 6c 6f 77 20 77 69 6c check below wil
a420: 6c 20 6f 6e 6c 79 20 74 65 73 74 20 61 67 61 69 l only test agai
a430: 6e 73 74 20 77 6f 72 6c 64 20 61 63 63 65 73 73 nst world access
a440: 2c 0a 09 20 2a 20 77 68 69 63 68 20 69 73 20 6c ,.. * which is l
a450: 69 6b 65 6c 79 20 74 6f 20 62 65 20 6d 6f 72 65 ikely to be more
a460: 20 72 65 73 74 72 69 63 74 69 76 65 20 74 68 61 restrictive tha
a470: 6e 20 74 68 65 20 61 63 74 75 61 6c 20 61 63 63 n the actual acc
a480: 65 73 73 0a 09 20 2a 20 72 65 73 74 72 69 63 74 ess.. * restrict
a490: 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 74 68 65 ions. Since the
a4a0: 20 41 43 4c 20 74 65 73 74 73 20 61 72 65 20 6d ACL tests are m
a4b0: 6f 72 65 20 6c 69 6b 65 6c 79 20 77 72 6f 6e 67 ore likely wrong
a4c0: 20 74 68 61 6e 0a 09 20 2a 20 72 69 67 68 74 2c than.. * right,
a4d0: 20 73 6b 69 70 20 74 68 65 6d 2e 20 20 4d 6f 72 skip them. Mor
a4e0: 65 6f 76 65 72 2c 20 74 68 65 20 75 6e 69 78 20 eover, the unix
a4f0: 6f 77 6e 65 72 20 61 63 63 65 73 73 20 70 65 72 owner access per
a500: 6d 69 73 73 69 6f 6e 73 20 61 72 65 0a 09 20 2a missions are.. *
a510: 20 75 73 75 61 6c 6c 79 20 6d 61 70 70 65 64 20 usually mapped
a520: 74 6f 20 74 68 65 20 57 69 6e 64 6f 77 73 20 61 to the Windows a
a530: 74 74 72 69 62 75 74 65 73 2c 20 73 6f 20 69 66 ttributes, so if
a540: 20 74 68 65 20 75 73 65 72 20 69 73 20 74 68 65 the user is the
a550: 0a 09 20 2a 20 66 69 6c 65 20 6f 77 6e 65 72 20 .. * file owner
a560: 74 68 65 6e 20 74 68 65 20 61 74 74 72 69 62 20 then the attrib
a570: 63 68 65 63 6b 73 20 61 62 6f 76 65 20 61 72 65 checks above are
a580: 20 63 6f 72 72 65 63 74 20 28 61 73 20 66 61 72 correct (as far
a590: 20 61 73 20 74 68 65 79 0a 09 20 2a 20 67 6f 29 as they.. * go)
a5a0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 28 21 47 65 74 ... */...if(!Get
a5b0: 53 65 63 75 72 69 74 79 44 65 73 63 72 69 70 74 SecurityDescript
a5c0: 6f 72 4f 77 6e 65 72 28 73 64 50 74 72 2c 26 70 orOwner(sdPtr,&p
a5d0: 53 69 64 2c 26 53 69 64 44 65 66 61 75 6c 74 65 Sid,&SidDefaulte
a5e0: 64 29 20 7c 7c 0a 09 20 20 20 6d 65 6d 63 6d 70 d) ||.. memcmp
a5f0: 28 47 65 74 53 69 64 49 64 65 6e 74 69 66 69 65 (GetSidIdentifie
a600: 72 41 75 74 68 6f 72 69 74 79 28 70 53 69 64 29 rAuthority(pSid)
a610: 2c 26 73 61 6d 62 61 5f 75 6e 6d 61 70 70 65 64 ,&samba_unmapped
a620: 2c 0a 09 09 20 20 73 69 7a 65 6f 66 28 53 49 44 ,... sizeof(SID
a630: 5f 49 44 45 4e 54 49 46 49 45 52 5f 41 55 54 48 _IDENTIFIER_AUTH
a640: 4f 52 49 54 59 29 29 3d 3d 30 29 20 7b 0a 09 20 ORITY))==0) {..
a650: 20 20 20 48 65 61 70 46 72 65 65 28 47 65 74 50 HeapFree(GetP
a660: 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c rocessHeap(), 0,
a670: 20 73 64 50 74 72 29 3b 0a 09 20 20 20 20 72 65 sdPtr);.. re
a680: 74 75 72 6e 20 30 3b 20 2f 2a 20 41 74 74 72 69 turn 0; /* Attri
a690: 62 20 74 65 73 74 73 20 73 61 79 20 61 63 63 65 b tests say acce
a6a0: 73 73 20 61 6c 6c 6f 77 65 64 2e 20 2a 2f 0a 09 ss allowed. */..
a6b0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66 6f }.../*.. * Perfo
a6c0: 72 6d 20 73 65 63 75 72 69 74 79 20 69 6d 70 65 rm security impe
a6d0: 72 73 6f 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 rsonation of the
a6e0: 20 75 73 65 72 20 61 6e 64 20 6f 70 65 6e 20 74 user and open t
a6f0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 09 20 2a he resulting.. *
a700: 20 74 68 72 65 61 64 20 74 6f 6b 65 6e 2e 0a 09 thread token...
a710: 20 2a 2f 0a 0a 09 69 66 20 28 21 49 6d 70 65 72 */...if (!Imper
a720: 73 6f 6e 61 74 65 53 65 6c 66 28 53 65 63 75 72 sonateSelf(Secur
a730: 69 74 79 49 6d 70 65 72 73 6f 6e 61 74 69 6f 6e ityImpersonation
a740: 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 )) {.. /*..
a750: 20 20 20 2a 20 55 6e 61 62 6c 65 20 74 6f 20 70 * Unable to p
a760: 65 72 66 6f 72 6d 20 73 65 63 75 72 69 74 79 20 erform security
a770: 69 6d 70 65 72 73 6f 6e 61 74 69 6f 6e 2e 0a 09 impersonation...
a780: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 67 6f */... go
a790: 74 6f 20 61 63 63 65 73 73 45 72 72 6f 72 3b 0a to accessError;.
a7a0: 09 7d 0a 09 69 66 20 28 21 4f 70 65 6e 54 68 72 .}..if (!OpenThr
a7b0: 65 61 64 54 6f 6b 65 6e 28 47 65 74 43 75 72 72 eadToken(GetCurr
a7c0: 65 6e 74 54 68 72 65 61 64 28 29 2c 0a 09 09 54 entThread(),...T
a7d0: 4f 4b 45 4e 5f 44 55 50 4c 49 43 41 54 45 20 7c OKEN_DUPLICATE |
a7e0: 20 54 4f 4b 45 4e 5f 51 55 45 52 59 2c 20 46 41 TOKEN_QUERY, FA
a7f0: 4c 53 45 2c 20 26 68 54 6f 6b 65 6e 29 29 20 7b LSE, &hToken)) {
a800: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
a810: 20 55 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 63 Unable to get c
a820: 75 72 72 65 6e 74 20 74 68 72 65 61 64 27 73 20 urrent thread's
a830: 74 6f 6b 65 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a token... */.
a840: 0a 09 20 20 20 20 67 6f 74 6f 20 61 63 63 65 73 .. goto acces
a850: 73 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 52 65 76 sError;..}...Rev
a860: 65 72 74 54 6f 53 65 6c 66 28 29 3b 0a 0a 09 2f ertToSelf();.../
a870: 2a 0a 09 20 2a 20 53 65 74 75 70 20 64 65 73 69 *.. * Setup desi
a880: 72 65 64 41 63 63 65 73 73 20 61 63 63 6f 72 64 redAccess accord
a890: 69 6e 67 20 74 6f 20 74 68 65 20 61 63 63 65 73 ing to the acces
a8a0: 73 20 70 72 69 76 65 6c 65 67 65 73 20 77 65 20 s priveleges we
a8b0: 61 72 65 0a 09 20 2a 20 63 68 65 63 6b 69 6e 67 are.. * checking
a8c0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 6d 6f 64 ... */...if (mod
a8d0: 65 20 26 20 52 5f 4f 4b 29 20 7b 0a 09 20 20 20 e & R_OK) {..
a8e0: 20 64 65 73 69 72 65 64 41 63 63 65 73 73 20 7c desiredAccess |
a8f0: 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 52 = FILE_GENERIC_R
a900: 45 41 44 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 EAD;..}..if (mod
a910: 65 20 26 20 57 5f 4f 4b 29 20 7b 0a 09 20 20 20 e & W_OK) {..
a920: 20 64 65 73 69 72 65 64 41 63 63 65 73 73 20 7c desiredAccess |
a930: 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 57 = FILE_GENERIC_W
a940: 52 49 54 45 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f RITE;..}..if (mo
a950: 64 65 20 26 20 58 5f 4f 4b 29 20 7b 0a 09 20 20 de & X_OK) {..
a960: 20 20 64 65 73 69 72 65 64 41 63 63 65 73 73 20 desiredAccess
a970: 7c 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f |= FILE_GENERIC_
a980: 45 58 45 43 55 54 45 3b 0a 09 7d 0a 0a 09 6d 65 EXECUTE;..}...me
a990: 6d 73 65 74 28 26 67 65 6e 4d 61 70 2c 20 30 78 mset(&genMap, 0x
a9a0: 30 2c 20 73 69 7a 65 6f 66 28 47 45 4e 45 52 49 0, sizeof(GENERI
a9b0: 43 5f 4d 41 50 50 49 4e 47 29 29 3b 0a 09 67 65 C_MAPPING));..ge
a9c0: 6e 4d 61 70 2e 47 65 6e 65 72 69 63 52 65 61 64 nMap.GenericRead
a9d0: 20 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f = FILE_GENERIC_
a9e0: 52 45 41 44 3b 0a 09 67 65 6e 4d 61 70 2e 47 65 READ;..genMap.Ge
a9f0: 6e 65 72 69 63 57 72 69 74 65 20 3d 20 46 49 4c nericWrite = FIL
aa00: 45 5f 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b E_GENERIC_WRITE;
aa10: 0a 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72 69 63 ..genMap.Generic
aa20: 45 78 65 63 75 74 65 20 3d 20 46 49 4c 45 5f 47 Execute = FILE_G
aa30: 45 4e 45 52 49 43 5f 45 58 45 43 55 54 45 3b 0a ENERIC_EXECUTE;.
aa40: 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72 69 63 41 .genMap.GenericA
aa50: 6c 6c 20 3d 20 46 49 4c 45 5f 41 4c 4c 5f 41 43 ll = FILE_ALL_AC
aa60: 43 45 53 53 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 50 CESS;.../*.. * P
aa70: 65 72 66 6f 72 6d 20 61 63 63 65 73 73 20 63 68 erform access ch
aa80: 65 63 6b 20 75 73 69 6e 67 20 74 68 65 20 74 6f eck using the to
aa90: 6b 65 6e 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 ken... */...if (
aaa0: 21 41 63 63 65 73 73 43 68 65 63 6b 28 73 64 50 !AccessCheck(sdP
aab0: 74 72 2c 20 68 54 6f 6b 65 6e 2c 20 64 65 73 69 tr, hToken, desi
aac0: 72 65 64 41 63 63 65 73 73 2c 0a 09 09 26 67 65 redAccess,...&ge
aad0: 6e 4d 61 70 2c 20 26 70 72 69 76 53 65 74 2c 20 nMap, &privSet,
aae0: 26 70 72 69 76 53 65 74 53 69 7a 65 2c 20 26 67 &privSetSize, &g
aaf0: 72 61 6e 74 65 64 41 63 63 65 73 73 2c 0a 09 09 rantedAccess,...
ab00: 26 61 63 63 65 73 73 59 65 73 4e 6f 29 29 20 7b &accessYesNo)) {
ab10: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
ab20: 20 55 6e 61 62 6c 65 20 74 6f 20 70 65 72 66 6f Unable to perfo
ab30: 72 6d 20 61 63 63 65 73 73 20 63 68 65 63 6b 2e rm access check.
ab40: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 61 63 63 65 .. */...acce
ab50: 73 73 45 72 72 6f 72 3a 0a 09 20 20 20 20 54 63 ssError:.. Tc
ab60: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 lWinConvertError
ab70: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 (GetLastError())
ab80: 3b 0a 09 20 20 20 20 69 66 20 28 73 64 50 74 72 ;.. if (sdPtr
ab90: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 48 65 != NULL) {...He
aba0: 61 70 46 72 65 65 28 47 65 74 50 72 6f 63 65 73 apFree(GetProces
abb0: 73 48 65 61 70 28 29 2c 20 30 2c 20 73 64 50 74 sHeap(), 0, sdPt
abc0: 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 r);.. }..
abd0: 69 66 20 28 68 54 6f 6b 65 6e 20 21 3d 20 4e 55 if (hToken != NU
abe0: 4c 4c 29 20 7b 0a 09 09 43 6c 6f 73 65 48 61 6e LL) {...CloseHan
abf0: 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 20 20 dle(hToken);..
ac00: 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e 20 }.. return
ac10: 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 -1;..}.../*.. *
ac20: 43 6c 65 61 6e 20 75 70 2e 0a 09 20 2a 2f 0a 0a Clean up... */..
ac30: 09 48 65 61 70 46 72 65 65 28 47 65 74 50 72 6f .HeapFree(GetPro
ac40: 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 73 cessHeap(), 0, s
ac50: 64 50 74 72 29 3b 0a 09 43 6c 6f 73 65 48 61 6e dPtr);..CloseHan
ac60: 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 69 66 dle(hToken);..if
ac70: 20 28 21 61 63 63 65 73 73 59 65 73 4e 6f 29 20 (!accessYesNo)
ac80: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 {.. Tcl_SetEr
ac90: 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a 09 20 20 rno(EACCES);..
aca0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a return -1;..}.
acb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a . }.#endif /*
acc0: 20 21 55 4e 49 43 4f 44 45 20 2a 2f 0a 20 20 20 !UNICODE */.
acd0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
ace0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
acf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
ad30: 20 4e 61 74 69 76 65 49 73 45 78 65 63 20 2d 2d NativeIsExec --
ad40: 0a 20 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e 65 . *. *.Determine
ad50: 73 20 69 66 20 61 20 70 61 74 68 20 69 73 20 65 s if a path is e
ad60: 78 65 63 75 74 61 62 6c 65 2e 20 4f 6e 20 77 69 xecutable. On wi
ad70: 6e 64 6f 77 73 20 74 68 69 73 20 69 73 20 73 69 ndows this is si
ad80: 6d 70 6c 79 20 64 65 66 69 6e 65 64 0a 20 2a 09 mply defined. *.
ad90: 62 79 20 77 68 65 74 68 65 72 20 74 68 65 20 70 by whether the p
ada0: 61 74 68 20 65 6e 64 73 20 69 6e 20 61 6e 79 20 ath ends in any
adb0: 6f 66 20 22 2e 65 78 65 22 2c 20 22 2e 63 6f 6d of ".exe", ".com
adc0: 22 2c 20 6f 72 20 22 2e 62 61 74 22 0a 20 2a 0a ", or ".bat". *.
add0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 31 * Results:. *.1
ade0: 20 3d 20 65 78 65 63 75 74 61 62 6c 65 2c 20 30 = executable, 0
adf0: 20 3d 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d = not.. *. *---
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ae40: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
ae50: 69 6e 74 0a 4e 61 74 69 76 65 49 73 45 78 65 63 int.NativeIsExec
ae60: 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 (. const TCHA
ae70: 52 20 2a 70 61 74 68 29 0a 7b 0a 20 20 20 20 69 R *path).{. i
ae80: 6e 74 20 6c 65 6e 20 3d 20 5f 74 63 73 6c 65 6e nt len = _tcslen
ae90: 28 70 61 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 (path);.. if
aea0: 28 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 72 65 74 (len < 5) {..ret
aeb0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
aec0: 20 20 69 66 20 28 70 61 74 68 5b 6c 65 6e 2d 34 if (path[len-4
aed0: 5d 20 21 3d 20 27 2e 27 29 20 7b 0a 09 72 65 74 ] != '.') {..ret
aee0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
aef0: 20 20 69 66 20 28 28 5f 74 63 73 69 63 6d 70 28 if ((_tcsicmp(
af00: 70 61 74 68 2b 6c 65 6e 2d 33 2c 20 54 45 58 54 path+len-3, TEXT
af10: 28 22 65 78 65 22 29 29 20 3d 3d 20 30 29 0a 09 ("exe")) == 0)..
af20: 20 20 20 20 7c 7c 20 28 5f 74 63 73 69 63 6d 70 || (_tcsicmp
af30: 28 70 61 74 68 2b 6c 65 6e 2d 33 2c 20 54 45 58 (path+len-3, TEX
af40: 54 28 22 63 6f 6d 22 29 29 20 3d 3d 20 30 29 0a T("com")) == 0).
af50: 09 20 20 20 20 7c 7c 20 28 5f 74 63 73 69 63 6d . || (_tcsicm
af60: 70 28 70 61 74 68 2b 6c 65 6e 2d 33 2c 20 54 45 p(path+len-3, TE
af70: 58 54 28 22 62 61 74 22 29 29 20 3d 3d 20 30 29 XT("bat")) == 0)
af80: 29 20 7b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 ) {..return 1;.
af90: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
afa0: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
afb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
afe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aff0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 62 6a --. *. * TclpObj
b000: 43 68 64 69 72 20 2d 2d 0a 20 2a 0a 20 2a 09 54 Chdir --. *. *.T
b010: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 his function rep
b020: 6c 61 63 65 73 20 74 68 65 20 6c 69 62 72 61 72 laces the librar
b030: 79 20 76 65 72 73 69 6f 6e 20 6f 66 20 63 68 64 y version of chd
b040: 69 72 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 ir().. *. * Resu
b050: 6c 74 73 3a 0a 20 2a 09 53 65 65 20 63 68 64 69 lts:. *.See chdi
b060: 72 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f r() documentatio
b070: 6e 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 n.. *. * Side ef
b080: 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 63 68 fects:. *.See ch
b090: 64 69 72 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 dir() documentat
b0a0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ion.. *. *------
b0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0f0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 . */..int.TclpOb
b100: 6a 43 68 64 69 72 28 0a 20 20 20 20 54 63 6c 5f jChdir(. Tcl_
b110: 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 09 2f 2a Obj *pathPtr)./*
b120: 20 50 61 74 68 20 74 6f 20 6e 65 77 20 77 6f 72 Path to new wor
b130: 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 20 king directory.
b140: 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 */.{. int res
b150: 75 6c 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 54 ult;. const T
b160: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 CHAR *nativePath
b170: 3b 0a 0a 20 20 20 20 6e 61 74 69 76 65 50 61 74 ;.. nativePat
b180: 68 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 h = Tcl_FSGetNat
b190: 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 29 ivePath(pathPtr)
b1a0: 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 ;.. result =
b1b0: 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 SetCurrentDirect
b1c0: 6f 72 79 28 6e 61 74 69 76 65 50 61 74 68 29 3b ory(nativePath);
b1d0: 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 .. if (result
b1e0: 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 57 69 6e == 0) {..TclWin
b1f0: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 ConvertError(Get
b200: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72 LastError());..r
b210: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a eturn -1;. }.
b220: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
b230: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
b280: 0a 20 2a 20 54 63 6c 70 47 65 74 43 77 64 20 2d . * TclpGetCwd -
b290: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
b2a0: 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 ction replaces t
b2b0: 68 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 he library versi
b2c0: 6f 6e 20 6f 66 20 67 65 74 63 77 64 28 29 2e 20 on of getcwd().
b2d0: 28 4f 62 73 6f 6c 65 74 65 0a 20 2a 09 66 75 6e (Obsolete. *.fun
b2e0: 63 74 69 6f 6e 2c 20 6f 6e 6c 79 20 72 65 74 61 ction, only reta
b2f0: 69 6e 65 64 20 66 6f 72 20 6f 6c 64 20 65 78 74 ined for old ext
b300: 65 6e 73 69 6f 6e 73 20 77 68 69 63 68 20 6d 61 ensions which ma
b310: 79 20 63 61 6c 6c 20 69 74 0a 20 2a 09 64 69 72 y call it. *.dir
b320: 65 63 74 6c 79 29 2e 0a 20 2a 0a 20 2a 20 52 65 ectly).. *. * Re
b330: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 sults:. *.The re
b340: 73 75 6c 74 20 69 73 20 61 20 70 6f 69 6e 74 65 sult is a pointe
b350: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 73 70 r to a string sp
b360: 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72 ecifying the cur
b370: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 0a rent directory,.
b380: 20 2a 09 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 *.or NULL if th
b390: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 e current direct
b3a0: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 ory could not be
b3b0: 20 64 65 74 65 72 6d 69 6e 65 64 2e 20 49 66 20 determined. If
b3c0: 4e 55 4c 4c 20 69 73 0a 20 2a 09 72 65 74 75 72 NULL is. *.retur
b3d0: 6e 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 ned, an error me
b3e0: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e ssage is left in
b3f0: 20 74 68 65 20 69 6e 74 65 72 70 27 73 20 72 65 the interp's re
b400: 73 75 6c 74 2e 20 53 74 6f 72 61 67 65 20 66 6f sult. Storage fo
b410: 72 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74 20 r. *.the result
b420: 73 74 72 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 string is alloca
b430: 74 65 64 20 69 6e 20 62 75 66 66 65 72 50 74 72 ted in bufferPtr
b440: 3b 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 ; the caller mus
b450: 74 20 63 61 6c 6c 0a 20 2a 09 54 63 6c 5f 44 53 t call. *.Tcl_DS
b460: 74 72 69 6e 67 46 72 65 65 28 29 20 77 68 65 6e tringFree() when
b470: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e the result is n
b480: 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e o longer needed.
b490: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
b4a0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a cts:. *.None.. *
b4b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
b4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 ---------. */..c
b500: 6f 6e 73 74 20 63 68 61 72 20 2a 0a 54 63 6c 70 onst char *.Tclp
b510: 47 65 74 43 77 64 28 0a 20 20 20 20 54 63 6c 5f GetCwd(. Tcl_
b520: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 Interp *interp,.
b530: 09 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c ./* If non-NULL,
b540: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 used for error
b550: 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 reporting. */.
b560: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 62 Tcl_DString *b
b570: 75 66 66 65 72 50 74 72 29 09 2f 2a 20 55 6e 69 ufferPtr)./* Uni
b580: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 66 72 nitialized or fr
b590: 65 65 20 44 53 74 72 69 6e 67 20 66 69 6c 6c 65 ee DString fille
b5a0: 64 20 77 69 74 68 0a 09 09 09 09 20 2a 20 6e 61 d with..... * na
b5b0: 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 64 69 me of current di
b5c0: 72 65 63 74 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 rectory. */.{.
b5d0: 20 20 54 43 48 41 52 20 62 75 66 66 65 72 5b 4d TCHAR buffer[M
b5e0: 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 63 68 AX_PATH];. ch
b5f0: 61 72 20 2a 70 3b 0a 20 20 20 20 57 43 48 41 52 ar *p;. WCHAR
b600: 20 2a 6e 61 74 69 76 65 3b 0a 0a 20 20 20 20 69 *native;.. i
b610: 66 20 28 47 65 74 43 75 72 72 65 6e 74 44 69 72 f (GetCurrentDir
b620: 65 63 74 6f 72 79 28 4d 41 58 5f 50 41 54 48 2c ectory(MAX_PATH,
b630: 20 62 75 66 66 65 72 29 20 3d 3d 20 30 29 20 7b buffer) == 0) {
b640: 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 ..TclWinConvertE
b650: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f rror(GetLastErro
b660: 72 28 29 29 3b 0a 09 69 66 20 28 69 6e 74 65 72 r());..if (inter
b670: 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 p != NULL) {..
b680: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
b690: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
b6a0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 bjPrintf(...
b6b0: 22 65 72 72 6f 72 20 67 65 74 74 69 6e 67 20 77 "error getting w
b6c0: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 orking directory
b6d0: 20 6e 61 6d 65 3a 20 25 73 22 2c 0a 09 09 20 20 name: %s",...
b6e0: 20 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 Tcl_PosixError
b6f0: 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a 09 (interp)));..}..
b700: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
b710: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
b720: 2a 20 57 61 74 63 68 20 66 6f 72 20 74 68 65 20 * Watch for the
b730: 77 65 69 72 64 20 57 69 6e 64 6f 77 73 20 63 3a weird Windows c:
b740: 5c 5c 55 4e 43 20 73 79 6e 74 61 78 2e 0a 20 20 \\UNC syntax..
b750: 20 20 20 2a 2f 0a 0a 20 20 20 20 6e 61 74 69 76 */.. nativ
b760: 65 20 3d 20 28 57 43 48 41 52 20 2a 29 20 62 75 e = (WCHAR *) bu
b770: 66 66 65 72 3b 0a 20 20 20 20 69 66 20 28 28 6e ffer;. if ((n
b780: 61 74 69 76 65 5b 30 5d 20 21 3d 20 27 5c 30 27 ative[0] != '\0'
b790: 29 20 26 26 20 28 6e 61 74 69 76 65 5b 31 5d 20 ) && (native[1]
b7a0: 3d 3d 20 27 3a 27 29 0a 09 20 20 20 20 26 26 20 == ':').. &&
b7b0: 28 6e 61 74 69 76 65 5b 32 5d 20 3d 3d 20 27 5c (native[2] == '\
b7c0: 5c 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b 33 \') && (native[3
b7d0: 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 6e ] == '\\')) {..n
b7e0: 61 74 69 76 65 20 2b 3d 20 32 3b 0a 20 20 20 20 ative += 2;.
b7f0: 7d 0a 20 20 20 20 54 63 6c 5f 57 69 6e 54 43 68 }. Tcl_WinTCh
b800: 61 72 54 6f 55 74 66 28 28 54 43 48 41 52 20 2a arToUtf((TCHAR *
b810: 29 20 6e 61 74 69 76 65 2c 20 2d 31 2c 20 62 75 ) native, -1, bu
b820: 66 66 65 72 50 74 72 29 3b 0a 0a 20 20 20 20 2f fferPtr);.. /
b830: 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65 72 74 *. * Convert
b840: 20 74 6f 20 66 6f 72 77 61 72 64 20 73 6c 61 73 to forward slas
b850: 68 65 73 20 66 6f 72 20 65 61 73 69 65 72 20 75 hes for easier u
b860: 73 65 20 69 6e 20 73 63 72 69 70 74 73 2e 0a 20 se in scripts..
b870: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 */.. for
b880: 28 70 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 (p = Tcl_DString
b890: 56 61 6c 75 65 28 62 75 66 66 65 72 50 74 72 29 Value(bufferPtr)
b8a0: 3b 20 2a 70 20 21 3d 20 27 5c 30 27 3b 20 70 2b ; *p != '\0'; p+
b8b0: 2b 29 20 7b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 +) {..if (*p ==
b8c0: 27 5c 5c 27 29 20 7b 0a 09 20 20 20 20 2a 70 20 '\\') {.. *p
b8d0: 3d 20 27 2f 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a = '/';..}. }.
b8e0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 44 return Tcl_D
b8f0: 53 74 72 69 6e 67 56 61 6c 75 65 28 62 75 66 66 StringValue(buff
b900: 65 72 50 74 72 29 3b 0a 7d 0a 0c 0a 69 6e 74 0a erPtr);.}...int.
b910: 54 63 6c 70 4f 62 6a 53 74 61 74 28 0a 20 20 20 TclpObjStat(.
b920: 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 Tcl_Obj *pathPt
b930: 72 2c 09 09 2f 2a 20 50 61 74 68 20 6f 66 20 66 r,../* Path of f
b940: 69 6c 65 20 74 6f 20 73 74 61 74 2e 20 2a 2f 0a ile to stat. */.
b950: 20 20 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 Tcl_StatBuf
b960: 2a 73 74 61 74 50 74 72 29 09 2f 2a 20 46 69 6c *statPtr)./* Fil
b970: 6c 65 64 20 77 69 74 68 20 72 65 73 75 6c 74 73 led with results
b980: 20 6f 66 20 73 74 61 74 20 63 61 6c 6c 2e 20 2a of stat call. *
b990: 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 /.{. /*.
b9a0: 2a 20 45 6e 73 75 72 65 20 63 6f 72 72 65 63 74 * Ensure correct
b9b0: 20 66 69 6c 65 20 73 69 7a 65 73 20 62 79 20 66 file sizes by f
b9c0: 6f 72 63 69 6e 67 20 74 68 65 20 4f 53 20 74 6f orcing the OS to
b9d0: 20 77 72 69 74 65 20 61 6e 79 20 70 65 6e 64 69 write any pendi
b9e0: 6e 67 20 64 61 74 61 0a 20 20 20 20 20 2a 20 74 ng data. * t
b9f0: 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 o disk. This is
ba00: 64 6f 6e 65 20 6f 6e 6c 79 20 66 6f 72 20 63 68 done only for ch
ba10: 61 6e 6e 65 6c 73 20 77 68 69 63 68 20 61 72 65 annels which are
ba20: 20 64 69 72 74 79 2c 20 69 2e 65 2e 20 68 61 76 dirty, i.e. hav
ba30: 65 20 62 65 65 6e 0a 20 20 20 20 20 2a 20 77 72 e been. * wr
ba40: 69 74 74 65 6e 20 74 6f 20 73 69 6e 63 65 20 74 itten to since t
ba50: 68 65 20 6c 61 73 74 20 66 6c 75 73 68 20 68 65 he last flush he
ba60: 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 re.. */..
ba70: 20 54 63 6c 57 69 6e 46 6c 75 73 68 44 69 72 74 TclWinFlushDirt
ba80: 79 43 68 61 6e 6e 65 6c 73 28 29 3b 0a 0a 20 20 yChannels();..
ba90: 20 20 72 65 74 75 72 6e 20 4e 61 74 69 76 65 53 return NativeS
baa0: 74 61 74 28 54 63 6c 5f 46 53 47 65 74 4e 61 74 tat(Tcl_FSGetNat
bab0: 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 29 ivePath(pathPtr)
bac0: 2c 20 73 74 61 74 50 74 72 2c 20 30 29 3b 0a 7d , statPtr, 0);.}
bad0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
bae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
baf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
bb20: 2a 0a 20 2a 20 4e 61 74 69 76 65 53 74 61 74 20 *. * NativeStat
bb30: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
bb40: 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 nction replaces
bb50: 74 68 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 the library vers
bb60: 69 6f 6e 20 6f 66 20 73 74 61 74 28 29 2c 20 66 ion of stat(), f
bb70: 69 78 69 6e 67 20 74 68 65 0a 20 2a 09 66 6f 6c ixing the. *.fol
bb80: 6c 6f 77 69 6e 67 20 62 75 67 73 3a 0a 20 2a 0a lowing bugs:. *.
bb90: 20 2a 09 31 2e 20 73 74 61 74 28 22 63 3a 22 29 *.1. stat("c:")
bba0: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f returns an erro
bbb0: 72 2e 0a 20 2a 09 32 2e 20 42 6f 72 6c 61 6e 64 r.. *.2. Borland
bbc0: 20 73 74 61 74 28 29 20 72 65 74 75 72 6e 20 74 stat() return t
bbd0: 69 6d 65 20 69 6e 20 47 4d 54 20 69 6e 73 74 65 ime in GMT inste
bbe0: 61 64 20 6f 66 20 6c 6f 63 61 6c 74 69 6d 65 2e ad of localtime.
bbf0: 0a 20 2a 09 33 2e 20 73 74 61 74 28 22 5c 5c 73 . *.3. stat("\\s
bc00: 65 72 76 65 72 5c 6d 6f 75 6e 74 22 29 20 77 6f erver\mount") wo
bc10: 75 6c 64 20 72 65 74 75 72 6e 20 65 72 72 6f 72 uld return error
bc20: 2e 0a 20 2a 09 34 2e 20 41 63 63 65 70 74 73 20 .. *.4. Accepts
bc30: 73 6c 61 73 68 65 73 20 6f 72 20 62 61 63 6b 73 slashes or backs
bc40: 6c 61 73 68 65 73 2e 0a 20 2a 09 35 2e 20 73 74 lashes.. *.5. st
bc50: 5f 64 65 76 20 61 6e 64 20 73 74 5f 72 64 65 76 _dev and st_rdev
bc60: 20 77 65 72 65 20 77 72 6f 6e 67 20 66 6f 72 20 were wrong for
bc70: 55 4e 43 20 70 61 74 68 73 2e 0a 20 2a 0a 20 2a UNC paths.. *. *
bc80: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 65 65 Results:. *.See
bc90: 20 73 74 61 74 20 64 6f 63 75 6d 65 6e 74 61 74 stat documentat
bca0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ion.. *. * Side
bcb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 effects:. *.See
bcc0: 73 74 61 74 20 64 6f 63 75 6d 65 6e 74 61 74 69 stat documentati
bcd0: 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d on.. *. *-------
bce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
bd20: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
bd30: 4e 61 74 69 76 65 53 74 61 74 28 0a 20 20 20 20 NativeStat(.
bd40: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 74 const TCHAR *nat
bd50: 69 76 65 50 61 74 68 2c 09 2f 2a 20 50 61 74 68 ivePath,./* Path
bd60: 20 6f 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74 of file to stat
bd70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 74 61 74 */. Tcl_Stat
bd80: 42 75 66 20 2a 73 74 61 74 50 74 72 2c 09 2f 2a Buf *statPtr,./*
bd90: 20 46 69 6c 6c 65 64 20 77 69 74 68 20 72 65 73 Filled with res
bda0: 75 6c 74 73 20 6f 66 20 73 74 61 74 20 63 61 6c ults of stat cal
bdb0: 6c 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68 l. */. int ch
bdc0: 65 63 6b 4c 69 6e 6b 73 29 09 09 2f 2a 20 49 66 eckLinks)../* If
bdd0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 65 68 61 76 non-zero, behav
bde0: 65 20 6c 69 6b 65 20 27 6c 73 74 61 74 27 20 2a e like 'lstat' *
bdf0: 2f 0a 7b 0a 20 20 20 20 44 57 4f 52 44 20 61 74 /.{. DWORD at
be00: 74 72 3b 0a 20 20 20 20 69 6e 74 20 64 65 76 2c tr;. int dev,
be10: 20 6e 6c 69 6e 6b 20 3d 20 31 3b 0a 20 20 20 20 nlink = 1;.
be20: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 6d unsigned short m
be30: 6f 64 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ode;. unsigne
be40: 64 20 69 6e 74 20 69 6e 6f 64 65 20 3d 20 30 3b d int inode = 0;
be50: 0a 20 20 20 20 48 41 4e 44 4c 45 20 66 69 6c 65 . HANDLE file
be60: 48 61 6e 64 6c 65 3b 0a 0a 20 20 20 20 2f 2a 0a Handle;.. /*.
be70: 20 20 20 20 20 2a 20 49 66 20 77 65 20 63 61 6e * If we can
be80: 20 75 73 65 20 27 63 72 65 61 74 65 46 69 6c 65 use 'createFile
be90: 27 20 6f 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 ' on this, then
bea0: 77 65 20 63 61 6e 20 75 73 65 20 74 68 65 20 72 we can use the r
beb0: 65 73 75 6c 74 69 6e 67 0a 20 20 20 20 20 2a 20 esulting. *
bec0: 66 69 6c 65 48 61 6e 64 6c 65 20 74 6f 20 72 65 fileHandle to re
bed0: 61 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 ad more informat
bee0: 69 6f 6e 20 28 6e 6c 69 6e 6b 2c 20 69 6e 6f 29 ion (nlink, ino)
bef0: 20 74 68 61 6e 20 77 65 20 63 61 6e 20 67 65 74 than we can get
bf00: 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 6f 74 68 from. * oth
bf10: 65 72 20 61 74 74 72 69 62 75 74 65 73 20 72 65 er attributes re
bf20: 61 64 69 6e 67 20 41 50 49 73 2e 20 49 66 20 6e ading APIs. If n
bf30: 6f 74 2c 20 74 68 65 6e 20 77 65 20 74 72 79 20 ot, then we try
bf40: 74 6f 20 66 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 to fall back on
bf50: 74 68 65 0a 20 20 20 20 20 2a 20 27 67 65 74 46 the. * 'getF
bf60: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 50 ileAttributesExP
bf70: 72 6f 63 27 2c 20 61 6e 64 20 69 66 20 74 68 61 roc', and if tha
bf80: 74 20 69 73 6e 27 74 20 61 76 61 69 6c 61 62 6c t isn't availabl
bf90: 65 2c 20 74 68 65 6e 20 6f 6e 20 65 76 65 6e 0a e, then on even.
bfa0: 20 20 20 20 20 2a 20 73 69 6d 70 6c 65 72 20 72 * simpler r
bfb0: 6f 75 74 69 6e 65 73 2e 0a 20 20 20 20 20 2a 2f outines.. */
bfc0: 0a 0a 20 20 20 20 66 69 6c 65 48 61 6e 64 6c 65 .. fileHandle
bfd0: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 6e 61 = CreateFile(na
bfe0: 74 69 76 65 50 61 74 68 2c 20 47 45 4e 45 52 49 tivePath, GENERI
bff0: 43 5f 52 45 41 44 2c 0a 09 20 20 20 20 46 49 4c C_READ,.. FIL
c000: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 E_SHARE_READ | F
c010: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c ILE_SHARE_WRITE,
c020: 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 NULL, OPEN_EXIS
c030: 54 49 4e 47 2c 0a 09 20 20 20 20 46 49 4c 45 5f TING,.. FILE_
c040: 46 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 FLAG_BACKUP_SEMA
c050: 4e 54 49 43 53 20 7c 20 46 49 4c 45 5f 46 4c 41 NTICS | FILE_FLA
c060: 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f 50 G_OPEN_REPARSE_P
c070: 4f 49 4e 54 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 OINT, NULL);..
c080: 20 20 69 66 20 28 66 69 6c 65 48 61 6e 64 6c 65 if (fileHandle
c090: 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 != INVALID_HAND
c0a0: 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 42 59 5f LE_VALUE) {..BY_
c0b0: 48 41 4e 44 4c 45 5f 46 49 4c 45 5f 49 4e 46 4f HANDLE_FILE_INFO
c0c0: 52 4d 41 54 49 4f 4e 20 64 61 74 61 3b 0a 0a 09 RMATION data;...
c0d0: 69 66 20 28 47 65 74 46 69 6c 65 49 6e 66 6f 72 if (GetFileInfor
c0e0: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 28 66 mationByHandle(f
c0f0: 69 6c 65 48 61 6e 64 6c 65 2c 26 64 61 74 61 29 ileHandle,&data)
c100: 20 21 3d 20 54 52 55 45 29 20 7b 0a 09 20 20 20 != TRUE) {..
c110: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 66 69 6c CloseHandle(fil
c120: 65 48 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20 54 eHandle);.. T
c130: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f 45 cl_SetErrno(ENOE
c140: 4e 54 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e NT);.. return
c150: 20 2d 31 3b 0a 09 7d 0a 09 43 6c 6f 73 65 48 61 -1;..}..CloseHa
c160: 6e 64 6c 65 28 66 69 6c 65 48 61 6e 64 6c 65 29 ndle(fileHandle)
c170: 3b 0a 0a 09 61 74 74 72 20 3d 20 64 61 74 61 2e ;...attr = data.
c180: 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 dwFileAttributes
c190: 3b 0a 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f ;...statPtr->st_
c1a0: 73 69 7a 65 20 3d 20 28 28 54 63 6c 5f 57 69 64 size = ((Tcl_Wid
c1b0: 65 49 6e 74 29 20 64 61 74 61 2e 6e 46 69 6c 65 eInt) data.nFile
c1c0: 53 69 7a 65 4c 6f 77 29 20 7c 0a 09 09 28 28 28 SizeLow) |...(((
c1d0: 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 64 61 74 Tcl_WideInt) dat
c1e0: 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 29 a.nFileSizeHigh)
c1f0: 20 3c 3c 20 33 32 29 3b 0a 09 73 74 61 74 50 74 << 32);..statPt
c200: 72 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20 54 6f r->st_atime = To
c210: 43 54 69 6d 65 28 64 61 74 61 2e 66 74 4c 61 73 CTime(data.ftLas
c220: 74 41 63 63 65 73 73 54 69 6d 65 29 3b 0a 09 73 tAccessTime);..s
c230: 74 61 74 50 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 tatPtr->st_mtime
c240: 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e = ToCTime(data.
c250: 66 74 4c 61 73 74 57 72 69 74 65 54 69 6d 65 29 ftLastWriteTime)
c260: 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 63 ;..statPtr->st_c
c270: 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28 64 time = ToCTime(d
c280: 61 74 61 2e 66 74 43 72 65 61 74 69 6f 6e 54 69 ata.ftCreationTi
c290: 6d 65 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4f 6e me);.../*.. * On
c2a0: 20 55 6e 69 78 2c 20 66 6f 72 20 64 69 72 65 63 Unix, for direc
c2b0: 74 6f 72 69 65 73 2c 20 6e 6c 69 6e 6b 20 61 70 tories, nlink ap
c2c0: 70 61 72 65 6e 74 6c 79 20 64 65 70 65 6e 64 73 parently depends
c2d0: 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f on the number o
c2e0: 66 0a 09 20 2a 20 66 69 6c 65 73 20 69 6e 20 74 f.. * files in t
c2f0: 68 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 57 he directory. W
c300: 65 20 63 6f 75 6c 64 20 63 61 6c 63 75 6c 61 74 e could calculat
c310: 65 20 74 68 61 74 2c 20 62 75 74 20 69 74 20 77 e that, but it w
c320: 6f 75 6c 64 20 62 65 20 61 0a 09 20 2a 20 62 69 ould be a.. * bi
c330: 74 20 6f 66 20 61 20 70 65 72 66 6f 72 6d 61 6e t of a performan
c340: 63 65 20 70 65 6e 61 6c 74 79 2c 20 49 20 74 68 ce penalty, I th
c350: 69 6e 6b 2e 20 48 65 6e 63 65 20 77 65 20 6a 75 ink. Hence we ju
c360: 73 74 20 75 73 65 20 77 68 61 74 0a 09 20 2a 20 st use what.. *
c370: 57 69 6e 64 6f 77 73 20 67 69 76 65 73 20 75 73 Windows gives us
c380: 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 , which is the s
c390: 61 6d 65 20 61 73 20 55 6e 69 78 20 66 6f 72 20 ame as Unix for
c3a0: 66 69 6c 65 73 2c 20 61 74 20 6c 65 61 73 74 2e files, at least.
c3b0: 0a 09 20 2a 2f 0a 0a 09 6e 6c 69 6e 6b 20 3d 20 .. */...nlink =
c3c0: 64 61 74 61 2e 6e 4e 75 6d 62 65 72 4f 66 4c 69 data.nNumberOfLi
c3d0: 6e 6b 73 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 55 6e nks;.../*.. * Un
c3e0: 66 6f 72 74 75 6e 61 74 65 6c 79 20 6f 75 72 20 fortunately our
c3f0: 73 74 61 74 20 64 65 66 69 6e 69 74 69 6f 6e 27 stat definition'
c400: 73 20 69 6e 6f 64 65 20 66 69 65 6c 64 20 28 75 s inode field (u
c410: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 29 0a 09 nsigned short)..
c420: 20 2a 20 77 69 6c 6c 20 74 68 72 6f 77 20 61 77 * will throw aw
c430: 61 79 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 70 ay most of the p
c440: 72 65 63 69 73 69 6f 6e 20 77 65 20 68 61 76 65 recision we have
c450: 20 68 65 72 65 2c 20 77 68 69 63 68 20 6d 65 61 here, which mea
c460: 6e 73 20 77 65 0a 09 20 2a 20 63 61 6e 27 74 20 ns we.. * can't
c470: 72 65 6c 79 20 6f 6e 20 69 6e 6f 64 65 20 61 73 rely on inode as
c480: 20 61 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 a unique identi
c490: 66 69 65 72 20 6f 66 20 61 20 66 69 6c 65 2e 20 fier of a file.
c4a0: 57 65 27 64 20 72 65 61 6c 6c 79 0a 09 20 2a 20 We'd really.. *
c4b0: 6c 69 6b 65 20 74 6f 20 64 6f 20 73 6f 6d 65 74 like to do somet
c4c0: 68 69 6e 67 20 6c 69 6b 65 20 68 6f 77 20 77 65 hing like how we
c4d0: 20 68 61 6e 64 6c 65 20 27 73 74 5f 73 69 7a 65 handle 'st_size
c4e0: 27 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 6f 64 65 20 '... */...inode
c4f0: 3d 20 64 61 74 61 2e 6e 46 69 6c 65 49 6e 64 65 = data.nFileInde
c500: 78 48 69 67 68 20 7c 20 64 61 74 61 2e 6e 46 69 xHigh | data.nFi
c510: 6c 65 49 6e 64 65 78 4c 6f 77 3b 0a 20 20 20 20 leIndexLow;.
c520: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a } else {../*.. *
c530: 20 46 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 74 68 Fall back on th
c540: 65 20 6c 65 73 73 20 63 61 70 61 62 6c 65 20 72 e less capable r
c550: 6f 75 74 69 6e 65 73 2e 20 54 68 69 73 20 6d 65 outines. This me
c560: 61 6e 73 20 6e 6f 20 6e 6c 69 6e 6b 20 6f 72 20 ans no nlink or
c570: 69 6e 6f 2e 0a 09 20 2a 2f 0a 0a 09 57 49 4e 33 ino... */...WIN3
c580: 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 2_FILE_ATTRIBUTE
c590: 5f 44 41 54 41 20 64 61 74 61 3b 0a 0a 09 69 66 _DATA data;...if
c5a0: 20 28 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 (GetFileAttribu
c5b0: 74 65 73 45 78 28 6e 61 74 69 76 65 50 61 74 68 tesEx(nativePath
c5c0: 2c 0a 09 09 47 65 74 46 69 6c 65 45 78 49 6e 66 ,...GetFileExInf
c5d0: 6f 53 74 61 6e 64 61 72 64 2c 20 26 64 61 74 61 oStandard, &data
c5e0: 29 20 21 3d 20 54 52 55 45 29 20 7b 0a 09 20 20 ) != TRUE) {..
c5f0: 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 3b 0a HANDLE hFind;.
c600: 09 20 20 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f . WIN32_FIND_
c610: 44 41 54 41 20 66 66 64 3b 0a 09 20 20 20 20 44 DATA ffd;.. D
c620: 57 4f 52 44 20 6c 61 73 74 65 72 72 6f 72 20 3d WORD lasterror =
c630: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b GetLastError();
c640: 0a 0a 09 20 20 20 20 69 66 20 28 6c 61 73 74 65 ... if (laste
c650: 72 72 6f 72 20 21 3d 20 45 52 52 4f 52 5f 53 48 rror != ERROR_SH
c660: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 ARING_VIOLATION)
c670: 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f 6e 76 65 {...TclWinConve
c680: 72 74 45 72 72 6f 72 28 6c 61 73 74 65 72 72 6f rtError(lasterro
c690: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b r);...return -1;
c6a0: 0a 09 09 7d 0a 09 20 20 20 20 68 46 69 6e 64 20 ...}.. hFind
c6b0: 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 28 = FindFirstFile(
c6c0: 6e 61 74 69 76 65 50 61 74 68 2c 20 26 66 66 64 nativePath, &ffd
c6d0: 29 3b 0a 09 20 20 20 20 69 66 20 28 68 46 69 6e );.. if (hFin
c6e0: 64 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e d == INVALID_HAN
c6f0: 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 09 54 DLE_VALUE) {...T
c700: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
c710: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
c720: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a );...return -1;.
c730: 09 20 20 20 20 7d 0a 09 20 20 20 20 6d 65 6d 63 . }.. memc
c740: 70 79 28 26 64 61 74 61 2c 20 26 66 66 64 2c 20 py(&data, &ffd,
c750: 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 09 sizeof(data));..
c760: 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 FindClose(hF
c770: 69 6e 64 29 3b 0a 09 7d 0a 0a 09 61 74 74 72 20 ind);..}...attr
c780: 3d 20 64 61 74 61 2e 64 77 46 69 6c 65 41 74 74 = data.dwFileAtt
c790: 72 69 62 75 74 65 73 3b 0a 0a 09 73 74 61 74 50 ributes;...statP
c7a0: 74 72 2d 3e 73 74 5f 73 69 7a 65 20 3d 20 28 28 tr->st_size = ((
c7b0: 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 64 61 74 Tcl_WideInt) dat
c7c0: 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 29 20 a.nFileSizeLow)
c7d0: 7c 0a 09 09 28 28 28 54 63 6c 5f 57 69 64 65 49 |...(((Tcl_WideI
c7e0: 6e 74 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 nt) data.nFileSi
c7f0: 7a 65 48 69 67 68 29 20 3c 3c 20 33 32 29 3b 0a zeHigh) << 32);.
c800: 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 61 74 69 .statPtr->st_ati
c810: 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 me = ToCTime(dat
c820: 61 2e 66 74 4c 61 73 74 41 63 63 65 73 73 54 69 a.ftLastAccessTi
c830: 6d 65 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 me);..statPtr->s
c840: 74 5f 6d 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d t_mtime = ToCTim
c850: 65 28 64 61 74 61 2e 66 74 4c 61 73 74 57 72 69 e(data.ftLastWri
c860: 74 65 54 69 6d 65 29 3b 0a 09 73 74 61 74 50 74 teTime);..statPt
c870: 72 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20 54 6f r->st_ctime = To
c880: 43 54 69 6d 65 28 64 61 74 61 2e 66 74 43 72 65 CTime(data.ftCre
c890: 61 74 69 6f 6e 54 69 6d 65 29 3b 0a 20 20 20 20 ationTime);.
c8a0: 7d 0a 0a 20 20 20 20 64 65 76 20 3d 20 4e 61 74 }.. dev = Nat
c8b0: 69 76 65 44 65 76 28 6e 61 74 69 76 65 50 61 74 iveDev(nativePat
c8c0: 68 29 3b 0a 20 20 20 20 6d 6f 64 65 20 3d 20 4e h);. mode = N
c8d0: 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28 61 74 ativeStatMode(at
c8e0: 74 72 2c 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 20 tr, checkLinks,
c8f0: 4e 61 74 69 76 65 49 73 45 78 65 63 28 6e 61 74 NativeIsExec(nat
c900: 69 76 65 50 61 74 68 29 29 3b 0a 0a 20 20 20 20 ivePath));..
c910: 73 74 61 74 50 74 72 2d 3e 73 74 5f 64 65 76 09 statPtr->st_dev.
c920: 3d 20 28 64 65 76 5f 74 29 20 64 65 76 3b 0a 20 = (dev_t) dev;.
c930: 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 69 statPtr->st_i
c940: 6e 6f 09 3d 20 69 6e 6f 64 65 3b 0a 20 20 20 20 no.= inode;.
c950: 73 74 61 74 50 74 72 2d 3e 73 74 5f 6d 6f 64 65 statPtr->st_mode
c960: 09 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 73 74 61 .= mode;. sta
c970: 74 50 74 72 2d 3e 73 74 5f 6e 6c 69 6e 6b 09 3d tPtr->st_nlink.=
c980: 20 6e 6c 69 6e 6b 3b 0a 20 20 20 20 73 74 61 74 nlink;. stat
c990: 50 74 72 2d 3e 73 74 5f 75 69 64 09 3d 20 30 3b Ptr->st_uid.= 0;
c9a0: 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 . statPtr->st
c9b0: 5f 67 69 64 09 3d 20 30 3b 0a 20 20 20 20 73 74 _gid.= 0;. st
c9c0: 61 74 50 74 72 2d 3e 73 74 5f 72 64 65 76 09 3d atPtr->st_rdev.=
c9d0: 20 28 64 65 76 5f 74 29 20 64 65 76 3b 0a 20 20 (dev_t) dev;.
c9e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a return 0;.}...
c9f0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
ca40: 2a 20 4e 61 74 69 76 65 44 65 76 20 2d 2d 0a 20 * NativeDev --.
ca50: 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65 20 6a *. *.Calculate j
ca60: 75 73 74 20 74 68 65 20 27 73 74 5f 64 65 76 27 ust the 'st_dev'
ca70: 20 66 69 65 6c 64 20 6f 66 20 61 20 27 73 74 61 field of a 'sta
ca80: 74 27 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a t' structure.. *
ca90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
cae0: 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 tatic int.Native
caf0: 44 65 76 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 Dev(. const T
cb00: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 CHAR *nativePath
cb10: 29 09 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 6f )./* Full path o
cb20: 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74 20 2a f file to stat *
cb30: 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 64 65 76 3b /.{. int dev;
cb40: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
cb50: 20 64 73 3b 0a 20 20 20 20 54 43 48 41 52 20 6e ds;. TCHAR n
cb60: 61 74 69 76 65 46 75 6c 6c 50 61 74 68 5b 4d 41 ativeFullPath[MA
cb70: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 54 43 48 X_PATH];. TCH
cb80: 41 52 20 2a 6e 61 74 69 76 65 50 61 72 74 3b 0a AR *nativePart;.
cb90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
cba0: 66 75 6c 6c 50 61 74 68 3b 0a 0a 20 20 20 20 47 fullPath;.. G
cbb0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 28 6e etFullPathName(n
cbc0: 61 74 69 76 65 50 61 74 68 2c 20 4d 41 58 5f 50 ativePath, MAX_P
cbd0: 41 54 48 2c 20 6e 61 74 69 76 65 46 75 6c 6c 50 ATH, nativeFullP
cbe0: 61 74 68 2c 20 26 6e 61 74 69 76 65 50 61 72 74 ath, &nativePart
cbf0: 29 3b 0a 20 20 20 20 66 75 6c 6c 50 61 74 68 20 );. fullPath
cc00: 3d 20 54 63 6c 5f 57 69 6e 54 43 68 61 72 54 6f = Tcl_WinTCharTo
cc10: 55 74 66 28 6e 61 74 69 76 65 46 75 6c 6c 50 61 Utf(nativeFullPa
cc20: 74 68 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 0a 20 th, -1, &ds);..
cc30: 20 20 20 69 66 20 28 28 66 75 6c 6c 50 61 74 68 if ((fullPath
cc40: 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 26 20 [0] == '\\') &&
cc50: 28 66 75 6c 6c 50 61 74 68 5b 31 5d 20 3d 3d 20 (fullPath[1] ==
cc60: 27 5c 5c 27 29 29 20 7b 0a 09 63 6f 6e 73 74 20 '\\')) {..const
cc70: 63 68 61 72 20 2a 70 3b 0a 09 44 57 4f 52 44 20 char *p;..DWORD
cc80: 64 77 3b 0a 09 63 6f 6e 73 74 20 54 43 48 41 52 dw;..const TCHAR
cc90: 20 2a 6e 61 74 69 76 65 56 6f 6c 3b 0a 09 54 63 *nativeVol;..Tc
cca0: 6c 5f 44 53 74 72 69 6e 67 20 76 6f 6c 53 74 72 l_DString volStr
ccb0: 69 6e 67 3b 0a 0a 09 70 20 3d 20 73 74 72 63 68 ing;...p = strch
ccc0: 72 28 66 75 6c 6c 50 61 74 68 20 2b 20 32 2c 20 r(fullPath + 2,
ccd0: 27 5c 5c 27 29 3b 0a 09 70 20 3d 20 73 74 72 63 '\\');..p = strc
cce0: 68 72 28 70 20 2b 20 31 2c 20 27 5c 5c 27 29 3b hr(p + 1, '\\');
ccf0: 0a 09 69 66 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 ..if (p == NULL)
cd00: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
cd10: 20 2a 20 41 64 64 20 74 65 72 6d 69 6e 61 74 69 * Add terminati
cd20: 6e 67 20 62 61 63 6b 73 6c 61 73 68 20 74 6f 20 ng backslash to
cd30: 66 75 6c 6c 70 61 74 68 20 6f 72 20 47 65 74 56 fullpath or GetV
cd40: 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 6f 6e olumeInformation
cd50: 28 29 0a 09 20 20 20 20 20 2a 20 77 6f 6e 27 74 ().. * won't
cd60: 20 77 6f 72 6b 2e 0a 09 20 20 20 20 20 2a 2f 0a work... */.
cd70: 0a 09 20 20 20 20 66 75 6c 6c 50 61 74 68 20 3d .. fullPath =
cd80: 20 54 63 6c 44 53 74 72 69 6e 67 41 70 70 65 6e TclDStringAppen
cd90: 64 4c 69 74 65 72 61 6c 28 26 64 73 2c 20 22 5c dLiteral(&ds, "\
cda0: 5c 22 29 3b 0a 09 20 20 20 20 70 20 3d 20 66 75 \");.. p = fu
cdb0: 6c 6c 50 61 74 68 20 2b 20 54 63 6c 5f 44 53 74 llPath + Tcl_DSt
cdc0: 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 3b ringLength(&ds);
cdd0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
cde0: 70 2b 2b 3b 0a 09 7d 0a 09 6e 61 74 69 76 65 56 p++;..}..nativeV
cdf0: 6f 6c 20 3d 20 54 63 6c 5f 57 69 6e 55 74 66 54 ol = Tcl_WinUtfT
ce00: 6f 54 43 68 61 72 28 66 75 6c 6c 50 61 74 68 2c oTChar(fullPath,
ce10: 20 70 20 2d 20 66 75 6c 6c 50 61 74 68 2c 20 26 p - fullPath, &
ce20: 76 6f 6c 53 74 72 69 6e 67 29 3b 0a 09 64 77 20 volString);..dw
ce30: 3d 20 28 44 57 4f 52 44 29 20 2d 31 3b 0a 09 47 = (DWORD) -1;..G
ce40: 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 etVolumeInformat
ce50: 69 6f 6e 28 6e 61 74 69 76 65 56 6f 6c 2c 20 4e ion(nativeVol, N
ce60: 55 4c 4c 2c 20 30 2c 20 26 64 77 2c 20 4e 55 4c ULL, 0, &dw, NUL
ce70: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 L, NULL, NULL, 0
ce80: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 46 );.../*.. * GetF
ce90: 75 6c 6c 50 61 74 68 4e 61 6d 65 28 29 20 74 75 ullPathName() tu
cea0: 72 6e 73 20 73 70 65 63 69 61 6c 20 64 65 76 69 rns special devi
ceb0: 63 65 73 20 6c 69 6b 65 20 22 4e 55 4c 22 20 69 ces like "NUL" i
cec0: 6e 74 6f 20 22 5c 5c 2e 5c 4e 55 4c 22 2c 0a 09 nto "\\.\NUL",..
ced0: 20 2a 20 62 75 74 20 47 65 74 56 6f 6c 75 6d 65 * but GetVolume
cee0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 28 29 20 72 65 Information() re
cef0: 74 75 72 6e 73 20 66 61 69 6c 75 72 65 20 66 6f turns failure fo
cf00: 72 20 22 5c 5c 2e 5c 4e 55 4c 22 2e 20 54 68 69 r "\\.\NUL". Thi
cf10: 73 20 77 69 6c 6c 0a 09 20 2a 20 63 61 75 73 65 s will.. * cause
cf20: 20 22 4e 55 4c 22 20 74 6f 20 67 65 74 20 61 20 "NUL" to get a
cf30: 64 72 69 76 65 20 6e 75 6d 62 65 72 20 6f 66 20 drive number of
cf40: 2d 31 2c 20 77 68 69 63 68 20 6d 61 6b 65 73 20 -1, which makes
cf50: 61 62 6f 75 74 20 61 73 20 6d 75 63 68 0a 09 20 about as much..
cf60: 2a 20 73 65 6e 73 65 20 61 73 20 61 6e 79 74 68 * sense as anyth
cf70: 69 6e 67 20 73 69 6e 63 65 20 74 68 65 20 73 70 ing since the sp
cf80: 65 63 69 61 6c 20 64 65 76 69 63 65 73 20 64 6f ecial devices do
cf90: 6e 27 74 20 6c 69 76 65 20 6f 6e 20 61 6e 79 0a n't live on any.
cfa0: 09 20 2a 20 64 72 69 76 65 2e 0a 09 20 2a 2f 0a . * drive... */.
cfb0: 0a 09 64 65 76 20 3d 20 64 77 3b 0a 09 54 63 6c ..dev = dw;..Tcl
cfc0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 76 6f _DStringFree(&vo
cfd0: 6c 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 7d 20 lString);. }
cfe0: 65 6c 73 65 20 69 66 20 28 28 66 75 6c 6c 50 61 else if ((fullPa
cff0: 74 68 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 26 th[0] != '\0') &
d000: 26 20 28 66 75 6c 6c 50 61 74 68 5b 31 5d 20 3d & (fullPath[1] =
d010: 3d 20 27 3a 27 29 29 20 7b 0a 09 64 65 76 20 3d = ':')) {..dev =
d020: 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c 6f Tcl_UniCharToLo
d030: 77 65 72 28 66 75 6c 6c 50 61 74 68 5b 30 5d 29 wer(fullPath[0])
d040: 20 2d 20 27 61 27 3b 0a 20 20 20 20 7d 20 65 6c - 'a';. } el
d050: 73 65 20 7b 0a 09 64 65 76 20 3d 20 2d 31 3b 0a se {..dev = -1;.
d060: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 }. Tcl_DS
d070: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
d080: 0a 20 20 20 20 72 65 74 75 72 6e 20 64 65 76 3b . return dev;
d090: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d0e0: 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 53 74 61 . *. * NativeSta
d0f0: 74 4d 6f 64 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 tMode --. *. *.C
d100: 61 6c 63 75 6c 61 74 65 20 6a 75 73 74 20 74 68 alculate just th
d110: 65 20 27 73 74 5f 6d 6f 64 65 27 20 66 69 65 6c e 'st_mode' fiel
d120: 64 20 6f 66 20 61 20 27 73 74 61 74 27 20 73 74 d of a 'stat' st
d130: 72 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 09 49 ructure.. *. *.I
d140: 6e 20 6d 61 6e 79 20 70 6c 61 63 65 73 20 77 65 n many places we
d150: 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 68 65 20 don't need the
d160: 66 75 6c 6c 20 73 74 61 74 20 73 74 72 75 63 74 full stat struct
d170: 75 72 65 2c 20 61 6e 64 20 69 74 27 73 20 6d 75 ure, and it's mu
d180: 63 68 0a 20 2a 09 66 61 73 74 65 72 20 6a 75 73 ch. *.faster jus
d190: 74 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 t to calculate t
d1a0: 68 65 73 65 20 70 69 65 63 65 73 2c 20 69 66 20 hese pieces, if
d1b0: 74 68 61 74 27 73 20 61 6c 6c 20 77 65 20 6e 65 that's all we ne
d1c0: 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ed.. *. *-------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d210: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 */..static unsi
d220: 67 6e 65 64 20 73 68 6f 72 74 0a 4e 61 74 69 76 gned short.Nativ
d230: 65 53 74 61 74 4d 6f 64 65 28 0a 20 20 20 20 44 eStatMode(. D
d240: 57 4f 52 44 20 61 74 74 72 2c 0a 20 20 20 20 69 WORD attr,. i
d250: 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a 20 nt checkLinks,.
d260: 20 20 20 69 6e 74 20 69 73 45 78 65 63 29 0a 7b int isExec).{
d270: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a . int mode;..
d280: 20 20 20 20 69 66 20 28 63 68 65 63 6b 4c 69 6e if (checkLin
d290: 6b 73 20 26 26 20 28 61 74 74 72 20 26 20 46 49 ks && (attr & FI
d2a0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 50 LE_ATTRIBUTE_REP
d2b0: 41 52 53 45 5f 50 4f 49 4e 54 29 29 20 7b 0a 09 ARSE_POINT)) {..
d2c0: 2f 2a 0a 09 20 2a 20 49 74 20 69 73 20 61 20 6c /*.. * It is a l
d2d0: 69 6e 6b 2e 0a 09 20 2a 2f 0a 0a 09 6d 6f 64 65 ink... */...mode
d2e0: 20 3d 20 53 5f 49 46 4c 4e 4b 3b 0a 20 20 20 20 = S_IFLNK;.
d2f0: 7d 20 65 6c 73 65 20 7b 0a 09 6d 6f 64 65 20 3d } else {..mode =
d300: 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 (attr & FILE_AT
d310: 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 TRIBUTE_DIRECTOR
d320: 59 29 20 3f 20 53 5f 49 46 44 49 52 7c 53 5f 49 Y) ? S_IFDIR|S_I
d330: 45 58 45 43 20 3a 20 53 5f 49 46 52 45 47 3b 0a EXEC : S_IFREG;.
d340: 20 20 20 20 7d 0a 20 20 20 20 6d 6f 64 65 20 7c }. mode |
d350: 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 = (attr & FILE_A
d360: 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c TTRIBUTE_READONL
d370: 59 29 20 3f 20 53 5f 49 52 45 41 44 20 3a 20 53 Y) ? S_IREAD : S
d380: 5f 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45 3b _IREAD|S_IWRITE;
d390: 0a 20 20 20 20 69 66 20 28 69 73 45 78 65 63 29 . if (isExec)
d3a0: 20 7b 0a 09 6d 6f 64 65 20 7c 3d 20 53 5f 49 45 {..mode |= S_IE
d3b0: 58 45 43 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 XEC;. }..
d3c0: 2f 2a 0a 20 20 20 20 20 2a 20 50 72 6f 70 61 67 /*. * Propag
d3d0: 61 74 65 20 74 68 65 20 53 5f 49 52 45 41 44 2c ate the S_IREAD,
d3e0: 20 53 5f 49 57 52 49 54 45 2c 20 53 5f 49 45 58 S_IWRITE, S_IEX
d3f0: 45 43 20 62 69 74 73 20 74 6f 20 74 68 65 20 67 EC bits to the g
d400: 72 6f 75 70 20 61 6e 64 20 6f 74 68 65 72 0a 20 roup and other.
d410: 20 20 20 20 2a 20 70 6f 73 69 74 69 6f 6e 73 2e * positions.
d420: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 6f . */.. mo
d430: 64 65 20 7c 3d 20 28 6d 6f 64 65 20 26 20 28 53 de |= (mode & (S
d440: 5f 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45 7c _IREAD|S_IWRITE|
d450: 53 5f 49 45 58 45 43 29 29 20 3e 3e 20 33 3b 0a S_IEXEC)) >> 3;.
d460: 20 20 20 20 6d 6f 64 65 20 7c 3d 20 28 6d 6f 64 mode |= (mod
d470: 65 20 26 20 28 53 5f 49 52 45 41 44 7c 53 5f 49 e & (S_IREAD|S_I
d480: 57 52 49 54 45 7c 53 5f 49 45 58 45 43 29 29 20 WRITE|S_IEXEC))
d490: 3e 3e 20 36 3b 0a 20 20 20 20 72 65 74 75 72 6e >> 6;. return
d4a0: 20 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 (unsigned short
d4b0: 29 20 6d 6f 64 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 ) mode;.}.../*.
d4c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
d510: 54 6f 43 54 69 6d 65 20 2d 2d 0a 20 2a 0a 20 2a ToCTime --. *. *
d520: 09 43 6f 6e 76 65 72 74 73 20 61 20 57 69 6e 64 .Converts a Wind
d530: 6f 77 73 20 46 49 4c 45 54 49 4d 45 20 74 6f 20 ows FILETIME to
d540: 61 20 74 69 6d 65 5f 74 20 69 6e 20 55 54 43 2e a time_t in UTC.
d550: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
d560: 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 63 *.Returns the c
d570: 6f 75 6e 74 20 6f 66 20 73 65 63 6f 6e 64 73 20 ount of seconds
d580: 66 72 6f 6d 20 74 68 65 20 50 6f 73 69 78 20 65 from the Posix e
d590: 70 6f 63 68 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d poch.. *. *-----
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d5e0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
d5f0: 74 69 6d 65 5f 74 0a 54 6f 43 54 69 6d 65 28 0a time_t.ToCTime(.
d600: 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66 69 6c FILETIME fil
d610: 65 54 69 6d 65 29 09 09 2f 2a 20 55 54 43 20 74 eTime)../* UTC t
d620: 69 6d 65 20 2a 2f 0a 7b 0a 20 20 20 20 4c 41 52 ime */.{. LAR
d630: 47 45 5f 49 4e 54 45 47 45 52 20 63 6f 6e 76 65 GE_INTEGER conve
d640: 72 74 65 64 54 69 6d 65 3b 0a 0a 20 20 20 20 63 rtedTime;.. c
d650: 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e 4c 6f 77 onvertedTime.Low
d660: 50 61 72 74 20 3d 20 66 69 6c 65 54 69 6d 65 2e Part = fileTime.
d670: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 3b 0a 20 dwLowDateTime;.
d680: 20 20 20 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 convertedTime
d690: 2e 48 69 67 68 50 61 72 74 20 3d 20 28 4c 4f 4e .HighPart = (LON
d6a0: 47 29 20 66 69 6c 65 54 69 6d 65 2e 64 77 48 69 G) fileTime.dwHi
d6b0: 67 68 44 61 74 65 54 69 6d 65 3b 0a 0a 20 20 20 ghDateTime;..
d6c0: 20 72 65 74 75 72 6e 20 28 74 69 6d 65 5f 74 29 return (time_t)
d6d0: 20 28 28 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 ((convertedTime
d6e0: 2e 51 75 61 64 50 61 72 74 20 2d 0a 09 20 20 20 .QuadPart -..
d6f0: 20 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 50 (Tcl_WideInt) P
d700: 4f 53 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 OSIX_EPOCH_AS_FI
d710: 4c 45 54 49 4d 45 29 20 2f 20 28 54 63 6c 5f 57 LETIME) / (Tcl_W
d720: 69 64 65 49 6e 74 29 20 31 30 30 30 30 30 30 30 ideInt) 10000000
d730: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d );.}.../*. *----
d740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d780: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 72 6f 6d 43 ----. *. * FromC
d790: 54 69 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f Time --. *. *.Co
d7a0: 6e 76 65 72 74 73 20 61 20 74 69 6d 65 5f 74 20 nverts a time_t
d7b0: 74 6f 20 61 20 57 69 6e 64 6f 77 73 20 46 49 4c to a Windows FIL
d7c0: 45 54 49 4d 45 0a 20 2a 0a 20 2a 20 52 65 73 75 ETIME. *. * Resu
d7d0: 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 lts:. *.Returns
d7e0: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 31 30 30 the count of 100
d7f0: 2d 6e 73 20 74 69 63 6b 73 20 73 65 63 6f 6e 64 -ns ticks second
d800: 73 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f s from the Windo
d810: 77 73 20 65 70 6f 63 68 2e 0a 20 2a 0a 20 2a 2d ws epoch.. *. *-
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d860: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
d870: 74 69 63 20 76 6f 69 64 0a 46 72 6f 6d 43 54 69 tic void.FromCTi
d880: 6d 65 28 0a 20 20 20 20 74 69 6d 65 5f 74 20 70 me(. time_t p
d890: 6f 73 69 78 54 69 6d 65 2c 0a 20 20 20 20 46 49 osixTime,. FI
d8a0: 4c 45 54 49 4d 45 20 2a 66 69 6c 65 54 69 6d 65 LETIME *fileTime
d8b0: 29 09 09 2f 2a 20 55 54 43 20 54 69 6d 65 20 2a )../* UTC Time *
d8c0: 2f 0a 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e /.{. LARGE_IN
d8d0: 54 45 47 45 52 20 63 6f 6e 76 65 72 74 65 64 54 TEGER convertedT
d8e0: 69 6d 65 3b 0a 0a 20 20 20 20 63 6f 6e 76 65 72 ime;.. conver
d8f0: 74 65 64 54 69 6d 65 2e 51 75 61 64 50 61 72 74 tedTime.QuadPart
d900: 20 3d 20 28 28 4c 4f 4e 47 4c 4f 4e 47 29 20 70 = ((LONGLONG) p
d910: 6f 73 69 78 54 69 6d 65 29 20 2a 20 31 30 30 30 osixTime) * 1000
d920: 30 30 30 30 0a 09 20 20 20 20 2b 20 50 4f 53 49 0000.. + POSI
d930: 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45 54 X_EPOCH_AS_FILET
d940: 49 4d 45 3b 0a 20 20 20 20 66 69 6c 65 54 69 6d IME;. fileTim
d950: 65 2d 3e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 e->dwLowDateTime
d960: 20 3d 20 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 = convertedTime
d970: 2e 4c 6f 77 50 61 72 74 3b 0a 20 20 20 20 66 69 .LowPart;. fi
d980: 6c 65 54 69 6d 65 2d 3e 64 77 48 69 67 68 44 61 leTime->dwHighDa
d990: 74 65 54 69 6d 65 20 3d 20 63 6f 6e 76 65 72 74 teTime = convert
d9a0: 65 64 54 69 6d 65 2e 48 69 67 68 50 61 72 74 3b edTime.HighPart;
d9b0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
da00: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 -----. *. * Tclp
da10: 47 65 74 4e 61 74 69 76 65 43 77 64 20 2d 2d 0a GetNativeCwd --.
da20: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
da30: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68 65 ion replaces the
da40: 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 6f 6e library version
da50: 20 6f 66 20 67 65 74 63 77 64 28 29 2e 0a 20 2a of getcwd().. *
da60: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
da70: 54 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 The input and ou
da80: 74 70 75 74 20 61 72 65 20 66 69 6c 65 73 79 73 tput are filesys
da90: 74 65 6d 20 70 61 74 68 73 20 69 6e 20 6e 61 74 tem paths in nat
daa0: 69 76 65 20 66 6f 72 6d 2e 20 54 68 65 20 72 65 ive form. The re
dab0: 73 75 6c 74 0a 20 2a 09 69 73 20 65 69 74 68 65 sult. *.is eithe
dac0: 72 20 74 68 65 20 67 69 76 65 6e 20 63 6c 69 65 r the given clie
dad0: 6e 74 44 61 74 61 2c 20 69 66 20 74 68 65 20 77 ntData, if the w
dae0: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 orking directory
daf0: 20 68 61 73 6e 27 74 0a 20 2a 09 63 68 61 6e 67 hasn't. *.chang
db00: 65 64 2c 20 6f 72 20 61 20 6e 65 77 20 63 6c 69 ed, or a new cli
db10: 65 6e 74 44 61 74 61 20 28 6f 77 6e 65 64 20 62 entData (owned b
db20: 79 20 6f 75 72 20 63 61 6c 6c 65 72 29 2c 20 67 y our caller), g
db30: 69 76 69 6e 67 20 74 68 65 20 6e 65 77 0a 20 2a iving the new. *
db40: 09 6e 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 .native path, or
db50: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 63 75 72 NULL if the cur
db60: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 63 rent directory c
db70: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 64 65 74 65 ould not be dete
db80: 72 6d 69 6e 65 64 2e 0a 20 2a 09 49 66 20 4e 55 rmined.. *.If NU
db90: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 LL is returned,
dba0: 74 68 65 20 63 61 6c 6c 65 72 20 63 61 6e 20 65 the caller can e
dbb0: 78 61 6d 69 6e 65 20 74 68 65 20 73 74 61 6e 64 xamine the stand
dbc0: 61 72 64 20 70 6f 73 69 78 20 65 72 72 6f 72 0a ard posix error.
dbd0: 20 2a 09 63 6f 64 65 73 20 74 6f 20 64 65 74 65 *.codes to dete
dbe0: 72 6d 69 6e 65 20 74 68 65 20 63 61 75 73 65 20 rmine the cause
dbf0: 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a of the problem..
dc00: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
dc10: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
dc20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
dc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c --------. */..Cl
dc70: 69 65 6e 74 44 61 74 61 0a 54 63 6c 70 47 65 74 ientData.TclpGet
dc80: 4e 61 74 69 76 65 43 77 64 28 0a 20 20 20 20 43 NativeCwd(. C
dc90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
dca0: 44 61 74 61 29 0a 7b 0a 20 20 20 20 54 43 48 41 Data).{. TCHA
dcb0: 52 20 62 75 66 66 65 72 5b 4d 41 58 5f 50 41 54 R buffer[MAX_PAT
dcc0: 48 5d 3b 0a 0a 20 20 20 20 69 66 20 28 47 65 74 H];.. if (Get
dcd0: 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 CurrentDirectory
dce0: 28 4d 41 58 5f 50 41 54 48 2c 20 62 75 66 66 65 (MAX_PATH, buffe
dcf0: 72 29 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c 57 r) == 0) {..TclW
dd00: 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 inConvertError(G
dd10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a etLastError());.
dd20: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
dd30: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 63 6c 69 }.. if (cli
dd40: 65 6e 74 44 61 74 61 20 21 3d 20 4e 55 4c 4c 29 entData != NULL)
dd50: 20 7b 0a 09 69 66 20 28 5f 74 63 73 63 6d 70 28 {..if (_tcscmp(
dd60: 28 63 6f 6e 73 74 20 54 43 48 41 52 2a 29 63 6c (const TCHAR*)cl
dd70: 69 65 6e 74 44 61 74 61 2c 20 62 75 66 66 65 72 ientData, buffer
dd80: 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 72 ) == 0) {.. r
dd90: 65 74 75 72 6e 20 63 6c 69 65 6e 74 44 61 74 61 eturn clientData
dda0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
ddb0: 72 65 74 75 72 6e 20 54 63 6c 4e 61 74 69 76 65 return TclNative
ddc0: 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 28 62 DupInternalRep(b
ddd0: 75 66 66 65 72 29 3b 0a 7d 0a 0c 0a 69 6e 74 0a uffer);.}...int.
dde0: 54 63 6c 70 4f 62 6a 41 63 63 65 73 73 28 0a 20 TclpObjAccess(.
ddf0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 Tcl_Obj *path
de00: 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 6d 6f 64 Ptr,. int mod
de10: 65 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 e).{. return
de20: 4e 61 74 69 76 65 41 63 63 65 73 73 28 54 63 6c NativeAccess(Tcl
de30: 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 _FSGetNativePath
de40: 28 70 61 74 68 50 74 72 29 2c 20 6d 6f 64 65 29 (pathPtr), mode)
de50: 3b 0a 7d 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f 62 ;.}...int.TclpOb
de60: 6a 4c 73 74 61 74 28 0a 20 20 20 20 54 63 6c 5f jLstat(. Tcl_
de70: 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 Obj *pathPtr,.
de80: 20 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 Tcl_StatBuf *s
de90: 74 61 74 50 74 72 29 0a 7b 0a 20 20 20 20 2f 2a tatPtr).{. /*
dea0: 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 63 . * Ensure c
deb0: 6f 72 72 65 63 74 20 66 69 6c 65 20 73 69 7a 65 orrect file size
dec0: 73 20 62 79 20 66 6f 72 63 69 6e 67 20 74 68 65 s by forcing the
ded0: 20 4f 53 20 74 6f 20 77 72 69 74 65 20 61 6e 79 OS to write any
dee0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 0a 20 20 pending data.
def0: 20 20 20 2a 20 74 6f 20 64 69 73 6b 2e 20 54 68 * to disk. Th
df00: 69 73 20 69 73 20 64 6f 6e 65 20 6f 6e 6c 79 20 is is done only
df10: 66 6f 72 20 63 68 61 6e 6e 65 6c 73 20 77 68 69 for channels whi
df20: 63 68 20 61 72 65 20 64 69 72 74 79 2c 20 69 2e ch are dirty, i.
df30: 65 2e 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 e. have been.
df40: 20 20 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 73 * written to s
df50: 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 66 6c ince the last fl
df60: 75 73 68 20 68 65 72 65 2e 0a 20 20 20 20 20 2a ush here.. *
df70: 2f 0a 0a 20 20 20 20 54 63 6c 57 69 6e 46 6c 75 /.. TclWinFlu
df80: 73 68 44 69 72 74 79 43 68 61 6e 6e 65 6c 73 28 shDirtyChannels(
df90: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
dfa0: 61 74 69 76 65 53 74 61 74 28 54 63 6c 5f 46 53 ativeStat(Tcl_FS
dfb0: 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 GetNativePath(pa
dfc0: 74 68 50 74 72 29 2c 20 73 74 61 74 50 74 72 2c thPtr), statPtr,
dfd0: 20 31 29 3b 0a 7d 0a 0c 0a 23 69 66 64 65 66 20 1);.}...#ifdef
dfe0: 53 5f 49 46 4c 4e 4b 0a 54 63 6c 5f 4f 62 6a 20 S_IFLNK.Tcl_Obj
dff0: 2a 0a 54 63 6c 70 4f 62 6a 4c 69 6e 6b 28 0a 20 *.TclpObjLink(.
e000: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 Tcl_Obj *path
e010: 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a Ptr,. Tcl_Obj
e020: 20 2a 74 6f 50 74 72 2c 0a 20 20 20 20 69 6e 74 *toPtr,. int
e030: 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 linkAction).{.
e040: 20 20 20 69 66 20 28 74 6f 50 74 72 20 21 3d 20 if (toPtr !=
e050: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 72 65 73 NULL) {..int res
e060: 3b 0a 09 63 6f 6e 73 74 20 54 43 48 41 52 20 2a ;..const TCHAR *
e070: 4c 69 6e 6b 54 61 72 67 65 74 3b 0a 09 63 6f 6e LinkTarget;..con
e080: 73 74 20 54 43 48 41 52 20 2a 4c 69 6e 6b 53 6f st TCHAR *LinkSo
e090: 75 72 63 65 20 3d 20 54 63 6c 5f 46 53 47 65 74 urce = Tcl_FSGet
e0a0: 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 NativePath(pathP
e0b0: 74 72 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e tr);..Tcl_Obj *n
e0c0: 6f 72 6d 61 6c 69 7a 65 64 54 6f 50 74 72 20 3d ormalizedToPtr =
e0d0: 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 6c Tcl_FSGetNormal
e0e0: 69 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 74 izedPath(NULL, t
e0f0: 6f 50 74 72 29 3b 0a 0a 09 69 66 20 28 6e 6f 72 oPtr);...if (nor
e100: 6d 61 6c 69 7a 65 64 54 6f 50 74 72 20 3d 3d 20 malizedToPtr ==
e110: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 NULL) {.. ret
e120: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 4c urn NULL;..}...L
e130: 69 6e 6b 54 61 72 67 65 74 20 3d 20 54 63 6c 5f inkTarget = Tcl_
e140: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 FSGetNativePath(
e150: 6e 6f 72 6d 61 6c 69 7a 65 64 54 6f 50 74 72 29 normalizedToPtr)
e160: 3b 0a 0a 09 69 66 20 28 4c 69 6e 6b 53 6f 75 72 ;...if (LinkSour
e170: 63 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 4c 69 ce == NULL || Li
e180: 6e 6b 54 61 72 67 65 74 20 3d 3d 20 4e 55 4c 4c nkTarget == NULL
e190: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
e1a0: 4e 55 4c 4c 3b 0a 09 7d 0a 09 72 65 73 20 3d 20 NULL;..}..res =
e1b0: 57 69 6e 4c 69 6e 6b 28 4c 69 6e 6b 53 6f 75 72 WinLink(LinkSour
e1c0: 63 65 2c 20 4c 69 6e 6b 54 61 72 67 65 74 2c 20 ce, LinkTarget,
e1d0: 6c 69 6e 6b 41 63 74 69 6f 6e 29 3b 0a 09 69 66 linkAction);..if
e1e0: 20 28 72 65 73 20 3d 3d 20 30 29 20 7b 0a 09 20 (res == 0) {..
e1f0: 20 20 20 72 65 74 75 72 6e 20 74 6f 50 74 72 3b return toPtr;
e200: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
e210: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
e220: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 6f } else {..co
e230: 6e 73 74 20 54 43 48 41 52 20 2a 4c 69 6e 6b 53 nst TCHAR *LinkS
e240: 6f 75 72 63 65 20 3d 20 54 63 6c 5f 46 53 47 65 ource = Tcl_FSGe
e250: 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68 tNativePath(path
e260: 50 74 72 29 3b 0a 0a 09 69 66 20 28 4c 69 6e 6b Ptr);...if (Link
e270: 53 6f 75 72 63 65 20 3d 3d 20 4e 55 4c 4c 29 20 Source == NULL)
e280: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 {.. return NU
e290: 4c 4c 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 57 LL;..}..return W
e2a0: 69 6e 52 65 61 64 4c 69 6e 6b 28 4c 69 6e 6b 53 inReadLink(LinkS
e2b0: 6f 75 72 63 65 29 3b 0a 20 20 20 20 7d 0a 7d 0a ource);. }.}.
e2c0: 23 65 6e 64 69 66 20 2f 2a 20 53 5f 49 46 4c 4e #endif /* S_IFLN
e2d0: 4b 20 2a 2f 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d K */.../*. *----
e2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e320: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
e330: 6c 70 46 69 6c 65 73 79 73 74 65 6d 50 61 74 68 lpFilesystemPath
e340: 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Type --. *. *.Th
e350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 is function is p
e360: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 74 69 76 art of the nativ
e370: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73 75 70 e filesystem sup
e380: 70 6f 72 74 2c 20 61 6e 64 20 72 65 74 75 72 6e port, and return
e390: 73 0a 20 2a 09 74 68 65 20 70 61 74 68 20 74 79 s. *.the path ty
e3a0: 70 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 pe of the given
e3b0: 70 61 74 68 2e 20 52 65 74 75 72 6e 73 20 4e 54 path. Returns NT
e3c0: 46 53 20 6f 72 20 46 41 54 20 6f 72 20 77 68 61 FS or FAT or wha
e3d0: 74 65 76 65 72 20 69 73 0a 20 2a 09 72 65 74 75 tever is. *.retu
e3e0: 72 6e 65 64 20 62 79 20 74 68 65 20 27 76 6f 6c rned by the 'vol
e3f0: 75 6d 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 27 ume information'
e400: 20 70 72 6f 63 2e 0a 20 2a 0a 20 2a 20 52 65 73 proc.. *. * Res
e410: 75 6c 74 73 3a 0a 20 2a 09 4e 55 4c 4c 20 61 74 ults:. *.NULL at
e420: 20 70 72 65 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 present.. *. *
e430: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
e440: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
e450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e490: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c -------. */..Tcl
e4a0: 5f 4f 62 6a 20 2a 0a 54 63 6c 70 46 69 6c 65 73 _Obj *.TclpFiles
e4b0: 79 73 74 65 6d 50 61 74 68 54 79 70 65 28 0a 20 ystemPathType(.
e4c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 Tcl_Obj *path
e4d0: 50 74 72 29 0a 7b 0a 23 64 65 66 69 6e 65 20 56 Ptr).{.#define V
e4e0: 4f 4c 5f 42 55 46 5f 53 49 5a 45 20 33 32 0a 20 OL_BUF_SIZE 32.
e4f0: 20 20 20 69 6e 74 20 66 6f 75 6e 64 3b 0a 20 20 int found;.
e500: 20 20 54 43 48 41 52 20 76 6f 6c 54 79 70 65 5b TCHAR volType[
e510: 56 4f 4c 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 VOL_BUF_SIZE];.
e520: 20 20 20 63 68 61 72 20 2a 66 69 72 73 74 53 65 char *firstSe
e530: 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 63 6f 6e parator;. con
e540: 73 74 20 63 68 61 72 20 2a 70 61 74 68 3b 0a 20 st char *path;.
e550: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d Tcl_Obj *norm
e560: 50 61 74 68 20 3d 20 54 63 6c 5f 46 53 47 65 74 Path = Tcl_FSGet
e570: 4e 6f 72 6d 61 6c 69 7a 65 64 50 61 74 68 28 4e NormalizedPath(N
e580: 55 4c 4c 2c 20 70 61 74 68 50 74 72 29 3b 0a 0a ULL, pathPtr);..
e590: 20 20 20 20 69 66 20 28 6e 6f 72 6d 50 61 74 68 if (normPath
e5a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
e5b0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e5c0: 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c 5f 47 path = Tcl_G
e5d0: 65 74 53 74 72 69 6e 67 28 6e 6f 72 6d 50 61 74 etString(normPat
e5e0: 68 29 3b 0a 20 20 20 20 69 66 20 28 70 61 74 68 h);. if (path
e5f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
e600: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
e610: 0a 20 20 20 20 66 69 72 73 74 53 65 70 61 72 61 . firstSepara
e620: 74 6f 72 20 3d 20 73 74 72 63 68 72 28 70 61 74 tor = strchr(pat
e630: 68 2c 20 27 2f 27 29 3b 0a 20 20 20 20 69 66 20 h, '/');. if
e640: 28 66 69 72 73 74 53 65 70 61 72 61 74 6f 72 20 (firstSeparator
e650: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 6f 75 6e == NULL) {..foun
e660: 64 20 3d 20 47 65 74 56 6f 6c 75 6d 65 49 6e 66 d = GetVolumeInf
e670: 6f 72 6d 61 74 69 6f 6e 28 54 63 6c 5f 46 53 47 ormation(Tcl_FSG
e680: 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 etNativePath(pat
e690: 68 50 74 72 29 2c 0a 09 09 4e 55 4c 4c 2c 20 30 hPtr),...NULL, 0
e6a0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 , NULL, NULL, NU
e6b0: 4c 4c 2c 20 76 6f 6c 54 79 70 65 2c 20 56 4f 4c LL, volType, VOL
e6c0: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 _BUF_SIZE);.
e6d0: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
e6e0: 6a 20 2a 64 72 69 76 65 4e 61 6d 65 20 3d 20 54 j *driveName = T
e6f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
e700: 70 61 74 68 2c 20 66 69 72 73 74 53 65 70 61 72 path, firstSepar
e710: 61 74 6f 72 20 2d 20 70 61 74 68 2b 31 29 3b 0a ator - path+1);.
e720: 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 ..Tcl_IncrRefCou
e730: 6e 74 28 64 72 69 76 65 4e 61 6d 65 29 3b 0a 09 nt(driveName);..
e740: 66 6f 75 6e 64 20 3d 20 47 65 74 56 6f 6c 75 6d found = GetVolum
e750: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 28 54 63 6c eInformation(Tcl
e760: 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 _FSGetNativePath
e770: 28 64 72 69 76 65 4e 61 6d 65 29 2c 0a 09 09 4e (driveName),...N
e780: 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 ULL, 0, NULL, NU
e790: 4c 4c 2c 20 4e 55 4c 4c 2c 20 76 6f 6c 54 79 70 LL, NULL, volTyp
e7a0: 65 2c 20 56 4f 4c 5f 42 55 46 5f 53 49 5a 45 29 e, VOL_BUF_SIZE)
e7b0: 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f ;..Tcl_DecrRefCo
e7c0: 75 6e 74 28 64 72 69 76 65 4e 61 6d 65 29 3b 0a unt(driveName);.
e7d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 66 }.. if (f
e7e0: 6f 75 6e 64 20 3d 3d 20 30 29 20 7b 0a 09 72 65 ound == 0) {..re
e7f0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
e800: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 44 53 74 else {..Tcl_DSt
e810: 72 69 6e 67 20 64 73 3b 0a 0a 09 54 63 6c 5f 57 ring ds;...Tcl_W
e820: 69 6e 54 43 68 61 72 54 6f 55 74 66 28 76 6f 6c inTCharToUtf(vol
e830: 54 79 70 65 2c 20 2d 31 2c 20 26 64 73 29 3b 0a Type, -1, &ds);.
e840: 09 72 65 74 75 72 6e 20 54 63 6c 44 53 74 72 69 .return TclDStri
e850: 6e 67 54 6f 4f 62 6a 28 26 64 73 29 3b 0a 20 20 ngToObj(&ds);.
e860: 20 20 7d 0a 23 75 6e 64 65 66 20 56 4f 4c 5f 42 }.#undef VOL_B
e870: 55 46 5f 53 49 5a 45 0a 7d 0a 0c 0a 2f 2a 0a 20 UF_SIZE.}.../*.
e880: 2a 20 54 68 69 73 20 64 65 66 69 6e 65 20 63 61 * This define ca
e890: 6e 20 62 65 20 74 75 72 6e 65 64 20 6f 6e 20 74 n be turned on t
e8a0: 6f 20 65 78 70 65 72 69 6d 65 6e 74 20 77 69 74 o experiment wit
e8b0: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 77 61 h a different wa
e8c0: 79 20 6f 66 0a 20 2a 20 6e 6f 72 6d 61 6c 69 7a y of. * normaliz
e8d0: 69 6e 67 20 70 61 74 68 73 20 28 75 73 69 6e 67 ing paths (using
e8e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 57 69 6e a different Win
e8f0: 64 6f 77 73 20 41 50 49 29 2e 20 55 6e 66 6f 72 dows API). Unfor
e900: 74 75 6e 61 74 65 6c 79 20 74 68 65 20 6e 65 77 tunately the new
e910: 0a 20 2a 20 70 61 74 68 20 73 65 65 6d 73 20 74 . * path seems t
e920: 6f 20 74 61 6b 65 20 61 6c 6d 6f 73 74 20 65 78 o take almost ex
e930: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 actly the same a
e940: 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 61 73 mount of time as
e950: 20 74 68 65 20 6f 6c 64 20 70 61 74 68 21 0a 20 the old path!.
e960: 2a 20 54 68 65 20 70 72 69 6d 61 72 79 20 74 69 * The primary ti
e970: 6d 65 20 74 61 6b 65 6e 20 62 79 20 6e 6f 72 6d me taken by norm
e980: 61 6c 69 7a 61 74 69 6f 6e 20 69 73 20 69 6e 0a alization is in.
e990: 20 2a 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 * GetFileAttrib
e9a0: 75 74 65 73 45 78 2f 46 69 6e 64 46 69 72 73 74 utesEx/FindFirst
e9b0: 46 69 6c 65 20 6f 72 20 47 65 74 46 69 6c 65 41 File or GetFileA
e9c0: 74 74 72 69 62 75 74 65 73 45 78 2f 47 65 74 4c ttributesEx/GetL
e9d0: 6f 6e 67 50 61 74 68 4e 61 6d 65 2e 0a 20 2a 20 ongPathName.. *
e9e0: 43 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 2f 66 72 Conversion to/fr
e9f0: 6f 6d 20 6e 61 74 69 76 65 20 69 73 20 6e 6f 74 om native is not
ea00: 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 66 a significant f
ea10: 61 63 74 6f 72 20 61 74 20 61 6c 6c 2e 0a 20 2a actor at all.. *
ea20: 0a 20 2a 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 . * Also, since
ea30: 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b we have to check
ea40: 20 66 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 for symbolic li
ea50: 6e 6b 73 20 28 72 65 70 61 72 73 65 20 70 6f 69 nks (reparse poi
ea60: 6e 74 73 29 20 74 68 65 6e 20 77 65 0a 20 2a 20 nts) then we. *
ea70: 68 61 76 65 20 74 6f 20 63 61 6c 6c 20 47 65 74 have to call Get
ea80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 6f FileAttributes o
ea90: 6e 20 65 61 63 68 20 70 61 74 68 20 73 65 67 6d n each path segm
eaa0: 65 6e 74 20 61 6e 79 77 61 79 2c 20 73 6f 20 74 ent anyway, so t
eab0: 68 65 72 65 27 73 20 6e 6f 0a 20 2a 20 62 65 6e here's no. * ben
eac0: 65 66 69 74 20 74 6f 20 64 6f 69 6e 67 20 61 6e efit to doing an
ead0: 79 74 68 69 6e 67 20 63 6c 65 76 65 72 20 74 68 ything clever th
eae0: 65 72 65 2e 0a 20 2a 2f 0a 0a 2f 2a 20 23 64 65 ere.. */../* #de
eaf0: 66 69 6e 65 20 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e fine TclNORM_LON
eb00: 47 5f 50 41 54 48 20 2a 2f 0a 0c 0a 2f 2a 0a 20 G_PATH */.../*.
eb10: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
eb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
eb60: 20 2a 20 54 63 6c 70 4f 62 6a 4e 6f 72 6d 61 6c * TclpObjNormal
eb70: 69 7a 65 50 61 74 68 20 2d 2d 0a 20 2a 0a 20 2a izePath --. *. *
eb80: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 .This function s
eb90: 63 61 6e 73 20 74 68 72 6f 75 67 68 20 61 20 70 cans through a p
eba0: 61 74 68 20 73 70 65 63 69 66 69 63 61 74 69 6f ath specificatio
ebb0: 6e 20 61 6e 64 20 72 65 70 6c 61 63 65 73 20 69 n and replaces i
ebc0: 74 2c 20 69 6e 0a 20 2a 09 70 6c 61 63 65 2c 20 t, in. *.place,
ebd0: 77 69 74 68 20 61 20 6e 6f 72 6d 61 6c 69 7a 65 with a normalize
ebe0: 64 20 76 65 72 73 69 6f 6e 2e 20 54 68 69 73 20 d version. This
ebf0: 6d 65 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 means using the
ec00: 27 6c 6f 6e 67 6e 61 6d 65 27 2c 20 61 6e 64 0a 'longname', and.
ec10: 20 2a 09 65 78 70 61 6e 64 69 6e 67 20 61 6e 79 *.expanding any
ec20: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 symbolic links
ec30: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e contained within
ec40: 20 74 68 65 20 70 61 74 68 2e 0a 20 2a 0a 20 2a the path.. *. *
ec50: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 Results:. *.The
ec60: 20 6e 65 77 20 27 6e 65 78 74 43 68 65 63 6b 70 new 'nextCheckp
ec70: 6f 69 6e 74 27 20 76 61 6c 75 65 2c 20 67 69 76 oint' value, giv
ec80: 69 6e 67 20 61 73 20 66 61 72 20 61 73 20 77 65 ing as far as we
ec90: 20 63 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e could understan
eca0: 64 0a 20 2a 09 69 6e 20 74 68 65 20 70 61 74 68 d. *.in the path
ecb0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
ecc0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 70 61 74 ects:. *.The pat
ecd0: 68 50 74 72 20 73 74 72 69 6e 67 2c 20 77 68 69 hPtr string, whi
ece0: 63 68 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 ch must contain
ecf0: 61 20 76 61 6c 69 64 20 70 61 74 68 2c 20 69 73 a valid path, is
ed00: 20 70 6f 73 73 69 62 6c 79 0a 20 2a 09 6d 6f 64 possibly. *.mod
ed10: 69 66 69 65 64 20 69 6e 20 70 6c 61 63 65 2e 0a ified in place..
ed20: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
ed30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed70: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 . */..int.TclpOb
ed80: 6a 4e 6f 72 6d 61 6c 69 7a 65 50 61 74 68 28 0a jNormalizePath(.
ed90: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
eda0: 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f interp,. Tcl_
edb0: 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 Obj *pathPtr,.
edc0: 20 20 69 6e 74 20 6e 65 78 74 43 68 65 63 6b 70 int nextCheckp
edd0: 6f 69 6e 74 29 0a 7b 0a 20 20 20 20 63 68 61 72 oint).{. char
ede0: 20 2a 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 *lastValidPathE
edf0: 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 nd = NULL;. T
ee00: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 4e 6f 72 cl_DString dsNor
ee10: 6d 3b 09 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c m;../* This will
ee20: 20 68 6f 6c 64 20 74 68 65 20 6e 6f 72 6d 61 6c hold the normal
ee30: 69 7a 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a ized string. */.
ee40: 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 2c 20 char *path,
ee50: 2a 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 *currentPathEndP
ee60: 6f 73 69 74 69 6f 6e 3b 0a 20 20 20 20 54 63 6c osition;. Tcl
ee70: 5f 4f 62 6a 20 2a 74 65 6d 70 20 3d 20 4e 55 4c _Obj *temp = NUL
ee80: 4c 3b 0a 20 20 20 20 69 6e 74 20 69 73 44 72 69 L;. int isDri
ee90: 76 65 20 3d 20 31 3b 0a 20 20 20 20 54 63 6c 5f ve = 1;. Tcl_
eea0: 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a 20 DString ds;../*
eeb0: 53 6f 6d 65 20 77 6f 72 6b 73 70 61 63 65 2e 20 Some workspace.
eec0: 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */.. Tcl_DStr
eed0: 69 6e 67 49 6e 69 74 28 26 64 73 4e 6f 72 6d 29 ingInit(&dsNorm)
eee0: 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c ;. path = Tcl
eef0: 5f 47 65 74 53 74 72 69 6e 67 28 70 61 74 68 50 _GetString(pathP
ef00: 74 72 29 3b 0a 0a 20 20 20 20 63 75 72 72 65 6e tr);.. curren
ef10: 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e tPathEndPosition
ef20: 20 3d 20 70 61 74 68 20 2b 20 6e 65 78 74 43 68 = path + nextCh
ef30: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 69 66 eckpoint;. if
ef40: 20 28 2a 63 75 72 72 65 6e 74 50 61 74 68 45 6e (*currentPathEn
ef50: 64 50 6f 73 69 74 69 6f 6e 20 3d 3d 20 27 2f 27 dPosition == '/'
ef60: 29 20 7b 0a 09 63 75 72 72 65 6e 74 50 61 74 68 ) {..currentPath
ef70: 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 20 EndPosition++;.
ef80: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 20 28 }. while (
ef90: 31 29 20 7b 0a 09 63 68 61 72 20 63 75 72 20 3d 1) {..char cur =
efa0: 20 2a 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 *currentPathEnd
efb0: 50 6f 73 69 74 69 6f 6e 3b 0a 0a 09 69 66 20 28 Position;...if (
efc0: 28 63 75 72 3d 3d 27 2f 27 20 7c 7c 20 63 75 72 (cur=='/' || cur
efd0: 3d 3d 30 29 20 26 26 20 28 70 61 74 68 20 21 3d ==0) && (path !=
efe0: 20 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 currentPathEndP
eff0: 6f 73 69 74 69 6f 6e 29 29 20 7b 0a 09 20 20 20 osition)) {..
f000: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 52 65 61 63 /*.. * Reac
f010: 68 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 hed directory se
f020: 70 61 72 61 74 6f 72 2c 20 6f 72 20 65 6e 64 20 parator, or end
f030: 6f 66 20 73 74 72 69 6e 67 2e 0a 09 20 20 20 20 of string...
f040: 20 2a 2f 0a 0a 09 20 20 20 20 57 49 4e 33 32 5f */... WIN32_
f050: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 FILE_ATTRIBUTE_D
f060: 41 54 41 20 64 61 74 61 3b 0a 09 20 20 20 20 63 ATA data;.. c
f070: 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 74 69 onst TCHAR *nati
f080: 76 65 50 61 74 68 20 3d 20 54 63 6c 5f 57 69 6e vePath = Tcl_Win
f090: 55 74 66 54 6f 54 43 68 61 72 28 70 61 74 68 2c UtfToTChar(path,
f0a0: 0a 09 09 20 20 20 20 63 75 72 72 65 6e 74 50 61 ... currentPa
f0b0: 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 2d 20 thEndPosition -
f0c0: 70 61 74 68 2c 20 26 64 73 29 3b 0a 0a 09 20 20 path, &ds);...
f0d0: 20 20 69 66 20 28 47 65 74 46 69 6c 65 41 74 74 if (GetFileAtt
f0e0: 72 69 62 75 74 65 73 45 78 28 6e 61 74 69 76 65 ributesEx(native
f0f0: 50 61 74 68 2c 0a 09 09 20 20 20 20 47 65 74 46 Path,... GetF
f100: 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 ileExInfoStandar
f110: 64 2c 20 26 64 61 74 61 29 20 21 3d 20 54 52 55 d, &data) != TRU
f120: 45 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 46 E) {.../*... * F
f130: 69 6c 65 20 64 6f 65 73 6e 27 74 20 65 78 69 73 ile doesn't exis
f140: 74 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 t.... */....if (
f150: 69 73 44 72 69 76 65 29 20 7b 0a 09 09 20 20 20 isDrive) {...
f160: 20 69 6e 74 20 6c 65 6e 20 3d 20 57 69 6e 49 73 int len = WinIs
f170: 52 65 73 65 72 76 65 64 28 70 61 74 68 29 3b 0a Reserved(path);.
f180: 0a 09 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e ... if (len >
f190: 20 30 29 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 0) {..../*....
f1a0: 2a 20 41 63 74 75 61 6c 6c 79 20 69 74 20 64 6f * Actually it do
f1b0: 65 73 20 65 78 69 73 74 20 2d 20 43 4f 4d 31 2c es exist - COM1,
f1c0: 20 65 74 63 2e 0a 09 09 09 20 2a 2f 0a 0a 09 09 etc..... */....
f1d0: 09 69 6e 74 20 69 3b 0a 0a 09 09 09 66 6f 72 20 .int i;.....for
f1e0: 28 69 3d 30 20 3b 20 69 3c 6c 65 6e 20 3b 20 69 (i=0 ; i<len ; i
f1f0: 2b 2b 29 20 7b 0a 09 09 09 20 20 20 20 57 43 48 ++) {.... WCH
f200: 41 52 20 77 63 20 3d 20 28 28 57 43 48 41 52 20 AR wc = ((WCHAR
f210: 2a 29 20 6e 61 74 69 76 65 50 61 74 68 29 5b 69 *) nativePath)[i
f220: 5d 3b 0a 0a 09 09 09 20 20 20 20 69 66 20 28 77 ];..... if (w
f230: 63 20 3e 3d 20 4c 27 61 27 29 20 7b 0a 09 09 09 c >= L'a') {....
f240: 09 77 63 20 2d 3d 20 28 4c 27 61 27 20 2d 20 4c .wc -= (L'a' - L
f250: 27 41 27 29 3b 0a 09 09 09 09 28 28 57 43 48 41 'A');.....((WCHA
f260: 52 20 2a 29 20 6e 61 74 69 76 65 50 61 74 68 29 R *) nativePath)
f270: 5b 69 5d 20 3d 20 77 63 3b 0a 09 09 09 20 20 20 [i] = wc;....
f280: 20 7d 0a 09 09 09 7d 0a 09 09 09 54 63 6c 5f 44 }....}....Tcl_D
f290: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 StringAppend(&ds
f2a0: 4e 6f 72 6d 2c 0a 09 09 09 09 28 63 6f 6e 73 74 Norm,.....(const
f2b0: 20 63 68 61 72 20 2a 29 6e 61 74 69 76 65 50 61 char *)nativePa
f2c0: 74 68 2c 0a 09 09 09 09 28 69 6e 74 29 28 73 69 th,.....(int)(si
f2d0: 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20 6c 65 zeof(WCHAR) * le
f2e0: 6e 29 29 3b 0a 09 09 09 6c 61 73 74 56 61 6c 69 n));....lastVali
f2f0: 64 50 61 74 68 45 6e 64 20 3d 20 63 75 72 72 65 dPathEnd = curre
f300: 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
f310: 6e 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 n;... } else
f320: 69 66 20 28 6e 65 78 74 43 68 65 63 6b 70 6f 69 if (nextCheckpoi
f330: 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 2f 2a nt == 0) {..../*
f340: 20 50 61 74 68 20 73 74 61 72 74 73 20 77 69 74 Path starts wit
f350: 68 20 61 20 64 72 69 76 65 20 64 65 73 69 67 6e h a drive design
f360: 61 74 69 6f 6e 0a 09 09 09 20 2a 20 74 68 61 74 ation.... * that
f370: 27 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 's not actually
f380: 6f 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 09 on the system...
f390: 09 09 20 2a 20 57 65 20 73 74 69 6c 6c 20 6d 75 .. * We still mu
f3a0: 73 74 20 6e 6f 72 6d 61 6c 69 7a 65 20 75 70 20 st normalize up
f3b0: 70 61 73 74 20 74 68 65 0a 09 09 09 20 2a 20 66 past the.... * f
f3c0: 69 72 73 74 20 73 65 70 61 72 61 74 6f 72 2e 20 irst separator.
f3d0: 20 5b 42 75 67 20 33 36 30 33 34 33 34 5d 20 2a [Bug 3603434] *
f3e0: 2f 0a 09 09 09 63 75 72 72 65 6e 74 50 61 74 68 /....currentPath
f3f0: 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 09 EndPosition++;..
f400: 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 54 63 6c . }...}...Tcl
f410: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
f420: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 );...break;..
f430: 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 }... /*..
f440: 20 20 2a 20 46 69 6c 65 20 27 6e 61 74 69 76 65 * File 'native
f450: 50 61 74 68 27 20 64 6f 65 73 20 65 78 69 73 74 Path' does exist
f460: 20 69 66 20 77 65 20 67 65 74 20 68 65 72 65 2e if we get here.
f470: 20 57 65 20 6e 6f 77 20 77 61 6e 74 20 74 6f 0a We now want to.
f480: 09 20 20 20 20 20 2a 20 63 68 65 63 6b 20 69 66 . * check if
f490: 20 69 74 20 69 73 20 61 20 73 79 6d 6c 69 6e 6b it is a symlink
f4a0: 20 61 6e 64 20 6f 74 68 65 72 77 69 73 65 20 63 and otherwise c
f4b0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 ontinue with the
f4c0: 0a 09 20 20 20 20 20 2a 20 72 65 73 74 20 6f 66 .. * rest of
f4d0: 20 74 68 65 20 70 61 74 68 2e 0a 09 20 20 20 20 the path...
f4e0: 20 2a 2f 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 */... /*..
f4f0: 20 20 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 73 * Check for s
f500: 79 6d 6c 69 6e 6b 73 2c 20 65 78 63 65 70 74 20 ymlinks, except
f510: 61 74 20 6c 61 73 74 20 63 6f 6d 70 6f 6e 65 6e at last componen
f520: 74 20 6f 66 20 70 61 74 68 20 28 77 65 0a 09 20 t of path (we..
f530: 20 20 20 20 2a 20 64 6f 6e 27 74 20 66 6f 6c 6c * don't foll
f540: 6f 77 20 66 69 6e 61 6c 20 73 79 6d 6c 69 6e 6b ow final symlink
f550: 73 29 2e 20 41 6c 73 6f 20 61 20 64 72 69 76 65 s). Also a drive
f560: 20 28 43 3a 2f 29 20 66 6f 72 0a 09 20 20 20 20 (C:/) for..
f570: 20 2a 20 65 78 61 6d 70 6c 65 2c 20 6d 61 79 20 * example, may
f580: 73 6f 6d 65 74 69 6d 65 73 20 68 61 76 65 20 74 sometimes have t
f590: 68 65 20 72 65 70 61 72 73 65 20 66 6c 61 67 20 he reparse flag
f5a0: 73 65 74 20 66 6f 72 20 73 6f 6d 65 0a 09 20 20 set for some..
f5b0: 20 20 20 2a 20 72 65 61 73 6f 6e 20 49 20 64 6f * reason I do
f5c0: 6e 27 74 20 75 6e 64 65 72 73 74 61 6e 64 2e 20 n't understand.
f5d0: 57 65 20 74 68 65 72 65 66 6f 72 65 20 64 6f 6e We therefore don
f5e0: 27 74 20 70 65 72 66 6f 72 6d 20 74 68 69 73 0a 't perform this.
f5f0: 09 20 20 20 20 20 2a 20 63 68 65 63 6b 20 66 6f . * check fo
f600: 72 20 64 72 69 76 65 73 2e 0a 09 20 20 20 20 20 r drives...
f610: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 63 75 72 */... if (cur
f620: 20 21 3d 20 30 20 26 26 20 21 69 73 44 72 69 76 != 0 && !isDriv
f630: 65 20 26 26 0a 09 09 20 20 20 20 64 61 74 61 2e e &&... data.
f640: 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 dwFileAttributes
f650: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 & FILE_ATTRIBUT
f660: 45 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 29 E_REPARSE_POINT)
f670: 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20 2a 74 6f 20 {...Tcl_Obj *to
f680: 3d 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 = WinReadLinkDir
f690: 65 63 74 6f 72 79 28 6e 61 74 69 76 65 50 61 74 ectory(nativePat
f6a0: 68 29 3b 0a 0a 09 09 69 66 20 28 74 6f 20 21 3d h);....if (to !=
f6b0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 2f NULL) {... /
f6c0: 2a 0a 09 09 20 20 20 20 20 2a 20 52 65 61 64 20 *... * Read
f6d0: 74 68 65 20 72 65 70 61 72 73 65 20 70 6f 69 6e the reparse poin
f6e0: 74 20 6f 6b 2e 20 4e 6f 77 2c 20 72 65 70 61 72 t ok. Now, repar
f6f0: 73 65 20 70 6f 69 6e 74 73 20 6e 65 65 64 0a 09 se points need..
f700: 09 20 20 20 20 20 2a 20 6e 6f 74 20 62 65 20 6e . * not be n
f710: 6f 72 6d 61 6c 69 7a 65 64 2c 20 6f 74 68 65 72 ormalized, other
f720: 77 69 73 65 20 77 65 20 63 6f 75 6c 64 20 75 73 wise we could us
f730: 65 3a 0a 09 09 20 20 20 20 20 2a 0a 09 09 20 20 e:... *...
f740: 20 20 20 2a 20 54 63 6c 5f 47 65 74 53 74 72 69 * Tcl_GetStri
f750: 6e 67 46 72 6f 6d 4f 62 6a 28 74 6f 2c 20 26 70 ngFromObj(to, &p
f760: 61 74 68 4c 65 6e 29 3b 0a 09 09 20 20 20 20 20 athLen);...
f770: 2a 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 * nextCheckpoint
f780: 20 3d 20 70 61 74 68 4c 65 6e 3b 0a 09 09 20 20 = pathLen;...
f790: 20 20 20 2a 0a 09 09 20 20 20 20 20 2a 20 53 6f *... * So
f7a0: 2c 20 69 6e 73 74 65 61 64 20 77 65 20 68 61 76 , instead we hav
f7b0: 65 20 74 6f 20 73 74 61 72 74 20 66 72 6f 6d 20 e to start from
f7c0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 09 the beginning...
f7d0: 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 . */....
f7e0: 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d nextCheckpoint =
f7f0: 20 30 3b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 0;... Tcl_Ap
f800: 70 65 6e 64 54 6f 4f 62 6a 28 74 6f 2c 20 63 75 pendToObj(to, cu
f810: 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 rrentPathEndPosi
f820: 74 69 6f 6e 2c 20 2d 31 29 3b 0a 0a 09 09 20 20 tion, -1);....
f830: 20 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 43 6f /*... * Co
f840: 6e 76 65 72 74 20 6c 69 6e 6b 20 74 6f 20 66 6f nvert link to fo
f850: 72 77 61 72 64 20 73 6c 61 73 68 65 73 2e 0a 09 rward slashes...
f860: 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 . */....
f870: 66 6f 72 20 28 70 61 74 68 20 3d 20 54 63 6c 5f for (path = Tcl_
f880: 47 65 74 53 74 72 69 6e 67 28 74 6f 29 3b 20 2a GetString(to); *
f890: 70 61 74 68 20 21 3d 20 30 3b 20 70 61 74 68 2b path != 0; path+
f8a0: 2b 29 20 7b 0a 09 09 09 69 66 20 28 2a 70 61 74 +) {....if (*pat
f8b0: 68 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 09 09 h == '\\') {....
f8c0: 20 20 20 20 2a 70 61 74 68 20 3d 20 27 2f 27 3b *path = '/';
f8d0: 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 ....}... }...
f8e0: 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c 5f 47 path = Tcl_G
f8f0: 65 74 53 74 72 69 6e 67 28 74 6f 29 3b 0a 09 09 etString(to);...
f900: 20 20 20 20 63 75 72 72 65 6e 74 50 61 74 68 45 currentPathE
f910: 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 20 70 61 74 ndPosition = pat
f920: 68 20 2b 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 h + nextCheckpoi
f930: 6e 74 3b 0a 09 09 20 20 20 20 69 66 20 28 74 65 nt;... if (te
f940: 6d 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 mp != NULL) {...
f950: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
f960: 74 28 74 65 6d 70 29 3b 0a 09 09 20 20 20 20 7d t(temp);... }
f970: 0a 09 09 20 20 20 20 74 65 6d 70 20 3d 20 74 6f ... temp = to
f980: 3b 0a 0a 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 ;.... /*...
f990: 20 20 20 2a 20 52 65 73 65 74 20 76 61 72 69 61 * Reset varia
f9a0: 62 6c 65 73 20 73 6f 20 77 65 20 63 61 6e 20 72 bles so we can r
f9b0: 65 73 74 61 72 74 20 6e 6f 72 6d 61 6c 69 7a 61 estart normaliza
f9c0: 74 69 6f 6e 2e 0a 09 09 20 20 20 20 20 2a 2f 0a tion.... */.
f9d0: 0a 09 09 20 20 20 20 69 73 44 72 69 76 65 20 3d ... isDrive =
f9e0: 20 31 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 1;... Tcl_DS
f9f0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 4e 6f 72 tringFree(&dsNor
fa00: 6d 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 m);... Tcl_DS
fa10: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
fa20: 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a .. continue;.
fa30: 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 6e ..}.. }..#ifn
fa40: 64 65 66 20 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 def TclNORM_LONG
fa50: 5f 50 41 54 48 0a 09 20 20 20 20 2f 2a 0a 09 20 _PATH.. /*..
fa60: 20 20 20 20 2a 20 4e 6f 77 20 77 65 20 63 6f 6e * Now we con
fa70: 76 65 72 74 20 74 68 65 20 74 61 69 6c 20 6f 66 vert the tail of
fa80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 the current pat
fa90: 68 20 74 6f 20 69 74 73 20 27 6c 6f 6e 67 0a 09 h to its 'long..
faa0: 20 20 20 20 20 2a 20 66 6f 72 6d 27 2c 20 61 6e * form', an
fab0: 64 20 61 70 70 65 6e 64 20 69 74 20 74 6f 20 27 d append it to '
fac0: 64 73 4e 6f 72 6d 27 20 77 68 69 63 68 20 68 6f dsNorm' which ho
fad0: 6c 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a lds the current.
fae0: 09 20 20 20 20 20 2a 20 6e 6f 72 6d 61 6c 69 7a . * normaliz
faf0: 65 64 20 70 61 74 68 0a 09 20 20 20 20 20 2a 2f ed path.. */
fb00: 0a 0a 09 20 20 20 20 69 66 20 28 69 73 44 72 69 ... if (isDri
fb10: 76 65 29 20 7b 0a 09 09 57 43 48 41 52 20 64 72 ve) {...WCHAR dr
fb20: 69 76 65 20 3d 20 28 28 57 43 48 41 52 20 2a 29 ive = ((WCHAR *)
fb30: 20 6e 61 74 69 76 65 50 61 74 68 29 5b 30 5d 3b nativePath)[0];
fb40: 0a 0a 09 09 69 66 20 28 64 72 69 76 65 20 3e 3d ....if (drive >=
fb50: 20 4c 27 61 27 29 20 7b 0a 09 09 20 20 20 20 64 L'a') {... d
fb60: 72 69 76 65 20 2d 3d 20 28 4c 27 61 27 20 2d 20 rive -= (L'a' -
fb70: 4c 27 41 27 29 3b 0a 09 09 20 20 20 20 28 28 57 L'A');... ((W
fb80: 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 61 CHAR *) nativePa
fb90: 74 68 29 5b 30 5d 20 3d 20 64 72 69 76 65 3b 0a th)[0] = drive;.
fba0: 09 09 7d 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e ..}...Tcl_DStrin
fbb0: 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c gAppend(&dsNorm,
fbc0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 6e (const char *)n
fbd0: 61 74 69 76 65 50 61 74 68 2c 0a 09 09 09 54 63 ativePath,....Tc
fbe0: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 l_DStringLength(
fbf0: 26 64 73 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c &ds));.. } el
fc00: 73 65 20 7b 0a 09 09 63 68 61 72 20 2a 63 68 65 se {...char *che
fc10: 63 6b 44 6f 74 73 20 3d 20 4e 55 4c 4c 3b 0a 0a ckDots = NULL;..
fc20: 09 09 69 66 20 28 6c 61 73 74 56 61 6c 69 64 50 ..if (lastValidP
fc30: 61 74 68 45 6e 64 5b 31 5d 20 3d 3d 20 27 2e 27 athEnd[1] == '.'
fc40: 29 20 7b 0a 09 09 20 20 20 20 63 68 65 63 6b 44 ) {... checkD
fc50: 6f 74 73 20 3d 20 6c 61 73 74 56 61 6c 69 64 50 ots = lastValidP
fc60: 61 74 68 45 6e 64 20 2b 20 31 3b 0a 09 09 20 20 athEnd + 1;...
fc70: 20 20 77 68 69 6c 65 20 28 63 68 65 63 6b 44 6f while (checkDo
fc80: 74 73 20 3c 20 63 75 72 72 65 6e 74 50 61 74 68 ts < currentPath
fc90: 45 6e 64 50 6f 73 69 74 69 6f 6e 29 20 7b 0a 09 EndPosition) {..
fca0: 09 09 69 66 20 28 2a 63 68 65 63 6b 44 6f 74 73 ..if (*checkDots
fcb0: 20 21 3d 20 27 2e 27 29 20 7b 0a 09 09 09 20 20 != '.') {....
fcc0: 20 20 63 68 65 63 6b 44 6f 74 73 20 3d 20 4e 55 checkDots = NU
fcd0: 4c 4c 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b LL;.... break
fce0: 3b 0a 09 09 09 7d 0a 09 09 09 63 68 65 63 6b 44 ;....}....checkD
fcf0: 6f 74 73 2b 2b 3b 0a 09 09 20 20 20 20 7d 0a 09 ots++;... }..
fd00: 09 7d 0a 09 09 69 66 20 28 63 68 65 63 6b 44 6f .}...if (checkDo
fd10: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 ts != NULL) {...
fd20: 20 20 20 20 69 6e 74 20 64 6f 74 4c 65 6e 20 3d int dotLen =
fd30: 20 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 currentPathEndP
fd40: 6f 73 69 74 69 6f 6e 2d 6c 61 73 74 56 61 6c 69 osition-lastVali
fd50: 64 50 61 74 68 45 6e 64 3b 0a 0a 09 09 20 20 20 dPathEnd;....
fd60: 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 50 61 74 /*... * Pat
fd70: 68 20 69 73 20 6a 75 73 74 20 64 6f 74 73 2e 20 h is just dots.
fd80: 57 65 20 73 68 6f 75 6c 64 6e 27 74 20 72 65 61 We shouldn't rea
fd90: 6c 6c 79 20 65 76 65 72 20 73 65 65 20 61 0a 09 lly ever see a..
fda0: 09 20 20 20 20 20 2a 20 70 61 74 68 20 6c 69 6b . * path lik
fdb0: 65 20 74 68 61 74 2e 20 48 6f 77 65 76 65 72 2c e that. However,
fdc0: 20 74 6f 20 62 65 20 6e 69 63 65 20 77 65 20 61 to be nice we a
fdd0: 74 20 6c 65 61 73 74 0a 09 09 20 20 20 20 20 2a t least... *
fde0: 20 64 6f 6e 27 74 20 6d 61 6e 67 6c 65 20 74 68 don't mangle th
fdf0: 65 20 70 61 74 68 20 2d 20 77 65 20 6a 75 73 74 e path - we just
fe00: 20 61 64 64 20 74 68 65 20 64 6f 74 73 20 61 73 add the dots as
fe10: 20 61 0a 09 09 20 20 20 20 20 2a 20 70 61 74 68 a... * path
fe20: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 63 6f 6e segment and con
fe30: 74 69 6e 75 65 2e 0a 09 09 20 20 20 20 20 2a 2f tinue.... */
fe40: 0a 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 .... Tcl_DStr
fe50: 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 ingAppend(&dsNor
fe60: 6d 2c 20 28 28 63 6f 6e 73 74 20 63 68 61 72 20 m, ((const char
fe70: 2a 29 6e 61 74 69 76 65 50 61 74 68 29 0a 09 09 *)nativePath)...
fe80: 09 20 20 20 20 2b 20 54 63 6c 5f 44 53 74 72 69 . + Tcl_DStri
fe90: 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 0a 09 09 ngLength(&ds)...
fea0: 09 20 20 20 20 2d 20 28 64 6f 74 4c 65 6e 20 2a . - (dotLen *
feb0: 20 73 69 7a 65 6f 66 28 54 43 48 41 52 29 29 2c sizeof(TCHAR)),
fec0: 0a 09 09 09 20 20 20 20 28 69 6e 74 29 28 64 6f .... (int)(do
fed0: 74 4c 65 6e 20 2a 20 73 69 7a 65 6f 66 28 54 43 tLen * sizeof(TC
fee0: 48 41 52 29 29 29 3b 0a 09 09 7d 20 65 6c 73 65 HAR)));...} else
fef0: 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 {... /*...
ff00: 20 20 20 2a 20 4e 6f 72 6d 61 6c 20 70 61 74 68 * Normal path
ff10: 2e 0a 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 .... */....
ff20: 20 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 WIN32_FIND_DA
ff30: 54 41 57 20 66 44 61 74 61 3b 0a 09 09 20 20 20 TAW fData;...
ff40: 20 48 41 4e 44 4c 45 20 68 61 6e 64 6c 65 3b 0a HANDLE handle;.
ff50: 0a 09 09 20 20 20 20 68 61 6e 64 6c 65 20 3d 20 ... handle =
ff60: 46 69 6e 64 46 69 72 73 74 46 69 6c 65 57 28 28 FindFirstFileW((
ff70: 57 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 WCHAR *) nativeP
ff80: 61 74 68 2c 20 26 66 44 61 74 61 29 3b 0a 09 09 ath, &fData);...
ff90: 20 20 20 20 69 66 20 28 68 61 6e 64 6c 65 20 3d if (handle =
ffa0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 = INVALID_HANDLE
ffb0: 5f 56 41 4c 55 45 29 20 7b 0a 09 09 09 2f 2a 0a _VALUE) {..../*.
ffc0: 09 09 09 20 2a 20 54 68 69 73 20 69 73 20 75 73 ... * This is us
ffd0: 75 61 6c 6c 79 20 74 68 65 20 27 2f 27 20 69 6e ually the '/' in
ffe0: 20 27 63 3a 2f 27 20 61 74 20 65 6e 64 20 6f 66 'c:/' at end of
fff0: 0a 09 09 09 20 2a 20 73 74 72 69 6e 67 2e 0a 09 .... * string...
10000 09 09 20 2a 2f 0a 0a 09 09 09 54 63 6c 5f 44 53 .. */.....Tcl_DS
10010 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e tringAppend(&dsN
10020 6f 72 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 orm, (const char
10030 20 2a 29 20 4c 22 2f 22 2c 0a 09 09 09 09 73 69 *) L"/",.....si
10040 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 09 09 zeof(WCHAR));...
10050 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 } else {....
10060 57 43 48 41 52 20 2a 6e 61 74 69 76 65 4e 61 6d WCHAR *nativeNam
10070 65 3b 0a 0a 09 09 09 69 66 20 28 66 44 61 74 61 e;.....if (fData
10080 2e 63 46 69 6c 65 4e 61 6d 65 5b 30 5d 20 21 3d .cFileName[0] !=
10090 20 27 5c 30 27 29 20 7b 0a 09 09 09 20 20 20 20 '\0') {....
100a0 6e 61 74 69 76 65 4e 61 6d 65 20 3d 20 66 44 61 nativeName = fDa
100b0 74 61 2e 63 46 69 6c 65 4e 61 6d 65 3b 0a 09 09 ta.cFileName;...
100c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 20 20 20 .} else {....
100d0 20 6e 61 74 69 76 65 4e 61 6d 65 20 3d 20 66 44 nativeName = fD
100e0 61 74 61 2e 63 41 6c 74 65 72 6e 61 74 65 46 69 ata.cAlternateFi
100f0 6c 65 4e 61 6d 65 3b 0a 09 09 09 7d 0a 09 09 09 leName;....}....
10100 46 69 6e 64 43 6c 6f 73 65 28 68 61 6e 64 6c 65 FindClose(handle
10110 29 3b 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e );....Tcl_DStrin
10120 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c gAppend(&dsNorm,
10130 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 (const char *)
10140 4c 22 2f 22 2c 0a 09 09 09 09 73 69 7a 65 6f 66 L"/",.....sizeof
10150 28 57 43 48 41 52 29 29 3b 0a 09 09 09 54 63 6c (WCHAR));....Tcl
10160 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 _DStringAppend(&
10170 64 73 4e 6f 72 6d 2c 0a 09 09 09 09 28 63 6f 6e dsNorm,.....(con
10180 73 74 20 63 68 61 72 20 2a 29 20 6e 61 74 69 76 st char *) nativ
10190 65 4e 61 6d 65 2c 0a 09 09 09 09 28 69 6e 74 29 eName,.....(int)
101a0 20 28 77 63 73 6c 65 6e 28 6e 61 74 69 76 65 4e (wcslen(nativeN
101b0 61 6d 65 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 ame)*sizeof(WCHA
101c0 52 29 29 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 R)));... }...
101d0 7d 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 }.. }.#endif
101e0 2f 2a 20 21 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 /* !TclNORM_LONG
101f0 5f 50 41 54 48 20 2a 2f 0a 09 20 20 20 20 54 63 _PATH */.. Tc
10200 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 l_DStringFree(&d
10210 73 29 3b 0a 09 20 20 20 20 6c 61 73 74 56 61 6c s);.. lastVal
10220 69 64 50 61 74 68 45 6e 64 20 3d 20 63 75 72 72 idPathEnd = curr
10230 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 entPathEndPositi
10240 6f 6e 3b 0a 09 20 20 20 20 69 66 20 28 63 75 72 on;.. if (cur
10250 20 3d 3d 20 30 29 20 7b 0a 09 09 62 72 65 61 6b == 0) {...break
10260 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f ;.. }... /
10270 2a 0a 09 20 20 20 20 20 2a 20 49 66 20 77 65 20 *.. * If we
10280 67 65 74 20 68 65 72 65 2c 20 77 65 27 76 65 20 get here, we've
10290 67 6f 74 20 70 61 73 74 20 6f 6e 65 20 64 69 72 got past one dir
102a0 65 63 74 6f 72 79 20 64 65 6c 69 6d 69 74 65 72 ectory delimiter
102b0 2c 20 73 6f 0a 09 20 20 20 20 20 2a 20 77 65 20 , so.. * we
102c0 6b 6e 6f 77 20 69 74 20 69 73 20 6e 6f 20 6c 6f know it is no lo
102d0 6e 67 65 72 20 61 20 64 72 69 76 65 2e 0a 09 20 nger a drive...
102e0 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 73 44 */... isD
102f0 72 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 09 63 75 rive = 0;..}..cu
10300 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 rrentPathEndPosi
10310 74 69 6f 6e 2b 2b 3b 0a 0a 23 69 66 64 65 66 20 tion++;..#ifdef
10320 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 54 TclNORM_LONG_PAT
10330 48 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72 H../*.. * Conver
10340 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 6e 6f t the entire kno
10350 77 6e 20 70 61 74 68 20 74 6f 20 6c 6f 6e 67 20 wn path to long
10360 66 6f 72 6d 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 form... */...if
10370 28 31 29 20 7b 0a 09 20 20 20 20 57 43 48 41 52 (1) {.. WCHAR
10380 20 77 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d wpath[MAX_PATH]
10390 3b 0a 09 20 20 20 20 63 6f 6e 73 74 20 54 43 48 ;.. const TCH
103a0 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 20 3d AR *nativePath =
103b0 0a 09 09 20 20 20 20 54 63 6c 5f 57 69 6e 55 74 ... Tcl_WinUt
103c0 66 54 6f 54 43 68 61 72 28 70 61 74 68 2c 20 6c fToTChar(path, l
103d0 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20 astValidPathEnd
103e0 2d 20 70 61 74 68 2c 20 26 64 73 29 3b 0a 09 20 - path, &ds);..
103f0 20 20 20 44 57 4f 52 44 20 77 70 61 74 68 6c 65 DWORD wpathle
10400 6e 20 3d 20 47 65 74 4c 6f 6e 67 50 61 74 68 4e n = GetLongPathN
10410 61 6d 65 50 72 6f 63 28 6e 61 74 69 76 65 50 61 ameProc(nativePa
10420 74 68 2c 0a 09 09 20 20 20 20 28 54 43 48 41 52 th,... (TCHAR
10430 20 2a 29 20 77 70 61 74 68 2c 20 4d 41 58 5f 50 *) wpath, MAX_P
10440 41 54 48 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 ATH);... /*..
10450 20 20 20 20 20 2a 20 57 65 20 68 61 76 65 20 74 * We have t
10460 6f 20 6d 61 6b 65 20 74 68 65 20 64 72 69 76 65 o make the drive
10470 20 6c 65 74 74 65 72 20 75 70 70 65 72 63 61 73 letter uppercas
10480 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 e... */...
10490 20 20 69 66 20 28 77 70 61 74 68 5b 30 5d 20 3e if (wpath[0] >
104a0 3d 20 4c 27 61 27 29 20 7b 0a 09 09 77 70 61 74 = L'a') {...wpat
104b0 68 5b 30 5d 20 2d 3d 20 28 4c 27 61 27 20 2d 20 h[0] -= (L'a' -
104c0 4c 27 41 27 29 3b 0a 09 20 20 20 20 7d 0a 09 20 L'A');.. }..
104d0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 Tcl_DStringAp
104e0 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 28 63 pend(&dsNorm, (c
104f0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 77 70 61 onst char *) wpa
10500 74 68 2c 0a 09 09 20 20 20 20 77 70 61 74 68 6c th,... wpathl
10510 65 6e 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 en * sizeof(WCHA
10520 52 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 R));.. Tcl_DS
10530 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
10540 09 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 63 6c .}.#endif /* Tcl
10550 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 54 48 20 2a NORM_LONG_PATH *
10560 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a /. }.. /*.
10570 20 20 20 20 20 2a 20 43 6f 6d 6d 6f 6e 20 63 6f * Common co
10580 64 65 20 70 61 74 68 20 66 6f 72 20 61 6c 6c 20 de path for all
10590 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d Windows platform
105a0 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 s.. */..
105b0 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d nextCheckpoint =
105c0 20 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 currentPathEndP
105d0 6f 73 69 74 69 6f 6e 20 2d 20 70 61 74 68 3b 0a osition - path;.
105e0 20 20 20 20 69 66 20 28 6c 61 73 74 56 61 6c 69 if (lastVali
105f0 64 50 61 74 68 45 6e 64 20 21 3d 20 4e 55 4c 4c dPathEnd != NULL
10600 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6e 63 ) {../*.. * Conc
10610 61 74 65 6e 61 74 65 20 74 68 65 20 6e 6f 72 6d atenate the norm
10620 61 6c 69 7a 65 64 20 73 74 72 69 6e 67 20 69 6e alized string in
10630 20 64 73 4e 6f 72 6d 20 77 69 74 68 20 74 68 65 dsNorm with the
10640 20 74 61 69 6c 20 6f 66 20 74 68 65 0a 09 20 2a tail of the.. *
10650 20 70 61 74 68 20 77 68 69 63 68 20 77 65 20 64 path which we d
10660 69 64 6e 27 74 20 72 65 63 6f 67 6e 69 73 65 2e idn't recognise.
10670 20 54 68 65 20 73 74 72 69 6e 67 20 69 6e 20 64 The string in d
10680 73 4e 6f 72 6d 20 69 73 20 69 6e 20 74 68 65 0a sNorm is in the.
10690 09 20 2a 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 . * native encod
106a0 69 6e 67 2c 20 73 6f 20 77 65 20 68 61 76 65 20 ing, so we have
106b0 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f to convert it to
106c0 20 55 74 66 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c Utf... */...Tcl
106d0 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 _WinTCharToUtf((
106e0 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 29 20 54 const TCHAR *) T
106f0 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
10700 26 64 73 4e 6f 72 6d 29 2c 0a 09 09 54 63 6c 5f &dsNorm),...Tcl_
10710 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 DStringLength(&d
10720 73 4e 6f 72 6d 29 2c 20 26 64 73 29 3b 0a 09 6e sNorm), &ds);..n
10730 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d 20 extCheckpoint =
10740 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 Tcl_DStringLengt
10750 68 28 26 64 73 29 3b 0a 09 69 66 20 28 2a 6c 61 h(&ds);..if (*la
10760 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20 21 stValidPathEnd !
10770 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 = 0) {.. /*..
10780 20 20 20 20 20 2a 20 4e 6f 74 20 74 68 65 20 65 * Not the e
10790 6e 64 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 nd of the string
107a0 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 ... */...
107b0 20 69 6e 74 20 6c 65 6e 3b 0a 09 20 20 20 20 63 int len;.. c
107c0 68 61 72 20 2a 70 61 74 68 3b 0a 09 20 20 20 20 har *path;..
107d0 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 50 61 74 68 Tcl_Obj *tmpPath
107e0 50 74 72 3b 0a 0a 09 20 20 20 20 74 6d 70 50 61 Ptr;... tmpPa
107f0 74 68 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 thPtr = Tcl_NewS
10800 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 tringObj(Tcl_DSt
10810 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29 2c 0a ringValue(&ds),.
10820 09 09 20 20 20 20 6e 65 78 74 43 68 65 63 6b 70 .. nextCheckp
10830 6f 69 6e 74 29 3b 0a 09 20 20 20 20 54 63 6c 5f oint);.. Tcl_
10840 41 70 70 65 6e 64 54 6f 4f 62 6a 28 74 6d 70 50 AppendToObj(tmpP
10850 61 74 68 50 74 72 2c 20 6c 61 73 74 56 61 6c 69 athPtr, lastVali
10860 64 50 61 74 68 45 6e 64 2c 20 2d 31 29 3b 0a 09 dPathEnd, -1);..
10870 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c 5f 47 path = Tcl_G
10880 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
10890 74 6d 70 50 61 74 68 50 74 72 2c 20 26 6c 65 6e tmpPathPtr, &len
108a0 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 53 );.. Tcl_SetS
108b0 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 50 74 72 tringObj(pathPtr
108c0 2c 20 70 61 74 68 2c 20 6c 65 6e 29 3b 0a 09 20 , path, len);..
108d0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
108e0 75 6e 74 28 74 6d 70 50 61 74 68 50 74 72 29 3b unt(tmpPathPtr);
108f0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
10900 2f 2a 0a 09 20 20 20 20 20 2a 20 45 6e 64 20 6f /*.. * End o
10910 66 20 73 74 72 69 6e 67 20 77 61 73 20 72 65 61 f string was rea
10920 63 68 65 64 20 61 62 6f 76 65 2e 0a 09 20 20 20 ched above...
10930 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 53 */... Tcl_S
10940 65 74 53 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 etStringObj(path
10950 50 74 72 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 Ptr, Tcl_DString
10960 56 61 6c 75 65 28 26 64 73 29 2c 20 6e 65 78 74 Value(&ds), next
10970 43 68 65 63 6b 70 6f 69 6e 74 29 3b 0a 09 7d 0a Checkpoint);..}.
10980 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 .Tcl_DStringFree
10990 28 26 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 (&ds);. }.
109a0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
109b0 28 26 64 73 4e 6f 72 6d 29 3b 0a 0a 20 20 20 20 (&dsNorm);..
109c0 2f 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 6d /*. * This m
109d0 75 73 74 20 62 65 20 64 6f 6e 65 20 61 66 74 65 ust be done afte
109e0 72 20 77 65 20 61 72 65 20 74 6f 74 61 6c 6c 79 r we are totally
109f0 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 27 finished with '
10a00 70 61 74 68 27 20 61 73 20 77 65 20 61 72 65 0a path' as we are.
10a10 20 20 20 20 20 2a 20 73 68 61 72 69 6e 67 20 74 * sharing t
10a20 68 65 20 73 61 6d 65 20 75 6e 64 65 72 6c 79 69 he same underlyi
10a30 6e 67 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 ng string..
10a40 2a 2f 0a 0a 20 20 20 20 69 66 20 28 74 65 6d 70 */.. if (temp
10a50 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
10a60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 65 _DecrRefCount(te
10a70 6d 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 mp);. }..
10a80 72 65 74 75 72 6e 20 6e 65 78 74 43 68 65 63 6b return nextCheck
10a90 70 6f 69 6e 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a point;.}.../*. *
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
10af0 2a 20 54 63 6c 57 69 6e 56 6f 6c 75 6d 65 52 65 * TclWinVolumeRe
10b00 6c 61 74 69 76 65 4e 6f 72 6d 61 6c 69 7a 65 20 lativeNormalize
10b10 2d 2d 0a 20 2a 0a 20 2a 09 4f 6e 6c 79 20 57 69 --. *. *.Only Wi
10b20 6e 64 6f 77 73 20 68 61 73 20 76 6f 6c 75 6d 65 ndows has volume
10b30 2d 72 65 6c 61 74 69 76 65 20 70 61 74 68 73 2e -relative paths.
10b40 20 54 68 65 73 65 20 70 61 74 68 73 20 61 72 65 These paths are
10b50 20 72 61 74 68 65 72 20 72 61 72 65 2c 0a 20 2a rather rare,. *
10b60 09 62 75 74 20 69 74 20 69 73 20 6e 69 63 65 20 .but it is nice
10b70 69 66 20 54 63 6c 20 63 61 6e 20 68 61 6e 64 6c if Tcl can handl
10b80 65 20 74 68 65 6d 2e 20 49 74 20 69 73 20 6d 75 e them. It is mu
10b90 63 68 20 62 65 74 74 65 72 20 69 66 20 77 65 20 ch better if we
10ba0 63 61 6e 0a 20 2a 09 68 61 6e 64 6c 65 20 74 68 can. *.handle th
10bb0 65 6d 20 68 65 72 65 2c 20 72 61 74 68 65 72 20 em here, rather
10bc0 74 68 61 6e 20 69 6e 20 74 68 65 20 6e 61 74 69 than in the nati
10bd0 76 65 20 66 73 20 63 6f 64 65 2c 20 62 65 63 61 ve fs code, beca
10be0 75 73 65 20 77 65 20 72 65 61 6c 6c 79 0a 20 2a use we really. *
10bf0 09 6e 65 65 64 20 74 6f 20 68 61 76 65 20 61 20 .need to have a
10c00 72 65 61 6c 20 61 62 73 6f 6c 75 74 65 20 70 61 real absolute pa
10c10 74 68 20 6a 75 73 74 20 62 65 6c 6f 77 2e 0a 20 th just below..
10c20 2a 0a 20 2a 09 57 65 20 64 6f 20 6e 6f 74 20 6c *. *.We do not l
10c30 65 74 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 6f et this block co
10c40 6d 70 69 6c 65 20 6f 6e 20 6e 6f 6e 2d 57 69 6e mpile on non-Win
10c50 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 dows platforms b
10c60 65 63 61 75 73 65 20 74 68 65 0a 20 2a 09 74 65 ecause the. *.te
10c70 73 74 20 73 75 69 74 65 27 73 20 6d 61 6e 75 61 st suite's manua
10c80 6c 20 66 6f 72 63 69 6e 67 20 6f 66 20 74 63 6c l forcing of tcl
10c90 50 6c 61 74 66 6f 72 6d 20 63 61 6e 20 6f 74 68 Platform can oth
10ca0 65 72 77 69 73 65 20 63 61 75 73 65 20 74 68 69 erwise cause thi
10cb0 73 0a 20 2a 09 63 6f 64 65 20 70 61 74 68 20 74 s. *.code path t
10cc0 6f 20 62 65 20 65 78 65 63 75 74 65 64 2c 20 63 o be executed, c
10cd0 61 75 73 69 6e 67 20 76 61 72 69 6f 75 73 20 65 ausing various e
10ce0 72 72 6f 72 73 20 62 65 63 61 75 73 65 0a 20 2a rrors because. *
10cf0 09 76 6f 6c 75 6d 65 2d 72 65 6c 61 74 69 76 65 .volume-relative
10d00 20 70 61 74 68 73 20 72 65 61 6c 6c 79 20 64 6f paths really do
10d10 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 2a 0a 20 not exist.. *.
10d20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
10d30 76 61 6c 69 64 20 6e 6f 72 6d 61 6c 69 7a 65 64 valid normalized
10d40 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 53 69 64 path.. *. * Sid
10d50 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
10d60 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
10d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10db0 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 ----. */..Tcl_Ob
10dc0 6a 20 2a 0a 54 63 6c 57 69 6e 56 6f 6c 75 6d 65 j *.TclWinVolume
10dd0 52 65 6c 61 74 69 76 65 4e 6f 72 6d 61 6c 69 7a RelativeNormaliz
10de0 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 e(. Tcl_Inter
10df0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 63 p *interp,. c
10e00 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c onst char *path,
10e10 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 75 . Tcl_Obj **u
10e20 73 65 54 68 69 73 43 77 64 50 74 72 29 0a 7b 0a seThisCwdPtr).{.
10e30 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 62 73 Tcl_Obj *abs
10e40 6f 6c 75 74 65 50 61 74 68 2c 20 2a 75 73 65 54 olutePath, *useT
10e50 68 69 73 43 77 64 3b 0a 0a 20 20 20 20 75 73 65 hisCwd;.. use
10e60 54 68 69 73 43 77 64 20 3d 20 54 63 6c 5f 46 53 ThisCwd = Tcl_FS
10e70 47 65 74 43 77 64 28 69 6e 74 65 72 70 29 3b 0a GetCwd(interp);.
10e80 20 20 20 20 69 66 20 28 75 73 65 54 68 69 73 43 if (useThisC
10e90 77 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 wd == NULL) {..r
10ea0 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
10eb0 7d 0a 0a 20 20 20 20 69 66 20 28 70 61 74 68 5b }.. if (path[
10ec0 30 5d 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 2f 2a 0] == '/') {../*
10ed0 0a 09 20 2a 20 50 61 74 68 20 6f 66 20 66 6f 72 .. * Path of for
10ee0 6d 20 2f 66 6f 6f 2f 62 61 72 20 77 68 69 63 68 m /foo/bar which
10ef0 20 69 73 20 61 20 70 61 74 68 20 69 6e 20 74 68 is a path in th
10f00 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 e root directory
10f10 20 6f 66 20 74 68 65 0a 09 20 2a 20 63 75 72 72 of the.. * curr
10f20 65 6e 74 20 76 6f 6c 75 6d 65 2e 0a 09 20 2a 2f ent volume... */
10f30 0a 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 ...const char *d
10f40 72 69 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 rive = Tcl_GetSt
10f50 72 69 6e 67 28 75 73 65 54 68 69 73 43 77 64 29 ring(useThisCwd)
10f60 3b 0a 0a 09 61 62 73 6f 6c 75 74 65 50 61 74 68 ;...absolutePath
10f70 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 = Tcl_NewString
10f80 4f 62 6a 28 64 72 69 76 65 2c 32 29 3b 0a 09 54 Obj(drive,2);..T
10f90 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 cl_AppendToObj(a
10fa0 62 73 6f 6c 75 74 65 50 61 74 68 2c 20 70 61 74 bsolutePath, pat
10fb0 68 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 49 6e 63 h, -1);..Tcl_Inc
10fc0 72 52 65 66 43 6f 75 6e 74 28 61 62 73 6f 6c 75 rRefCount(absolu
10fd0 74 65 50 61 74 68 29 3b 0a 0a 09 2f 2a 0a 09 20 tePath);.../*..
10fe0 2a 20 57 65 20 68 61 76 65 20 61 20 72 65 66 43 * We have a refC
10ff0 6f 75 6e 74 20 6f 6e 20 74 68 65 20 63 77 64 2e ount on the cwd.
11000 0a 09 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 .. */. } else
11010 20 7b 0a 09 2f 2a 0a 09 20 2a 20 50 61 74 68 20 {../*.. * Path
11020 6f 66 20 66 6f 72 6d 20 43 3a 66 6f 6f 2f 62 61 of form C:foo/ba
11030 72 2c 20 62 75 74 20 74 68 69 73 20 6f 6e 6c 79 r, but this only
11040 20 6d 61 6b 65 73 20 73 65 6e 73 65 20 69 66 20 makes sense if
11050 74 68 65 20 63 77 64 20 69 73 0a 09 20 2a 20 61 the cwd is.. * a
11060 6c 73 6f 20 6f 6e 20 64 72 69 76 65 20 43 2e 0a lso on drive C..
11070 09 20 2a 2f 0a 0a 09 69 6e 74 20 63 77 64 4c 65 . */...int cwdLe
11080 6e 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a n;..const char *
11090 64 72 69 76 65 20 3d 0a 09 09 54 63 6c 5f 47 65 drive =...Tcl_Ge
110a0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 75 tStringFromObj(u
110b0 73 65 54 68 69 73 43 77 64 2c 20 26 63 77 64 4c seThisCwd, &cwdL
110c0 65 6e 29 3b 0a 09 63 68 61 72 20 64 72 69 76 65 en);..char drive
110d0 5f 63 75 72 20 3d 20 70 61 74 68 5b 30 5d 3b 0a _cur = path[0];.
110e0 0a 09 69 66 20 28 64 72 69 76 65 5f 63 75 72 20 ..if (drive_cur
110f0 3e 3d 20 27 61 27 29 20 7b 0a 09 20 20 20 20 64 >= 'a') {.. d
11100 72 69 76 65 5f 63 75 72 20 2d 3d 20 28 27 61 27 rive_cur -= ('a'
11110 20 2d 20 27 41 27 29 3b 0a 09 7d 0a 09 69 66 20 - 'A');..}..if
11120 28 64 72 69 76 65 5b 30 5d 20 3d 3d 20 64 72 69 (drive[0] == dri
11130 76 65 5f 63 75 72 29 20 7b 0a 09 20 20 20 20 61 ve_cur) {.. a
11140 62 73 6f 6c 75 74 65 50 61 74 68 20 3d 20 54 63 bsolutePath = Tc
11150 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 75 l_DuplicateObj(u
11160 73 65 54 68 69 73 43 77 64 29 3b 0a 0a 09 20 20 seThisCwd);...
11170 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 /*.. * We
11180 68 61 76 65 20 61 20 72 65 66 43 6f 75 6e 74 20 have a refCount
11190 6f 6e 20 74 68 65 20 63 77 64 2c 20 77 68 69 63 on the cwd, whic
111a0 68 20 77 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 h we will releas
111b0 65 20 6c 61 74 65 72 2e 0a 09 20 20 20 20 20 2a e later... *
111c0 2f 0a 0a 09 20 20 20 20 69 66 20 28 64 72 69 76 /... if (driv
111d0 65 5b 63 77 64 4c 65 6e 2d 31 5d 20 21 3d 20 27 e[cwdLen-1] != '
111e0 2f 27 20 26 26 20 28 70 61 74 68 5b 32 5d 20 21 /' && (path[2] !
111f0 3d 20 27 5c 30 27 29 29 20 7b 0a 09 09 2f 2a 0a = '\0')) {.../*.
11200 09 09 20 2a 20 4f 6e 6c 79 20 61 64 64 20 61 20 .. * Only add a
11210 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 69 66 20 trailing '/' if
11220 6e 65 65 64 65 64 2c 20 77 68 69 63 68 20 69 73 needed, which is
11230 20 69 66 20 74 68 65 72 65 20 69 73 6e 27 74 0a if there isn't.
11240 09 09 20 2a 20 6f 6e 65 20 61 6c 72 65 61 64 79 .. * one already
11250 2c 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 , and if we are
11260 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 64 64 69 going to be addi
11270 6e 67 20 73 6f 6d 65 20 6d 6f 72 65 0a 09 09 20 ng some more...
11280 2a 20 63 68 61 72 61 63 74 65 72 73 2e 0a 09 09 * characters....
11290 20 2a 2f 0a 0a 09 09 54 63 6c 5f 41 70 70 65 6e */....Tcl_Appen
112a0 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 65 50 dToObj(absoluteP
112b0 61 74 68 2c 20 22 2f 22 2c 20 31 29 3b 0a 09 20 ath, "/", 1);..
112c0 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 }..} else {..
112d0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
112e0 6f 75 6e 74 28 75 73 65 54 68 69 73 43 77 64 29 ount(useThisCwd)
112f0 3b 0a 09 20 20 20 20 75 73 65 54 68 69 73 43 77 ;.. useThisCw
11300 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 d = NULL;...
11310 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 70 /*.. * The p
11320 61 74 68 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 ath is not in th
11330 65 20 63 75 72 72 65 6e 74 20 64 72 69 76 65 2c e current drive,
11340 20 62 75 74 20 69 73 20 76 6f 6c 75 6d 65 2d 72 but is volume-r
11350 65 6c 61 74 69 76 65 2e 0a 09 20 20 20 20 20 2a elative... *
11360 20 54 68 65 20 77 61 79 20 54 63 6c 20 38 2e 33 The way Tcl 8.3
11370 20 68 61 6e 64 6c 65 73 20 74 68 69 73 20 69 73 handles this is
11380 20 74 68 61 74 20 69 74 20 74 72 65 61 74 73 20 that it treats
11390 73 75 63 68 20 61 20 70 61 74 68 20 61 73 0a 09 such a path as..
113a0 20 20 20 20 20 2a 20 72 65 6c 61 74 69 76 65 20 * relative
113b0 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 to the root of t
113c0 68 65 20 64 72 69 76 65 2e 20 57 65 20 74 68 65 he drive. We the
113d0 72 65 66 6f 72 65 20 62 65 68 61 76 65 20 74 68 refore behave th
113e0 65 20 73 61 6d 65 0a 09 20 20 20 20 20 2a 20 68 e same.. * h
113f0 65 72 65 2e 20 54 68 69 73 20 62 65 68 61 76 69 ere. This behavi
11400 6f 75 72 20 69 73 2c 20 68 6f 77 65 76 65 72 2c our is, however,
11410 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 74 68 different to th
11420 61 74 20 6f 66 20 74 68 65 0a 09 20 20 20 20 20 at of the..
11430 2a 20 77 69 6e 64 6f 77 73 20 63 6f 6d 6d 61 6e * windows comman
11440 64 2d 6c 69 6e 65 2e 20 49 66 20 77 65 20 77 61 d-line. If we wa
11450 6e 74 20 74 6f 20 66 69 78 20 74 68 69 73 20 61 nt to fix this a
11460 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 0a t some point in.
11470 09 20 20 20 20 20 2a 20 74 68 65 20 66 75 74 75 . * the futu
11480 72 65 20 28 61 74 20 74 68 65 20 65 78 70 65 6e re (at the expen
11490 73 65 20 6f 66 20 61 20 62 65 68 61 76 69 6f 75 se of a behaviou
114a0 72 20 63 68 61 6e 67 65 20 74 6f 20 54 63 6c 29 r change to Tcl)
114b0 2c 20 77 65 0a 09 20 20 20 20 20 2a 20 63 6f 75 , we.. * cou
114c0 6c 64 20 75 73 65 20 74 68 65 20 27 5f 64 67 65 ld use the '_dge
114d0 74 64 63 77 64 27 20 57 69 6e 33 32 20 41 50 49 tdcwd' Win32 API
114e0 20 74 6f 20 67 65 74 20 74 68 65 20 64 72 69 76 to get the driv
114f0 65 27 73 20 63 77 64 2e 0a 09 20 20 20 20 20 2a e's cwd... *
11500 2f 0a 0a 09 20 20 20 20 61 62 73 6f 6c 75 74 65 /... absolute
11510 50 61 74 68 20 3d 20 54 63 6c 5f 4e 65 77 53 74 Path = Tcl_NewSt
11520 72 69 6e 67 4f 62 6a 28 70 61 74 68 2c 20 32 29 ringObj(path, 2)
11530 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e ;.. Tcl_Appen
11540 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 65 50 dToObj(absoluteP
11550 61 74 68 2c 20 22 2f 22 2c 20 31 29 3b 0a 09 7d ath, "/", 1);..}
11560 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 ..Tcl_IncrRefCou
11570 6e 74 28 61 62 73 6f 6c 75 74 65 50 61 74 68 29 nt(absolutePath)
11580 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f ;..Tcl_AppendToO
11590 62 6a 28 61 62 73 6f 6c 75 74 65 50 61 74 68 2c bj(absolutePath,
115a0 20 70 61 74 68 2b 32 2c 20 2d 31 29 3b 0a 20 20 path+2, -1);.
115b0 20 20 7d 0a 20 20 20 20 2a 75 73 65 54 68 69 73 }. *useThis
115c0 43 77 64 50 74 72 20 3d 20 75 73 65 54 68 69 73 CwdPtr = useThis
115d0 43 77 64 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 Cwd;. return
115e0 61 62 73 6f 6c 75 74 65 50 61 74 68 3b 0a 7d 0a absolutePath;.}.
115f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
11600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11640 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4e 61 74 --. *. * TclpNat
11650 69 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65 64 20 iveToNormalized
11660 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 --. *. *.Convert
11670 20 6e 61 74 69 76 65 20 66 6f 72 6d 61 74 20 74 native format t
11680 6f 20 61 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 o a normalized p
11690 61 74 68 20 6f 62 6a 65 63 74 2c 20 77 69 74 68 ath object, with
116a0 20 72 65 66 43 6f 75 6e 74 20 6f 66 0a 20 2a 09 refCount of. *.
116b0 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 09 43 75 72 72 zero.. *. *.Curr
116c0 65 6e 74 6c 79 20 61 73 73 75 6d 65 73 20 61 6c ently assumes al
116d0 6c 20 6e 61 74 69 76 65 20 70 61 74 68 73 20 61 l native paths a
116e0 72 65 20 61 63 74 75 61 6c 6c 79 20 6e 6f 72 6d re actually norm
116f0 61 6c 69 7a 65 64 20 61 6c 72 65 61 64 79 2c 20 alized already,
11700 73 6f 0a 20 2a 09 69 66 20 74 68 65 20 70 61 74 so. *.if the pat
11710 68 20 67 69 76 65 6e 20 69 73 20 6e 6f 74 20 6e h given is not n
11720 6f 72 6d 61 6c 69 7a 65 64 20 74 68 69 73 20 77 ormalized this w
11730 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 6a 75 73 ill actually jus
11740 74 20 63 6f 6e 76 65 72 74 20 74 6f 0a 20 2a 09 t convert to. *.
11750 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 70 a valid string p
11760 61 74 68 2c 20 62 75 74 20 6e 6f 74 20 6e 65 63 ath, but not nec
11770 65 73 73 61 72 69 6c 79 20 61 20 6e 6f 72 6d 61 essarily a norma
11780 6c 69 7a 65 64 20 6f 6e 65 2e 0a 20 2a 0a 20 2a lized one.. *. *
11790 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 Results:. *.A v
117a0 61 6c 69 64 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 alid normalized
117b0 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 path.. *. * Side
117c0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
117d0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
117e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
117f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11820 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a ---. */..Tcl_Obj
11830 20 2a 0a 54 63 6c 70 4e 61 74 69 76 65 54 6f 4e *.TclpNativeToN
11840 6f 72 6d 61 6c 69 7a 65 64 28 0a 20 20 20 20 43 ormalized(. C
11850 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
11860 44 61 74 61 29 0a 7b 0a 20 20 20 20 54 63 6c 5f Data).{. Tcl_
11870 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 DString ds;.
11880 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b Tcl_Obj *objPtr;
11890 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 . int len;.
118a0 20 20 63 68 61 72 20 2a 63 6f 70 79 2c 20 2a 70 char *copy, *p
118b0 3b 0a 0a 20 20 20 20 54 63 6c 5f 57 69 6e 54 43 ;.. Tcl_WinTC
118c0 68 61 72 54 6f 55 74 66 28 28 63 6f 6e 73 74 20 harToUtf((const
118d0 54 43 48 41 52 20 2a 29 20 63 6c 69 65 6e 74 44 TCHAR *) clientD
118e0 61 74 61 2c 20 2d 31 2c 20 26 64 73 29 3b 0a 20 ata, -1, &ds);.
118f0 20 20 20 63 6f 70 79 20 3d 20 54 63 6c 5f 44 53 copy = Tcl_DS
11900 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29 3b tringValue(&ds);
11910 0a 20 20 20 20 6c 65 6e 20 3d 20 54 63 6c 5f 44 . len = Tcl_D
11920 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 StringLength(&ds
11930 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
11940 2a 20 43 65 72 74 61 69 6e 20 6e 61 74 69 76 65 * Certain native
11950 20 70 61 74 68 20 72 65 70 72 65 73 65 6e 74 61 path representa
11960 74 69 6f 6e 73 20 6f 6e 20 57 69 6e 64 6f 77 73 tions on Windows
11970 20 68 61 76 65 20 74 68 69 73 20 73 70 65 63 69 have this speci
11980 61 6c 20 70 72 65 66 69 78 0a 20 20 20 20 20 2a al prefix. *
11990 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 to indicate tha
119a0 74 20 74 68 65 79 20 61 72 65 20 74 6f 20 62 65 t they are to be
119b0 20 74 72 65 61 74 65 64 20 73 70 65 63 69 61 6c treated special
119c0 6c 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 0a ly. For example.
119d0 20 20 20 20 20 2a 20 65 78 74 72 65 6d 65 6c 79 * extremely
119e0 20 6c 6f 6e 67 20 70 61 74 68 73 2c 20 6f 72 20 long paths, or
119f0 73 79 6d 6c 69 6e 6b 73 2e 0a 20 20 20 20 20 2a symlinks.. *
11a00 2f 0a 0a 20 20 20 20 69 66 20 28 2a 63 6f 70 79 /.. if (*copy
11a10 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 69 66 20 == '\\') {..if
11a20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 63 6f (0 == strncmp(co
11a30 70 79 2c 22 5c 5c 3f 3f 5c 5c 22 2c 34 29 29 20 py,"\\??\\",4))
11a40 7b 0a 09 20 20 20 20 63 6f 70 79 20 2b 3d 20 34 {.. copy += 4
11a50 3b 0a 09 20 20 20 20 6c 65 6e 20 2d 3d 20 34 3b ;.. len -= 4;
11a60 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 30 20 3d ..} else if (0 =
11a70 3d 20 73 74 72 6e 63 6d 70 28 63 6f 70 79 2c 22 = strncmp(copy,"
11a80 5c 5c 5c 5c 3f 5c 5c 22 2c 34 29 29 20 7b 0a 09 \\\\?\\",4)) {..
11a90 20 20 20 20 63 6f 70 79 20 2b 3d 20 34 3b 0a 09 copy += 4;..
11aa0 20 20 20 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d len -= 4;..}
11ab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
11ac0 20 20 20 20 2a 20 45 6e 73 75 72 65 20 77 65 20 * Ensure we
11ad0 61 72 65 20 75 73 69 6e 67 20 66 6f 72 77 61 72 are using forwar
11ae0 64 20 73 6c 61 73 68 65 73 20 6f 6e 6c 79 2e 0a d slashes only..
11af0 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 */.. for
11b00 20 28 70 20 3d 20 63 6f 70 79 3b 20 2a 70 20 21 (p = copy; *p !
11b10 3d 20 27 5c 30 27 3b 20 70 2b 2b 29 20 7b 0a 09 = '\0'; p++) {..
11b20 69 66 20 28 2a 70 20 3d 3d 20 27 5c 5c 27 29 20 if (*p == '\\')
11b30 7b 0a 09 20 20 20 20 2a 70 20 3d 20 27 2f 27 3b {.. *p = '/';
11b40 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f ..}. }.. o
11b50 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 bjPtr = Tcl_NewS
11b60 74 72 69 6e 67 4f 62 6a 28 63 6f 70 79 2c 6c 65 tringObj(copy,le
11b70 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 n);. Tcl_DStr
11b80 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 ingFree(&ds);..
11b90 20 20 20 72 65 74 75 72 6e 20 6f 62 6a 50 74 72 return objPtr
11ba0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11bd0 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
11c00 4e 61 74 69 76 65 43 72 65 61 74 65 4e 61 74 69 NativeCreateNati
11c10 76 65 52 65 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 veRep --. *. *.C
11c20 72 65 61 74 65 20 61 20 6e 61 74 69 76 65 20 72 reate a native r
11c30 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f epresentation fo
11c40 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 74 68 r the given path
11c50 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
11c60 0a 20 2a 09 54 68 65 20 6e 61 74 69 76 65 50 61 . *.The nativePa
11c70 74 68 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f th representatio
11c80 6e 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 n.. *. * Side ef
11c90 66 65 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 fects:. *.Memory
11ca0 20 77 69 6c 6c 20 62 65 20 61 6c 6c 6f 63 61 74 will be allocat
11cb0 65 64 2e 20 54 68 65 20 70 61 74 68 20 6d 61 79 ed. The path may
11cc0 20 6e 65 65 64 20 74 6f 20 62 65 20 6e 6f 72 6d need to be norm
11cd0 61 6c 69 7a 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d alized.. *. *---
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11d20 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c --------. */..Cl
11d30 69 65 6e 74 44 61 74 61 0a 54 63 6c 4e 61 74 69 ientData.TclNati
11d40 76 65 43 72 65 61 74 65 4e 61 74 69 76 65 52 65 veCreateNativeRe
11d50 70 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a p(. Tcl_Obj *
11d60 70 61 74 68 50 74 72 29 0a 7b 0a 20 20 20 20 63 pathPtr).{. c
11d70 68 61 72 20 2a 6e 61 74 69 76 65 50 61 74 68 50 har *nativePathP
11d80 74 72 2c 20 2a 73 74 72 3b 0a 20 20 20 20 54 63 tr, *str;. Tc
11d90 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 l_DString ds;.
11da0 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 61 6c 69 64 Tcl_Obj *valid
11db0 50 61 74 68 50 74 72 3b 0a 20 20 20 20 69 6e 74 PathPtr;. int
11dc0 20 6c 65 6e 3b 0a 0a 20 20 20 20 69 66 20 28 54 len;.. if (T
11dd0 63 6c 46 53 43 77 64 49 73 4e 61 74 69 76 65 28 clFSCwdIsNative(
11de0 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 )) {../*.. * The
11df0 20 63 77 64 20 69 73 20 6e 61 74 69 76 65 2c 20 cwd is native,
11e00 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20 63 which means we c
11e10 61 6e 20 75 73 65 20 74 68 65 20 74 72 61 6e 73 an use the trans
11e20 6c 61 74 65 64 20 70 61 74 68 0a 09 20 2a 20 77 lated path.. * w
11e30 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 ithout worrying
11e40 61 62 6f 75 74 20 6e 6f 72 6d 61 6c 69 7a 61 74 about normalizat
11e50 69 6f 6e 20 28 74 68 69 73 20 77 69 6c 6c 20 61 ion (this will a
11e60 6c 73 6f 20 75 73 75 61 6c 6c 79 20 62 65 0a 09 lso usually be..
11e70 20 2a 20 73 68 6f 72 74 65 72 20 73 6f 20 74 68 * shorter so th
11e80 65 20 75 74 66 2d 74 6f 2d 65 78 74 65 72 6e 61 e utf-to-externa
11e90 6c 20 63 6f 6e 76 65 72 73 69 6f 6e 20 77 69 6c l conversion wil
11ea0 6c 20 62 65 20 73 6f 6d 65 77 68 61 74 20 66 61 l be somewhat fa
11eb0 73 74 65 72 29 2e 0a 09 20 2a 2f 0a 0a 09 76 61 ster)... */...va
11ec0 6c 69 64 50 61 74 68 50 74 72 20 3d 20 54 63 6c lidPathPtr = Tcl
11ed0 5f 46 53 47 65 74 54 72 61 6e 73 6c 61 74 65 64 _FSGetTranslated
11ee0 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 74 68 50 Path(NULL, pathP
11ef0 74 72 29 3b 0a 09 69 66 20 28 76 61 6c 69 64 50 tr);..if (validP
11f00 61 74 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 athPtr == NULL)
11f10 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 {.. return NU
11f20 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
11f30 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 e {../*.. * Make
11f40 20 73 75 72 65 20 74 68 65 20 6e 6f 72 6d 61 6c sure the normal
11f50 69 7a 65 64 20 70 61 74 68 20 69 73 20 73 65 74 ized path is set
11f60 2e 0a 09 20 2a 2f 0a 0a 09 76 61 6c 69 64 50 61 ... */...validPa
11f70 74 68 50 74 72 20 3d 20 54 63 6c 5f 46 53 47 65 thPtr = Tcl_FSGe
11f80 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 61 74 68 28 tNormalizedPath(
11f90 4e 55 4c 4c 2c 20 70 61 74 68 50 74 72 29 3b 0a NULL, pathPtr);.
11fa0 09 69 66 20 28 76 61 6c 69 64 50 61 74 68 50 74 .if (validPathPt
11fb0 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 r == NULL) {..
11fc0 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
11fd0 7d 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f }..Tcl_IncrRefCo
11fe0 75 6e 74 28 76 61 6c 69 64 50 61 74 68 50 74 72 unt(validPathPtr
11ff0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 );. }.. st
12000 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e r = Tcl_GetStrin
12010 67 46 72 6f 6d 4f 62 6a 28 76 61 6c 69 64 50 61 gFromObj(validPa
12020 74 68 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 20 20 thPtr, &len);.
12030 20 20 69 66 20 28 73 74 72 5b 30 5d 20 3d 3d 20 if (str[0] ==
12040 27 2f 27 20 26 26 20 73 74 72 5b 31 5d 20 3d 3d '/' && str[1] ==
12050 20 27 2f 27 20 26 26 20 73 74 72 5b 32 5d 20 3d '/' && str[2] =
12060 3d 20 27 3f 27 20 26 26 20 73 74 72 5b 33 5d 20 = '?' && str[3]
12070 3d 3d 20 27 2f 27 29 20 7b 0a 09 63 68 61 72 20 == '/') {..char
12080 2a 70 3b 0a 0a 09 66 6f 72 20 28 70 20 3d 20 73 *p;...for (p = s
12090 74 72 3b 20 70 20 26 26 20 2a 70 3b 20 2b 2b 70 tr; p && *p; ++p
120a0 29 20 7b 0a 09 20 20 20 20 69 66 20 28 2a 70 20 ) {.. if (*p
120b0 3d 3d 20 27 2f 27 29 20 7b 0a 09 09 2a 70 20 3d == '/') {...*p =
120c0 20 27 5c 5c 27 3b 0a 09 20 20 20 20 7d 0a 09 7d '\\';.. }..}
120d0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 57 . }. Tcl_W
120e0 69 6e 55 74 66 54 6f 54 43 68 61 72 28 73 74 72 inUtfToTChar(str
120f0 2c 20 6c 65 6e 2c 20 26 64 73 29 3b 0a 20 20 20 , len, &ds);.
12100 20 6c 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 len = Tcl_DStri
12110 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 20 2b 20 ngLength(&ds) +
12120 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 sizeof(WCHAR);.
12130 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f Tcl_DecrRefCo
12140 75 6e 74 28 76 61 6c 69 64 50 61 74 68 50 74 72 unt(validPathPtr
12150 29 3b 0a 20 20 20 20 6e 61 74 69 76 65 50 61 74 );. nativePat
12160 68 50 74 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 6c hPtr = ckalloc(l
12170 65 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 en);. memcpy(
12180 6e 61 74 69 76 65 50 61 74 68 50 74 72 2c 20 54 nativePathPtr, T
12190 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
121a0 26 64 73 29 2c 20 28 73 69 7a 65 5f 74 29 20 6c &ds), (size_t) l
121b0 65 6e 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53 en);.. Tcl_DS
121c0 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
121d0 20 20 20 20 72 65 74 75 72 6e 20 6e 61 74 69 76 return nativ
121e0 65 50 61 74 68 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a ePathPtr;.}.../*
121f0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
12200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
12240 2a 0a 20 2a 20 54 63 6c 4e 61 74 69 76 65 44 75 *. * TclNativeDu
12250 70 49 6e 74 65 72 6e 61 6c 52 65 70 20 2d 2d 0a pInternalRep --.
12260 20 2a 0a 20 2a 09 44 75 70 6c 69 63 61 74 65 20 *. *.Duplicate
12270 74 68 65 20 6e 61 74 69 76 65 20 72 65 70 72 65 the native repre
12280 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a sentation.. *. *
12290 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 Results:. *.The
122a0 20 63 6f 70 69 65 64 20 6e 61 74 69 76 65 20 72 copied native r
122b0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 6f epresentation, o
122c0 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 r NULL if it is
122d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a not possible to.
122e0 20 2a 09 63 6f 70 79 20 74 68 65 20 72 65 70 72 *.copy the repr
122f0 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 esentation.. *.
12300 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
12310 20 2a 09 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 *.Memory alloca
12320 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 tion for the cop
12330 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d y.. *. *--------
12340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12380 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c 69 65 6e 74 44 ---. */..ClientD
12390 61 74 61 0a 54 63 6c 4e 61 74 69 76 65 44 75 70 ata.TclNativeDup
123a0 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a 20 20 20 InternalRep(.
123b0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 ClientData clie
123c0 6e 74 44 61 74 61 29 0a 7b 0a 20 20 20 20 63 68 ntData).{. ch
123d0 61 72 20 2a 63 6f 70 79 3b 0a 20 20 20 20 73 69 ar *copy;. si
123e0 7a 65 5f 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 69 ze_t len;.. i
123f0 66 20 28 63 6c 69 65 6e 74 44 61 74 61 20 3d 3d f (clientData ==
12400 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
12410 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
12420 20 20 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 54 len = sizeof(T
12430 43 48 41 52 29 20 2a 20 28 5f 74 63 73 6c 65 6e CHAR) * (_tcslen
12440 28 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 29 ((const TCHAR *)
12450 20 63 6c 69 65 6e 74 44 61 74 61 29 20 2b 20 31 clientData) + 1
12460 29 3b 0a 0a 20 20 20 20 63 6f 70 79 20 3d 20 63 );.. copy = c
12470 6b 61 6c 6c 6f 63 28 6c 65 6e 29 3b 0a 20 20 20 kalloc(len);.
12480 20 6d 65 6d 63 70 79 28 63 6f 70 79 2c 20 63 6c memcpy(copy, cl
12490 69 65 6e 74 44 61 74 61 2c 20 6c 65 6e 29 3b 0a ientData, len);.
124a0 20 20 20 20 72 65 74 75 72 6e 20 63 6f 70 79 3b return copy;
124b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
124f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12500 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 -----. *. * Tclp
12510 55 74 69 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 53 Utime --. *. *.S
12520 65 74 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 et the modificat
12530 69 6f 6e 20 64 61 74 65 20 66 6f 72 20 61 20 66 ion date for a f
12540 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ile.. *. * Resul
12550 74 73 3a 0a 20 2a 09 30 20 6f 6e 20 73 75 63 63 ts:. *.0 on succ
12560 65 73 73 2c 20 2d 31 20 6f 6e 20 65 72 72 6f 72 ess, -1 on error
12570 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
12580 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 65 72 ects:. *.Sets er
12590 72 6e 6f 20 74 6f 20 61 20 72 65 70 72 65 73 65 rno to a represe
125a0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 79 20 57 ntation of any W
125b0 69 6e 64 6f 77 73 20 70 72 6f 62 6c 65 6d 20 74 indows problem t
125c0 68 61 74 27 73 20 6f 62 73 65 72 76 65 64 0a 20 hat's observed.
125d0 2a 09 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 *.in the process
125e0 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
125f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12630 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 --. */..int.Tclp
12640 55 74 69 6d 65 28 0a 20 20 20 20 54 63 6c 5f 4f Utime(. Tcl_O
12650 62 6a 20 2a 70 61 74 68 50 74 72 2c 09 09 2f 2a bj *pathPtr,../*
12660 20 46 69 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20 File to modify
12670 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 75 74 */. struct ut
12680 69 6d 62 75 66 20 2a 74 76 61 6c 29 09 2f 2a 20 imbuf *tval)./*
12690 4e 65 77 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e New modification
126a0 20 64 61 74 65 20 73 74 72 75 63 74 75 72 65 20 date structure
126b0 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 */.{. int res
126c0 20 3d 20 30 3b 0a 20 20 20 20 48 41 4e 44 4c 45 = 0;. HANDLE
126d0 20 66 69 6c 65 48 61 6e 64 6c 65 3b 0a 20 20 20 fileHandle;.
126e0 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 const TCHAR *na
126f0 74 69 76 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 tive;. DWORD
12700 61 74 74 72 20 3d 20 30 3b 0a 20 20 20 20 44 57 attr = 0;. DW
12710 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 ORD flags = FILE
12720 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 _ATTRIBUTE_NORMA
12730 4c 3b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 L;. FILETIME
12740 6c 61 73 74 41 63 63 65 73 73 54 69 6d 65 2c 20 lastAccessTime,
12750 6c 61 73 74 4d 6f 64 54 69 6d 65 3b 0a 0a 20 20 lastModTime;..
12760 20 20 46 72 6f 6d 43 54 69 6d 65 28 74 76 61 6c FromCTime(tval
12770 2d 3e 61 63 74 69 6d 65 2c 20 26 6c 61 73 74 41 ->actime, &lastA
12780 63 63 65 73 73 54 69 6d 65 29 3b 0a 20 20 20 20 ccessTime);.
12790 46 72 6f 6d 43 54 69 6d 65 28 74 76 61 6c 2d 3e FromCTime(tval->
127a0 6d 6f 64 74 69 6d 65 2c 20 26 6c 61 73 74 4d 6f modtime, &lastMo
127b0 64 54 69 6d 65 29 3b 0a 0a 20 20 20 20 6e 61 74 dTime);.. nat
127c0 69 76 65 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e ive = Tcl_FSGetN
127d0 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 ativePath(pathPt
127e0 72 29 3b 0a 0a 20 20 20 20 61 74 74 72 20 3d 20 r);.. attr =
127f0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 GetFileAttribute
12800 73 28 6e 61 74 69 76 65 29 3b 0a 0a 20 20 20 20 s(native);..
12810 69 66 20 28 61 74 74 72 20 21 3d 20 49 4e 56 41 if (attr != INVA
12820 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 LID_FILE_ATTRIBU
12830 54 45 53 20 26 26 20 61 74 74 72 20 26 20 46 49 TES && attr & FI
12840 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 LE_ATTRIBUTE_DIR
12850 45 43 54 4f 52 59 29 20 7b 0a 09 66 6c 61 67 73 ECTORY) {..flags
12860 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 42 41 43 = FILE_FLAG_BAC
12870 4b 55 50 5f 53 45 4d 41 4e 54 49 43 53 3b 0a 20 KUP_SEMANTICS;.
12880 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
12890 20 20 2a 20 57 65 20 75 73 65 20 74 68 65 20 6e * We use the n
128a0 61 74 69 76 65 20 41 50 49 73 20 28 6e 6f 74 20 ative APIs (not
128b0 27 75 74 69 6d 65 27 29 20 62 65 63 61 75 73 65 'utime') because
128c0 20 74 68 65 72 65 20 61 72 65 20 73 6f 6d 65 20 there are some
128d0 64 61 79 6c 69 67 68 74 0a 20 20 20 20 20 2a 20 daylight. *
128e0 73 61 76 69 6e 67 73 20 63 6f 6d 70 6c 69 63 61 savings complica
128f0 74 69 6f 6e 73 20 74 68 61 74 20 75 74 69 6d 65 tions that utime
12900 20 67 65 74 73 20 77 72 6f 6e 67 2e 0a 20 20 20 gets wrong..
12910 20 20 2a 2f 0a 0a 20 20 20 20 66 69 6c 65 48 61 */.. fileHa
12920 6e 64 6c 65 20 3d 20 43 72 65 61 74 65 46 69 6c ndle = CreateFil
12930 65 28 6e 61 74 69 76 65 2c 20 46 49 4c 45 5f 57 e(native, FILE_W
12940 52 49 54 45 5f 41 54 54 52 49 42 55 54 45 53 2c RITE_ATTRIBUTES,
12950 20 30 2c 20 4e 55 4c 4c 2c 0a 09 20 20 20 20 4f 0, NULL,.. O
12960 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 20 66 6c PEN_EXISTING, fl
12970 61 67 73 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 ags, NULL);..
12980 20 69 66 20 28 66 69 6c 65 48 61 6e 64 6c 65 20 if (fileHandle
12990 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c == INVALID_HANDL
129a0 45 5f 56 41 4c 55 45 20 7c 7c 0a 09 20 20 20 20 E_VALUE ||..
129b0 21 53 65 74 46 69 6c 65 54 69 6d 65 28 66 69 6c !SetFileTime(fil
129c0 65 48 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 26 eHandle, NULL, &
129d0 6c 61 73 74 41 63 63 65 73 73 54 69 6d 65 2c 20 lastAccessTime,
129e0 26 6c 61 73 74 4d 6f 64 54 69 6d 65 29 29 20 7b &lastModTime)) {
129f0 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 ..TclWinConvertE
12a00 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f rror(GetLastErro
12a10 72 28 29 29 3b 0a 09 72 65 73 20 3d 20 2d 31 3b r());..res = -1;
12a20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 . }. if (f
12a30 69 6c 65 48 61 6e 64 6c 65 20 21 3d 20 49 4e 56 ileHandle != INV
12a40 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
12a50 45 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e 64 6c E) {..CloseHandl
12a60 65 28 66 69 6c 65 48 61 6e 64 6c 65 29 3b 0a 20 e(fileHandle);.
12a70 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
12a80 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c res;.}.../*. * L
12a90 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a ocal Variables:.
12aa0 20 2a 20 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d * mode: c. * c-
12ab0 62 61 73 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a basic-offset: 4.
12ac0 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 * fill-column:
12ad0 37 38 0a 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a 78. * End:. */.