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 61 63 63 65 73 73 2e 68 lude <lmaccess.h
0230: 3e 09 09 2f 2a 20 46 6f 72 20 54 63 6c 70 47 65 >../* For TclpGe
0240: 74 55 73 65 72 48 6f 6d 65 28 29 2e 20 2a 2f 0a tUserHome(). */.
0250: 23 69 6e 63 6c 75 64 65 20 3c 75 73 65 72 65 6e #include <useren
0260: 76 2e 68 3e 09 09 2f 2a 20 46 6f 72 20 54 63 6c v.h>../* For Tcl
0270: 70 47 65 74 55 73 65 72 48 6f 6d 65 28 29 2e 20 pGetUserHome().
0280: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6e 75 */../*. * The nu
0290: 6d 62 65 72 20 6f 66 20 31 30 30 2d 6e 73 20 69 mber of 100-ns i
02a0: 6e 74 65 72 76 61 6c 73 20 62 65 74 77 65 65 6e ntervals between
02b0: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 73 79 73 the Windows sys
02c0: 74 65 6d 20 65 70 6f 63 68 20 28 31 36 30 31 2d tem epoch (1601-
02d0: 30 31 2d 30 31 0a 20 2a 20 6f 6e 20 74 68 65 20 01-01. * on the
02e0: 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 proleptic Gregor
02f0: 69 61 6e 20 63 61 6c 65 6e 64 61 72 29 20 61 6e ian calendar) an
0300: 64 20 74 68 65 20 50 6f 73 69 78 20 65 70 6f 63 d the Posix epoc
0310: 68 20 28 31 39 37 30 2d 30 31 2d 30 31 29 2e 0a h (1970-01-01)..
0320: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 50 4f 53 */..#define POS
0330: 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45 IX_EPOCH_AS_FILE
0340: 54 49 4d 45 09 5c 0a 09 28 28 54 63 6c 5f 57 69 TIME.\..((Tcl_Wi
0350: 64 65 49 6e 74 29 20 31 31 36 34 34 34 37 33 36 deInt) 116444736
0360: 20 2a 20 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 * (Tcl_WideInt)
0370: 20 31 30 30 30 30 30 30 30 30 30 29 0a 0a 2f 2a 1000000000)../*
0380: 0a 20 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 . * Declarations
0390: 20 66 6f 72 20 27 6c 69 6e 6b 27 20 72 65 6c 61 for 'link' rela
03a0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e ted information.
03b0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f This informatio
03c0: 6e 20 73 68 6f 75 6c 64 20 63 6f 6d 65 0a 20 2a n should come. *
03d0: 20 77 69 74 68 20 56 43 2b 2b 20 36 2e 30 2c 20 with VC++ 6.0,
03e0: 62 75 74 20 69 73 20 6e 6f 74 20 69 6e 20 73 6f but is not in so
03f0: 6d 65 20 6f 6c 64 65 72 20 53 44 4b 73 2e 20 49 me older SDKs. I
0400: 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20 69 73 n any case it is
0410: 20 6e 6f 74 20 77 65 6c 6c 0a 20 2a 20 64 6f 63 not well. * doc
0420: 75 6d 65 6e 74 65 64 2e 0a 20 2a 2f 0a 0a 23 69 umented.. */..#i
0430: 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 fndef IO_REPARSE
0440: 5f 54 41 47 5f 52 45 53 45 52 56 45 44 5f 4f 4e _TAG_RESERVED_ON
0450: 45 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 E.# define IO_R
0460: 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 EPARSE_TAG_RESER
0470: 56 45 44 5f 4f 4e 45 09 30 78 30 30 30 30 30 30 VED_ONE.0x000000
0480: 30 30 31 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 001.#endif.#ifnd
0490: 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 ef IO_REPARSE_TA
04a0: 47 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45 G_RESERVED_RANGE
04b0: 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 .# define IO_RE
04c0: 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 PARSE_TAG_RESERV
04d0: 45 44 5f 52 41 4e 47 45 09 30 78 30 30 30 30 30 ED_RANGE.0x00000
04e0: 30 30 30 31 0a 23 65 6e 64 69 66 0a 23 69 66 6e 0001.#endif.#ifn
04f0: 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 def IO_REPARSE_T
0500: 41 47 5f 56 41 4c 49 44 5f 56 41 4c 55 45 53 0a AG_VALID_VALUES.
0510: 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 # define IO_REP
0520: 41 52 53 45 5f 54 41 47 5f 56 41 4c 49 44 5f 56 ARSE_TAG_VALID_V
0530: 41 4c 55 45 53 09 30 78 30 45 30 30 30 46 46 46 ALUES.0x0E000FFF
0540: 46 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 F.#endif.#ifndef
0550: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f IO_REPARSE_TAG_
0560: 48 53 4d 0a 23 20 20 64 65 66 69 6e 65 20 49 4f HSM.# define IO
0570: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 48 53 4d _REPARSE_TAG_HSM
0580: 09 09 30 78 30 43 30 30 30 30 30 30 34 0a 23 65 ..0x0C0000004.#e
0590: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f ndif.#ifndef IO_
05a0: 52 45 50 41 52 53 45 5f 54 41 47 5f 4e 53 53 0a REPARSE_TAG_NSS.
05b0: 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 # define IO_REP
05c0: 41 52 53 45 5f 54 41 47 5f 4e 53 53 09 09 30 78 ARSE_TAG_NSS..0x
05d0: 30 38 30 30 30 30 30 30 35 0a 23 65 6e 64 69 66 080000005.#endif
05e0: 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 .#ifndef IO_REPA
05f0: 52 53 45 5f 54 41 47 5f 4e 53 53 52 45 43 4f 56 RSE_TAG_NSSRECOV
0600: 45 52 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f ER.# define IO_
0610: 52 45 50 41 52 53 45 5f 54 41 47 5f 4e 53 53 52 REPARSE_TAG_NSSR
0620: 45 43 4f 56 45 52 09 30 78 30 38 30 30 30 30 30 ECOVER.0x0800000
0630: 30 36 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 06.#endif.#ifnde
0640: 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 f IO_REPARSE_TAG
0650: 5f 53 49 53 0a 23 20 20 64 65 66 69 6e 65 20 49 _SIS.# define I
0660: 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 53 49 O_REPARSE_TAG_SI
0670: 53 09 09 30 78 30 38 30 30 30 30 30 30 37 0a 23 S..0x080000007.#
0680: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f endif.#ifndef IO
0690: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 44 46 53 _REPARSE_TAG_DFS
06a0: 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 .# define IO_RE
06b0: 50 41 52 53 45 5f 54 41 47 5f 44 46 53 09 09 30 PARSE_TAG_DFS..0
06c0: 78 30 38 30 30 30 30 30 30 38 0a 23 65 6e 64 69 x080000008.#endi
06d0: 66 0a 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 f..#ifndef IO_RE
06e0: 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56 PARSE_TAG_RESERV
06f0: 45 44 5f 5a 45 52 4f 0a 23 20 20 64 65 66 69 6e ED_ZERO.# defin
0700: 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 e IO_REPARSE_TAG
0710: 5f 52 45 53 45 52 56 45 44 5f 5a 45 52 4f 09 30 _RESERVED_ZERO.0
0720: 78 30 30 30 30 30 30 30 30 0a 23 65 6e 64 69 66 x00000000.#endif
0730: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c .#ifndef FILE_FL
0740: 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f AG_OPEN_REPARSE_
0750: 50 4f 49 4e 54 0a 23 20 20 64 65 66 69 6e 65 20 POINT.# define
0760: 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52 FILE_FLAG_OPEN_R
0770: 45 50 41 52 53 45 5f 50 4f 49 4e 54 09 30 78 30 EPARSE_POINT.0x0
0780: 30 32 30 30 30 30 30 0a 23 65 6e 64 69 66 0a 23 0200000.#endif.#
0790: 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 ifndef IO_REPARS
07a0: 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e E_TAG_MOUNT_POIN
07b0: 54 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 T.# define IO_R
07c0: 45 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 EPARSE_TAG_MOUNT
07d0: 5f 50 4f 49 4e 54 09 30 78 41 30 30 30 30 30 30 _POINT.0xA000000
07e0: 33 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 3.#endif.#ifndef
07f0: 20 49 73 52 65 70 61 72 73 65 54 61 67 56 61 6c IsReparseTagVal
0800: 69 64 0a 23 20 20 64 65 66 69 6e 65 20 49 73 52 id.# define IsR
0810: 65 70 61 72 73 65 54 61 67 56 61 6c 69 64 28 78 eparseTagValid(x
0820: 29 20 5c 0a 20 20 20 20 28 21 28 28 78 29 26 7e ) \. (!((x)&~
0830: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 56 IO_REPARSE_TAG_V
0840: 41 4c 49 44 5f 56 41 4c 55 45 53 29 26 26 28 28 ALID_VALUES)&&((
0850: 78 29 3e 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 x)>IO_REPARSE_TA
0860: 47 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45 G_RESERVED_RANGE
0870: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 )).#endif.#ifnde
0880: 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 f IO_REPARSE_TAG
0890: 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 0a 23 _SYMBOLIC_LINK.#
08a0: 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 define IO_REPA
08b0: 52 53 45 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43 RSE_TAG_SYMBOLIC
08c0: 5f 4c 49 4e 4b 09 49 4f 5f 52 45 50 41 52 53 45 _LINK.IO_REPARSE
08d0: 5f 54 41 47 5f 52 45 53 45 52 56 45 44 5f 5a 45 _TAG_RESERVED_ZE
08e0: 52 4f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 RO.#endif.#ifnde
08f0: 66 20 46 49 4c 45 5f 53 50 45 43 49 41 4c 5f 41 f FILE_SPECIAL_A
0900: 43 43 45 53 53 0a 23 20 20 64 65 66 69 6e 65 20 CCESS.# define
0910: 46 49 4c 45 5f 53 50 45 43 49 41 4c 5f 41 43 43 FILE_SPECIAL_ACC
0920: 45 53 53 09 09 28 46 49 4c 45 5f 41 4e 59 5f 41 ESS..(FILE_ANY_A
0930: 43 43 45 53 53 29 0a 23 65 6e 64 69 66 0a 23 69 CCESS).#endif.#i
0940: 66 6e 64 65 66 20 46 53 43 54 4c 5f 53 45 54 5f fndef FSCTL_SET_
0950: 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 0a 23 20 REPARSE_POINT.#
0960: 20 64 65 66 69 6e 65 20 46 53 43 54 4c 5f 53 45 define FSCTL_SE
0970: 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 T_REPARSE_POINT
0980: 5c 0a 20 20 20 20 43 54 4c 5f 43 4f 44 45 28 46 \. CTL_CODE(F
0990: 49 4c 45 5f 44 45 56 49 43 45 5f 46 49 4c 45 5f ILE_DEVICE_FILE_
09a0: 53 59 53 54 45 4d 2c 20 34 31 2c 20 4d 45 54 48 SYSTEM, 41, METH
09b0: 4f 44 5f 42 55 46 46 45 52 45 44 2c 20 46 49 4c OD_BUFFERED, FIL
09c0: 45 5f 53 50 45 43 49 41 4c 5f 41 43 43 45 53 53 E_SPECIAL_ACCESS
09d0: 29 0a 23 20 20 64 65 66 69 6e 65 20 46 53 43 54 ).# define FSCT
09e0: 4c 5f 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f L_GET_REPARSE_PO
09f0: 49 4e 54 20 5c 0a 20 20 20 20 43 54 4c 5f 43 4f INT \. CTL_CO
0a00: 44 45 28 46 49 4c 45 5f 44 45 56 49 43 45 5f 46 DE(FILE_DEVICE_F
0a10: 49 4c 45 5f 53 59 53 54 45 4d 2c 20 34 32 2c 20 ILE_SYSTEM, 42,
0a20: 4d 45 54 48 4f 44 5f 42 55 46 46 45 52 45 44 2c METHOD_BUFFERED,
0a30: 20 46 49 4c 45 5f 41 4e 59 5f 41 43 43 45 53 53 FILE_ANY_ACCESS
0a40: 29 0a 23 20 20 64 65 66 69 6e 65 20 46 53 43 54 ).# define FSCT
0a50: 4c 5f 44 45 4c 45 54 45 5f 52 45 50 41 52 53 45 L_DELETE_REPARSE
0a60: 5f 50 4f 49 4e 54 20 5c 0a 20 20 20 20 43 54 4c _POINT \. CTL
0a70: 5f 43 4f 44 45 28 46 49 4c 45 5f 44 45 56 49 43 _CODE(FILE_DEVIC
0a80: 45 5f 46 49 4c 45 5f 53 59 53 54 45 4d 2c 20 34 E_FILE_SYSTEM, 4
0a90: 33 2c 20 4d 45 54 48 4f 44 5f 42 55 46 46 45 52 3, METHOD_BUFFER
0aa0: 45 44 2c 20 46 49 4c 45 5f 53 50 45 43 49 41 4c ED, FILE_SPECIAL
0ab0: 5f 41 43 43 45 53 53 29 0a 23 65 6e 64 69 66 0a _ACCESS).#endif.
0ac0: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f #ifndef INVALID_
0ad0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a FILE_ATTRIBUTES.
0ae0: 23 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f #define INVALID_
0af0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 09 FILE_ATTRIBUTES.
0b00: 09 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e .((DWORD)-1).#en
0b10: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 4d 61 78 69 6d dif../*. * Maxim
0b20: 75 6d 20 72 65 70 61 72 73 65 20 62 75 66 66 65 um reparse buffe
0b30: 72 20 69 6e 66 6f 20 73 69 7a 65 2e 20 54 68 65 r info size. The
0b40: 20 6d 61 78 20 75 73 65 72 20 64 65 66 69 6e 65 max user define
0b50: 64 20 72 65 70 61 72 73 65 20 64 61 74 61 20 69 d reparse data i
0b60: 73 0a 20 2a 20 31 36 4b 42 2c 20 70 6c 75 73 20 s. * 16KB, plus
0b70: 74 68 65 72 65 27 73 20 61 20 68 65 61 64 65 72 there's a header
0b80: 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4d .. */..#define M
0b90: 41 58 5f 52 45 50 41 52 53 45 5f 53 49 5a 45 09 AX_REPARSE_SIZE.
0ba0: 09 31 37 30 30 30 0a 0a 2f 2a 0a 20 2a 20 55 6e .17000../*. * Un
0bb0: 64 6f 63 75 6d 65 6e 74 65 64 20 52 45 50 41 52 documented REPAR
0bc0: 53 45 5f 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 SE_MOUNTPOINT_HE
0bd0: 41 44 45 52 5f 53 49 5a 45 20 73 74 72 75 63 74 ADER_SIZE struct
0be0: 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 ure definition.
0bf0: 54 68 69 73 20 69 73 0a 20 2a 20 66 6f 75 6e 64 This is. * found
0c00: 20 69 6e 20 77 69 6e 6e 74 2e 68 2e 0a 20 2a 0a in winnt.h.. *.
0c10: 20 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 63 61 * IMPORTANT: ca
0c20: 75 74 69 6f 6e 20 77 68 65 6e 20 75 73 69 6e 67 ution when using
0c30: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2c this structure,
0c40: 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61 since the actua
0c50: 6c 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 20 l structures. *
0c60: 75 73 65 64 20 77 69 6c 6c 20 77 61 6e 74 20 74 used will want t
0c70: 6f 20 73 74 6f 72 65 20 61 20 66 75 6c 6c 20 70 o store a full p
0c80: 61 74 68 20 69 6e 20 74 68 65 20 27 50 61 74 68 ath in the 'Path
0c90: 42 75 66 66 65 72 27 20 66 69 65 6c 64 2c 20 62 Buffer' field, b
0ca0: 75 74 20 74 68 65 72 65 0a 20 2a 20 69 73 6e 27 ut there. * isn'
0cb0: 74 20 72 6f 6f 6d 20 28 74 68 65 72 65 27 73 20 t room (there's
0cc0: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 57 43 only a single WC
0cd0: 48 41 52 21 29 2e 20 54 68 65 72 65 66 6f 72 65 HAR!). Therefore
0ce0: 20 6f 6e 65 20 6d 75 73 74 20 61 72 74 69 66 69 one must artifi
0cf0: 63 69 61 6c 6c 79 0a 20 2a 20 63 72 65 61 74 65 cially. * create
0d00: 20 61 20 6c 61 72 67 65 72 20 73 70 61 63 65 20 a larger space
0d10: 6f 66 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 of memory and th
0d20: 65 6e 20 63 61 73 74 20 69 74 20 74 6f 20 74 68 en cast it to th
0d30: 69 73 20 74 79 70 65 2e 20 57 65 20 75 73 65 20 is type. We use
0d40: 74 68 65 0a 20 2a 20 27 44 55 4d 4d 59 5f 52 45 the. * 'DUMMY_RE
0d50: 50 41 52 53 45 5f 42 55 46 46 45 52 27 20 73 74 PARSE_BUFFER' st
0d60: 72 75 63 74 20 6a 75 73 74 20 62 65 6c 6f 77 20 ruct just below
0d70: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 to deal with thi
0d80: 73 20 70 72 6f 62 6c 65 6d 2e 0a 20 2a 2f 0a 0a s problem.. */..
0d90: 23 64 65 66 69 6e 65 20 52 45 50 41 52 53 45 5f #define REPARSE_
0da0: 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 MOUNTPOINT_HEADE
0db0: 52 5f 53 49 5a 45 09 20 38 0a 23 69 66 6e 64 65 R_SIZE. 8.#ifnde
0dc0: 66 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 f REPARSE_DATA_B
0dd0: 55 46 46 45 52 5f 48 45 41 44 45 52 5f 53 49 5a UFFER_HEADER_SIZ
0de0: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 E.typedef struct
0df0: 20 5f 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 _REPARSE_DATA_B
0e00: 55 46 46 45 52 20 7b 0a 20 20 20 20 44 57 4f 52 UFFER {. DWOR
0e10: 44 20 52 65 70 61 72 73 65 54 61 67 3b 0a 20 20 D ReparseTag;.
0e20: 20 20 57 4f 52 44 20 52 65 70 61 72 73 65 44 61 WORD ReparseDa
0e30: 74 61 4c 65 6e 67 74 68 3b 0a 20 20 20 20 57 4f taLength;. WO
0e40: 52 44 20 52 65 73 65 72 76 65 64 3b 0a 20 20 20 RD Reserved;.
0e50: 20 75 6e 69 6f 6e 20 7b 0a 09 73 74 72 75 63 74 union {..struct
0e60: 20 7b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 62 {.. WORD Sub
0e70: 73 74 69 74 75 74 65 4e 61 6d 65 4f 66 66 73 65 stituteNameOffse
0e80: 74 3b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 62 t;.. WORD Sub
0e90: 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 stituteNameLengt
0ea0: 68 3b 0a 09 20 20 20 20 57 4f 52 44 20 50 72 69 h;.. WORD Pri
0eb0: 6e 74 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20 ntNameOffset;..
0ec0: 20 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d WORD PrintNam
0ed0: 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 55 4c eLength;.. UL
0ee0: 4f 4e 47 20 46 6c 61 67 73 3b 0a 09 20 20 20 20 ONG Flags;..
0ef0: 57 43 48 41 52 20 50 61 74 68 42 75 66 66 65 72 WCHAR PathBuffer
0f00: 5b 31 5d 3b 0a 09 7d 20 53 79 6d 62 6f 6c 69 63 [1];..} Symbolic
0f10: 4c 69 6e 6b 52 65 70 61 72 73 65 42 75 66 66 65 LinkReparseBuffe
0f20: 72 3b 0a 09 73 74 72 75 63 74 20 7b 0a 09 20 20 r;..struct {..
0f30: 20 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74 WORD Substitut
0f40: 65 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20 20 eNameOffset;..
0f50: 20 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74 WORD Substitut
0f60: 65 4e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20 eNameLength;..
0f70: 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d 65 WORD PrintName
0f80: 4f 66 66 73 65 74 3b 0a 09 20 20 20 20 57 4f 52 Offset;.. WOR
0f90: 44 20 50 72 69 6e 74 4e 61 6d 65 4c 65 6e 67 74 D PrintNameLengt
0fa0: 68 3b 0a 09 20 20 20 20 57 43 48 41 52 20 50 61 h;.. WCHAR Pa
0fb0: 74 68 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20 thBuffer[1];..}
0fc0: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 MountPointRepars
0fd0: 65 42 75 66 66 65 72 3b 0a 09 73 74 72 75 63 74 eBuffer;..struct
0fe0: 20 7b 0a 09 20 20 20 20 42 59 54 45 20 44 61 74 {.. BYTE Dat
0ff0: 61 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20 47 aBuffer[1];..} G
1000: 65 6e 65 72 69 63 52 65 70 61 72 73 65 42 75 66 enericReparseBuf
1010: 66 65 72 3b 0a 20 20 20 20 7d 3b 0a 7d 20 52 45 fer;. };.} RE
1020: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 PARSE_DATA_BUFFE
1030: 52 3b 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64 R;.#endif..typed
1040: 65 66 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 ef struct {.
1050: 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 REPARSE_DATA_BUF
1060: 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20 57 FER dummy;. W
1070: 43 48 41 52 20 64 75 6d 6d 79 42 75 66 5b 4d 41 CHAR dummyBuf[MA
1080: 58 5f 50 41 54 48 20 2a 20 33 5d 3b 0a 7d 20 44 X_PATH * 3];.} D
1090: 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 UMMY_REPARSE_BUF
10a0: 46 45 52 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 FER;..#if define
10b0: 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 28 d(_MSC_VER) && (
10c0: 5f 4d 53 43 5f 56 45 52 20 3c 3d 20 31 31 30 30 _MSC_VER <= 1100
10d0: 29 0a 23 75 6e 64 65 66 09 48 41 56 45 5f 4e 4f ).#undef.HAVE_NO
10e0: 5f 46 49 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 64 _FINDEX_ENUMS.#d
10f0: 65 66 69 6e 65 20 48 41 56 45 5f 4e 4f 5f 46 49 efine HAVE_NO_FI
1100: 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 65 6c 69 66 NDEX_ENUMS.#elif
1110: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 !defined(_WIN32
1120: 5f 57 49 4e 4e 54 29 20 7c 7c 20 28 5f 57 49 4e _WINNT) || (_WIN
1130: 33 32 5f 57 49 4e 4e 54 20 3c 20 30 78 30 34 30 32_WINNT < 0x040
1140: 30 29 0a 23 75 6e 64 65 66 09 48 41 56 45 5f 4e 0).#undef.HAVE_N
1150: 4f 5f 46 49 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 O_FINDEX_ENUMS.#
1160: 64 65 66 69 6e 65 20 48 41 56 45 5f 4e 4f 5f 46 define HAVE_NO_F
1170: 49 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 65 6e 64 INDEX_ENUMS.#end
1180: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f if..#ifdef HAVE_
1190: 4e 4f 5f 46 49 4e 44 45 58 5f 45 4e 55 4d 53 0a NO_FINDEX_ENUMS.
11a0: 2f 2a 20 54 68 65 73 65 20 74 77 6f 20 61 72 65 /* These two are
11b0: 6e 27 74 20 69 6e 20 56 43 2b 2b 20 35 2e 32 20 n't in VC++ 5.2
11c0: 68 65 61 64 65 72 73 20 2a 2f 0a 74 79 70 65 64 headers */.typed
11d0: 65 66 20 65 6e 75 6d 20 5f 46 49 4e 44 45 58 5f ef enum _FINDEX_
11e0: 49 4e 46 4f 5f 4c 45 56 45 4c 53 20 7b 0a 20 20 INFO_LEVELS {.
11f0: 20 20 46 69 6e 64 45 78 49 6e 66 6f 53 74 61 6e FindExInfoStan
1200: 64 61 72 64 2c 0a 20 20 20 20 46 69 6e 64 45 78 dard,. FindEx
1210: 49 6e 66 6f 4d 61 78 49 6e 66 6f 4c 65 76 65 6c InfoMaxInfoLevel
1220: 0a 7d 20 46 49 4e 44 45 58 5f 49 4e 46 4f 5f 4c .} FINDEX_INFO_L
1230: 45 56 45 4c 53 3b 0a 74 79 70 65 64 65 66 20 65 EVELS;.typedef e
1240: 6e 75 6d 20 5f 46 49 4e 44 45 58 5f 53 45 41 52 num _FINDEX_SEAR
1250: 43 48 5f 4f 50 53 20 7b 0a 20 20 20 20 46 69 6e CH_OPS {. Fin
1260: 64 45 78 53 65 61 72 63 68 4e 61 6d 65 4d 61 74 dExSearchNameMat
1270: 63 68 2c 0a 20 20 20 20 46 69 6e 64 45 78 53 65 ch,. FindExSe
1280: 61 72 63 68 4c 69 6d 69 74 54 6f 44 69 72 65 63 archLimitToDirec
1290: 74 6f 72 69 65 73 2c 0a 20 20 20 20 46 69 6e 64 tories,. Find
12a0: 45 78 53 65 61 72 63 68 4c 69 6d 69 74 54 6f 44 ExSearchLimitToD
12b0: 65 76 69 63 65 73 2c 0a 20 20 20 20 46 69 6e 64 evices,. Find
12c0: 45 78 53 65 61 72 63 68 4d 61 78 53 65 61 72 63 ExSearchMaxSearc
12d0: 68 4f 70 0a 7d 20 46 49 4e 44 45 58 5f 53 45 41 hOp.} FINDEX_SEA
12e0: 52 43 48 5f 4f 50 53 3b 0a 23 65 6e 64 69 66 20 RCH_OPS;.#endif
12f0: 2f 2a 20 48 41 56 45 5f 4e 4f 5f 46 49 4e 44 45 /* HAVE_NO_FINDE
1300: 58 5f 45 4e 55 4d 53 20 2a 2f 0a 0a 2f 2a 0a 20 X_ENUMS */../*.
1310: 2a 20 4f 74 68 65 72 20 74 79 70 65 64 65 66 73 * Other typedefs
1320: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 required by thi
1330: 73 20 63 6f 64 65 2e 0a 20 2a 2f 0a 0a 73 74 61 s code.. */..sta
1340: 74 69 63 20 74 69 6d 65 5f 74 09 09 54 6f 43 54 tic time_t..ToCT
1350: 69 6d 65 28 46 49 4c 45 54 49 4d 45 20 66 69 6c ime(FILETIME fil
1360: 65 54 69 6d 65 29 3b 0a 73 74 61 74 69 63 20 76 eTime);.static v
1370: 6f 69 64 09 09 46 72 6f 6d 43 54 69 6d 65 28 74 oid..FromCTime(t
1380: 69 6d 65 5f 74 20 70 6f 73 69 78 54 69 6d 65 2c ime_t posixTime,
1390: 20 46 49 4c 45 54 49 4d 45 20 2a 66 69 6c 65 54 FILETIME *fileT
13a0: 69 6d 65 29 3b 0a 0a 74 79 70 65 64 65 66 20 4e ime);..typedef N
13b0: 45 54 5f 41 50 49 5f 53 54 41 54 55 53 20 4e 45 ET_API_STATUS NE
13c0: 54 5f 41 50 49 5f 46 55 4e 43 54 49 4f 4e 20 4e T_API_FUNCTION N
13d0: 45 54 55 53 45 52 47 45 54 49 4e 46 4f 50 52 4f ETUSERGETINFOPRO
13e0: 43 28 0a 09 4c 50 57 53 54 52 20 73 65 72 76 65 C(..LPWSTR serve
13f0: 72 6e 61 6d 65 2c 20 4c 50 57 53 54 52 20 75 73 rname, LPWSTR us
1400: 65 72 6e 61 6d 65 2c 20 44 57 4f 52 44 20 6c 65 ername, DWORD le
1410: 76 65 6c 2c 20 4c 50 42 59 54 45 20 2a 62 75 66 vel, LPBYTE *buf
1420: 70 74 72 29 3b 0a 0a 74 79 70 65 64 65 66 20 4e ptr);..typedef N
1430: 45 54 5f 41 50 49 5f 53 54 41 54 55 53 20 4e 45 ET_API_STATUS NE
1440: 54 5f 41 50 49 5f 46 55 4e 43 54 49 4f 4e 20 4e T_API_FUNCTION N
1450: 45 54 41 50 49 42 55 46 46 45 52 46 52 45 45 50 ETAPIBUFFERFREEP
1460: 52 4f 43 28 4c 50 56 4f 49 44 20 42 75 66 66 65 ROC(LPVOID Buffe
1470: 72 29 3b 0a 0a 74 79 70 65 64 65 66 20 4e 45 54 r);..typedef NET
1480: 5f 41 50 49 5f 53 54 41 54 55 53 20 4e 45 54 5f _API_STATUS NET_
1490: 41 50 49 5f 46 55 4e 43 54 49 4f 4e 20 4e 45 54 API_FUNCTION NET
14a0: 47 45 54 44 43 4e 41 4d 45 50 52 4f 43 28 0a 09 GETDCNAMEPROC(..
14b0: 4c 50 57 53 54 52 20 73 65 72 76 65 72 6e 61 6d LPWSTR servernam
14c0: 65 2c 20 4c 50 57 53 54 52 20 64 6f 6d 61 69 6e e, LPWSTR domain
14d0: 6e 61 6d 65 2c 20 4c 50 42 59 54 45 20 2a 62 75 name, LPBYTE *bu
14e0: 66 70 74 72 29 3b 0a 0a 74 79 70 65 64 65 66 20 fptr);..typedef
14f0: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 47 45 54 50 BOOL WINAPI GETP
1500: 52 4f 46 49 4c 45 53 44 49 52 45 43 54 4f 52 59 ROFILESDIRECTORY
1510: 50 52 4f 43 28 0a 09 4c 50 57 53 54 52 20 20 6c PROC(..LPWSTR l
1520: 70 50 72 6f 66 69 6c 65 73 44 69 72 2c 20 4c 50 pProfilesDir, LP
1530: 44 57 4f 52 44 20 6c 70 63 63 68 53 69 7a 65 0a DWORD lpcchSize.
1540: 29 3b 0a 0a 2f 2a 0a 20 2a 20 44 65 63 6c 61 72 );../*. * Declar
1550: 61 74 69 6f 6e 73 20 66 6f 72 20 6c 6f 63 61 6c ations for local
1560: 20 66 75 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e functions defin
1570: 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 3a ed in this file:
1580: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
1590: 09 09 4e 61 74 69 76 65 41 63 63 65 73 73 28 63 ..NativeAccess(c
15a0: 6f 6e 73 74 20 54 43 48 41 52 20 2a 70 61 74 68 onst TCHAR *path
15b0: 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 73 74 61 , int mode);.sta
15c0: 74 69 63 20 69 6e 74 09 09 4e 61 74 69 76 65 44 tic int..NativeD
15d0: 65 76 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a ev(const TCHAR *
15e0: 70 61 74 68 29 3b 0a 73 74 61 74 69 63 20 69 6e path);.static in
15f0: 74 09 09 4e 61 74 69 76 65 53 74 61 74 28 63 6f t..NativeStat(co
1600: 6e 73 74 20 54 43 48 41 52 20 2a 70 61 74 68 2c nst TCHAR *path,
1610: 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 Tcl_StatBuf *st
1620: 61 74 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e atPtr,.... in
1630: 74 20 63 68 65 63 6b 4c 69 6e 6b 73 29 3b 0a 73 t checkLinks);.s
1640: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 73 tatic unsigned s
1650: 68 6f 72 74 09 4e 61 74 69 76 65 53 74 61 74 4d hort.NativeStatM
1660: 6f 64 65 28 44 57 4f 52 44 20 61 74 74 72 2c 20 ode(DWORD attr,
1670: 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a int checkLinks,.
1680: 09 09 09 20 20 20 20 69 6e 74 20 69 73 45 78 65 ... int isExe
1690: 63 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 c);.static int..
16a0: 4e 61 74 69 76 65 49 73 45 78 65 63 28 63 6f 6e NativeIsExec(con
16b0: 73 74 20 54 43 48 41 52 20 2a 70 61 74 68 29 3b st TCHAR *path);
16c0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74 .static int..Nat
16d0: 69 76 65 52 65 61 64 52 65 70 61 72 73 65 28 63 iveReadReparse(c
16e0: 6f 6e 73 74 20 54 43 48 41 52 20 2a 4c 69 6e 6b onst TCHAR *Link
16f0: 44 69 72 65 63 74 6f 72 79 2c 0a 09 09 09 20 20 Directory,....
1700: 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 REPARSE_DATA_B
1710: 55 46 46 45 52 20 2a 62 75 66 66 65 72 2c 20 44 UFFER *buffer, D
1720: 57 4f 52 44 20 64 65 73 69 72 65 64 41 63 63 65 WORD desiredAcce
1730: 73 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 ss);.static int.
1740: 09 4e 61 74 69 76 65 57 72 69 74 65 52 65 70 61 .NativeWriteRepa
1750: 72 73 65 28 63 6f 6e 73 74 20 54 43 48 41 52 20 rse(const TCHAR
1760: 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 2c 0a *LinkDirectory,.
1770: 09 09 09 20 20 20 20 52 45 50 41 52 53 45 5f 44 ... REPARSE_D
1780: 41 54 41 5f 42 55 46 46 45 52 20 2a 62 75 66 66 ATA_BUFFER *buff
1790: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 er);.static int.
17a0: 09 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70 65 .NativeMatchType
17b0: 28 69 6e 74 20 69 73 44 72 69 76 65 2c 20 44 57 (int isDrive, DW
17c0: 4f 52 44 20 61 74 74 72 2c 0a 09 09 09 20 20 20 ORD attr,....
17d0: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 const TCHAR *na
17e0: 74 69 76 65 4e 61 6d 65 2c 20 54 63 6c 5f 47 6c tiveName, Tcl_Gl
17f0: 6f 62 54 79 70 65 44 61 74 61 20 2a 74 79 70 65 obTypeData *type
1800: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 s);.static int..
1810: 57 69 6e 49 73 44 72 69 76 65 28 63 6f 6e 73 74 WinIsDrive(const
1820: 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 char *name, int
1830: 20 6e 61 6d 65 4c 65 6e 29 3b 0a 73 74 61 74 69 nameLen);.stati
1840: 63 20 69 6e 74 09 09 57 69 6e 49 73 52 65 73 65 c int..WinIsRese
1850: 72 76 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 rved(const char
1860: 2a 70 61 74 68 29 3b 0a 73 74 61 74 69 63 20 54 *path);.static T
1870: 63 6c 5f 4f 62 6a 20 2a 09 57 69 6e 52 65 61 64 cl_Obj *.WinRead
1880: 4c 69 6e 6b 28 63 6f 6e 73 74 20 54 43 48 41 52 Link(const TCHAR
1890: 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 29 3b 0a 73 *LinkSource);.s
18a0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 09 tatic Tcl_Obj *.
18b0: 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 65 63 WinReadLinkDirec
18c0: 74 6f 72 79 28 63 6f 6e 73 74 20 54 43 48 41 52 tory(const TCHAR
18d0: 20 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 29 *LinkDirectory)
18e0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 57 69 ;.static int..Wi
18f0: 6e 4c 69 6e 6b 28 63 6f 6e 73 74 20 54 43 48 41 nLink(const TCHA
1900: 52 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 2c 0a 09 R *LinkSource,..
1910: 09 09 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 .. const TCHA
1920: 52 20 2a 4c 69 6e 6b 54 61 72 67 65 74 2c 20 69 R *LinkTarget, i
1930: 6e 74 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 3b 0a nt linkAction);.
1940: 73 74 61 74 69 63 20 69 6e 74 09 09 57 69 6e 53 static int..WinS
1950: 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 ymLinkDirectory(
1960: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 4c 69 6e const TCHAR *Lin
1970: 6b 44 69 72 65 63 74 6f 72 79 2c 0a 09 09 09 20 kDirectory,....
1980: 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a const TCHAR *
1990: 4c 69 6e 6b 54 61 72 67 65 74 29 3b 0a 0c 0a 2f LinkTarget);.../
19a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 --------. *. * W
19f0: 69 6e 4c 69 6e 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 inLink --. *. *.
1a00: 4d 61 6b 65 20 61 20 6c 69 6e 6b 20 66 72 6f 6d Make a link from
1a10: 20 73 6f 75 72 63 65 20 74 6f 20 74 61 72 67 65 source to targe
1a20: 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d t.. *. *--------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
1a70: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 6e ..static int.Win
1a80: 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74 20 Link(. const
1a90: 54 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72 63 TCHAR *linkSourc
1aa0: 65 50 61 74 68 2c 0a 20 20 20 20 63 6f 6e 73 74 ePath,. const
1ab0: 20 54 43 48 41 52 20 2a 6c 69 6e 6b 54 61 72 67 TCHAR *linkTarg
1ac0: 65 74 50 61 74 68 2c 0a 20 20 20 20 69 6e 74 20 etPath,. int
1ad0: 6c 69 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 20 linkAction).{.
1ae0: 20 20 57 43 48 41 52 20 74 65 6d 70 46 69 6c 65 WCHAR tempFile
1af0: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a Name[MAX_PATH];.
1b00: 20 20 20 20 54 43 48 41 52 20 2a 74 65 6d 70 46 TCHAR *tempF
1b10: 69 6c 65 50 61 72 74 3b 0a 20 20 20 20 44 57 4f ilePart;. DWO
1b20: 52 44 20 61 74 74 72 3b 0a 0a 20 20 20 20 2f 2a RD attr;.. /*
1b30: 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 . * Get the
1b40: 66 75 6c 6c 20 70 61 74 68 20 72 65 66 65 72 65 full path refere
1b50: 6e 63 65 64 20 62 79 20 74 68 65 20 74 61 72 67 nced by the targ
1b60: 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 et.. */..
1b70: 20 69 66 20 28 21 28 2a 74 63 6c 57 69 6e 50 72 if (!(*tclWinPr
1b80: 6f 63 73 2d 3e 67 65 74 46 75 6c 6c 50 61 74 68 ocs->getFullPath
1b90: 4e 61 6d 65 50 72 6f 63 29 28 6c 69 6e 6b 54 61 NameProc)(linkTa
1ba0: 72 67 65 74 50 61 74 68 2c 20 4d 41 58 5f 50 41 rgetPath, MAX_PA
1bb0: 54 48 2c 0a 09 20 20 20 20 74 65 6d 70 46 69 6c TH,.. tempFil
1bc0: 65 4e 61 6d 65 2c 20 26 74 65 6d 70 46 69 6c 65 eName, &tempFile
1bd0: 50 61 72 74 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a Part)) {../*.. *
1be0: 20 49 6e 76 61 6c 69 64 20 66 69 6c 65 2e 0a 09 Invalid file...
1bf0: 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 */...TclWinConv
1c00: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 ertError(GetLast
1c10: 45 72 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 Error());..retur
1c20: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 n -1;. }..
1c30: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 /*. * Make
1c40: 73 75 72 65 20 73 6f 75 72 63 65 20 66 69 6c 65 sure source file
1c50: 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a doesn't exist..
1c60: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 61 74 74 */.. att
1c70: 72 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 r = (*tclWinProc
1c80: 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 69 62 s->getFileAttrib
1c90: 75 74 65 73 50 72 6f 63 29 28 6c 69 6e 6b 53 6f utesProc)(linkSo
1ca0: 75 72 63 65 50 61 74 68 29 3b 0a 20 20 20 20 69 urcePath);. i
1cb0: 66 20 28 61 74 74 72 20 21 3d 20 49 4e 56 41 4c f (attr != INVAL
1cc0: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 ID_FILE_ATTRIBUT
1cd0: 45 53 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 ES) {..Tcl_SetEr
1ce0: 72 6e 6f 28 45 45 58 49 53 54 29 3b 0a 09 72 65 rno(EEXIST);..re
1cf0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a turn -1;. }..
1d00: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 47 65 /*. * Ge
1d10: 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 t the full path
1d20: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 referenced by th
1d30: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 2f 64 69 e source file/di
1d40: 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 2f rectory.. */
1d50: 0a 0a 20 20 20 20 69 66 20 28 21 28 2a 74 63 6c .. if (!(*tcl
1d60: 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 46 75 6c WinProcs->getFul
1d70: 6c 50 61 74 68 4e 61 6d 65 50 72 6f 63 29 28 6c lPathNameProc)(l
1d80: 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 20 4d inkSourcePath, M
1d90: 41 58 5f 50 41 54 48 2c 0a 09 20 20 20 20 74 65 AX_PATH,.. te
1da0: 6d 70 46 69 6c 65 4e 61 6d 65 2c 20 26 74 65 6d mpFileName, &tem
1db0: 70 46 69 6c 65 50 61 72 74 29 29 20 7b 0a 09 2f pFilePart)) {../
1dc0: 2a 0a 09 20 2a 20 49 6e 76 61 6c 69 64 20 66 69 *.. * Invalid fi
1dd0: 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 le... */...TclWi
1de0: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 nConvertError(Ge
1df0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 tLastError());..
1e00: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d return -1;. }
1e10: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
1e20: 43 68 65 63 6b 20 74 68 65 20 74 61 72 67 65 74 Check the target
1e30: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 61 .. */.. a
1e40: 74 74 72 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 ttr = (*tclWinPr
1e50: 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 ocs->getFileAttr
1e60: 69 62 75 74 65 73 50 72 6f 63 29 28 6c 69 6e 6b ibutesProc)(link
1e70: 54 61 72 67 65 74 50 61 74 68 29 3b 0a 20 20 20 TargetPath);.
1e80: 20 69 66 20 28 61 74 74 72 20 3d 3d 20 49 4e 56 if (attr == INV
1e90: 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 ALID_FILE_ATTRIB
1ea0: 55 54 45 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 UTES) {../*.. *
1eb0: 54 68 65 20 74 61 72 67 65 74 20 64 6f 65 73 6e The target doesn
1ec0: 27 74 20 65 78 69 73 74 2e 0a 09 20 2a 2f 0a 0a 't exist... */..
1ed0: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 .TclWinConvertEr
1ee0: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 ror(GetLastError
1ef0: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b ());..return -1;
1f00: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
1f10: 28 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 ((attr & FILE_AT
1f20: 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 TRIBUTE_DIRECTOR
1f30: 59 29 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 Y) == 0) {../*..
1f40: 20 2a 20 49 74 20 69 73 20 61 20 66 69 6c 65 2e * It is a file.
1f50: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 74 63 6c 57 .. */...if (tclW
1f60: 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 48 inProcs->createH
1f70: 61 72 64 4c 69 6e 6b 50 72 6f 63 20 3d 3d 20 4e ardLinkProc == N
1f80: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ULL) {.. Tcl_
1f90: 53 65 74 45 72 72 6e 6f 28 45 4e 4f 54 44 49 52 SetErrno(ENOTDIR
1fa0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d );.. return -
1fb0: 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 69 6e 6b 1;..}...if (link
1fc0: 41 63 74 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 Action & TCL_CRE
1fd0: 41 54 45 5f 48 41 52 44 5f 4c 49 4e 4b 29 20 7b ATE_HARD_LINK) {
1fe0: 0a 09 20 20 20 20 69 66 20 28 21 28 2a 74 63 6c .. if (!(*tcl
1ff0: 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 WinProcs->create
2000: 48 61 72 64 4c 69 6e 6b 50 72 6f 63 29 28 6c 69 HardLinkProc)(li
2010: 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 0a 09 09 nkSourcePath,...
2020: 20 20 20 20 6c 69 6e 6b 54 61 72 67 65 74 50 61 linkTargetPa
2030: 74 68 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 09 54 th, NULL)) {...T
2040: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
2050: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
2060: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a );...return -1;.
2070: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 . }.. retu
2080: 72 6e 20 30 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 rn 0;...} else i
2090: 66 20 28 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20 f (linkAction &
20a0: 54 43 4c 5f 43 52 45 41 54 45 5f 53 59 4d 42 4f TCL_CREATE_SYMBO
20b0: 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 20 20 20 LIC_LINK) {..
20c0: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 61 6e 27 /*.. * Can'
20d0: 74 20 73 79 6d 6c 69 6e 6b 20 66 69 6c 65 73 2e t symlink files.
20e0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
20f0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f Tcl_SetErrno(ENO
2100: 54 44 49 52 29 3b 0a 09 20 20 20 20 72 65 74 75 TDIR);.. retu
2110: 72 6e 20 2d 31 3b 0a 09 7d 20 65 6c 73 65 20 7b rn -1;..} else {
2120: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
2130: 6e 6f 28 45 4e 4f 44 45 56 29 3b 0a 09 20 20 20 no(ENODEV);..
2140: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 return -1;..}.
2150: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a } else {../*.
2160: 09 20 2a 20 57 65 27 76 65 20 67 6f 74 20 61 20 . * We've got a
2170: 64 69 72 65 63 74 6f 72 79 2e 20 4e 6f 77 20 63 directory. Now c
2180: 68 65 63 6b 20 77 68 65 74 68 65 72 20 77 68 61 heck whether wha
2190: 74 20 77 65 27 72 65 20 74 72 79 69 6e 67 20 74 t we're trying t
21a0: 6f 20 64 6f 20 69 73 0a 09 20 2a 20 72 65 61 73 o do is.. * reas
21b0: 6f 6e 61 62 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 69 onable... */...i
21c0: 66 20 28 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20 f (linkAction &
21d0: 54 43 4c 5f 43 52 45 41 54 45 5f 53 59 4d 42 4f TCL_CREATE_SYMBO
21e0: 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 20 20 20 LIC_LINK) {..
21f0: 20 72 65 74 75 72 6e 20 57 69 6e 53 79 6d 4c 69 return WinSymLi
2200: 6e 6b 44 69 72 65 63 74 6f 72 79 28 6c 69 6e 6b nkDirectory(link
2210: 53 6f 75 72 63 65 50 61 74 68 2c 20 6c 69 6e 6b SourcePath, link
2220: 54 61 72 67 65 74 50 61 74 68 29 3b 0a 0a 09 7d TargetPath);...}
2230: 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 6b 41 63 else if (linkAc
2240: 74 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 41 54 tion & TCL_CREAT
2250: 45 5f 48 41 52 44 5f 4c 49 4e 4b 29 20 7b 0a 09 E_HARD_LINK) {..
2260: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 /*.. * C
2270: 61 6e 27 74 20 68 61 72 64 20 6c 69 6e 6b 20 64 an't hard link d
2280: 69 72 65 63 74 6f 72 69 65 73 2e 0a 09 20 20 20 irectories...
2290: 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 53 */... Tcl_S
22a0: 65 74 45 72 72 6e 6f 28 45 49 53 44 49 52 29 3b etErrno(EISDIR);
22b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
22c0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
22d0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f Tcl_SetErrno(ENO
22e0: 44 45 56 29 3b 0a 09 20 20 20 20 72 65 74 75 72 DEV);.. retur
22f0: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d n -1;..}. }.}
2300: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2350: 20 2a 20 57 69 6e 52 65 61 64 4c 69 6e 6b 20 2d * WinReadLink -
2360: 2d 0a 20 2a 0a 20 2a 09 57 68 61 74 20 64 6f 65 -. *. *.What doe
2370: 73 20 27 4c 69 6e 6b 53 6f 75 72 63 65 27 20 70 s 'LinkSource' p
2380: 6f 69 6e 74 20 74 6f 3f 0a 20 2a 0a 20 2a 2d 2d oint to?. *. *--
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 2d 2d 2d 2d 2d 2d ----------------
23d0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 --. */..static T
23e0: 63 6c 5f 4f 62 6a 20 2a 0a 57 69 6e 52 65 61 64 cl_Obj *.WinRead
23f0: 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74 20 Link(. const
2400: 54 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72 63 TCHAR *linkSourc
2410: 65 50 61 74 68 29 0a 7b 0a 20 20 20 20 57 43 48 ePath).{. WCH
2420: 41 52 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 5b AR tempFileName[
2430: 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 54 MAX_PATH];. T
2440: 43 48 41 52 20 2a 74 65 6d 70 46 69 6c 65 50 61 CHAR *tempFilePa
2450: 72 74 3b 0a 20 20 20 20 44 57 4f 52 44 20 61 74 rt;. DWORD at
2460: 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 tr;.. /*.
2470: 20 2a 20 47 65 74 20 74 68 65 20 66 75 6c 6c 20 * Get the full
2480: 70 61 74 68 20 72 65 66 65 72 65 6e 63 65 64 20 path referenced
2490: 62 79 20 74 68 65 20 74 61 72 67 65 74 2e 0a 20 by the target..
24a0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
24b0: 21 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e !(*tclWinProcs->
24c0: 67 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 50 getFullPathNameP
24d0: 72 6f 63 29 28 6c 69 6e 6b 53 6f 75 72 63 65 50 roc)(linkSourceP
24e0: 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c 0a 09 ath, MAX_PATH,..
24f0: 20 20 20 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 tempFileName
2500: 2c 20 26 74 65 6d 70 46 69 6c 65 50 61 72 74 29 , &tempFilePart)
2510: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e 76 61 ) {../*.. * Inva
2520: 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a 2f 0a 0a lid file... */..
2530: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 .TclWinConvertEr
2540: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 ror(GetLastError
2550: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c ());..return NUL
2560: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
2570: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 . * Make sur
2580: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 64 6f e source file do
2590: 65 73 20 65 78 69 73 74 2e 0a 20 20 20 20 20 2a es exist.. *
25a0: 2f 0a 0a 20 20 20 20 61 74 74 72 20 3d 20 28 2a /.. attr = (*
25b0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 tclWinProcs->get
25c0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 50 72 FileAttributesPr
25d0: 6f 63 29 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 oc)(linkSourcePa
25e0: 74 68 29 3b 0a 20 20 20 20 69 66 20 28 61 74 74 th);. if (att
25f0: 72 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c r == INVALID_FIL
2600: 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a E_ATTRIBUTES) {.
2610: 09 2f 2a 0a 09 20 2a 20 54 68 65 20 73 6f 75 72 ./*.. * The sour
2620: 63 65 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 ce doesn't exist
2630: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 ... */...TclWinC
2640: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c onvertError(GetL
2650: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72 65 astError());..re
2660: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 turn NULL;..
2670: 7d 20 65 6c 73 65 20 69 66 20 28 28 61 74 74 72 } else if ((attr
2680: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 & FILE_ATTRIBUT
2690: 45 5f 44 49 52 45 43 54 4f 52 59 29 20 3d 3d 20 E_DIRECTORY) ==
26a0: 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 74 20 0) {../*.. * It
26b0: 69 73 20 61 20 66 69 6c 65 20 2d 20 74 68 69 73 is a file - this
26c0: 20 69 73 20 6e 6f 74 20 79 65 74 20 73 75 70 70 is not yet supp
26d0: 6f 72 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 orted... */...Tc
26e0: 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f 54 44 l_SetErrno(ENOTD
26f0: 49 52 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c IR);..return NUL
2700: 4c 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a L;. } else {.
2710: 09 72 65 74 75 72 6e 20 57 69 6e 52 65 61 64 4c .return WinReadL
2720: 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 6c 69 6e inkDirectory(lin
2730: 6b 53 6f 75 72 63 65 50 61 74 68 29 3b 0a 20 20 kSourcePath);.
2740: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d }.}.../*. *---
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2790: 2d 0a 20 2a 0a 20 2a 20 57 69 6e 53 79 6d 4c 69 -. *. * WinSymLi
27a0: 6e 6b 44 69 72 65 63 74 6f 72 79 20 2d 2d 0a 20 nkDirectory --.
27b0: 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74 69 6e *. *.This routin
27c0: 65 20 63 72 65 61 74 65 73 20 61 20 4e 54 46 53 e creates a NTFS
27d0: 20 6a 75 6e 63 74 69 6f 6e 2c 20 75 73 69 6e 67 junction, using
27e0: 20 74 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 the undocumente
27f0: 64 0a 20 2a 09 46 53 43 54 4c 5f 53 45 54 5f 52 d. *.FSCTL_SET_R
2800: 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 73 74 72 EPARSE_POINT str
2810: 75 63 74 75 72 65 20 57 69 6e 32 4b 20 75 73 65 ucture Win2K use
2820: 73 20 66 6f 72 20 6d 6f 75 6e 74 20 70 6f 69 6e s for mount poin
2830: 74 73 20 61 6e 64 0a 20 2a 09 6a 75 6e 63 74 69 ts and. *.juncti
2840: 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d ons.. *. *.Assum
2850: 70 74 69 6f 6e 20 74 68 61 74 20 6c 69 6e 6b 54 ption that linkT
2860: 61 72 67 65 74 50 61 74 68 20 69 73 20 61 20 76 argetPath is a v
2870: 61 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 20 64 alid, existing d
2880: 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 20 irectory.. *. *
2890: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a 65 72 6f Returns:. *.Zero
28a0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 20 2a 0a on success.. *.
28b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
2900: 69 63 20 69 6e 74 0a 57 69 6e 53 79 6d 4c 69 6e ic int.WinSymLin
2910: 6b 44 69 72 65 63 74 6f 72 79 28 0a 20 20 20 20 kDirectory(.
2920: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e const TCHAR *lin
2930: 6b 44 69 72 50 61 74 68 2c 0a 20 20 20 20 63 6f kDirPath,. co
2940: 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b 54 nst TCHAR *linkT
2950: 61 72 67 65 74 50 61 74 68 29 0a 7b 0a 20 20 20 argetPath).{.
2960: 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 DUMMY_REPARSE_B
2970: 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 UFFER dummy;.
2980: 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 REPARSE_DATA_BU
2990: 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 66 FFER *reparseBuf
29a0: 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f 44 fer = (REPARSE_D
29b0: 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 64 ATA_BUFFER *) &d
29c0: 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 6c 65 ummy;. int le
29d0: 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 6e 61 74 n;. WCHAR nat
29e0: 69 76 65 54 61 72 67 65 74 5b 4d 41 58 5f 50 41 iveTarget[MAX_PA
29f0: 54 48 5d 3b 0a 20 20 20 20 57 43 48 41 52 20 2a TH];. WCHAR *
2a00: 6c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 loop;.. /*.
2a10: 20 20 20 2a 20 4d 61 6b 65 20 74 68 65 20 6e 61 * Make the na
2a20: 74 69 76 65 20 74 61 72 67 65 74 20 6e 61 6d 65 tive target name
2a30: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d .. */.. m
2a40: 65 6d 63 70 79 28 6e 61 74 69 76 65 54 61 72 67 emcpy(nativeTarg
2a50: 65 74 2c 20 4c 22 5c 5c 3f 3f 5c 5c 22 2c 20 34 et, L"\\??\\", 4
2a60: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 * sizeof(WCHAR)
2a70: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6e 61 );. memcpy(na
2a80: 74 69 76 65 54 61 72 67 65 74 20 2b 20 34 2c 20 tiveTarget + 4,
2a90: 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 2c 0a linkTargetPath,.
2aa0: 09 20 20 20 73 69 7a 65 6f 66 28 57 43 48 41 52 . sizeof(WCHAR
2ab0: 29 20 2a 20 28 31 2b 77 63 73 6c 65 6e 28 28 57 ) * (1+wcslen((W
2ac0: 43 48 41 52 20 2a 29 20 6c 69 6e 6b 54 61 72 67 CHAR *) linkTarg
2ad0: 65 74 50 61 74 68 29 29 29 3b 0a 20 20 20 20 6c etPath)));. l
2ae0: 65 6e 20 3d 20 77 63 73 6c 65 6e 28 6e 61 74 69 en = wcslen(nati
2af0: 76 65 54 61 72 67 65 74 29 3b 0a 0a 20 20 20 20 veTarget);..
2b00: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6d 75 73 /*. * We mus
2b10: 74 20 68 61 76 65 20 62 61 63 6b 73 6c 61 73 68 t have backslash
2b20: 65 73 20 6f 6e 6c 79 2e 20 54 68 69 73 20 69 73 es only. This is
2b30: 20 56 45 52 59 20 49 4d 50 4f 52 54 41 4e 54 2e VERY IMPORTANT.
2b40: 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 0a If we have any.
2b50: 20 20 20 20 20 2a 20 66 6f 72 77 61 72 64 20 73 * forward s
2b60: 6c 61 73 68 65 73 20 65 76 65 72 79 74 68 69 6e lashes everythin
2b70: 67 20 61 70 70 65 61 72 73 20 74 6f 20 77 6f 72 g appears to wor
2b80: 6b 2c 20 62 75 74 20 74 68 65 20 72 65 73 75 6c k, but the resul
2b90: 74 69 6e 67 20 73 79 6d 6c 69 6e 6b 0a 20 20 20 ting symlink.
2ba0: 20 20 2a 20 69 73 20 75 73 65 6c 65 73 73 21 0a * is useless!.
2bb0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 */.. for
2bc0: 20 28 6c 6f 6f 70 20 3d 20 6e 61 74 69 76 65 54 (loop = nativeT
2bd0: 61 72 67 65 74 3b 20 2a 6c 6f 6f 70 20 21 3d 20 arget; *loop !=
2be0: 30 3b 20 6c 6f 6f 70 2b 2b 29 20 7b 0a 09 69 66 0; loop++) {..if
2bf0: 20 28 2a 6c 6f 6f 70 20 3d 3d 20 4c 27 2f 27 29 (*loop == L'/')
2c00: 20 7b 0a 09 20 20 20 20 2a 6c 6f 6f 70 20 3d 20 {.. *loop =
2c10: 4c 27 5c 5c 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a L'\\';..}. }.
2c20: 20 20 20 20 69 66 20 28 28 6e 61 74 69 76 65 54 if ((nativeT
2c30: 61 72 67 65 74 5b 6c 65 6e 2d 31 5d 20 3d 3d 20 arget[len-1] ==
2c40: 4c 27 5c 5c 27 29 20 26 26 20 28 6e 61 74 69 76 L'\\') && (nativ
2c50: 65 54 61 72 67 65 74 5b 6c 65 6e 2d 32 5d 20 21 eTarget[len-2] !
2c60: 3d 20 4c 27 3a 27 29 29 20 7b 0a 09 6e 61 74 69 = L':')) {..nati
2c70: 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d 31 5d 20 veTarget[len-1]
2c80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 0;. }..
2c90: 2f 2a 0a 20 20 20 20 20 2a 20 42 75 69 6c 64 20 /*. * Build
2ca0: 74 68 65 20 72 65 70 61 72 73 65 20 69 6e 66 6f the reparse info
2cb0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d .. */.. m
2cc0: 65 6d 73 65 74 28 72 65 70 61 72 73 65 42 75 66 emset(reparseBuf
2cd0: 66 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 fer, 0, sizeof(D
2ce0: 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 UMMY_REPARSE_BUF
2cf0: 46 45 52 29 29 3b 0a 20 20 20 20 72 65 70 61 72 FER));. repar
2d00: 73 65 42 75 66 66 65 72 2d 3e 52 65 70 61 72 73 seBuffer->Repars
2d10: 65 54 61 67 20 3d 20 49 4f 5f 52 45 50 41 52 53 eTag = IO_REPARS
2d20: 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e E_TAG_MOUNT_POIN
2d30: 54 3b 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 T;. reparseBu
2d40: 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 ffer->MountPoint
2d50: 52 65 70 61 72 73 65 42 75 66 66 65 72 2e 53 75 ReparseBuffer.Su
2d60: 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 bstituteNameLeng
2d70: 74 68 20 3d 0a 09 20 20 20 20 77 63 73 6c 65 6e th =.. wcslen
2d80: 28 6e 61 74 69 76 65 54 61 72 67 65 74 29 20 2a (nativeTarget) *
2d90: 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a sizeof(WCHAR);.
2da0: 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 reparseBuffe
2db0: 72 2d 3e 52 65 73 65 72 76 65 64 20 3d 20 30 3b r->Reserved = 0;
2dc0: 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 . reparseBuff
2dd0: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 er->MountPointRe
2de0: 70 61 72 73 65 42 75 66 66 65 72 2e 50 72 69 6e parseBuffer.Prin
2df0: 74 4e 61 6d 65 4c 65 6e 67 74 68 20 3d 20 30 3b tNameLength = 0;
2e00: 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 . reparseBuff
2e10: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 er->MountPointRe
2e20: 70 61 72 73 65 42 75 66 66 65 72 2e 50 72 69 6e parseBuffer.Prin
2e30: 74 4e 61 6d 65 4f 66 66 73 65 74 20 3d 0a 09 20 tNameOffset =..
2e40: 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72 reparseBuffer
2e50: 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 ->MountPointRepa
2e60: 72 73 65 42 75 66 66 65 72 2e 53 75 62 73 74 69 rseBuffer.Substi
2e70: 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 0a 09 tuteNameLength..
2e80: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 57 43 48 + sizeof(WCH
2e90: 41 52 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 AR);. memcpy(
2ea0: 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d reparseBuffer->M
2eb0: 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 ountPointReparse
2ec0: 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 Buffer.PathBuffe
2ed0: 72 2c 20 6e 61 74 69 76 65 54 61 72 67 65 74 2c r, nativeTarget,
2ee0: 0a 09 20 20 20 20 73 69 7a 65 6f 66 28 57 43 48 .. sizeof(WCH
2ef0: 41 52 29 0a 09 20 20 20 20 2b 20 72 65 70 61 72 AR).. + repar
2f00: 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 seBuffer->MountP
2f10: 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 ointReparseBuffe
2f20: 72 2e 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 r.SubstituteName
2f30: 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 72 65 70 Length);. rep
2f40: 61 72 73 65 42 75 66 66 65 72 2d 3e 52 65 70 61 arseBuffer->Repa
2f50: 72 73 65 44 61 74 61 4c 65 6e 67 74 68 20 3d 0a rseDataLength =.
2f60: 09 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 . reparseBuff
2f70: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 er->MountPointRe
2f80: 70 61 72 73 65 42 75 66 66 65 72 2e 53 75 62 73 parseBuffer.Subs
2f90: 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 tituteNameLength
2fa0: 2b 31 32 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e +12;.. return
2fb0: 20 4e 61 74 69 76 65 57 72 69 74 65 52 65 70 61 NativeWriteRepa
2fc0: 72 73 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c rse(linkDirPath,
2fd0: 20 72 65 70 61 72 73 65 42 75 66 66 65 72 29 3b reparseBuffer);
2fe0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
3030: 2a 0a 20 2a 20 54 63 6c 57 69 6e 53 79 6d 4c 69 *. * TclWinSymLi
3040: 6e 6b 43 6f 70 79 44 69 72 65 63 74 6f 72 79 20 nkCopyDirectory
3050: 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 70 79 20 61 20 --. *. *.Copy a
3060: 57 69 6e 64 6f 77 73 20 4e 54 46 53 20 6a 75 6e Windows NTFS jun
3070: 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 ction. This func
3080: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 tion assumes tha
3090: 74 20 4c 69 6e 6b 4f 72 69 67 69 6e 61 6c 0a 20 t LinkOriginal.
30a0: 2a 09 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 *.exists and is
30b0: 61 20 76 61 6c 69 64 20 6a 75 6e 63 74 69 6f 6e a valid junction
30c0: 20 70 6f 69 6e 74 2c 20 61 6e 64 20 74 68 61 74 point, and that
30d0: 20 4c 69 6e 6b 43 6f 70 79 20 64 6f 65 73 20 6e LinkCopy does n
30e0: 6f 74 0a 20 2a 09 65 78 69 73 74 2e 0a 20 2a 0a ot. *.exist.. *.
30f0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a * Returns:. *.Z
3100: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a ero on success..
3110: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
3160: 6e 74 0a 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b nt.TclWinSymLink
3170: 43 6f 70 79 44 69 72 65 63 74 6f 72 79 28 0a 20 CopyDirectory(.
3180: 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a const TCHAR *
3190: 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 09 2f 2a linkOrigPath,./*
31a0: 20 45 78 69 73 74 69 6e 67 20 6a 75 6e 63 74 69 Existing juncti
31b0: 6f 6e 20 2d 20 72 65 70 61 72 73 65 20 70 6f 69 on - reparse poi
31c0: 6e 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 nt */. const
31d0: 54 43 48 41 52 20 2a 6c 69 6e 6b 43 6f 70 79 50 TCHAR *linkCopyP
31e0: 61 74 68 29 09 2f 2a 20 57 69 6c 6c 20 62 65 63 ath)./* Will bec
31f0: 6f 6d 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 ome a duplicate
3200: 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7b 0a 20 20 junction */.{.
3210: 20 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f DUMMY_REPARSE_
3220: 42 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 BUFFER dummy;.
3230: 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 REPARSE_DATA_B
3240: 55 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 UFFER *reparseBu
3250: 66 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f ffer = (REPARSE_
3260: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 DATA_BUFFER *) &
3270: 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 66 20 28 dummy;.. if (
3280: 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 72 73 NativeReadRepars
3290: 65 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 20 e(linkOrigPath,
32a0: 72 65 70 61 72 73 65 42 75 66 66 65 72 2c 20 47 reparseBuffer, G
32b0: 45 4e 45 52 49 43 5f 52 45 41 44 29 29 20 7b 0a ENERIC_READ)) {.
32c0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 .return -1;.
32d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74 }. return Nat
32e0: 69 76 65 57 72 69 74 65 52 65 70 61 72 73 65 28 iveWriteReparse(
32f0: 6c 69 6e 6b 43 6f 70 79 50 61 74 68 2c 20 72 65 linkCopyPath, re
3300: 70 61 72 73 65 42 75 66 66 65 72 29 3b 0a 7d 0a parseBuffer);.}.
3310: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3360: 2a 20 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b 44 * TclWinSymLinkD
3370: 65 6c 65 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 elete --. *. *.D
3380: 65 6c 65 74 65 20 61 20 57 69 6e 64 6f 77 73 20 elete a Windows
3390: 4e 54 46 53 20 6a 75 6e 63 74 69 6f 6e 2e 20 4f NTFS junction. O
33a0: 6e 63 65 20 74 68 65 20 6a 75 6e 63 74 69 6f 6e nce the junction
33b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 0a information is.
33c0: 20 2a 09 64 65 6c 65 74 65 64 2c 20 74 68 65 20 *.deleted, the
33d0: 66 69 6c 65 73 79 73 74 65 6d 20 6f 62 6a 65 63 filesystem objec
33e0: 74 20 62 65 63 6f 6d 65 73 20 61 6e 20 6f 72 64 t becomes an ord
33f0: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e inary directory.
3400: 20 55 6e 6c 65 73 73 0a 20 2a 09 27 6c 69 6e 6b Unless. *.'link
3410: 4f 6e 6c 79 27 20 69 73 20 67 69 76 65 6e 2c 20 Only' is given,
3420: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 69 that directory i
3430: 73 20 61 6c 73 6f 20 72 65 6d 6f 76 65 64 2e 0a s also removed..
3440: 20 2a 0a 20 2a 09 41 73 73 75 6d 70 74 69 6f 6e *. *.Assumption
3450: 20 74 68 61 74 20 4c 69 6e 6b 4f 72 69 67 69 6e that LinkOrigin
3460: 61 6c 20 69 73 20 61 20 76 61 6c 69 64 2c 20 65 al is a valid, e
3470: 78 69 73 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e xisting junction
3480: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
3490: 0a 20 2a 09 5a 65 72 6f 20 6f 6e 20 73 75 63 63 . *.Zero on succ
34a0: 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ess.. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
34f0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 57 69 6e 53 79 */..int.TclWinSy
3500: 6d 4c 69 6e 6b 44 65 6c 65 74 65 28 0a 20 20 20 mLinkDelete(.
3510: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 const TCHAR *li
3520: 6e 6b 4f 72 69 67 50 61 74 68 2c 0a 20 20 20 20 nkOrigPath,.
3530: 69 6e 74 20 6c 69 6e 6b 4f 6e 6c 79 29 0a 7b 0a int linkOnly).{.
3540: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 74 /*. * It
3550: 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c is a symbolic l
3560: 69 6e 6b 20 2d 20 72 65 6d 6f 76 65 20 69 74 2e ink - remove it.
3570: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 44 55 . */.. DU
3580: 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 46 MMY_REPARSE_BUFF
3590: 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20 52 45 ER dummy;. RE
35a0: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 PARSE_DATA_BUFFE
35b0: 52 20 2a 72 65 70 61 72 73 65 42 75 66 66 65 72 R *reparseBuffer
35c0: 20 3d 20 28 52 45 50 41 52 53 45 5f 44 41 54 41 = (REPARSE_DATA
35d0: 5f 42 55 46 46 45 52 20 2a 29 20 26 64 75 6d 6d _BUFFER *) &dumm
35e0: 79 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 46 y;. HANDLE hF
35f0: 69 6c 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 72 ile;. DWORD r
3600: 65 74 75 72 6e 65 64 4c 65 6e 67 74 68 3b 0a 0a eturnedLength;..
3610: 20 20 20 20 6d 65 6d 73 65 74 28 72 65 70 61 72 memset(repar
3620: 73 65 42 75 66 66 65 72 2c 20 30 2c 20 73 69 7a seBuffer, 0, siz
3630: 65 6f 66 28 44 55 4d 4d 59 5f 52 45 50 41 52 53 eof(DUMMY_REPARS
3640: 45 5f 42 55 46 46 45 52 29 29 3b 0a 20 20 20 20 E_BUFFER));.
3650: 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 52 reparseBuffer->R
3660: 65 70 61 72 73 65 54 61 67 20 3d 20 49 4f 5f 52 eparseTag = IO_R
3670: 45 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 EPARSE_TAG_MOUNT
3680: 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 68 46 69 6c _POINT;. hFil
3690: 65 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 e = (*tclWinProc
36a0: 73 2d 3e 63 72 65 61 74 65 46 69 6c 65 50 72 6f s->createFilePro
36b0: 63 29 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c c)(linkOrigPath,
36c0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20 GENERIC_WRITE,
36d0: 30 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 4f 50 0,.. NULL, OP
36e0: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 20 20 EN_EXISTING,..
36f0: 20 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e FILE_FLAG_OPEN
3700: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 7c 46 _REPARSE_POINT|F
3710: 49 4c 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f ILE_FLAG_BACKUP_
3720: 53 45 4d 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 SEMANTICS, NULL)
3730: 3b 0a 0a 20 20 20 20 69 66 20 28 68 46 69 6c 65 ;.. if (hFile
3740: 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 != INVALID_HAND
3750: 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 69 66 20 LE_VALUE) {..if
3760: 28 21 44 65 76 69 63 65 49 6f 43 6f 6e 74 72 6f (!DeviceIoContro
3770: 6c 28 68 46 69 6c 65 2c 20 46 53 43 54 4c 5f 44 l(hFile, FSCTL_D
3780: 45 4c 45 54 45 5f 52 45 50 41 52 53 45 5f 50 4f ELETE_REPARSE_PO
3790: 49 4e 54 2c 20 72 65 70 61 72 73 65 42 75 66 66 INT, reparseBuff
37a0: 65 72 2c 0a 09 09 52 45 50 41 52 53 45 5f 4d 4f er,...REPARSE_MO
37b0: 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 52 5f UNTPOINT_HEADER_
37c0: 53 49 5a 45 2c 4e 55 4c 4c 2c 30 2c 26 72 65 74 SIZE,NULL,0,&ret
37d0: 75 72 6e 65 64 4c 65 6e 67 74 68 2c 4e 55 4c 4c urnedLength,NULL
37e0: 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 )) {.. /*..
37f0: 20 20 20 2a 20 45 72 72 6f 72 20 73 65 74 74 69 * Error setti
3800: 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e 0a 09 20 20 ng junction...
3810: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 57 */... TclW
3820: 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 inConvertError(G
3830: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a etLastError());.
3840: 09 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 . CloseHandle
3850: 28 68 46 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 65 (hFile);..} else
3860: 20 7b 0a 09 20 20 20 20 43 6c 6f 73 65 48 61 6e {.. CloseHan
3870: 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 20 20 20 dle(hFile);..
3880: 20 69 66 20 28 21 6c 69 6e 6b 4f 6e 6c 79 29 20 if (!linkOnly)
3890: 7b 0a 09 09 28 2a 74 63 6c 57 69 6e 50 72 6f 63 {...(*tclWinProc
38a0: 73 2d 3e 72 65 6d 6f 76 65 44 69 72 65 63 74 6f s->removeDirecto
38b0: 72 79 50 72 6f 63 29 28 6c 69 6e 6b 4f 72 69 67 ryProc)(linkOrig
38c0: 50 61 74 68 29 3b 0a 09 20 20 20 20 7d 0a 09 20 Path);.. }..
38d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a return 0;..}.
38e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
38f0: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d -1;.}.../*. *--
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 0a 20 2a 0a 20 2a 20 57 69 6e 52 65 61 64 --. *. * WinRead
3950: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 2d 2d LinkDirectory --
3960: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74 . *. *.This rout
3970: 69 6e 65 20 72 65 61 64 73 20 61 20 4e 54 46 53 ine reads a NTFS
3980: 20 6a 75 6e 63 74 69 6f 6e 2c 20 75 73 69 6e 67 junction, using
3990: 20 74 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 the undocumente
39a0: 64 0a 20 2a 09 46 53 43 54 4c 5f 47 45 54 5f 52 d. *.FSCTL_GET_R
39b0: 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 73 74 72 EPARSE_POINT str
39c0: 75 63 74 75 72 65 20 57 69 6e 32 4b 20 75 73 65 ucture Win2K use
39d0: 73 20 66 6f 72 20 6d 6f 75 6e 74 20 70 6f 69 6e s for mount poin
39e0: 74 73 20 61 6e 64 0a 20 2a 09 6a 75 6e 63 74 69 ts and. *.juncti
39f0: 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d ons.. *. *.Assum
3a00: 70 74 69 6f 6e 20 74 68 61 74 20 4c 69 6e 6b 44 ption that LinkD
3a10: 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 76 61 irectory is a va
3a20: 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 20 64 69 lid, existing di
3a30: 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 20 52 rectory.. *. * R
3a40: 65 74 75 72 6e 73 3a 0a 20 2a 09 41 20 54 63 6c eturns:. *.A Tcl
3a50: 5f 4f 62 6a 20 77 69 74 68 20 72 65 66 43 6f 75 _Obj with refCou
3a60: 6e 74 20 6f 66 20 31 20 28 69 2e 65 2e 20 6f 77 nt of 1 (i.e. ow
3a70: 6e 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 ned by the calle
3a80: 72 29 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 0a 20 r), or NULL if.
3a90: 2a 09 61 6e 79 74 68 69 6e 67 20 77 65 6e 74 20 *.anything went
3aa0: 77 72 6f 6e 67 2e 0a 20 2a 0a 20 2a 09 49 6e 20 wrong.. *. *.In
3ab0: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 73 68 the future we sh
3ac0: 6f 75 6c 64 20 65 6e 68 61 6e 63 65 20 74 68 69 ould enhance thi
3ad0: 73 20 74 6f 20 72 65 74 75 72 6e 20 61 20 70 61 s to return a pa
3ae0: 74 68 20 6f 62 6a 65 63 74 20 72 61 74 68 65 72 th object rather
3af0: 0a 20 2a 09 74 68 61 6e 20 61 20 73 74 72 69 6e . *.than a strin
3b00: 67 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d g.. *. *--------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3b50: 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a ..static Tcl_Obj
3b60: 20 2a 0a 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 *.WinReadLinkDi
3b70: 72 65 63 74 6f 72 79 28 0a 20 20 20 20 63 6f 6e rectory(. con
3b80: 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b 44 69 st TCHAR *linkDi
3b90: 72 50 61 74 68 29 0a 7b 0a 20 20 20 20 69 6e 74 rPath).{. int
3ba0: 20 61 74 74 72 2c 20 6c 65 6e 2c 20 6f 66 66 73 attr, len, offs
3bb0: 65 74 3b 0a 20 20 20 20 44 55 4d 4d 59 5f 52 45 et;. DUMMY_RE
3bc0: 50 41 52 53 45 5f 42 55 46 46 45 52 20 64 75 6d PARSE_BUFFER dum
3bd0: 6d 79 3b 0a 20 20 20 20 52 45 50 41 52 53 45 5f my;. REPARSE_
3be0: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 72 65 70 DATA_BUFFER *rep
3bf0: 61 72 73 65 42 75 66 66 65 72 20 3d 20 28 52 45 arseBuffer = (RE
3c00: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 PARSE_DATA_BUFFE
3c10: 52 20 2a 29 20 26 64 75 6d 6d 79 3b 0a 20 20 20 R *) &dummy;.
3c20: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 56 61 6c Tcl_Obj *retVal
3c30: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e ;. Tcl_DStrin
3c40: 67 20 64 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 g ds;. const
3c50: 63 68 61 72 20 2a 63 6f 70 79 3b 0a 0a 20 20 20 char *copy;..
3c60: 20 61 74 74 72 20 3d 20 28 2a 74 63 6c 57 69 6e attr = (*tclWin
3c70: 50 72 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 Procs->getFileAt
3c80: 74 72 69 62 75 74 65 73 50 72 6f 63 29 28 6c 69 tributesProc)(li
3c90: 6e 6b 44 69 72 50 61 74 68 29 3b 0a 20 20 20 20 nkDirPath);.
3ca0: 69 66 20 28 21 28 61 74 74 72 20 26 20 46 49 4c if (!(attr & FIL
3cb0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 50 41 E_ATTRIBUTE_REPA
3cc0: 52 53 45 5f 50 4f 49 4e 54 29 29 20 7b 0a 09 67 RSE_POINT)) {..g
3cd0: 6f 74 6f 20 69 6e 76 61 6c 69 64 45 72 72 6f 72 oto invalidError
3ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
3cf0: 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 72 73 NativeReadRepars
3d00: 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c 20 72 e(linkDirPath, r
3d10: 65 70 61 72 73 65 42 75 66 66 65 72 2c 20 30 29 eparseBuffer, 0)
3d20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
3d30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 ;. }.. swi
3d40: 74 63 68 20 28 72 65 70 61 72 73 65 42 75 66 66 tch (reparseBuff
3d50: 65 72 2d 3e 52 65 70 61 72 73 65 54 61 67 29 20 er->ReparseTag)
3d60: 7b 0a 20 20 20 20 63 61 73 65 20 30 78 38 30 30 {. case 0x800
3d70: 30 30 30 30 30 7c 49 4f 5f 52 45 50 41 52 53 45 00000|IO_REPARSE
3d80: 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 _TAG_SYMBOLIC_LI
3d90: 4e 4b 3a 0a 20 20 20 20 63 61 73 65 20 49 4f 5f NK:. case IO_
3da0: 52 45 50 41 52 53 45 5f 54 41 47 5f 53 59 4d 42 REPARSE_TAG_SYMB
3db0: 4f 4c 49 43 5f 4c 49 4e 4b 3a 0a 20 20 20 20 63 OLIC_LINK:. c
3dc0: 61 73 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 ase IO_REPARSE_T
3dd0: 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54 3a 0a AG_MOUNT_POINT:.
3de0: 09 2f 2a 0a 09 20 2a 20 43 65 72 74 61 69 6e 20 ./*.. * Certain
3df0: 6e 61 74 69 76 65 20 70 61 74 68 20 72 65 70 72 native path repr
3e00: 65 73 65 6e 74 61 74 69 6f 6e 73 20 6f 6e 20 57 esentations on W
3e10: 69 6e 64 6f 77 73 20 68 61 76 65 20 61 20 73 70 indows have a sp
3e20: 65 63 69 61 6c 0a 09 20 2a 20 70 72 65 66 69 78 ecial.. * prefix
3e30: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 to indicate tha
3e40: 74 20 74 68 65 79 20 61 72 65 20 74 6f 20 62 65 t they are to be
3e50: 20 74 72 65 61 74 65 64 20 73 70 65 63 69 61 6c treated special
3e60: 6c 79 2e 20 46 6f 72 0a 09 20 2a 20 65 78 61 6d ly. For.. * exam
3e70: 70 6c 65 20 65 78 74 72 65 6d 65 6c 79 20 6c 6f ple extremely lo
3e80: 6e 67 20 70 61 74 68 73 2c 20 6f 72 20 73 79 6d ng paths, or sym
3e90: 6c 69 6e 6b 73 2c 20 6f 72 20 76 6f 6c 75 6d 65 links, or volume
3ea0: 73 20 6d 6f 75 6e 74 65 64 0a 09 20 2a 20 69 6e s mounted.. * in
3eb0: 73 69 64 65 20 64 69 72 65 63 74 6f 72 69 65 73 side directories
3ec0: 2e 0a 09 20 2a 0a 09 20 2a 20 54 68 65 72 65 20 ... *.. * There
3ed0: 69 73 20 61 6e 20 61 73 73 75 6d 70 74 69 6f 6e is an assumption
3ee0: 20 69 6e 20 74 68 69 73 20 63 6f 64 65 20 74 68 in this code th
3ef0: 61 74 20 27 77 69 64 65 27 20 69 6e 74 65 72 66 at 'wide' interf
3f00: 61 63 65 73 20 61 72 65 0a 09 20 2a 20 62 65 69 aces are.. * bei
3f10: 6e 67 20 75 73 65 64 20 28 73 65 65 20 74 63 6c ng used (see tcl
3f20: 57 69 6e 33 32 44 6c 6c 2e 63 29 2c 20 77 68 69 Win32Dll.c), whi
3f30: 63 68 20 69 73 20 74 72 75 65 20 66 6f 72 20 74 ch is true for t
3f40: 68 65 20 6f 6e 6c 79 20 73 79 73 74 65 6d 73 0a he only systems.
3f50: 09 20 2a 20 77 68 69 63 68 20 73 75 70 70 6f 72 . * which suppor
3f60: 74 20 72 65 70 61 72 73 65 20 74 61 67 73 20 61 t reparse tags a
3f70: 74 20 70 72 65 73 65 6e 74 2e 20 49 66 20 74 68 t present. If th
3f80: 61 74 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 at changes in th
3f90: 65 0a 09 20 2a 20 66 75 74 75 72 65 2c 20 74 68 e.. * future, th
3fa0: 69 73 20 63 6f 64 65 20 77 69 6c 6c 20 68 61 76 is code will hav
3fb0: 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 6c 69 e to be generali
3fc0: 73 65 64 2e 0a 09 20 2a 2f 0a 0a 09 6f 66 66 73 sed... */...offs
3fd0: 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 70 et = 0;..if (rep
3fe0: 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e arseBuffer->Moun
3ff0: 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 tPointReparseBuf
4000: 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 5b 30 fer.PathBuffer[0
4010: 5d 20 3d 3d 20 4c 27 5c 5c 27 29 20 7b 0a 09 20 ] == L'\\') {..
4020: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 68 /*.. * Ch
4030: 65 63 6b 20 77 68 65 74 68 65 72 20 74 68 69 73 eck whether this
4040: 20 69 73 20 61 20 6d 6f 75 6e 74 65 64 20 76 6f is a mounted vo
4050: 6c 75 6d 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a lume... */..
4060: 09 20 20 20 20 69 66 20 28 77 63 73 6e 63 6d 70 . if (wcsncmp
4070: 28 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e (reparseBuffer->
4080: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 MountPointRepars
4090: 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 eBuffer.PathBuff
40a0: 65 72 2c 0a 09 09 20 20 20 20 4c 22 5c 5c 3f 3f er,... L"\\??
40b0: 5c 5c 56 6f 6c 75 6d 65 7b 22 2c 31 31 29 20 3d \\Volume{",11) =
40c0: 3d 20 30 29 20 7b 0a 09 09 63 68 61 72 20 64 72 = 0) {...char dr
40d0: 69 76 65 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 ive;..../*... *
40e0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 20 63 6f There is some co
40f0: 6e 66 75 73 69 6f 6e 20 62 65 74 77 65 65 6e 20 nfusion between
4100: 5c 3f 3f 5c 20 61 6e 64 20 5c 5c 3f 5c 20 77 68 \??\ and \\?\ wh
4110: 69 63 68 20 77 65 20 68 61 76 65 0a 09 09 20 2a ich we have... *
4120: 20 74 6f 20 66 69 78 20 68 65 72 65 2e 20 49 74 to fix here. It
4130: 20 64 6f 65 73 6e 27 74 20 73 65 65 6d 20 76 65 doesn't seem ve
4140: 72 79 20 77 65 6c 6c 20 64 6f 63 75 6d 65 6e 74 ry well document
4150: 65 64 2e 0a 09 09 20 2a 2f 0a 0a 09 09 72 65 70 ed.... */....rep
4160: 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e arseBuffer->Moun
4170: 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 tPointReparseBuf
4180: 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 5b 31 fer.PathBuffer[1
4190: 5d 3d 4c 27 5c 5c 27 3b 0a 0a 09 09 2f 2a 0a 09 ]=L'\\';..../*..
41a0: 09 20 2a 20 43 68 65 63 6b 20 69 66 20 61 20 63 . * Check if a c
41b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 72 69 orresponding dri
41c0: 76 65 20 6c 65 74 74 65 72 20 65 78 69 73 74 73 ve letter exists
41d0: 2c 20 61 6e 64 20 75 73 65 20 74 68 61 74 0a 09 , and use that..
41e0: 09 20 2a 20 69 66 20 69 74 20 69 73 20 66 6f 75 . * if it is fou
41f0: 6e 64 0a 09 09 20 2a 2f 0a 0a 09 09 64 72 69 76 nd... */....driv
4200: 65 20 3d 20 54 63 6c 57 69 6e 44 72 69 76 65 4c e = TclWinDriveL
4210: 65 74 74 65 72 46 6f 72 56 6f 6c 4d 6f 75 6e 74 etterForVolMount
4220: 50 6f 69 6e 74 28 0a 09 09 09 72 65 70 61 72 73 Point(....repars
4230: 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f eBuffer->MountPo
4240: 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 intReparseBuffer
4250: 2e 50 61 74 68 42 75 66 66 65 72 29 3b 0a 09 09 .PathBuffer);...
4260: 69 66 20 28 64 72 69 76 65 20 21 3d 20 2d 31 29 if (drive != -1)
4270: 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20 64 72 {... char dr
4280: 69 76 65 53 70 65 63 5b 33 5d 20 3d 20 7b 0a 09 iveSpec[3] = {..
4290: 09 09 27 5c 30 27 2c 20 27 3a 27 2c 20 27 5c 30 ..'\0', ':', '\0
42a0: 27 0a 09 09 20 20 20 20 7d 3b 0a 0a 09 09 20 20 '... };....
42b0: 20 20 64 72 69 76 65 53 70 65 63 5b 30 5d 20 3d driveSpec[0] =
42c0: 20 64 72 69 76 65 3b 0a 09 09 20 20 20 20 72 65 drive;... re
42d0: 74 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 tVal = Tcl_NewSt
42e0: 72 69 6e 67 4f 62 6a 28 64 72 69 76 65 53 70 65 ringObj(driveSpe
42f0: 63 2c 32 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f c,2);... Tcl_
4300: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 74 IncrRefCount(ret
4310: 56 61 6c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 Val);... retu
4320: 72 6e 20 72 65 74 56 61 6c 3b 0a 09 09 7d 0a 0a rn retVal;...}..
4330: 09 09 2f 2a 0a 09 09 20 2a 20 54 68 69 73 20 69 ../*... * This i
4340: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 6d 6f 75 s actually a mou
4350: 6e 74 65 64 20 64 72 69 76 65 2c 20 77 68 69 63 nted drive, whic
4360: 68 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 73 h doesn't exists
4370: 20 61 73 20 61 0a 09 09 20 2a 20 44 4f 53 20 64 as a... * DOS d
4380: 72 69 76 65 20 6c 65 74 74 65 72 2e 20 54 68 69 rive letter. Thi
4390: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 74 68 s means the path
43a0: 20 69 73 6e 27 74 20 61 63 74 75 61 6c 6c 79 20 isn't actually
43b0: 61 0a 09 09 20 2a 20 6c 69 6e 6b 2c 20 61 6c 74 a... * link, alt
43c0: 68 6f 75 67 68 20 77 65 20 70 61 72 74 69 61 6c hough we partial
43d0: 6c 79 20 74 72 65 61 74 20 69 74 20 6c 69 6b 65 ly treat it like
43e0: 20 6f 6e 65 20 28 27 66 69 6c 65 20 74 79 70 65 one ('file type
43f0: 27 0a 09 09 20 2a 20 77 69 6c 6c 20 72 65 74 75 '... * will retu
4400: 72 6e 20 27 6c 69 6e 6b 27 29 2c 20 62 75 74 20 rn 'link'), but
4410: 74 68 65 6e 20 74 68 65 20 6c 69 6e 6b 20 77 69 then the link wi
4420: 6c 6c 20 61 63 74 75 61 6c 6c 79 20 6a 75 73 74 ll actually just
4430: 0a 09 09 20 2a 20 62 65 20 74 72 65 61 74 65 64 ... * be treated
4440: 20 6c 69 6b 65 20 61 6e 20 6f 72 64 69 6e 61 72 like an ordinar
4450: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 49 20 64 y directory. I d
4460: 6f 6e 27 74 20 62 65 6c 69 65 76 65 20 61 6e 79 on't believe any
4470: 0a 09 09 20 2a 20 73 65 72 69 6f 75 73 20 69 6e ... * serious in
4480: 63 6f 6e 73 69 73 74 65 6e 63 79 20 77 69 6c 6c consistency will
4490: 20 61 72 69 73 65 20 66 72 6f 6d 20 74 68 69 73 arise from this
44a0: 2c 20 62 75 74 20 69 74 20 69 73 0a 09 09 20 2a , but it is... *
44b0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 6f 20 62 65 something to be
44c0: 20 61 77 61 72 65 20 6f 66 2e 0a 09 09 20 2a 2f aware of.... */
44d0: 0a 0a 09 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64 ....goto invalid
44e0: 45 72 72 6f 72 3b 0a 09 20 20 20 20 7d 20 65 6c Error;.. } el
44f0: 73 65 20 69 66 20 28 77 63 73 6e 63 6d 70 28 72 se if (wcsncmp(r
4500: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f eparseBuffer->Mo
4510: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 untPointReparseB
4520: 75 66 66 65 72 0a 09 09 20 20 20 20 2e 50 61 74 uffer... .Pat
4530: 68 42 75 66 66 65 72 2c 20 4c 22 5c 5c 5c 5c 3f hBuffer, L"\\\\?
4540: 5c 5c 22 2c 34 29 20 3d 3d 20 30 29 20 7b 0a 09 \\",4) == 0) {..
4550: 09 2f 2a 0a 09 09 20 2a 20 53 74 72 69 70 20 6f ./*... * Strip o
4560: 66 66 20 74 68 65 20 70 72 65 66 69 78 2e 0a 09 ff the prefix...
4570: 09 20 2a 2f 0a 0a 09 09 6f 66 66 73 65 74 20 3d . */....offset =
4580: 20 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 4;.. } else
4590: 69 66 20 28 77 63 73 6e 63 6d 70 28 72 65 70 61 if (wcsncmp(repa
45a0: 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 rseBuffer->Mount
45b0: 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 PointReparseBuff
45c0: 65 72 0a 09 09 20 20 20 20 2e 50 61 74 68 42 75 er... .PathBu
45d0: 66 66 65 72 2c 20 4c 22 5c 5c 3f 3f 5c 5c 22 2c ffer, L"\\??\\",
45e0: 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 0a 4) == 0) {.../*.
45f0: 09 09 20 2a 20 53 74 72 69 70 20 6f 66 66 20 74 .. * Strip off t
4600: 68 65 20 70 72 65 66 69 78 2e 0a 09 09 20 2a 2f he prefix.... */
4610: 0a 0a 09 09 6f 66 66 73 65 74 20 3d 20 34 3b 0a ....offset = 4;.
4620: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 54 63 6c 5f . }..}...Tcl_
4630: 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 63 WinTCharToUtf((c
4640: 6f 6e 73 74 20 63 68 61 72 20 2a 29 0a 09 09 72 onst char *)...r
4650: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f eparseBuffer->Mo
4660: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 untPointReparseB
4670: 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 uffer.PathBuffer
4680: 2c 0a 09 09 28 69 6e 74 29 20 72 65 70 61 72 73 ,...(int) repars
4690: 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f eBuffer->MountPo
46a0: 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 intReparseBuffer
46b0: 0a 09 09 2e 53 75 62 73 74 69 74 75 74 65 4e 61 ....SubstituteNa
46c0: 6d 65 4c 65 6e 67 74 68 2c 20 26 64 73 29 3b 0a meLength, &ds);.
46d0: 0a 09 63 6f 70 79 20 3d 20 54 63 6c 5f 44 53 74 ..copy = Tcl_DSt
46e0: 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29 2b 6f ringValue(&ds)+o
46f0: 66 66 73 65 74 3b 0a 09 6c 65 6e 20 3d 20 54 63 ffset;..len = Tc
4700: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 l_DStringLength(
4710: 26 64 73 29 2d 6f 66 66 73 65 74 3b 0a 09 72 65 &ds)-offset;..re
4720: 74 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 tVal = Tcl_NewSt
4730: 72 69 6e 67 4f 62 6a 28 63 6f 70 79 2c 6c 65 6e ringObj(copy,len
4740: 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 );..Tcl_IncrRefC
4750: 6f 75 6e 74 28 72 65 74 56 61 6c 29 3b 0a 09 54 ount(retVal);..T
4760: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
4770: 64 73 29 3b 0a 09 72 65 74 75 72 6e 20 72 65 74 ds);..return ret
4780: 56 61 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 69 6e Val;. }.. in
4790: 76 61 6c 69 64 45 72 72 6f 72 3a 0a 20 20 20 20 validError:.
47a0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e Tcl_SetErrno(EIN
47b0: 56 41 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e VAL);. return
47c0: 20 4e 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a NULL;.}.../*. *
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4810: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 ----. *. * Nativ
4820: 65 52 65 61 64 52 65 70 61 72 73 65 20 2d 2d 0a eReadReparse --.
4830: 20 2a 0a 20 2a 09 52 65 61 64 20 74 68 65 20 6a *. *.Read the j
4840: 75 6e 63 74 69 6f 6e 2f 72 65 70 61 72 73 65 20 unction/reparse
4850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d information from
4860: 20 61 20 67 69 76 65 6e 20 4e 54 46 53 20 64 69 a given NTFS di
4870: 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 09 41 rectory.. *. *.A
4880: 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 6c ssumption that l
4890: 69 6e 6b 44 69 72 50 61 74 68 20 69 73 20 61 20 inkDirPath is a
48a0: 76 61 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 20 valid, existing
48b0: 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a directory.. *. *
48c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a 65 72 Returns:. *.Zer
48d0: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 20 2a o on success.. *
48e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
4930: 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 52 65 tic int.NativeRe
4940: 61 64 52 65 70 61 72 73 65 28 0a 20 20 20 20 63 adReparse(. c
4950: 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b onst TCHAR *link
4960: 44 69 72 50 61 74 68 2c 09 2f 2a 20 54 68 65 20 DirPath,./* The
4970: 6a 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 61 64 junction to read
4980: 20 2a 2f 0a 20 20 20 20 52 45 50 41 52 53 45 5f */. REPARSE_
4990: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 62 75 66 DATA_BUFFER *buf
49a0: 66 65 72 2c 2f 2a 20 50 6f 69 6e 74 65 72 20 74 fer,/* Pointer t
49b0: 6f 20 62 75 66 66 65 72 2e 20 43 61 6e 6e 6f 74 o buffer. Cannot
49c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 be NULL */.
49d0: 44 57 4f 52 44 20 64 65 73 69 72 65 64 41 63 63 DWORD desiredAcc
49e0: 65 73 73 29 0a 7b 0a 20 20 20 20 48 41 4e 44 4c ess).{. HANDL
49f0: 45 20 68 46 69 6c 65 3b 0a 20 20 20 20 44 57 4f E hFile;. DWO
4a00: 52 44 20 72 65 74 75 72 6e 65 64 4c 65 6e 67 74 RD returnedLengt
4a10: 68 3b 0a 0a 20 20 20 20 68 46 69 6c 65 20 3d 20 h;.. hFile =
4a20: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 63 (*tclWinProcs->c
4a30: 72 65 61 74 65 46 69 6c 65 50 72 6f 63 29 28 6c reateFileProc)(l
4a40: 69 6e 6b 44 69 72 50 61 74 68 2c 20 64 65 73 69 inkDirPath, desi
4a50: 72 65 64 41 63 63 65 73 73 2c 20 46 49 4c 45 5f redAccess, FILE_
4a60: 53 48 41 52 45 5f 52 45 41 44 2c 0a 09 20 20 20 SHARE_READ,..
4a70: 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 NULL, OPEN_EXIS
4a80: 54 49 4e 47 2c 0a 09 20 20 20 20 46 49 4c 45 5f TING,.. FILE_
4a90: 46 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 FLAG_OPEN_REPARS
4aa0: 45 5f 50 4f 49 4e 54 7c 46 49 4c 45 5f 46 4c 41 E_POINT|FILE_FLA
4ab0: 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 49 G_BACKUP_SEMANTI
4ac0: 43 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 CS, NULL);..
4ad0: 69 66 20 28 68 46 69 6c 65 20 3d 3d 20 49 4e 56 if (hFile == INV
4ae0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
4af0: 45 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 E) {../*.. * Err
4b00: 6f 72 20 63 72 65 61 74 69 6e 67 20 64 69 72 65 or creating dire
4b10: 63 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 54 63 ctory... */...Tc
4b20: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 lWinConvertError
4b30: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 (GetLastError())
4b40: 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 ;..return -1;.
4b50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
4b60: 20 2a 20 47 65 74 20 74 68 65 20 6c 69 6e 6b 2e * Get the link.
4b70: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
4b80: 20 28 21 44 65 76 69 63 65 49 6f 43 6f 6e 74 72 (!DeviceIoContr
4b90: 6f 6c 28 68 46 69 6c 65 2c 20 46 53 43 54 4c 5f ol(hFile, FSCTL_
4ba0: 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e GET_REPARSE_POIN
4bb0: 54 2c 20 4e 55 4c 4c 2c 20 30 2c 20 62 75 66 66 T, NULL, 0, buff
4bc0: 65 72 2c 0a 09 20 20 20 20 73 69 7a 65 6f 66 28 er,.. sizeof(
4bd0: 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 DUMMY_REPARSE_BU
4be0: 46 46 45 52 29 2c 20 26 72 65 74 75 72 6e 65 64 FFER), &returned
4bf0: 4c 65 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20 7b Length, NULL)) {
4c00: 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 73 ../*.. * Error s
4c10: 65 74 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e etting junction.
4c20: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f .. */...TclWinCo
4c30: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 nvertError(GetLa
4c40: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c 6f stError());..Clo
4c50: 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b seHandle(hFile);
4c60: 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 ..return -1;.
4c70: 20 7d 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 }. CloseHand
4c80: 6c 65 28 68 46 69 6c 65 29 3b 0a 0a 20 20 20 20 le(hFile);..
4c90: 69 66 20 28 21 49 73 52 65 70 61 72 73 65 54 61 if (!IsReparseTa
4ca0: 67 56 61 6c 69 64 28 62 75 66 66 65 72 2d 3e 52 gValid(buffer->R
4cb0: 65 70 61 72 73 65 54 61 67 29 29 20 7b 0a 09 54 eparseTag)) {..T
4cc0: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 cl_SetErrno(EINV
4cd0: 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b AL);..return -1;
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
4cf0: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d n 0;.}.../*. *--
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 2d 2d 2d ----------------
4d40: 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 57 --. *. * NativeW
4d50: 72 69 74 65 52 65 70 61 72 73 65 20 2d 2d 0a 20 riteReparse --.
4d60: 2a 0a 20 2a 09 57 72 69 74 65 20 74 68 65 20 72 *. *.Write the r
4d70: 65 70 61 72 73 65 20 69 6e 66 6f 72 6d 61 74 69 eparse informati
4d80: 6f 6e 20 66 6f 72 20 61 20 67 69 76 65 6e 20 64 on for a given d
4d90: 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 09 irectory.. *. *.
4da0: 41 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 Assumption that
4db0: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 64 6f LinkDirectory do
4dc0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 2a es not exist.. *
4dd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
4e20: 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 57 72 tic int.NativeWr
4e30: 69 74 65 52 65 70 61 72 73 65 28 0a 20 20 20 20 iteReparse(.
4e40: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e const TCHAR *lin
4e50: 6b 44 69 72 50 61 74 68 2c 0a 20 20 20 20 52 45 kDirPath,. RE
4e60: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 PARSE_DATA_BUFFE
4e70: 52 20 2a 62 75 66 66 65 72 29 0a 7b 0a 20 20 20 R *buffer).{.
4e80: 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 20 HANDLE hFile;.
4e90: 20 20 20 44 57 4f 52 44 20 72 65 74 75 72 6e 65 DWORD returne
4ea0: 64 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 2f 2a dLength;.. /*
4eb0: 0a 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 74 . * Create t
4ec0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2d 20 69 he directory - i
4ed0: 74 20 6d 75 73 74 20 6e 6f 74 20 61 6c 72 65 61 t must not alrea
4ee0: 64 79 20 65 78 69 73 74 2e 0a 20 20 20 20 20 2a dy exist.. *
4ef0: 2f 0a 0a 20 20 20 20 69 66 20 28 28 2a 74 63 6c /.. if ((*tcl
4f00: 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 WinProcs->create
4f10: 44 69 72 65 63 74 6f 72 79 50 72 6f 63 29 28 6c DirectoryProc)(l
4f20: 69 6e 6b 44 69 72 50 61 74 68 2c 20 4e 55 4c 4c inkDirPath, NULL
4f30: 29 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 ) == 0) {../*..
4f40: 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e 67 * Error creating
4f50: 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a 2f directory... */
4f60: 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 ...TclWinConvert
4f70: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 Error(GetLastErr
4f80: 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d or());..return -
4f90: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 46 69 1;. }. hFi
4fa0: 6c 65 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f le = (*tclWinPro
4fb0: 63 73 2d 3e 63 72 65 61 74 65 46 69 6c 65 50 72 cs->createFilePr
4fc0: 6f 63 29 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c oc)(linkDirPath,
4fd0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20 GENERIC_WRITE,
4fe0: 30 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 4f 50 0,.. NULL, OP
4ff0: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 20 20 EN_EXISTING,..
5000: 20 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e FILE_FLAG_OPEN
5010: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 7c 46 _REPARSE_POINT|F
5020: 49 4c 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f ILE_FLAG_BACKUP_
5030: 53 45 4d 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 SEMANTICS, NULL)
5040: 3b 0a 20 20 20 20 69 66 20 28 68 46 69 6c 65 20 ;. if (hFile
5050: 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c == INVALID_HANDL
5060: 45 5f 56 41 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09 E_VALUE) {../*..
5070: 20 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e * Error creatin
5080: 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a g directory... *
5090: 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 /...TclWinConver
50a0: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 tError(GetLastEr
50b0: 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 ror());..return
50c0: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f -1;. }.. /
50d0: 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 74 68 65 *. * Set the
50e0: 20 6c 69 6e 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a link.. */..
50f0: 20 20 20 20 69 66 20 28 21 44 65 76 69 63 65 49 if (!DeviceI
5100: 6f 43 6f 6e 74 72 6f 6c 28 68 46 69 6c 65 2c 20 oControl(hFile,
5110: 46 53 43 54 4c 5f 53 45 54 5f 52 45 50 41 52 53 FSCTL_SET_REPARS
5120: 45 5f 50 4f 49 4e 54 2c 20 62 75 66 66 65 72 2c E_POINT, buffer,
5130: 0a 09 20 20 20 20 28 44 57 4f 52 44 29 20 62 75 .. (DWORD) bu
5140: 66 66 65 72 2d 3e 52 65 70 61 72 73 65 44 61 74 ffer->ReparseDat
5150: 61 4c 65 6e 67 74 68 20 2b 20 52 45 50 41 52 53 aLength + REPARS
5160: 45 5f 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 E_MOUNTPOINT_HEA
5170: 44 45 52 5f 53 49 5a 45 2c 0a 09 20 20 20 20 4e DER_SIZE,.. N
5180: 55 4c 4c 2c 20 30 2c 20 26 72 65 74 75 72 6e 65 ULL, 0, &returne
5190: 64 4c 65 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20 dLength, NULL))
51a0: 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 {../*.. * Error
51b0: 73 65 74 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e setting junction
51c0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 ... */...TclWinC
51d0: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c onvertError(GetL
51e0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c astError());..Cl
51f0: 6f 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 oseHandle(hFile)
5200: 3b 0a 09 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 ;..(*tclWinProcs
5210: 2d 3e 72 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 ->removeDirector
5220: 79 50 72 6f 63 29 28 6c 69 6e 6b 44 69 72 50 61 yProc)(linkDirPa
5230: 74 68 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b th);..return -1;
5240: 0a 20 20 20 20 7d 0a 20 20 20 20 43 6c 6f 73 65 . }. Close
5250: 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 0a Handle(hFile);..
5260: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
5270: 20 73 75 63 63 65 65 64 65 64 2e 0a 20 20 20 20 succeeded..
5280: 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 */.. return
5290: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
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 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
52f0: 6c 70 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 lpFindExecutable
5300: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
5310: 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75 74 65 73 unction computes
5320: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 70 61 the absolute pa
5330: 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 th name of the c
5340: 75 72 72 65 6e 74 0a 20 2a 09 61 70 70 6c 69 63 urrent. *.applic
5350: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 ation.. *. * Res
5360: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 ults:. *.None..
5370: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
5380: 73 3a 0a 20 2a 09 54 68 65 20 63 6f 6d 70 75 74 s:. *.The comput
5390: 65 64 20 70 61 74 68 20 69 73 20 73 74 6f 72 65 ed path is store
53a0: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53f0: 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 ---. */..void.Tc
5400: 6c 70 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 lpFindExecutable
5410: 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 (. const char
5420: 20 2a 61 72 67 76 30 29 09 09 2f 2a 20 54 68 65 *argv0)../* The
5430: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 70 value of the ap
5440: 70 6c 69 63 61 74 69 6f 6e 27 73 20 61 72 67 76 plication's argv
5450: 5b 30 5d 0a 09 09 09 09 20 2a 20 28 6e 61 74 69 [0]..... * (nati
5460: 76 65 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 57 43 ve). */.{. WC
5470: 48 41 52 20 77 4e 61 6d 65 5b 4d 41 58 5f 50 41 HAR wName[MAX_PA
5480: 54 48 5d 3b 0a 20 20 20 20 63 68 61 72 20 6e 61 TH];. char na
5490: 6d 65 5b 4d 41 58 5f 50 41 54 48 20 2a 20 54 43 me[MAX_PATH * TC
54a0: 4c 5f 55 54 46 5f 4d 41 58 5d 3b 0a 0a 20 20 20 L_UTF_MAX];..
54b0: 20 2f 2a 0a 20 20 20 20 20 2a 20 55 6e 64 65 72 /*. * Under
54c0: 20 57 69 6e 64 6f 77 73 20 77 65 20 69 67 6e 6f Windows we igno
54d0: 72 65 20 61 72 67 76 30 2c 20 61 6e 64 20 72 65 re argv0, and re
54e0: 74 75 72 6e 20 74 68 65 20 70 61 74 68 20 66 6f turn the path fo
54f0: 72 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 r the file used
5500: 74 6f 0a 20 20 20 20 20 2a 20 63 72 65 61 74 65 to. * create
5510: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 this process..
5520: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
5530: 47 65 74 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d GetModuleFileNam
5540: 65 57 28 4e 55 4c 4c 2c 20 77 4e 61 6d 65 2c 20 eW(NULL, wName,
5550: 4d 41 58 5f 50 41 54 48 29 20 3d 3d 20 30 29 20 MAX_PATH) == 0)
5560: 7b 0a 09 47 65 74 4d 6f 64 75 6c 65 46 69 6c 65 {..GetModuleFile
5570: 4e 61 6d 65 41 28 4e 55 4c 4c 2c 20 6e 61 6d 65 NameA(NULL, name
5580: 2c 20 73 69 7a 65 6f 66 28 6e 61 6d 65 29 29 3b , sizeof(name));
5590: 0a 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72 .../*.. * Conver
55a0: 74 20 74 6f 20 57 43 48 41 52 20 74 6f 20 67 65 t to WCHAR to ge
55b0: 74 20 6f 75 74 20 6f 66 20 41 4e 53 49 20 63 6f t out of ANSI co
55c0: 64 65 70 61 67 65 0a 09 20 2a 2f 0a 0a 09 4d 75 depage.. */...Mu
55d0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 ltiByteToWideCha
55e0: 72 28 43 50 5f 41 43 50 2c 20 30 2c 20 6e 61 6d r(CP_ACP, 0, nam
55f0: 65 2c 20 2d 31 2c 20 77 4e 61 6d 65 2c 20 4d 41 e, -1, wName, MA
5600: 58 5f 50 41 54 48 29 3b 0a 20 20 20 20 7d 0a 0a X_PATH);. }..
5610: 20 20 20 20 57 69 64 65 43 68 61 72 54 6f 4d 75 WideCharToMu
5620: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c ltiByte(CP_UTF8,
5630: 20 30 2c 20 77 4e 61 6d 65 2c 20 2d 31 2c 20 6e 0, wName, -1, n
5640: 61 6d 65 2c 20 73 69 7a 65 6f 66 28 6e 61 6d 65 ame, sizeof(name
5650: 29 2c 20 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20 ), NULL,NULL);.
5660: 20 20 20 54 63 6c 57 69 6e 4e 6f 42 61 63 6b 73 TclWinNoBacks
5670: 6c 61 73 68 28 6e 61 6d 65 29 3b 0a 20 20 20 20 lash(name);.
5680: 54 63 6c 53 65 74 4f 62 6a 4e 61 6d 65 4f 66 45 TclSetObjNameOfE
5690: 78 65 63 75 74 61 62 6c 65 28 54 63 6c 5f 4e 65 xecutable(Tcl_Ne
56a0: 77 53 74 72 69 6e 67 4f 62 6a 28 6e 61 6d 65 2c wStringObj(name,
56b0: 20 2d 31 29 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0c -1), NULL);.}..
56c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5710: 20 2a 20 54 63 6c 70 4d 61 74 63 68 49 6e 44 69 * TclpMatchInDi
5720: 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a rectory --. *. *
5730: 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 .This routine is
5740: 20 75 73 65 64 20 62 79 20 74 68 65 20 67 6c 6f used by the glo
5750: 62 62 69 6e 67 20 63 6f 64 65 20 74 6f 20 73 65 bbing code to se
5760: 61 72 63 68 20 61 20 64 69 72 65 63 74 6f 72 79 arch a directory
5770: 20 66 6f 72 0a 20 2a 09 61 6c 6c 20 66 69 6c 65 for. *.all file
5780: 73 20 77 68 69 63 68 20 6d 61 74 63 68 20 61 20 s which match a
5790: 67 69 76 65 6e 20 70 61 74 74 65 72 6e 2e 0a 20 given pattern..
57a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
57b0: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 .The return valu
57c0: 65 20 69 73 20 61 20 73 74 61 6e 64 61 72 64 20 e is a standard
57d0: 54 63 6c 20 72 65 73 75 6c 74 20 69 6e 64 69 63 Tcl result indic
57e0: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 61 6e ating whether an
57f0: 20 65 72 72 6f 72 0a 20 2a 09 6f 63 63 75 72 72 error. *.occurr
5800: 65 64 20 69 6e 20 67 6c 6f 62 62 69 6e 67 2e 20 ed in globbing.
5810: 45 72 72 6f 72 73 20 61 72 65 20 6c 65 66 74 20 Errors are left
5820: 69 6e 20 69 6e 74 65 72 70 2c 20 67 6f 6f 64 20 in interp, good
5830: 72 65 73 75 6c 74 73 20 61 72 65 0a 20 2a 09 6c results are. *.l
5840: 61 70 70 65 6e 64 65 64 20 74 6f 20 72 65 73 75 appended to resu
5850: 6c 74 50 74 72 20 28 77 68 69 63 68 20 6d 75 73 ltPtr (which mus
5860: 74 20 62 65 20 61 20 76 61 6c 69 64 20 6f 62 6a t be a valid obj
5870: 65 63 74 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 ect).. *. * Side
5880: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
5890: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
58e0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4d 61 74 63 */..int.TclpMatc
58f0: 68 49 6e 44 69 72 65 63 74 6f 72 79 28 0a 20 20 hInDirectory(.
5900: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
5910: 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 terp,../* Interp
5920: 72 65 74 65 72 20 74 6f 20 72 65 63 65 69 76 65 reter to receive
5930: 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 errors. */.
5940: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50 Tcl_Obj *resultP
5950: 74 72 2c 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a tr,../* List obj
5960: 65 63 74 20 74 6f 20 6c 61 70 70 65 6e 64 20 72 ect to lappend r
5970: 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 54 esults. */. T
5980: 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c cl_Obj *pathPtr,
5990: 09 09 2f 2a 20 43 6f 6e 74 61 69 6e 73 20 70 61 ../* Contains pa
59a0: 74 68 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 th to directory
59b0: 74 6f 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 to search. */.
59c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 const char *pa
59d0: 74 74 65 72 6e 2c 09 2f 2a 20 50 61 74 74 65 72 ttern,./* Patter
59e0: 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e n to match again
59f0: 73 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 st. */. Tcl_G
5a00: 6c 6f 62 54 79 70 65 44 61 74 61 20 2a 74 79 70 lobTypeData *typ
5a10: 65 73 29 09 2f 2a 20 4f 62 6a 65 63 74 20 63 6f es)./* Object co
5a20: 6e 74 61 69 6e 69 6e 67 20 6c 69 73 74 20 6f 66 ntaining list of
5a30: 20 61 63 63 65 70 74 61 62 6c 65 20 74 79 70 65 acceptable type
5a40: 73 2e 0a 09 09 09 09 20 2a 20 4d 61 79 20 62 65 s...... * May be
5a50: 20 4e 55 4c 4c 2e 20 49 6e 20 70 61 72 74 69 63 NULL. In partic
5a60: 75 6c 61 72 20 74 68 65 20 64 69 72 65 63 74 6f ular the directo
5a70: 72 79 0a 09 09 09 09 20 2a 20 66 6c 61 67 20 69 ry..... * flag i
5a80: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 s very important
5a90: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 . */.{. const
5aa0: 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 3b 0a TCHAR *native;.
5ab0: 0a 20 20 20 20 69 66 20 28 74 79 70 65 73 20 21 . if (types !
5ac0: 3d 20 4e 55 4c 4c 20 26 26 20 74 79 70 65 73 2d = NULL && types-
5ad0: 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 47 4c 4f >type == TCL_GLO
5ae0: 42 5f 54 59 50 45 5f 4d 4f 55 4e 54 29 20 7b 0a B_TYPE_MOUNT) {.
5af0: 09 2f 2a 0a 09 20 2a 20 54 68 65 20 6e 61 74 69 ./*.. * The nati
5b00: 76 65 20 66 69 6c 65 73 79 73 74 65 6d 20 6e 65 ve filesystem ne
5b10: 76 65 72 20 61 64 64 73 20 6d 6f 75 6e 74 73 2e ver adds mounts.
5b20: 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 54 .. */...return T
5b30: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 CL_OK;. }..
5b40: 20 20 69 66 20 28 70 61 74 74 65 72 6e 20 3d 3d if (pattern ==
5b50: 20 4e 55 4c 4c 20 7c 7c 20 28 2a 70 61 74 74 65 NULL || (*patte
5b60: 72 6e 20 3d 3d 20 27 5c 30 27 29 29 20 7b 0a 09 rn == '\0')) {..
5b70: 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 20 3d 20 Tcl_Obj *norm =
5b80: 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 Tcl_FSGetNormali
5b90: 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 zedPath(NULL, pa
5ba0: 74 68 50 74 72 29 3b 0a 09 69 66 20 28 6e 6f 72 thPtr);..if (nor
5bb0: 6d 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 m != NULL) {..
5bc0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 61 74 /*.. * Mat
5bd0: 63 68 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 ch a single file
5be0: 20 64 69 72 65 63 74 6c 79 2e 0a 09 20 20 20 20 directly...
5bf0: 20 2a 2f 0a 0a 09 20 20 20 20 69 6e 74 20 6c 65 */... int le
5c00: 6e 3b 0a 09 20 20 20 20 44 57 4f 52 44 20 61 74 n;.. DWORD at
5c10: 74 72 3b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 tr;.. const c
5c20: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 har *str = Tcl_G
5c30: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
5c40: 6e 6f 72 6d 2c 26 6c 65 6e 29 3b 0a 0a 09 20 20 norm,&len);...
5c50: 20 20 6e 61 74 69 76 65 20 3d 20 28 63 6f 6e 73 native = (cons
5c60: 74 20 54 43 48 41 52 20 2a 29 20 54 63 6c 5f 46 t TCHAR *) Tcl_F
5c70: 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 SGetNativePath(p
5c80: 61 74 68 50 74 72 29 3b 0a 0a 09 20 20 20 20 69 athPtr);... i
5c90: 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e f (tclWinProcs->
5ca0: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 getFileAttribute
5cb0: 73 45 78 50 72 6f 63 20 3d 3d 20 4e 55 4c 4c 29 sExProc == NULL)
5cc0: 20 7b 0a 09 09 61 74 74 72 20 3d 20 28 2a 74 63 {...attr = (*tc
5cd0: 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 46 69 lWinProcs->getFi
5ce0: 6c 65 41 74 74 72 69 62 75 74 65 73 50 72 6f 63 leAttributesProc
5cf0: 29 28 6e 61 74 69 76 65 29 3b 0a 09 09 69 66 20 )(native);...if
5d00: 28 61 74 74 72 20 3d 3d 20 30 78 66 66 66 66 66 (attr == 0xfffff
5d10: 66 66 66 29 20 7b 0a 09 09 20 20 20 20 72 65 74 fff) {... ret
5d20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 09 7d 0a urn TCL_OK;...}.
5d30: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
5d40: 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 WIN32_FILE_ATTRI
5d50: 42 55 54 45 5f 44 41 54 41 20 64 61 74 61 3b 0a BUTE_DATA data;.
5d60: 09 09 69 66 20 28 28 2a 74 63 6c 57 69 6e 50 72 ..if ((*tclWinPr
5d70: 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 ocs->getFileAttr
5d80: 69 62 75 74 65 73 45 78 50 72 6f 63 29 28 6e 61 ibutesExProc)(na
5d90: 74 69 76 65 2c 0a 09 09 09 47 65 74 46 69 6c 65 tive,....GetFile
5da0: 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 ExInfoStandard,
5db0: 26 64 61 74 61 29 20 21 3d 20 54 52 55 45 29 20 &data) != TRUE)
5dc0: 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 {... return T
5dd0: 43 4c 5f 4f 4b 3b 0a 09 09 7d 0a 09 09 61 74 74 CL_OK;...}...att
5de0: 72 20 3d 20 64 61 74 61 2e 64 77 46 69 6c 65 41 r = data.dwFileA
5df0: 74 74 72 69 62 75 74 65 73 3b 0a 09 20 20 20 20 ttributes;..
5e00: 7d 0a 0a 09 20 20 20 20 69 66 20 28 4e 61 74 69 }... if (Nati
5e10: 76 65 4d 61 74 63 68 54 79 70 65 28 57 69 6e 49 veMatchType(WinI
5e20: 73 44 72 69 76 65 28 73 74 72 2c 6c 65 6e 29 2c sDrive(str,len),
5e30: 20 61 74 74 72 2c 20 6e 61 74 69 76 65 2c 20 74 attr, native, t
5e40: 79 70 65 73 29 29 20 7b 0a 09 09 54 63 6c 5f 4c ypes)) {...Tcl_L
5e50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
5e60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 ent(interp, resu
5e70: 6c 74 50 74 72 2c 20 70 61 74 68 50 74 72 29 3b ltPtr, pathPtr);
5e80: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 .. }..}..retu
5e90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d rn TCL_OK;. }
5ea0: 20 65 6c 73 65 20 7b 0a 09 44 57 4f 52 44 20 61 else {..DWORD a
5eb0: 74 74 72 3b 0a 09 48 41 4e 44 4c 45 20 68 61 6e ttr;..HANDLE han
5ec0: 64 6c 65 3b 0a 09 57 49 4e 33 32 5f 46 49 4e 44 dle;..WIN32_FIND
5ed0: 5f 44 41 54 41 54 20 64 61 74 61 3b 0a 09 63 6f _DATAT data;..co
5ee0: 6e 73 74 20 63 68 61 72 20 2a 64 69 72 4e 61 6d nst char *dirNam
5ef0: 65 3b 09 2f 2a 20 55 54 46 2d 38 20 64 69 72 20 e;./* UTF-8 dir
5f00: 6e 61 6d 65 2c 20 6c 61 74 65 72 20 77 69 74 68 name, later with
5f10: 20 70 61 74 74 65 72 6e 0a 09 09 09 09 20 2a 20 pattern..... *
5f20: 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 09 69 6e appended. */..in
5f30: 74 20 64 69 72 4c 65 6e 67 74 68 3b 0a 09 69 6e t dirLength;..in
5f40: 74 20 6d 61 74 63 68 53 70 65 63 69 61 6c 44 6f t matchSpecialDo
5f50: 74 73 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 ts;..Tcl_DString
5f60: 20 64 73 3b 09 09 2f 2a 20 4e 61 74 69 76 65 20 ds;../* Native
5f70: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 64 69 72 2c encoding of dir,
5f80: 20 61 6c 73 6f 20 75 73 65 64 0a 09 09 09 09 20 also used.....
5f90: 2a 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 66 6f * temporarily fo
5fa0: 72 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2e 20 r other things.
5fb0: 2a 2f 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 */..Tcl_DString
5fc0: 64 73 4f 72 69 67 3b 09 2f 2a 20 55 54 46 2d 38 dsOrig;./* UTF-8
5fd0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 64 69 72 encoding of dir
5fe0: 2e 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 66 . */..Tcl_Obj *f
5ff0: 69 6c 65 4e 61 6d 65 50 74 72 3b 0a 09 63 68 61 ileNamePtr;..cha
6000: 72 20 6c 61 73 74 43 68 61 72 3b 0a 0a 09 2f 2a r lastChar;.../*
6010: 0a 09 20 2a 20 47 65 74 20 74 68 65 20 6e 6f 72 .. * Get the nor
6020: 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 72 65 70 malized path rep
6030: 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 74 68 65 resentation (the
6040: 20 6d 61 69 6e 20 74 68 69 6e 67 20 69 73 20 77 main thing is w
6050: 65 20 64 6f 6e 74 0a 09 20 2a 20 77 61 6e 74 20 e dont.. * want
6060: 61 6e 79 20 27 7e 27 20 73 65 71 75 65 6e 63 65 any '~' sequence
6070: 73 29 2e 0a 09 20 2a 2f 0a 0a 09 66 69 6c 65 4e s)... */...fileN
6080: 61 6d 65 50 74 72 20 3d 20 54 63 6c 5f 46 53 47 amePtr = Tcl_FSG
6090: 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 61 74 68 etNormalizedPath
60a0: 28 69 6e 74 65 72 70 2c 20 70 61 74 68 50 74 72 (interp, pathPtr
60b0: 29 3b 0a 09 69 66 20 28 66 69 6c 65 4e 61 6d 65 );..if (fileName
60c0: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Ptr == NULL) {..
60d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
60e0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 RROR;..}.../*..
60f0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 * Verify that th
6100: 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 e specified path
6110: 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 61 exists and is a
6120: 63 74 75 61 6c 6c 79 20 61 20 64 69 72 65 63 74 ctually a direct
6130: 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 6e 61 74 69 ory... */...nati
6140: 76 65 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e 61 ve = Tcl_FSGetNa
6150: 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 tivePath(pathPtr
6160: 29 3b 0a 09 69 66 20 28 6e 61 74 69 76 65 20 3d );..if (native =
6170: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 = NULL) {.. r
6180: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d eturn TCL_OK;..}
6190: 0a 09 61 74 74 72 20 3d 20 28 2a 74 63 6c 57 69 ..attr = (*tclWi
61a0: 6e 50 72 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 nProcs->getFileA
61b0: 74 74 72 69 62 75 74 65 73 50 72 6f 63 29 28 6e ttributesProc)(n
61c0: 61 74 69 76 65 29 3b 0a 0a 09 69 66 20 28 28 61 ative);...if ((a
61d0: 74 74 72 20 3d 3d 20 30 78 66 66 66 66 66 66 66 ttr == 0xfffffff
61e0: 66 29 20 7c 7c 20 28 28 61 74 74 72 20 26 20 46 f) || ((attr & F
61f0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 ILE_ATTRIBUTE_DI
6200: 52 45 43 54 4f 52 59 29 20 3d 3d 20 30 29 29 20 RECTORY) == 0))
6210: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
6220: 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 L_OK;..}.../*..
6230: 2a 20 42 75 69 6c 64 20 75 70 20 74 68 65 20 64 * Build up the d
6240: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 66 6f irectory name fo
6250: 72 20 73 65 61 72 63 68 69 6e 67 2c 20 69 6e 63 r searching, inc
6260: 6c 75 64 69 6e 67 20 61 20 74 72 61 69 6c 69 6e luding a trailin
6270: 67 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79 20 g.. * directory
6280: 73 65 70 61 72 61 74 6f 72 2e 0a 09 20 2a 2f 0a separator... */.
6290: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 ..Tcl_DStringIni
62a0: 74 28 26 64 73 4f 72 69 67 29 3b 0a 09 64 69 72 t(&dsOrig);..dir
62b0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
62c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 66 69 6c 65 ringFromObj(file
62d0: 4e 61 6d 65 50 74 72 2c 20 26 64 69 72 4c 65 6e NamePtr, &dirLen
62e0: 67 74 68 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 gth);..Tcl_DStri
62f0: 6e 67 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67 ngAppend(&dsOrig
6300: 2c 20 64 69 72 4e 61 6d 65 2c 20 64 69 72 4c 65 , dirName, dirLe
6310: 6e 67 74 68 29 3b 0a 0a 09 6c 61 73 74 43 68 61 ngth);...lastCha
6320: 72 20 3d 20 64 69 72 4e 61 6d 65 5b 64 69 72 4c r = dirName[dirL
6330: 65 6e 67 74 68 20 2d 31 5d 3b 0a 09 69 66 20 28 ength -1];..if (
6340: 28 6c 61 73 74 43 68 61 72 20 21 3d 20 27 5c 5c (lastChar != '\\
6350: 27 29 20 26 26 20 28 6c 61 73 74 43 68 61 72 20 ') && (lastChar
6360: 21 3d 20 27 2f 27 29 20 26 26 20 28 6c 61 73 74 != '/') && (last
6370: 43 68 61 72 20 21 3d 20 27 3a 27 29 29 20 7b 0a Char != ':')) {.
6380: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
6390: 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67 2c 20 Append(&dsOrig,
63a0: 22 2f 22 2c 20 31 29 3b 0a 09 20 20 20 20 64 69 "/", 1);.. di
63b0: 72 4c 65 6e 67 74 68 2b 2b 3b 0a 09 7d 0a 09 64 rLength++;..}..d
63c0: 69 72 4e 61 6d 65 20 3d 20 54 63 6c 5f 44 53 74 irName = Tcl_DSt
63d0: 72 69 6e 67 56 61 6c 75 65 28 26 64 73 4f 72 69 ringValue(&dsOri
63e0: 67 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 g);.../*.. * We
63f0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c need to check al
6400: 6c 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64 l files in the d
6410: 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 77 65 20 irectory, so we
6420: 61 70 70 65 6e 64 20 27 2a 2e 2a 27 20 74 6f 0a append '*.*' to.
6430: 09 20 2a 20 74 68 65 20 70 61 74 68 2c 20 75 6e . * the path, un
6440: 6c 65 73 73 20 74 68 65 20 70 61 74 74 65 72 6e less the pattern
6450: 20 77 65 27 76 65 20 62 65 65 6e 20 67 69 76 65 we've been give
6460: 6e 20 69 73 20 72 61 74 68 65 72 20 73 69 6d 70 n is rather simp
6470: 6c 65 2c 0a 09 20 2a 20 77 68 65 6e 20 77 65 20 le,.. * when we
6480: 63 61 6e 20 75 73 65 20 74 68 61 74 20 69 6e 73 can use that ins
6490: 74 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 tead... */...if
64a0: 28 73 74 72 70 62 72 6b 28 70 61 74 74 65 72 6e (strpbrk(pattern
64b0: 2c 20 22 5b 5d 5c 5c 22 29 20 3d 3d 20 4e 55 4c , "[]\\") == NUL
64c0: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 L) {.. /*..
64d0: 20 20 20 2a 20 54 68 65 20 70 61 74 74 65 72 6e * The pattern
64e0: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6f 6e 65 is a simple one
64f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6a 75 73 74 containing just
6500: 20 27 2a 27 20 61 6e 64 2f 6f 72 20 27 3f 27 2e '*' and/or '?'.
6510: 0a 09 20 20 20 20 20 2a 20 54 68 69 73 20 6d 65 .. * This me
6520: 61 6e 73 20 77 65 20 63 61 6e 20 67 65 74 20 74 ans we can get t
6530: 68 65 20 4f 53 20 74 6f 20 68 65 6c 70 20 75 73 he OS to help us
6540: 2c 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 , by passing it
6550: 74 68 65 0a 09 20 20 20 20 20 2a 20 70 61 74 74 the.. * patt
6560: 65 72 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ern... */...
6570: 20 20 20 20 64 69 72 4e 61 6d 65 20 3d 20 54 63 dirName = Tc
6580: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 l_DStringAppend(
6590: 26 64 73 4f 72 69 67 2c 20 70 61 74 74 65 72 6e &dsOrig, pattern
65a0: 2c 20 2d 31 29 3b 0a 09 7d 20 65 6c 73 65 20 7b , -1);..} else {
65b0: 0a 09 20 20 20 20 64 69 72 4e 61 6d 65 20 3d 20 .. dirName =
65c0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e Tcl_DStringAppen
65d0: 64 28 26 64 73 4f 72 69 67 2c 20 22 2a 2e 2a 22 d(&dsOrig, "*.*"
65e0: 2c 20 33 29 3b 0a 09 7d 0a 0a 09 6e 61 74 69 76 , 3);..}...nativ
65f0: 65 20 3d 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f e = Tcl_WinUtfTo
6600: 54 43 68 61 72 28 64 69 72 4e 61 6d 65 2c 20 2d TChar(dirName, -
6610: 31 2c 20 26 64 73 29 3b 0a 09 69 66 20 28 74 63 1, &ds);..if (tc
6620: 6c 57 69 6e 50 72 6f 63 73 2d 3e 66 69 6e 64 46 lWinProcs->findF
6630: 69 72 73 74 46 69 6c 65 45 78 50 72 6f 63 20 3d irstFileExProc =
6640: 3d 20 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65 73 = NULL || (types
6650: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 7c 7c 20 28 == NULL)...|| (
6660: 74 79 70 65 73 2d 3e 74 79 70 65 20 21 3d 20 54 types->type != T
6670: 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 44 49 52 CL_GLOB_TYPE_DIR
6680: 29 29 20 7b 0a 09 20 20 20 20 68 61 6e 64 6c 65 )) {.. handle
6690: 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 = (*tclWinProcs
66a0: 2d 3e 66 69 6e 64 46 69 72 73 74 46 69 6c 65 50 ->findFirstFileP
66b0: 72 6f 63 29 28 6e 61 74 69 76 65 2c 20 26 64 61 roc)(native, &da
66c0: 74 61 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 ta);..} else {..
66d0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 /*.. * W
66e0: 65 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 e can be more ef
66f0: 66 69 63 69 65 6e 74 2c 20 66 6f 72 20 70 75 72 ficient, for pur
6700: 65 20 64 69 72 65 63 74 6f 72 79 20 72 65 71 75 e directory requ
6710: 65 73 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a ests... */..
6720: 09 20 20 20 20 68 61 6e 64 6c 65 20 3d 20 28 2a . handle = (*
6730: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 66 69 6e tclWinProcs->fin
6740: 64 46 69 72 73 74 46 69 6c 65 45 78 50 72 6f 63 dFirstFileExProc
6750: 29 28 6e 61 74 69 76 65 2c 0a 09 09 20 20 20 20 )(native,...
6760: 46 69 6e 64 45 78 49 6e 66 6f 53 74 61 6e 64 61 FindExInfoStanda
6770: 72 64 2c 20 26 64 61 74 61 2c 0a 09 09 20 20 20 rd, &data,...
6780: 20 46 69 6e 64 45 78 53 65 61 72 63 68 4c 69 6d FindExSearchLim
6790: 69 74 54 6f 44 69 72 65 63 74 6f 72 69 65 73 2c itToDirectories,
67a0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a 09 NULL, 0);..}...
67b0: 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e if (handle == IN
67c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c VALID_HANDLE_VAL
67d0: 55 45 29 20 7b 0a 09 20 20 20 20 44 57 4f 52 44 UE) {.. DWORD
67e0: 20 65 72 72 20 3d 20 47 65 74 4c 61 73 74 45 72 err = GetLastEr
67f0: 72 6f 72 28 29 3b 0a 09 20 20 20 20 54 63 6c 5f ror();.. Tcl_
6800: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
6810: 3b 0a 09 20 20 20 20 69 66 20 28 65 72 72 20 3d ;.. if (err =
6820: 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 = ERROR_FILE_NOT
6830: 5f 46 4f 55 4e 44 29 20 7b 0a 09 09 2f 2a 0a 09 _FOUND) {.../*..
6840: 09 20 2a 20 57 65 20 75 73 65 64 20 6f 75 72 20 . * We used our
6850: 27 70 61 74 74 65 72 6e 27 20 61 62 6f 76 65 2c 'pattern' above,
6860: 20 61 6e 64 20 6d 61 74 63 68 65 64 20 6e 6f 74 and matched not
6870: 68 69 6e 67 2e 20 54 68 69 73 0a 09 09 20 2a 20 hing. This... *
6880: 6d 65 61 6e 73 20 77 65 20 6a 75 73 74 20 72 65 means we just re
6890: 74 75 72 6e 20 54 43 4c 5f 4f 4b 2c 20 69 6e 64 turn TCL_OK, ind
68a0: 69 63 61 74 69 6e 67 20 6e 6f 20 72 65 73 75 6c icating no resul
68b0: 74 73 20 66 6f 75 6e 64 2e 0a 09 09 20 2a 2f 0a ts found.... */.
68c0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 ...Tcl_DStringFr
68d0: 65 65 28 26 64 73 4f 72 69 67 29 3b 0a 09 09 72 ee(&dsOrig);...r
68e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 eturn TCL_OK;..
68f0: 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c 57 69 }... TclWi
6900: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 65 72 nConvertError(er
6910: 72 29 3b 0a 09 20 20 20 20 69 66 20 28 69 6e 74 r);.. if (int
6920: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 erp != NULL) {..
6930: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 .Tcl_ResetResult
6940: 28 69 6e 74 65 72 70 29 3b 0a 09 09 54 63 6c 5f (interp);...Tcl_
6950: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6960: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 72 erp, "couldn't r
6970: 65 61 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 ead directory \"
6980: 22 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e ",....Tcl_DStrin
6990: 67 56 61 6c 75 65 28 26 64 73 4f 72 69 67 29 2c gValue(&dsOrig),
69a0: 20 22 5c 22 3a 20 22 2c 0a 09 09 09 54 63 6c 5f "\": ",....Tcl_
69b0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 PosixError(inter
69c0: 70 29 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 p), NULL);..
69d0: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 }.. Tcl_DStri
69e0: 6e 67 46 72 65 65 28 26 64 73 4f 72 69 67 29 3b ngFree(&dsOrig);
69f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
6a00: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 6c 5f _ERROR;..}..Tcl_
6a10: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 DStringFree(&ds)
6a20: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6d 61 ;.../*.. * We ma
6a30: 79 20 75 73 65 20 74 68 69 73 20 6c 61 74 65 72 y use this later
6a40: 2c 20 73 6f 20 77 65 20 6d 75 73 74 20 72 65 73 , so we must res
6a50: 74 6f 72 65 20 69 74 20 74 6f 20 69 74 73 20 6c tore it to its l
6a60: 65 6e 67 74 68 0a 09 20 2a 20 69 6e 63 6c 75 64 ength.. * includ
6a70: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 ing the director
6a80: 79 20 64 65 6c 69 6d 69 74 65 72 2e 0a 09 20 2a y delimiter... *
6a90: 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 53 /...Tcl_DStringS
6aa0: 65 74 4c 65 6e 67 74 68 28 26 64 73 4f 72 69 67 etLength(&dsOrig
6ab0: 2c 20 64 69 72 4c 65 6e 67 74 68 29 3b 0a 0a 09 , dirLength);...
6ac0: 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 74 6f 20 /*.. * Check to
6ad0: 73 65 65 20 69 66 20 74 68 65 20 70 61 74 74 65 see if the patte
6ae0: 72 6e 20 73 68 6f 75 6c 64 20 6d 61 74 63 68 20 rn should match
6af0: 74 68 65 20 73 70 65 63 69 61 6c 20 2e 20 61 6e the special . an
6b00: 64 0a 09 20 2a 20 2e 2e 20 6e 61 6d 65 73 2c 20 d.. * .. names,
6b10: 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 65 referring to the
6b20: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f current directo
6b30: 72 79 2c 20 6f 72 20 74 68 65 20 64 69 72 65 63 ry, or the direc
6b40: 74 6f 72 79 0a 09 20 2a 20 61 62 6f 76 65 2e 20 tory.. * above.
6b50: 57 65 20 6e 65 65 64 20 61 20 73 70 65 63 69 61 We need a specia
6b60: 6c 20 63 68 65 63 6b 20 66 6f 72 20 74 68 69 73 l check for this
6b70: 20 62 65 63 61 75 73 65 20 70 61 74 68 73 20 62 because paths b
6b80: 65 67 69 6e 6e 69 6e 67 0a 09 20 2a 20 77 69 74 eginning.. * wit
6b90: 68 20 61 20 64 6f 74 20 61 72 65 20 6e 6f 74 20 h a dot are not
6ba0: 63 6f 6e 73 69 64 65 72 65 64 20 68 69 64 64 65 considered hidde
6bb0: 6e 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6e n on Windows, an
6bc0: 64 20 73 6f 20 6f 74 68 65 72 77 69 73 65 20 61 d so otherwise a
6bd0: 0a 09 20 2a 20 72 65 6c 61 74 69 76 65 20 67 6c .. * relative gl
6be0: 6f 62 20 6c 69 6b 65 20 27 67 6c 6f 62 20 2d 6a ob like 'glob -j
6bf0: 6f 69 6e 20 2a 20 2a 27 20 77 69 6c 6c 20 61 63 oin * *' will ac
6c00: 74 75 61 6c 6c 79 20 72 65 74 75 72 6e 0a 09 20 tually return..
6c10: 2a 20 27 2e 2f 2e 20 2e 2e 2f 2e 2e 27 20 65 74 * './. ../..' et
6c20: 63 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 70 c... */...if ((p
6c30: 61 74 74 65 72 6e 5b 30 5d 20 3d 3d 20 27 2e 27 attern[0] == '.'
6c40: 29 0a 09 09 7c 7c 20 28 28 70 61 74 74 65 72 6e )...|| ((pattern
6c50: 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 26 20 [0] == '\\') &&
6c60: 28 70 61 74 74 65 72 6e 5b 31 5d 20 3d 3d 20 27 (pattern[1] == '
6c70: 2e 27 29 29 29 20 7b 0a 09 20 20 20 20 6d 61 74 .'))) {.. mat
6c80: 63 68 53 70 65 63 69 61 6c 44 6f 74 73 20 3d 20 chSpecialDots =
6c90: 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 1;..} else {..
6ca0: 20 20 6d 61 74 63 68 53 70 65 63 69 61 6c 44 6f matchSpecialDo
6cb0: 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a ts = 0;..}.../*.
6cc0: 09 20 2a 20 4e 6f 77 20 69 74 65 72 61 74 65 20 . * Now iterate
6cd0: 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 over all of the
6ce0: 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64 69 72 files in the dir
6cf0: 65 63 74 6f 72 79 2c 20 73 74 61 72 74 69 6e 67 ectory, starting
6d00: 20 77 69 74 68 0a 09 20 2a 20 74 68 65 20 66 69 with.. * the fi
6d10: 72 73 74 20 6f 6e 65 20 77 65 20 66 6f 75 6e 64 rst one we found
6d20: 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 20 7b 0a 09 20 ... */...do {..
6d30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 const char *u
6d40: 74 66 6e 61 6d 65 3b 0a 09 20 20 20 20 69 6e 74 tfname;.. int
6d50: 20 63 68 65 63 6b 44 72 69 76 65 20 3d 20 30 2c checkDrive = 0,
6d60: 20 69 73 44 72 69 76 65 3b 0a 09 20 20 20 20 44 isDrive;.. D
6d70: 57 4f 52 44 20 61 74 74 72 3b 0a 0a 09 20 20 20 WORD attr;...
6d80: 20 69 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 if (tclWinProcs
6d90: 2d 3e 75 73 65 57 69 64 65 29 20 7b 0a 09 09 6e ->useWide) {...n
6da0: 61 74 69 76 65 20 3d 20 28 63 6f 6e 73 74 20 54 ative = (const T
6db0: 43 48 41 52 20 2a 29 20 64 61 74 61 2e 77 2e 63 CHAR *) data.w.c
6dc0: 46 69 6c 65 4e 61 6d 65 3b 0a 09 09 61 74 74 72 FileName;...attr
6dd0: 20 3d 20 64 61 74 61 2e 77 2e 64 77 46 69 6c 65 = data.w.dwFile
6de0: 41 74 74 72 69 62 75 74 65 73 3b 0a 09 20 20 20 Attributes;..
6df0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 61 74 69 } else {...nati
6e00: 76 65 20 3d 20 28 63 6f 6e 73 74 20 54 43 48 41 ve = (const TCHA
6e10: 52 20 2a 29 20 64 61 74 61 2e 61 2e 63 46 69 6c R *) data.a.cFil
6e20: 65 4e 61 6d 65 3b 0a 09 09 61 74 74 72 20 3d 20 eName;...attr =
6e30: 64 61 74 61 2e 61 2e 64 77 46 69 6c 65 41 74 74 data.a.dwFileAtt
6e40: 72 69 62 75 74 65 73 3b 0a 09 20 20 20 20 7d 0a ributes;.. }.
6e50: 0a 09 20 20 20 20 75 74 66 6e 61 6d 65 20 3d 20 .. utfname =
6e60: 54 63 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 Tcl_WinTCharToUt
6e70: 66 28 6e 61 74 69 76 65 2c 20 2d 31 2c 20 26 64 f(native, -1, &d
6e80: 73 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 6d s);... if (!m
6e90: 61 74 63 68 53 70 65 63 69 61 6c 44 6f 74 73 29 atchSpecialDots)
6ea0: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 {.../*... * If
6eb0: 69 74 20 69 73 20 65 78 61 63 74 6c 79 20 27 2e it is exactly '.
6ec0: 27 20 6f 72 20 27 2e 2e 27 20 74 68 65 6e 20 77 ' or '..' then w
6ed0: 65 20 69 67 6e 6f 72 65 20 69 74 2e 0a 09 09 20 e ignore it....
6ee0: 2a 2f 0a 0a 09 09 69 66 20 28 28 75 74 66 6e 61 */....if ((utfna
6ef0: 6d 65 5b 30 5d 20 3d 3d 20 27 2e 27 29 20 26 26 me[0] == '.') &&
6f00: 20 28 75 74 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20 (utfname[1] ==
6f10: 27 5c 30 27 0a 09 09 09 7c 7c 20 28 75 74 66 6e '\0'....|| (utfn
6f20: 61 6d 65 5b 31 5d 20 3d 3d 20 27 2e 27 20 26 26 ame[1] == '.' &&
6f30: 20 75 74 66 6e 61 6d 65 5b 32 5d 20 3d 3d 20 27 utfname[2] == '
6f40: 5c 30 27 29 29 29 20 7b 0a 09 09 20 20 20 20 54 \0'))) {... T
6f50: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
6f60: 64 73 29 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 ds);... conti
6f70: 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 nue;...}.. }
6f80: 65 6c 73 65 20 69 66 20 28 75 74 66 6e 61 6d 65 else if (utfname
6f90: 5b 30 5d 20 3d 3d 20 27 2e 27 20 26 26 20 75 74 [0] == '.' && ut
6fa0: 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27 2e 27 0a fname[1] == '.'.
6fb0: 09 09 20 20 20 20 26 26 20 75 74 66 6e 61 6d 65 .. && utfname
6fc0: 5b 32 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 [2] == '\0') {..
6fd0: 09 2f 2a 0a 09 09 20 2a 20 48 61 76 65 20 74 6f ./*... * Have to
6fe0: 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 check if this i
6ff0: 73 20 61 20 64 72 69 76 65 20 62 65 6c 6f 77 2c s a drive below,
7000: 20 73 6f 20 77 65 20 63 61 6e 20 63 6f 72 72 65 so we can corre
7010: 63 74 6c 79 0a 09 09 20 2a 20 6d 61 74 63 68 20 ctly... * match
7020: 27 68 69 64 64 65 6e 27 20 61 6e 64 20 6e 6f 74 'hidden' and not
7030: 20 68 69 64 64 65 6e 20 66 69 6c 65 73 2e 0a 09 hidden files...
7040: 09 20 2a 2f 0a 0a 09 09 63 68 65 63 6b 44 72 69 . */....checkDri
7050: 76 65 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 0a ve = 1;.. }..
7060: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
7070: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 Check to see if
7080: 74 68 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73 the file matches
7090: 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20 4e 6f the pattern. No
70a0: 74 65 20 74 68 61 74 20 77 65 20 61 72 65 0a 09 te that we are..
70b0: 20 20 20 20 20 2a 20 69 67 6e 6f 72 69 6e 67 20 * ignoring
70c0: 74 68 65 20 63 61 73 65 20 73 65 6e 73 69 74 69 the case sensiti
70d0: 76 69 74 79 20 66 6c 61 67 20 62 65 63 61 75 73 vity flag becaus
70e0: 65 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 6e 27 e Windows doesn'
70f0: 74 0a 09 20 20 20 20 20 2a 20 68 6f 6e 6f 72 20 t.. * honor
7100: 63 61 73 65 20 65 76 65 6e 20 69 66 20 74 68 65 case even if the
7110: 20 76 6f 6c 75 6d 65 20 69 73 20 63 61 73 65 20 volume is case
7120: 73 65 6e 73 69 74 69 76 65 2e 20 49 66 20 74 68 sensitive. If th
7130: 65 20 76 6f 6c 75 6d 65 0a 09 20 20 20 20 20 2a e volume.. *
7140: 20 61 6c 73 6f 20 64 6f 65 73 6e 27 74 20 70 72 also doesn't pr
7150: 65 73 65 72 76 65 20 63 61 73 65 2c 20 74 68 65 eserve case, the
7160: 6e 20 77 65 20 70 72 65 76 69 6f 75 73 6c 79 20 n we previously
7170: 72 65 74 75 72 6e 65 64 20 74 68 65 0a 09 20 20 returned the..
7180: 20 20 20 2a 20 6c 6f 77 65 72 20 63 61 73 65 20 * lower case
7190: 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 form of the name
71a0: 2e 20 54 68 69 73 20 64 69 64 6e 27 74 20 73 65 . This didn't se
71b0: 65 6d 20 71 75 69 74 65 20 72 69 67 68 74 20 73 em quite right s
71c0: 69 6e 63 65 0a 09 20 20 20 20 20 2a 20 74 68 65 ince.. * the
71d0: 72 65 20 61 72 65 20 6e 6f 6e 2d 63 61 73 65 2d re are non-case-
71e0: 70 72 65 73 65 72 76 69 6e 67 20 76 6f 6c 75 6d preserving volum
71f0: 65 73 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 es that actually
7200: 20 72 65 74 75 72 6e 0a 09 20 20 20 20 20 2a 20 return.. *
7210: 6d 69 78 65 64 20 63 61 73 65 2e 20 53 6f 20 6e mixed case. So n
7220: 6f 77 20 77 65 20 61 72 65 20 72 65 74 75 72 6e ow we are return
7230: 69 6e 67 20 65 78 61 63 74 6c 79 20 77 68 61 74 ing exactly what
7240: 20 77 65 20 67 65 74 20 66 72 6f 6d 0a 09 20 20 we get from..
7250: 20 20 20 2a 20 74 68 65 20 73 79 73 74 65 6d 2e * the system.
7260: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
7270: 69 66 20 28 54 63 6c 5f 53 74 72 69 6e 67 43 61 if (Tcl_StringCa
7280: 73 65 4d 61 74 63 68 28 75 74 66 6e 61 6d 65 2c seMatch(utfname,
7290: 20 70 61 74 74 65 72 6e 2c 20 31 29 29 20 7b 0a pattern, 1)) {.
72a0: 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 74 68 65 ../*... * If the
72b0: 20 66 69 6c 65 20 6d 61 74 63 68 65 73 2c 20 74 file matches, t
72c0: 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 70 hen we need to p
72d0: 72 6f 63 65 73 73 20 74 68 65 20 72 65 6d 61 69 rocess the remai
72e0: 6e 64 65 72 0a 09 09 20 2a 20 6f 66 20 74 68 65 nder... * of the
72f0: 20 70 61 74 68 2e 0a 09 09 20 2a 2f 0a 0a 09 09 path.... */....
7300: 69 66 20 28 63 68 65 63 6b 44 72 69 76 65 29 20 if (checkDrive)
7310: 7b 0a 09 09 20 20 20 20 63 6f 6e 73 74 20 63 68 {... const ch
7320: 61 72 20 2a 66 75 6c 6c 6e 61 6d 65 20 3d 20 54 ar *fullname = T
7330: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 cl_DStringAppend
7340: 28 26 64 73 4f 72 69 67 2c 20 75 74 66 6e 61 6d (&dsOrig, utfnam
7350: 65 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53 e,.... Tcl_DS
7360: 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29 tringLength(&ds)
7370: 29 3b 0a 09 09 20 20 20 20 69 73 44 72 69 76 65 );... isDrive
7380: 20 3d 20 57 69 6e 49 73 44 72 69 76 65 28 66 75 = WinIsDrive(fu
7390: 6c 6c 6e 61 6d 65 2c 20 54 63 6c 5f 44 53 74 72 llname, Tcl_DStr
73a0: 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 4f 72 69 ingLength(&dsOri
73b0: 67 29 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44 g));... Tcl_D
73c0: 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 StringSetLength(
73d0: 26 64 73 4f 72 69 67 2c 20 64 69 72 4c 65 6e 67 &dsOrig, dirLeng
73e0: 74 68 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a th);...} else {.
73f0: 09 09 20 20 20 20 69 73 44 72 69 76 65 20 3d 20 .. isDrive =
7400: 30 3b 0a 09 09 7d 0a 09 09 69 66 20 28 4e 61 74 0;...}...if (Nat
7410: 69 76 65 4d 61 74 63 68 54 79 70 65 28 69 73 44 iveMatchType(isD
7420: 72 69 76 65 2c 20 61 74 74 72 2c 20 6e 61 74 69 rive, attr, nati
7430: 76 65 2c 20 74 79 70 65 73 29 29 20 7b 0a 09 09 ve, types)) {...
7440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 Tcl_ListObjA
7450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 ppendElement(int
7460: 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a erp, resultPtr,.
7470: 09 09 09 20 20 20 20 54 63 6c 4e 65 77 46 53 50 ... TclNewFSP
7480: 61 74 68 4f 62 6a 28 70 61 74 68 50 74 72 2c 20 athObj(pathPtr,
7490: 75 74 66 6e 61 6d 65 2c 0a 09 09 09 09 20 20 20 utfname,.....
74a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 Tcl_DStringLeng
74b0: 74 68 28 26 64 73 29 29 29 3b 0a 09 09 7d 0a 09 th(&ds)));...}..
74c0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 }... /*..
74d0: 20 20 20 20 20 2a 20 46 72 65 65 20 64 73 20 68 * Free ds h
74e0: 65 72 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 ere to ensure th
74f0: 61 74 20 6e 61 74 69 76 65 20 69 73 20 76 61 6c at native is val
7500: 69 64 20 61 62 6f 76 65 2e 0a 09 20 20 20 20 20 id above...
7510: 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 */... Tcl_DSt
7520: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
7530: 7d 20 77 68 69 6c 65 20 28 28 2a 74 63 6c 57 69 } while ((*tclWi
7540: 6e 50 72 6f 63 73 2d 3e 66 69 6e 64 4e 65 78 74 nProcs->findNext
7550: 46 69 6c 65 50 72 6f 63 29 28 68 61 6e 64 6c 65 FileProc)(handle
7560: 2c 20 26 64 61 74 61 29 20 3d 3d 20 54 52 55 45 , &data) == TRUE
7570: 29 3b 0a 0a 09 46 69 6e 64 43 6c 6f 73 65 28 68 );...FindClose(h
7580: 61 6e 64 6c 65 29 3b 0a 09 54 63 6c 5f 44 53 74 andle);..Tcl_DSt
7590: 72 69 6e 67 46 72 65 65 28 26 64 73 4f 72 69 67 ringFree(&dsOrig
75a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f );..return TCL_O
75b0: 4b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a K;. }.}.../*.
75c0: 20 2a 20 44 6f 65 73 20 74 68 65 20 67 69 76 65 * Does the give
75d0: 6e 20 70 61 74 68 20 72 65 70 72 65 73 65 6e 74 n path represent
75e0: 20 61 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 3f 20 a root volume?
75f0: 57 65 20 6e 65 65 64 20 74 68 69 73 20 73 70 65 We need this spe
7600: 63 69 61 6c 20 63 61 73 65 0a 20 2a 20 62 65 63 cial case. * bec
7610: 61 75 73 65 20 66 6f 72 20 4e 54 46 53 20 72 6f ause for NTFS ro
7620: 6f 74 20 76 6f 6c 75 6d 65 73 2c 20 74 68 65 20 ot volumes, the
7630: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 getFileAttribute
7640: 73 50 72 6f 63 20 72 65 74 75 72 6e 73 20 61 20 sProc returns a
7650: 27 68 69 64 64 65 6e 27 0a 20 2a 20 61 74 74 72 'hidden'. * attr
7660: 69 62 75 74 65 20 77 68 65 6e 20 69 74 20 73 68 ibute when it sh
7670: 6f 75 6c 64 20 6e 6f 74 2e 0a 20 2a 2f 0a 0a 73 ould not.. */..s
7680: 74 61 74 69 63 20 69 6e 74 0a 57 69 6e 49 73 44 tatic int.WinIsD
7690: 72 69 76 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 rive(. const
76a0: 63 68 61 72 20 2a 6e 61 6d 65 2c 09 09 2f 2a 20 char *name,../*
76b0: 4e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a Name (UTF-8) */.
76c0: 20 20 20 20 69 6e 74 20 6c 65 6e 29 09 09 09 2f int len).../
76d0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6e 61 6d 65 * Length of name
76e0: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 72 65 */.{. int re
76f0: 6d 6f 76 65 20 3d 20 30 3b 0a 0a 20 20 20 20 77 move = 0;.. w
7700: 68 69 6c 65 20 28 6c 65 6e 20 3e 20 34 29 20 7b hile (len > 4) {
7710: 0a 09 69 66 20 28 28 6e 61 6d 65 5b 6c 65 6e 2d ..if ((name[len-
7720: 31 5d 20 21 3d 20 27 2e 27 20 7c 7c 20 6e 61 6d 1] != '.' || nam
7730: 65 5b 6c 65 6e 2d 32 5d 20 21 3d 20 27 2e 27 29 e[len-2] != '.')
7740: 0a 09 09 7c 7c 20 28 6e 61 6d 65 5b 6c 65 6e 2d ...|| (name[len-
7750: 33 5d 20 21 3d 20 27 2f 27 20 26 26 20 6e 61 6d 3] != '/' && nam
7760: 65 5b 6c 65 6e 2d 33 5d 20 21 3d 20 27 5c 5c 27 e[len-3] != '\\'
7770: 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 )) {.. /*..
7780: 20 20 20 2a 20 57 65 20 64 6f 6e 27 74 20 68 61 * We don't ha
7790: 76 65 20 27 2f 2e 2e 27 20 61 74 20 74 68 65 20 ve '/..' at the
77a0: 65 6e 64 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 end... */...
77b0: 20 20 20 20 69 66 20 28 72 65 6d 6f 76 65 20 3d if (remove =
77c0: 3d 20 30 29 20 7b 0a 09 09 62 72 65 61 6b 3b 0a = 0) {...break;.
77d0: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 6d 6f . }.. remo
77e0: 76 65 2d 2d 3b 0a 09 20 20 20 20 77 68 69 6c 65 ve--;.. while
77f0: 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 6c (len > 0) {...l
7800: 65 6e 2d 2d 3b 0a 09 09 69 66 20 28 6e 61 6d 65 en--;...if (name
7810: 5b 6c 65 6e 5d 20 3d 3d 20 27 2f 27 20 7c 7c 20 [len] == '/' ||
7820: 6e 61 6d 65 5b 6c 65 6e 5d 20 3d 3d 20 27 5c 5c name[len] == '\\
7830: 27 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61 6b ') {... break
7840: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 ;...}.. }..
7850: 20 20 69 66 20 28 6c 65 6e 20 3c 20 34 29 20 7b if (len < 4) {
7860: 0a 09 09 6c 65 6e 2b 2b 3b 0a 09 09 62 72 65 61 ...len++;...brea
7870: 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 k;.. }..} els
7880: 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 e {.. /*..
7890: 20 20 2a 20 57 65 20 64 6f 20 68 61 76 65 20 27 * We do have '
78a0: 2f 2e 2e 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 /..'.. */...
78b0: 20 20 20 20 6c 65 6e 20 2d 3d 20 33 3b 0a 09 20 len -= 3;..
78c0: 20 20 20 72 65 6d 6f 76 65 2b 2b 3b 0a 09 7d 0a remove++;..}.
78d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c }.. if (l
78e0: 65 6e 20 3c 20 34 29 20 7b 0a 09 69 66 20 28 6c en < 4) {..if (l
78f0: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 en == 0) {..
7900: 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 74 20 73 /*.. * Not s
7910: 75 72 65 20 69 66 20 74 68 69 73 20 69 73 20 70 ure if this is p
7920: 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 77 65 20 ossible, but we
7930: 70 61 73 73 20 69 74 20 6f 6e 20 61 6e 79 77 61 pass it on anywa
7940: 79 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 7d 20 65 y... */..} e
7950: 6c 73 65 20 69 66 20 28 6c 65 6e 20 3d 3d 20 31 lse if (len == 1
7960: 20 26 26 20 28 6e 61 6d 65 5b 30 5d 20 3d 3d 20 && (name[0] ==
7970: 27 2f 27 20 7c 7c 20 6e 61 6d 65 5b 30 5d 20 3d '/' || name[0] =
7980: 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20 20 20 20 = '\\')) {..
7990: 2f 2a 0a 09 20 20 20 20 20 2a 20 50 61 74 68 20 /*.. * Path
79a0: 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 is pointing to t
79b0: 68 65 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 2e 0a he root volume..
79c0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72 . */... r
79d0: 65 74 75 72 6e 20 31 3b 0a 09 7d 20 65 6c 73 65 eturn 1;..} else
79e0: 20 69 66 20 28 28 6e 61 6d 65 5b 31 5d 20 3d 3d if ((name[1] ==
79f0: 20 27 3a 27 29 0a 09 09 20 20 20 26 26 20 28 6c ':')... && (l
7a00: 65 6e 20 3d 3d 20 32 20 7c 7c 20 28 6e 61 6d 65 en == 2 || (name
7a10: 5b 32 5d 20 3d 3d 20 27 2f 27 20 7c 7c 20 6e 61 [2] == '/' || na
7a20: 6d 65 5b 32 5d 20 3d 3d 20 27 5c 5c 27 29 29 29 me[2] == '\\')))
7a30: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
7a40: 20 2a 20 50 61 74 68 20 69 73 20 6f 66 20 74 68 * Path is of th
7a50: 65 20 66 6f 72 6d 20 27 78 3a 27 20 6f 72 20 27 e form 'x:' or '
7a60: 78 3a 2f 27 20 6f 72 20 27 78 3a 5c 27 0a 09 20 x:/' or 'x:\'..
7a70: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72 65 74 */... ret
7a80: 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a urn 1;..}. }.
7a90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
7aa0: 0a 0c 0a 2f 2a 0a 20 2a 20 44 6f 65 73 20 74 68 .../*. * Does th
7ab0: 65 20 67 69 76 65 6e 20 70 61 74 68 20 72 65 70 e given path rep
7ac0: 72 65 73 65 6e 74 20 61 20 72 65 73 65 72 76 65 resent a reserve
7ad0: 64 20 77 69 6e 64 6f 77 20 70 61 74 68 20 6e 61 d window path na
7ae0: 6d 65 3f 20 49 66 20 6e 6f 74 20 72 65 74 75 72 me? If not retur
7af0: 6e 20 30 2c 0a 20 2a 20 69 66 20 74 72 75 65 2c n 0,. * if true,
7b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 return the numb
7b10: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 er of characters
7b20: 20 6f 66 20 74 68 65 20 70 61 74 68 20 74 68 61 of the path tha
7b30: 74 20 77 65 20 61 63 74 75 61 6c 6c 79 20 77 61 t we actually wa
7b40: 6e 74 0a 20 2a 20 28 6e 6f 74 20 61 6e 79 20 74 nt. * (not any t
7b50: 72 61 69 6c 69 6e 67 20 3a 29 2e 0a 20 2a 2f 0a railing :).. */.
7b60: 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 6e 49 .static int.WinI
7b70: 73 52 65 73 65 72 76 65 64 28 0a 20 20 20 20 63 sReserved(. c
7b80: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 onst char *path)
7b90: 09 09 2f 2a 20 50 61 74 68 20 69 6e 20 55 54 46 ../* Path in UTF
7ba0: 2d 38 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 -8 */.{. if (
7bb0: 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 63 27 20 (path[0] == 'c'
7bc0: 7c 7c 20 70 61 74 68 5b 30 5d 20 3d 3d 20 27 43 || path[0] == 'C
7bd0: 27 29 0a 09 20 20 20 20 26 26 20 28 70 61 74 68 ').. && (path
7be0: 5b 31 5d 20 3d 3d 20 27 6f 27 20 7c 7c 20 70 61 [1] == 'o' || pa
7bf0: 74 68 5b 31 5d 20 3d 3d 20 27 4f 27 29 29 20 7b th[1] == 'O')) {
7c00: 0a 09 69 66 20 28 28 70 61 74 68 5b 32 5d 20 3d ..if ((path[2] =
7c10: 3d 20 27 6d 27 20 7c 7c 20 70 61 74 68 5b 32 5d = 'm' || path[2]
7c20: 20 3d 3d 20 27 4d 27 29 0a 09 09 26 26 20 70 61 == 'M')...&& pa
7c30: 74 68 5b 33 5d 20 3e 3d 20 27 31 27 20 26 26 20 th[3] >= '1' &&
7c40: 70 61 74 68 5b 33 5d 20 3c 3d 20 27 39 27 29 20 path[3] <= '9')
7c50: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
7c60: 2a 20 4d 61 79 20 68 61 76 65 20 6d 61 74 63 68 * May have match
7c70: 20 66 6f 72 20 27 63 6f 6d 5b 31 2d 39 5d 3a 3f for 'com[1-9]:?
7c80: 27 2c 20 77 68 69 63 68 20 69 73 20 61 20 73 65 ', which is a se
7c90: 72 69 61 6c 20 70 6f 72 74 2e 0a 09 20 20 20 20 rial port...
7ca0: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 70 61 */... if (pa
7cb0: 74 68 5b 34 5d 20 3d 3d 20 27 5c 30 27 29 20 7b th[4] == '\0') {
7cc0: 0a 09 09 72 65 74 75 72 6e 20 34 3b 0a 09 20 20 ...return 4;..
7cd0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 70 61 74 } else if (pat
7ce0: 68 20 5b 34 5d 20 3d 3d 20 27 3a 27 20 26 26 20 h [4] == ':' &&
7cf0: 70 61 74 68 5b 35 5d 20 3d 3d 20 27 5c 30 27 29 path[5] == '\0')
7d00: 20 7b 0a 09 09 72 65 74 75 72 6e 20 34 3b 0a 09 {...return 4;..
7d10: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 69 66 }..} else if
7d20: 20 28 28 70 61 74 68 5b 32 5d 20 3d 3d 20 27 6e ((path[2] == 'n
7d30: 27 20 7c 7c 20 70 61 74 68 5b 32 5d 20 3d 3d 20 ' || path[2] ==
7d40: 27 4e 27 29 20 26 26 20 70 61 74 68 5b 33 5d 20 'N') && path[3]
7d50: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 20 20 20 20 == '\0') {..
7d60: 2f 2a 0a 09 20 20 20 20 20 2a 20 48 61 76 65 20 /*.. * Have
7d70: 6d 61 74 63 68 20 66 6f 72 20 27 63 6f 6e 27 0a match for 'con'.
7d80: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72 . */... r
7d90: 65 74 75 72 6e 20 33 3b 0a 09 7d 0a 0a 20 20 20 eturn 3;..}..
7da0: 20 7d 20 65 6c 73 65 20 69 66 20 28 28 70 61 74 } else if ((pat
7db0: 68 5b 30 5d 20 3d 3d 20 27 6c 27 20 7c 7c 20 70 h[0] == 'l' || p
7dc0: 61 74 68 5b 30 5d 20 3d 3d 20 27 4c 27 29 0a 09 ath[0] == 'L')..
7dd0: 20 20 20 20 26 26 20 28 70 61 74 68 5b 31 5d 20 && (path[1]
7de0: 3d 3d 20 27 70 27 20 7c 7c 20 70 61 74 68 5b 31 == 'p' || path[1
7df0: 5d 20 3d 3d 20 27 50 27 29 0a 09 20 20 20 20 26 ] == 'P').. &
7e00: 26 20 28 70 61 74 68 5b 32 5d 20 3d 3d 20 27 74 & (path[2] == 't
7e10: 27 20 7c 7c 20 70 61 74 68 5b 32 5d 20 3d 3d 20 ' || path[2] ==
7e20: 27 54 27 29 29 20 7b 0a 09 69 66 20 28 70 61 74 'T')) {..if (pat
7e30: 68 5b 33 5d 20 3e 3d 20 27 31 27 20 26 26 20 70 h[3] >= '1' && p
7e40: 61 74 68 5b 33 5d 20 3c 3d 20 27 39 27 29 20 7b ath[3] <= '9') {
7e50: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
7e60: 20 4d 61 79 20 68 61 76 65 20 6d 61 74 63 68 20 May have match
7e70: 66 6f 72 20 27 6c 70 74 5b 31 2d 39 5d 3a 3f 27 for 'lpt[1-9]:?'
7e80: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
7e90: 69 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d 20 27 if (path[4] == '
7ea0: 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 \0') {...return
7eb0: 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 4;.. } else i
7ec0: 66 20 28 70 61 74 68 20 5b 34 5d 20 3d 3d 20 27 f (path [4] == '
7ed0: 3a 27 20 26 26 20 70 61 74 68 5b 35 5d 20 3d 3d :' && path[5] ==
7ee0: 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 '\0') {...retur
7ef0: 6e 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a n 4;.. }..}..
7f00: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 } else if (!
7f10: 73 74 72 63 61 73 65 63 6d 70 28 70 61 74 68 2c strcasecmp(path,
7f20: 20 22 70 72 6e 22 29 20 7c 7c 20 21 73 74 72 63 "prn") || !strc
7f30: 61 73 65 63 6d 70 28 70 61 74 68 2c 20 22 6e 75 asecmp(path, "nu
7f40: 6c 22 29 0a 09 20 20 20 20 7c 7c 20 21 73 74 72 l").. || !str
7f50: 63 61 73 65 63 6d 70 28 70 61 74 68 2c 20 22 61 casecmp(path, "a
7f60: 75 78 22 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 ux")) {../*.. *
7f70: 48 61 76 65 20 6d 61 74 63 68 20 66 6f 72 20 27 Have match for '
7f80: 70 72 6e 27 2c 20 27 6e 75 6c 27 20 6f 72 20 27 prn', 'nul' or '
7f90: 61 75 78 27 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 aux'... */...ret
7fa0: 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 3;. }.
7fb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
7fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8010: 20 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70 65 NativeMatchType
8020: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
8030: 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 61 20 unction needs a
8040: 73 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 special case for
8050: 20 61 20 70 61 74 68 20 77 68 69 63 68 20 69 73 a path which is
8060: 20 61 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 2c 0a a root volume,.
8070: 20 2a 09 62 65 63 61 75 73 65 20 66 6f 72 20 4e *.because for N
8080: 54 46 53 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 73 TFS root volumes
8090: 2c 20 74 68 65 20 67 65 74 46 69 6c 65 41 74 74 , the getFileAtt
80a0: 72 69 62 75 74 65 73 50 72 6f 63 20 72 65 74 75 ributesProc retu
80b0: 72 6e 73 20 61 0a 20 2a 09 27 68 69 64 64 65 6e rns a. *.'hidden
80c0: 27 20 61 74 74 72 69 62 75 74 65 20 77 68 65 6e ' attribute when
80d0: 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 2e 0a it should not..
80e0: 20 2a 0a 20 2a 09 57 65 20 6e 65 76 65 72 20 6d *. *.We never m
80f0: 61 6b 65 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f ake any calls to
8100: 20 61 20 27 67 65 74 20 61 74 74 72 69 62 75 74 a 'get attribut
8110: 65 73 27 20 72 6f 75 74 69 6e 65 20 68 65 72 65 es' routine here
8120: 2c 20 73 69 6e 63 65 20 77 65 0a 20 2a 09 68 61 , since we. *.ha
8130: 76 65 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e ve arranged thin
8140: 67 73 20 73 6f 20 74 68 61 74 20 6f 75 72 20 63 gs so that our c
8150: 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 6b 6e aller already kn
8160: 6f 77 73 20 73 75 63 68 0a 20 2a 09 69 6e 66 6f ows such. *.info
8170: 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 rmation.. *. * R
8180: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 66 esults:. *.0 = f
8190: 69 6c 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 ile doesn't matc
81a0: 68 0a 20 2a 09 31 20 3d 20 66 69 6c 65 20 6d 61 h. *.1 = file ma
81b0: 74 63 68 65 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d tches. *. *-----
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8200: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
8210: 74 0a 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70 t.NativeMatchTyp
8220: 65 28 0a 20 20 20 20 69 6e 74 20 69 73 44 72 69 e(. int isDri
8230: 76 65 2c 09 09 2f 2a 20 49 73 20 74 68 69 73 20 ve,../* Is this
8240: 61 20 64 72 69 76 65 2e 20 2a 2f 0a 20 20 20 20 a drive. */.
8250: 44 57 4f 52 44 20 61 74 74 72 2c 09 09 09 2f 2a DWORD attr,.../*
8260: 20 57 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 We already know
8270: 20 74 68 65 20 61 74 74 72 69 62 75 74 65 73 20 the attributes
8280: 66 6f 72 20 74 68 65 0a 09 09 09 09 20 2a 20 66 for the..... * f
8290: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 ile. */. cons
82a0: 74 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 4e t TCHAR *nativeN
82b0: 61 6d 65 2c 09 2f 2a 20 4e 61 74 69 76 65 20 70 ame,./* Native p
82c0: 61 74 68 20 74 6f 20 63 68 65 63 6b 2e 20 2a 2f ath to check. */
82d0: 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 54 79 70 . Tcl_GlobTyp
82e0: 65 44 61 74 61 20 2a 74 79 70 65 73 29 09 2f 2a eData *types)./*
82f0: 20 54 79 70 65 20 64 65 73 63 72 69 70 74 69 6f Type descriptio
8300: 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e n to match again
8310: 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a st. */.{. /*.
8320: 20 20 20 20 20 2a 20 27 61 74 74 72 27 20 72 65 * 'attr' re
8330: 70 72 65 73 65 6e 74 73 20 74 68 65 20 61 74 74 presents the att
8340: 72 69 62 75 74 65 73 20 6f 66 20 74 68 65 20 66 ributes of the f
8350: 69 6c 65 2c 20 62 75 74 20 77 65 20 6f 6e 6c 79 ile, but we only
8360: 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 2a 20 want to. *
8370: 72 65 74 72 69 65 76 65 20 74 68 69 73 20 69 6e retrieve this in
8380: 66 6f 20 69 66 20 69 74 20 69 73 20 61 62 73 6f fo if it is abso
8390: 6c 75 74 65 6c 79 20 6e 65 63 65 73 73 61 72 79 lutely necessary
83a0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 because it is a
83b0: 6e 0a 20 20 20 20 20 2a 20 65 78 70 65 6e 73 69 n. * expensi
83c0: 76 65 20 63 61 6c 6c 2e 20 55 6e 66 6f 72 74 75 ve call. Unfortu
83d0: 6e 61 74 65 6c 79 2c 20 74 6f 20 64 65 61 6c 20 nately, to deal
83e0: 77 69 74 68 20 68 69 64 64 65 6e 20 66 69 6c 65 with hidden file
83f0: 73 20 70 72 6f 70 65 72 6c 79 2c 20 77 65 0a 20 s properly, we.
8400: 20 20 20 20 2a 20 6d 75 73 74 20 61 6c 77 61 79 * must alway
8410: 73 20 72 65 74 72 69 65 76 65 20 69 74 2e 0a 20 s retrieve it..
8420: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
8430: 74 79 70 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b types == NULL) {
8440: 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 69 6e 76 69 ../*.. * If invi
8450: 73 69 62 6c 65 2c 20 64 6f 6e 27 74 20 72 65 74 sible, don't ret
8460: 75 72 6e 20 74 68 65 20 66 69 6c 65 2e 0a 09 20 urn the file...
8470: 2a 2f 0a 0a 09 69 66 20 28 61 74 74 72 20 26 20 */...if (attr &
8480: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 FILE_ATTRIBUTE_H
8490: 49 44 44 45 4e 20 26 26 20 21 69 73 44 72 69 76 IDDEN && !isDriv
84a0: 65 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e e) {.. return
84b0: 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 0;..}. } els
84c0: 65 20 7b 0a 09 69 66 20 28 61 74 74 72 20 26 20 e {..if (attr &
84d0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 FILE_ATTRIBUTE_H
84e0: 49 44 44 45 4e 20 26 26 20 21 69 73 44 72 69 76 IDDEN && !isDriv
84f0: 65 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 e) {.. /*..
8500: 20 20 20 2a 20 49 66 20 69 6e 76 69 73 69 62 6c * If invisibl
8510: 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 e... */...
8520: 20 20 69 66 20 28 28 74 79 70 65 73 2d 3e 70 65 if ((types->pe
8530: 72 6d 20 3d 3d 20 30 29 20 7c 7c 20 21 28 74 79 rm == 0) || !(ty
8540: 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c 5f pes->perm & TCL_
8550: 47 4c 4f 42 5f 50 45 52 4d 5f 48 49 44 44 45 4e GLOB_PERM_HIDDEN
8560: 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b )) {...return 0;
8570: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 .. }..} else
8580: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
8590: 2a 20 56 69 73 69 62 6c 65 2e 0a 09 20 20 20 20 * Visible...
85a0: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 74 79 */... if (ty
85b0: 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c 5f pes->perm & TCL_
85c0: 47 4c 4f 42 5f 50 45 52 4d 5f 48 49 44 44 45 4e GLOB_PERM_HIDDEN
85d0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a ) {...return 0;.
85e0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 28 . }..}...if (
85f0: 74 79 70 65 73 2d 3e 70 65 72 6d 20 21 3d 20 30 types->perm != 0
8600: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28 28 74 ) {.. if (((t
8610: 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c ypes->perm & TCL
8620: 5f 47 4c 4f 42 5f 50 45 52 4d 5f 52 4f 4e 4c 59 _GLOB_PERM_RONLY
8630: 29 20 26 26 0a 09 09 09 21 28 61 74 74 72 20 26 ) &&....!(attr &
8640: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f FILE_ATTRIBUTE_
8650: 52 45 41 44 4f 4e 4c 59 29 29 20 7c 7c 0a 09 09 READONLY)) ||...
8660: 20 20 20 20 28 28 74 79 70 65 73 2d 3e 70 65 72 ((types->per
8670: 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 m & TCL_GLOB_PER
8680: 4d 5f 52 29 20 26 26 0a 09 09 09 28 30 20 2f 2a M_R) &&....(0 /*
8690: 20 46 69 6c 65 20 65 78 69 73 74 73 20 3d 3e 20 File exists =>
86a0: 52 5f 4f 4b 20 6f 6e 20 57 69 6e 64 6f 77 73 20 R_OK on Windows
86b0: 2a 2f 29 29 20 7c 7c 0a 09 09 20 20 20 20 28 28 */)) ||... ((
86c0: 74 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 types->perm & TC
86d0: 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 57 29 20 26 L_GLOB_PERM_W) &
86e0: 26 0a 09 09 09 28 61 74 74 72 20 26 20 46 49 4c &....(attr & FIL
86f0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 E_ATTRIBUTE_READ
8700: 4f 4e 4c 59 29 29 20 7c 7c 0a 09 09 20 20 20 20 ONLY)) ||...
8710: 28 28 74 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 ((types->perm &
8720: 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 58 29 TCL_GLOB_PERM_X)
8730: 20 26 26 0a 09 09 09 28 21 28 61 74 74 72 20 26 &&....(!(attr &
8740: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f FILE_ATTRIBUTE_
8750: 44 49 52 45 43 54 4f 52 59 29 0a 09 09 09 20 26 DIRECTORY).... &
8760: 26 20 21 4e 61 74 69 76 65 49 73 45 78 65 63 28 & !NativeIsExec(
8770: 6e 61 74 69 76 65 4e 61 6d 65 29 29 29 29 20 7b nativeName)))) {
8780: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 ...return 0;..
8790: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 28 74 79 70 }..}..if ((typ
87a0: 65 73 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47 es->type & TCL_G
87b0: 4c 4f 42 5f 54 59 50 45 5f 44 49 52 29 0a 09 09 LOB_TYPE_DIR)...
87c0: 26 26 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f && (attr & FILE_
87d0: 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 ATTRIBUTE_DIRECT
87e0: 4f 52 59 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a ORY)) {.. /*.
87f0: 09 20 20 20 20 20 2a 20 51 75 69 63 6b 65 72 20 . * Quicker
8800: 74 65 73 74 20 66 6f 72 20 64 69 72 65 63 74 6f test for directo
8810: 72 79 2c 20 77 68 69 63 68 20 69 73 20 61 20 63 ry, which is a c
8820: 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 09 20 20 20 ommon case...
8830: 20 20 2a 2f 0a 0a 09 20 20 20 20 72 65 74 75 72 */... retur
8840: 6e 20 31 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 n 1;...} else if
8850: 20 28 74 79 70 65 73 2d 3e 74 79 70 65 20 21 3d (types->type !=
8860: 20 30 29 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 0) {.. unsig
8870: 6e 65 64 20 73 68 6f 72 74 20 73 74 5f 6d 6f 64 ned short st_mod
8880: 65 3b 0a 09 20 20 20 20 69 6e 74 20 69 73 45 78 e;.. int isEx
8890: 65 63 20 3d 20 4e 61 74 69 76 65 49 73 45 78 65 ec = NativeIsExe
88a0: 63 28 6e 61 74 69 76 65 4e 61 6d 65 29 3b 0a 0a c(nativeName);..
88b0: 09 20 20 20 20 73 74 5f 6d 6f 64 65 20 3d 20 4e . st_mode = N
88c0: 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28 61 74 ativeStatMode(at
88d0: 74 72 2c 20 30 2c 20 69 73 45 78 65 63 29 3b 0a tr, 0, isExec);.
88e0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
88f0: 20 49 6e 20 6f 72 64 65 72 20 62 63 64 70 66 6c In order bcdpfl
8900: 73 20 61 73 20 69 6e 20 27 66 69 6e 64 20 2d 74 s as in 'find -t
8910: 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 '.. */...
8920: 20 69 66 20 28 28 28 74 79 70 65 73 2d 3e 74 79 if (((types->ty
8930: 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 pe&TCL_GLOB_TYPE
8940: 5f 42 4c 4f 43 4b 29 20 20 20 20 26 26 20 53 5f _BLOCK) && S_
8950: 49 53 42 4c 4b 28 73 74 5f 6d 6f 64 65 29 29 20 ISBLK(st_mode))
8960: 7c 7c 0a 09 09 20 20 20 20 28 28 74 79 70 65 73 ||... ((types
8970: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f ->type&TCL_GLOB_
8980: 54 59 50 45 5f 43 48 41 52 29 20 26 26 20 53 5f TYPE_CHAR) && S_
8990: 49 53 43 48 52 28 73 74 5f 6d 6f 64 65 29 29 20 ISCHR(st_mode))
89a0: 7c 7c 0a 09 09 20 20 20 20 28 28 74 79 70 65 73 ||... ((types
89b0: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f ->type&TCL_GLOB_
89c0: 54 59 50 45 5f 44 49 52 29 20 20 26 26 20 53 5f TYPE_DIR) && S_
89d0: 49 53 44 49 52 28 73 74 5f 6d 6f 64 65 29 29 20 ISDIR(st_mode))
89e0: 7c 7c 0a 09 09 20 20 20 20 28 28 74 79 70 65 73 ||... ((types
89f0: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f ->type&TCL_GLOB_
8a00: 54 59 50 45 5f 50 49 50 45 29 20 26 26 20 53 5f TYPE_PIPE) && S_
8a10: 49 53 46 49 46 4f 28 73 74 5f 6d 6f 64 65 29 29 ISFIFO(st_mode))
8a20: 20 7c 7c 0a 23 69 66 64 65 66 20 53 5f 49 53 53 ||.#ifdef S_ISS
8a30: 4f 43 4b 0a 09 09 20 20 20 20 28 28 74 79 70 65 OCK... ((type
8a40: 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 s->type&TCL_GLOB
8a50: 5f 54 59 50 45 5f 53 4f 43 4b 29 20 26 26 20 53 _TYPE_SOCK) && S
8a60: 5f 49 53 53 4f 43 4b 28 73 74 5f 6d 6f 64 65 29 _ISSOCK(st_mode)
8a70: 29 20 7c 7c 0a 23 65 6e 64 69 66 0a 09 09 20 20 ) ||.#endif...
8a80: 20 20 28 28 74 79 70 65 73 2d 3e 74 79 70 65 26 ((types->type&
8a90: 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 46 49 TCL_GLOB_TYPE_FI
8aa0: 4c 45 29 20 26 26 20 53 5f 49 53 52 45 47 28 73 LE) && S_ISREG(s
8ab0: 74 5f 6d 6f 64 65 29 29 29 20 7b 0a 09 09 2f 2a t_mode))) {.../*
8ac0: 0a 09 09 20 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 ... * Do nothing
8ad0: 20 2d 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 - this file is
8ae0: 6f 6b 2e 0a 09 09 20 2a 2f 0a 09 20 20 20 20 7d ok.... */.. }
8af0: 20 65 6c 73 65 20 7b 0a 23 69 66 64 65 66 20 53 else {.#ifdef S
8b00: 5f 49 53 4c 4e 4b 0a 09 09 69 66 20 28 74 79 70 _ISLNK...if (typ
8b10: 65 73 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47 es->type & TCL_G
8b20: 4c 4f 42 5f 54 59 50 45 5f 4c 49 4e 4b 29 20 7b LOB_TYPE_LINK) {
8b30: 0a 09 09 20 20 20 20 73 74 5f 6d 6f 64 65 20 3d ... st_mode =
8b40: 20 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28 NativeStatMode(
8b50: 61 74 74 72 2c 20 31 2c 20 69 73 45 78 65 63 29 attr, 1, isExec)
8b60: 3b 0a 09 09 20 20 20 20 69 66 20 28 53 5f 49 53 ;... if (S_IS
8b70: 4c 4e 4b 28 73 74 5f 6d 6f 64 65 29 29 20 7b 0a LNK(st_mode)) {.
8b80: 09 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 09 20 ...return 1;...
8b90: 20 20 20 7d 0a 09 09 7d 0a 23 65 6e 64 69 66 0a }...}.#endif.
8ba0: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 ..return 0;..
8bb0: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
8bc0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a return 1;.}.../*
8bd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8c20: 54 63 6c 70 47 65 74 55 73 65 72 48 6f 6d 65 20 TclpGetUserHome
8c30: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
8c40: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74 68 65 nction takes the
8c50: 20 70 61 73 73 65 64 20 69 6e 20 75 73 65 72 20 passed in user
8c60: 6e 61 6d 65 20 61 6e 64 20 66 69 6e 64 73 20 74 name and finds t
8c70: 68 65 0a 20 2a 09 63 6f 72 72 65 73 70 6f 6e 64 he. *.correspond
8c80: 69 6e 67 20 68 6f 6d 65 20 64 69 72 65 63 74 6f ing home directo
8c90: 72 79 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 ry specified in
8ca0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 66 69 6c the password fil
8cb0: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 e.. *. * Results
8cc0: 3a 0a 20 2a 09 54 68 65 20 72 65 73 75 6c 74 20 :. *.The result
8cd0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
8ce0: 61 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 79 a string specify
8cf0: 69 6e 67 20 74 68 65 20 75 73 65 72 27 73 20 68 ing the user's h
8d00: 6f 6d 65 0a 20 2a 09 64 69 72 65 63 74 6f 72 79 ome. *.directory
8d10: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 , or NULL if the
8d20: 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72 user's home dir
8d30: 65 63 74 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 ectory could not
8d40: 20 62 65 0a 20 2a 09 64 65 74 65 72 6d 69 6e 65 be. *.determine
8d50: 64 2e 20 53 74 6f 72 61 67 65 20 66 6f 72 20 74 d. Storage for t
8d60: 68 65 20 72 65 73 75 6c 74 20 73 74 72 69 6e 67 he result string
8d70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e is allocated in
8d80: 20 62 75 66 66 65 72 50 74 72 3b 0a 20 2a 09 74 bufferPtr;. *.t
8d90: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 he caller must c
8da0: 61 6c 6c 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 all Tcl_DStringF
8db0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 72 ree() when the r
8dc0: 65 73 75 6c 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 esult is no long
8dd0: 65 72 0a 20 2a 09 6e 65 65 64 65 64 2e 0a 20 2a er. *.needed.. *
8de0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
8df0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a :. *.None.. *. *
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8e40: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 68 61 72 ------. */..char
8e50: 20 2a 0a 54 63 6c 70 47 65 74 55 73 65 72 48 6f *.TclpGetUserHo
8e60: 6d 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 me(. const ch
8e70: 61 72 20 2a 6e 61 6d 65 2c 09 09 2f 2a 20 55 73 ar *name,../* Us
8e80: 65 72 20 6e 61 6d 65 20 66 6f 72 20 64 65 73 69 er name for desi
8e90: 72 65 64 20 68 6f 6d 65 20 64 69 72 65 63 74 6f red home directo
8ea0: 72 79 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 ry. */. Tcl_D
8eb0: 53 74 72 69 6e 67 20 2a 62 75 66 66 65 72 50 74 String *bufferPt
8ec0: 72 29 09 2f 2a 20 55 6e 69 6e 69 74 69 61 6c 69 r)./* Uninitiali
8ed0: 7a 65 64 20 6f 72 20 66 72 65 65 20 44 53 74 72 zed or free DStr
8ee0: 69 6e 67 20 66 69 6c 6c 65 64 20 77 69 74 68 0a ing filled with.
8ef0: 09 09 09 09 20 2a 20 6e 61 6d 65 20 6f 66 20 75 .... * name of u
8f00: 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63 ser's home direc
8f10: 74 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 tory. */.{. c
8f20: 68 61 72 20 2a 72 65 73 75 6c 74 3b 0a 0a 20 20 har *result;..
8f30: 20 20 73 74 61 74 69 63 20 4e 45 54 41 50 49 42 static NETAPIB
8f40: 55 46 46 45 52 46 52 45 45 50 52 4f 43 20 2a 6e UFFERFREEPROC *n
8f50: 65 74 41 70 69 42 75 66 66 65 72 46 72 65 65 50 etApiBufferFreeP
8f60: 72 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20 roc;. static
8f70: 4e 45 54 47 45 54 44 43 4e 41 4d 45 50 52 4f 43 NETGETDCNAMEPROC
8f80: 20 2a 6e 65 74 47 65 74 44 43 4e 61 6d 65 50 72 *netGetDCNamePr
8f90: 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20 4e oc;. static N
8fa0: 45 54 55 53 45 52 47 45 54 49 4e 46 4f 50 52 4f ETUSERGETINFOPRO
8fb0: 43 20 2a 6e 65 74 55 73 65 72 47 65 74 49 6e 66 C *netUserGetInf
8fc0: 6f 50 72 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 oProc;. stati
8fd0: 63 20 47 45 54 50 52 4f 46 49 4c 45 53 44 49 52 c GETPROFILESDIR
8fe0: 45 43 54 4f 52 59 50 52 4f 43 20 2a 67 65 74 50 ECTORYPROC *getP
8ff0: 72 6f 66 69 6c 65 73 44 69 72 65 63 74 6f 72 79 rofilesDirectory
9000: 50 72 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 63 Proc;. static
9010: 20 69 6e 74 20 61 70 69 73 74 75 62 73 20 3d 20 int apistubs =
9020: 30 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 0;.. result =
9030: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL;. Tcl_D
9040: 53 74 72 69 6e 67 49 6e 69 74 28 62 75 66 66 65 StringInit(buffe
9050: 72 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 rPtr);.. if (
9060: 21 61 70 69 73 74 75 62 73 29 20 7b 0a 09 48 49 !apistubs) {..HI
9070: 4e 53 54 41 4e 43 45 20 68 61 6e 64 6c 65 3b 0a NSTANCE handle;.
9080: 09 54 43 4c 5f 44 45 43 4c 41 52 45 5f 4d 55 54 .TCL_DECLARE_MUT
9090: 45 58 28 69 6e 69 74 69 61 6c 69 7a 65 4d 75 74 EX(initializeMut
90a0: 65 78 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f ex)..Tcl_MutexLo
90b0: 63 6b 28 26 69 6e 69 74 69 61 6c 69 7a 65 4d 75 ck(&initializeMu
90c0: 74 65 78 29 3b 0a 09 69 66 20 28 21 61 70 69 73 tex);..if (!apis
90d0: 74 75 62 73 29 20 7b 0a 09 20 20 20 20 68 61 6e tubs) {.. han
90e0: 64 6c 65 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 dle = LoadLibrar
90f0: 79 41 28 22 6e 65 74 61 70 69 33 32 2e 64 6c 6c yA("netapi32.dll
9100: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 68 61 6e ");.. if (han
9110: 64 6c 65 29 20 7b 0a 09 09 6e 65 74 41 70 69 42 dle) {...netApiB
9120: 75 66 66 65 72 46 72 65 65 50 72 6f 63 20 3d 20 ufferFreeProc =
9130: 28 4e 45 54 41 50 49 42 55 46 46 45 52 46 52 45 (NETAPIBUFFERFRE
9140: 45 50 52 4f 43 20 2a 29 0a 09 09 09 47 65 74 50 EPROC *)....GetP
9150: 72 6f 63 41 64 64 72 65 73 73 28 68 61 6e 64 6c rocAddress(handl
9160: 65 2c 20 22 4e 65 74 41 70 69 42 75 66 66 65 72 e, "NetApiBuffer
9170: 46 72 65 65 22 29 3b 0a 09 09 6e 65 74 47 65 74 Free");...netGet
9180: 44 43 4e 61 6d 65 50 72 6f 63 20 3d 20 28 4e 45 DCNameProc = (NE
9190: 54 47 45 54 44 43 4e 41 4d 45 50 52 4f 43 20 2a TGETDCNAMEPROC *
91a0: 29 0a 09 09 09 47 65 74 50 72 6f 63 41 64 64 72 )....GetProcAddr
91b0: 65 73 73 28 68 61 6e 64 6c 65 2c 20 22 4e 65 74 ess(handle, "Net
91c0: 47 65 74 44 43 4e 61 6d 65 22 29 3b 0a 09 09 6e GetDCName");...n
91d0: 65 74 55 73 65 72 47 65 74 49 6e 66 6f 50 72 6f etUserGetInfoPro
91e0: 63 20 3d 20 28 4e 45 54 55 53 45 52 47 45 54 49 c = (NETUSERGETI
91f0: 4e 46 4f 50 52 4f 43 20 2a 29 0a 09 09 09 47 65 NFOPROC *)....Ge
9200: 74 50 72 6f 63 41 64 64 72 65 73 73 28 68 61 6e tProcAddress(han
9210: 64 6c 65 2c 20 22 4e 65 74 55 73 65 72 47 65 74 dle, "NetUserGet
9220: 49 6e 66 6f 22 29 3b 0a 09 09 54 63 6c 5f 43 72 Info");...Tcl_Cr
9230: 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 72 28 eateExitHandler(
9240: 54 63 6c 70 55 6e 6c 6f 61 64 46 69 6c 65 2c 20 TclpUnloadFile,
9250: 68 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20 7d 0a handle);.. }.
9260: 09 20 20 20 20 68 61 6e 64 6c 65 20 3d 20 4c 6f . handle = Lo
9270: 61 64 4c 69 62 72 61 72 79 41 28 22 75 73 65 72 adLibraryA("user
9280: 65 6e 76 2e 64 6c 6c 22 29 3b 0a 09 20 20 20 20 env.dll");..
9290: 69 66 20 28 68 61 6e 64 6c 65 29 20 7b 0a 09 09 if (handle) {...
92a0: 67 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63 getProfilesDirec
92b0: 74 6f 72 79 50 72 6f 63 20 3d 20 28 47 45 54 50 toryProc = (GETP
92c0: 52 4f 46 49 4c 45 53 44 49 52 45 43 54 4f 52 59 ROFILESDIRECTORY
92d0: 50 52 4f 43 20 2a 29 0a 09 09 09 47 65 74 50 72 PROC *)....GetPr
92e0: 6f 63 41 64 64 72 65 73 73 28 68 61 6e 64 6c 65 ocAddress(handle
92f0: 2c 20 22 47 65 74 50 72 6f 66 69 6c 65 73 44 69 , "GetProfilesDi
9300: 72 65 63 74 6f 72 79 57 22 29 3b 0a 09 09 54 63 rectoryW");...Tc
9310: 6c 5f 43 72 65 61 74 65 45 78 69 74 48 61 6e 64 l_CreateExitHand
9320: 6c 65 72 28 54 63 6c 70 55 6e 6c 6f 61 64 46 69 ler(TclpUnloadFi
9330: 6c 65 2c 20 68 61 6e 64 6c 65 29 3b 0a 09 20 20 le, handle);..
9340: 20 20 7d 0a 09 20 20 20 20 0a 09 20 20 20 20 61 }.. .. a
9350: 70 69 73 74 75 62 73 20 3d 20 2d 31 3b 0a 09 20 pistubs = -1;..
9360: 20 20 20 69 66 20 28 20 28 6e 65 74 55 73 65 72 if ( (netUser
9370: 47 65 74 49 6e 66 6f 50 72 6f 63 20 21 3d 20 4e GetInfoProc != N
9380: 55 4c 4c 29 20 26 26 20 28 6e 65 74 47 65 74 44 ULL) && (netGetD
9390: 43 4e 61 6d 65 50 72 6f 63 20 21 3d 20 4e 55 4c CNameProc != NUL
93a0: 4c 29 0a 09 20 20 20 20 20 20 26 26 20 28 6e 65 L).. && (ne
93b0: 74 41 70 69 42 75 66 66 65 72 46 72 65 65 50 72 tApiBufferFreePr
93c0: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28 oc != NULL) && (
93d0: 67 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63 getProfilesDirec
93e0: 74 6f 72 79 50 72 6f 63 20 21 3d 20 4e 55 4c 4c toryProc != NULL
93f0: 29 0a 09 20 20 20 20 29 20 7b 0a 09 09 61 70 69 ).. ) {...api
9400: 73 74 75 62 73 20 3d 20 31 3b 0a 09 20 20 20 20 stubs = 1;..
9410: 7d 0a 09 7d 0a 09 54 63 6c 5f 4d 75 74 65 78 55 }..}..Tcl_MutexU
9420: 6e 6c 6f 63 6b 28 26 69 6e 69 74 69 61 6c 69 7a nlock(&initializ
9430: 65 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 0a eMutex);. }..
9440: 20 20 20 20 69 66 20 28 61 70 69 73 74 75 62 73 if (apistubs
9450: 20 3d 3d 20 31 29 20 7b 0a 09 55 53 45 52 5f 49 == 1) {..USER_I
9460: 4e 46 4f 5f 31 20 2a 75 69 50 74 72 3b 0a 09 54 NFO_1 *uiPtr;..T
9470: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 09 cl_DString ds;..
9480: 69 6e 74 20 6e 61 6d 65 4c 65 6e 2c 20 72 63 3b int nameLen, rc;
9490: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 6f ..const char *do
94a0: 6d 61 69 6e 3b 0a 09 57 43 48 41 52 20 2a 77 4e main;..WCHAR *wN
94b0: 61 6d 65 2c 20 2a 77 48 6f 6d 65 44 69 72 2c 20 ame, *wHomeDir,
94c0: 2a 77 44 6f 6d 61 69 6e 3b 0a 09 57 43 48 41 52 *wDomain;..WCHAR
94d0: 20 62 75 66 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a buf[MAX_PATH];.
94e0: 0a 09 72 63 20 3d 20 30 3b 0a 09 6e 61 6d 65 4c ..rc = 0;..nameL
94f0: 65 6e 20 3d 20 2d 31 3b 0a 09 77 44 6f 6d 61 69 en = -1;..wDomai
9500: 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 64 6f 6d 61 69 n = NULL;..domai
9510: 6e 20 3d 20 54 63 6c 5f 55 74 66 46 69 6e 64 46 n = Tcl_UtfFindF
9520: 69 72 73 74 28 6e 61 6d 65 2c 20 27 40 27 29 3b irst(name, '@');
9530: 0a 09 69 66 20 28 64 6f 6d 61 69 6e 20 3d 3d 20 ..if (domain ==
9540: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 6e NULL) {.. con
9550: 73 74 20 63 68 61 72 20 2a 70 74 72 3b 0a 09 20 st char *ptr;..
9560: 20 20 20 0a 09 20 20 20 20 2f 2a 20 6e 6f 20 64 .. /* no d
9570: 6f 6d 61 69 6e 20 2d 20 66 69 72 73 74 6c 79 20 omain - firstly
9580: 63 68 65 63 6b 20 69 74 27 73 20 74 68 65 20 63 check it's the c
9590: 75 72 72 65 6e 74 20 75 73 65 72 20 2a 2f 0a 09 urrent user */..
95a0: 20 20 20 20 69 66 20 28 20 28 70 74 72 20 3d 20 if ( (ptr =
95b0: 54 63 6c 70 47 65 74 55 73 65 72 4e 61 6d 65 28 TclpGetUserName(
95c0: 26 64 73 29 29 20 21 3d 20 4e 55 4c 4c 20 0a 09 &ds)) != NULL ..
95d0: 20 20 20 20 20 20 26 26 20 73 74 72 63 61 73 65 && strcase
95e0: 63 6d 70 28 6e 61 6d 65 2c 20 70 74 72 29 20 3d cmp(name, ptr) =
95f0: 3d 20 30 0a 09 20 20 20 20 29 20 7b 0a 09 09 2f = 0.. ) {.../
9600: 2a 20 74 72 79 20 73 61 66 65 73 74 20 61 6e 64 * try safest and
9610: 20 66 61 73 74 65 73 74 20 77 61 79 20 74 6f 20 fastest way to
9620: 67 65 74 20 63 75 72 72 65 6e 74 20 75 73 65 72 get current user
9630: 20 68 6f 6d 65 20 2a 2f 0a 09 09 70 74 72 20 3d home */...ptr =
9640: 20 54 63 6c 47 65 74 45 6e 76 28 22 48 4f 4d 45 TclGetEnv("HOME
9650: 22 2c 20 26 64 73 29 3b 0a 09 09 69 66 20 28 70 ", &ds);...if (p
9660: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 tr != NULL) {...
9670: 20 20 20 20 54 63 6c 5f 4a 6f 69 6e 50 61 74 68 Tcl_JoinPath
9680: 28 31 2c 20 26 70 74 72 2c 20 62 75 66 66 65 72 (1, &ptr, buffer
9690: 50 74 72 29 3b 0a 09 09 20 20 20 20 72 63 20 3d Ptr);... rc =
96a0: 20 31 3b 0a 09 09 20 20 20 20 72 65 73 75 6c 74 1;... result
96b0: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 = Tcl_DStringVa
96c0: 6c 75 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a lue(bufferPtr);.
96d0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ..}.. }..
96e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 Tcl_DStringFree(
96f0: 26 64 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a &ds);..} else {.
9700: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
9710: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 Init(&ds);..
9720: 77 4e 61 6d 65 20 3d 20 54 63 6c 5f 55 74 66 54 wName = Tcl_UtfT
9730: 6f 55 6e 69 43 68 61 72 44 53 74 72 69 6e 67 28 oUniCharDString(
9740: 64 6f 6d 61 69 6e 20 2b 20 31 2c 20 2d 31 2c 20 domain + 1, -1,
9750: 26 64 73 29 3b 0a 09 20 20 20 20 72 63 20 3d 20 &ds);.. rc =
9760: 28 6e 65 74 47 65 74 44 43 4e 61 6d 65 50 72 6f (netGetDCNamePro
9770: 63 29 28 4e 55 4c 4c 2c 20 77 4e 61 6d 65 2c 20 c)(NULL, wName,
9780: 28 4c 50 42 59 54 45 20 2a 29 20 26 77 44 6f 6d (LPBYTE *) &wDom
9790: 61 69 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 ain);.. Tcl_D
97a0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b StringFree(&ds);
97b0: 0a 09 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 .. nameLen =
97c0: 64 6f 6d 61 69 6e 20 2d 20 6e 61 6d 65 3b 0a 09 domain - name;..
97d0: 7d 0a 09 69 66 20 28 72 63 20 3d 3d 20 30 29 20 }..if (rc == 0)
97e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 {.. Tcl_DStri
97f0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 ngInit(&ds);..
9800: 20 20 77 4e 61 6d 65 20 3d 20 54 63 6c 5f 55 74 wName = Tcl_Ut
9810: 66 54 6f 55 6e 69 43 68 61 72 44 53 74 72 69 6e fToUniCharDStrin
9820: 67 28 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2c g(name, nameLen,
9830: 20 26 64 73 29 3b 0a 09 20 20 20 20 77 68 69 6c &ds);.. whil
9840: 65 20 28 28 6e 65 74 55 73 65 72 47 65 74 49 6e e ((netUserGetIn
9850: 66 6f 50 72 6f 63 29 28 77 44 6f 6d 61 69 6e 2c foProc)(wDomain,
9860: 20 77 4e 61 6d 65 2c 20 31 2c 0a 09 09 20 20 20 wName, 1,...
9870: 20 28 4c 50 42 59 54 45 20 2a 29 20 26 75 69 50 (LPBYTE *) &uiP
9880: 74 72 29 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a tr) != 0) {.../*
9890: 20 0a 09 09 20 2a 20 75 73 65 72 20 64 6f 65 73 ... * user does
98a0: 20 6e 6f 74 20 65 78 69 73 74 73 20 2d 20 69 66 not exists - if
98b0: 20 64 6f 6d 61 69 6e 20 77 61 73 20 6e 6f 74 20 domain was not
98c0: 73 70 65 63 69 66 69 65 64 2c 0a 09 09 20 2a 20 specified,... *
98d0: 74 72 79 20 61 67 61 69 6e 20 75 73 69 6e 67 20 try again using
98e0: 63 75 72 72 65 6e 74 20 64 6f 6d 61 69 6e 2e 0a current domain..
98f0: 09 09 20 2a 2f 0a 09 09 72 63 20 3d 20 31 3b 0a .. */...rc = 1;.
9900: 09 09 69 66 20 28 64 6f 6d 61 69 6e 20 21 3d 20 ..if (domain !=
9910: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 2f NULL) break;.../
9920: 2a 20 67 65 74 20 63 75 72 72 65 6e 74 20 64 6f * get current do
9930: 6d 61 69 6e 20 2a 2f 0a 09 09 72 63 20 3d 20 28 main */...rc = (
9940: 6e 65 74 47 65 74 44 43 4e 61 6d 65 50 72 6f 63 netGetDCNameProc
9950: 29 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 28 4c )(NULL, NULL, (L
9960: 50 42 59 54 45 20 2a 29 20 26 77 44 6f 6d 61 69 PBYTE *) &wDomai
9970: 6e 29 3b 0a 09 09 69 66 20 28 72 63 20 21 3d 20 n);...if (rc !=
9980: 30 29 20 62 72 65 61 6b 3b 0a 09 09 64 6f 6d 61 0) break;...doma
9990: 69 6e 20 3d 20 49 4e 54 32 50 54 52 28 2d 31 29 in = INT2PTR(-1)
99a0: 3b 20 2f 2a 20 72 65 70 65 61 74 20 6f 6e 63 65 ; /* repeat once
99b0: 20 2a 2f 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 */.. }..
99c0: 69 66 20 28 72 63 20 3d 3d 20 30 29 20 7b 0a 09 if (rc == 0) {..
99d0: 09 44 57 4f 52 44 20 69 2c 20 73 69 7a 65 20 3d .DWORD i, size =
99e0: 20 4d 41 58 5f 50 41 54 48 3b 0a 09 09 77 48 6f MAX_PATH;...wHo
99f0: 6d 65 44 69 72 20 3d 20 75 69 50 74 72 2d 3e 75 meDir = uiPtr->u
9a00: 73 72 69 31 5f 68 6f 6d 65 5f 64 69 72 3b 0a 09 sri1_home_dir;..
9a10: 09 69 66 20 28 28 77 48 6f 6d 65 44 69 72 20 21 .if ((wHomeDir !
9a20: 3d 20 4e 55 4c 4c 29 20 26 26 20 28 77 48 6f 6d = NULL) && (wHom
9a30: 65 44 69 72 5b 30 5d 20 21 3d 20 4c 27 5c 30 27 eDir[0] != L'\0'
9a40: 29 29 20 7b 0a 09 09 20 20 20 20 73 69 7a 65 20 )) {... size
9a50: 3d 20 6c 73 74 72 6c 65 6e 57 28 77 48 6f 6d 65 = lstrlenW(wHome
9a60: 44 69 72 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f Dir);... Tcl_
9a70: 55 6e 69 43 68 61 72 54 6f 55 74 66 44 53 74 72 UniCharToUtfDStr
9a80: 69 6e 67 28 77 48 6f 6d 65 44 69 72 2c 20 73 69 ing(wHomeDir, si
9a90: 7a 65 2c 20 62 75 66 66 65 72 50 74 72 29 3b 0a ze, bufferPtr);.
9aa0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 ..} else {...
9ab0: 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 55 73 65 /*... * Use
9ac0: 72 20 65 78 69 73 74 73 20 62 75 74 20 68 61 73 r exists but has
9ad0: 20 6e 6f 20 68 6f 6d 65 20 64 69 72 2e 20 52 65 no home dir. Re
9ae0: 74 75 72 6e 0a 09 09 20 20 20 20 20 2a 20 22 7b turn... * "{
9af0: 47 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63 GetProfilesDirec
9b00: 74 6f 72 79 7d 2f 3c 75 73 65 72 3e 22 2e 0a 09 tory}/<user>"...
9b10: 09 20 20 20 20 20 2a 2f 0a 09 09 20 20 20 20 67 . */... g
9b20: 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63 74 etProfilesDirect
9b30: 6f 72 79 50 72 6f 63 28 62 75 66 2c 20 26 73 69 oryProc(buf, &si
9b40: 7a 65 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 55 ze);... Tcl_U
9b50: 6e 69 43 68 61 72 54 6f 55 74 66 44 53 74 72 69 niCharToUtfDStri
9b60: 6e 67 28 62 75 66 2c 20 73 69 7a 65 2d 31 2c 20 ng(buf, size-1,
9b70: 62 75 66 66 65 72 50 74 72 29 3b 0a 09 09 20 20 bufferPtr);...
9b80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 Tcl_DStringApp
9b90: 65 6e 64 28 62 75 66 66 65 72 50 74 72 2c 20 22 end(bufferPtr, "
9ba0: 2f 22 2c 20 31 29 3b 0a 09 09 20 20 20 20 54 63 /", 1);... Tc
9bb0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 l_DStringAppend(
9bc0: 62 75 66 66 65 72 50 74 72 2c 20 6e 61 6d 65 2c bufferPtr, name,
9bd0: 20 6e 61 6d 65 4c 65 6e 29 3b 0a 09 09 7d 0a 09 nameLen);...}..
9be0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 44 53 .result = Tcl_DS
9bf0: 74 72 69 6e 67 56 61 6c 75 65 28 62 75 66 66 65 tringValue(buffe
9c00: 72 50 74 72 29 3b 0a 09 09 2f 2a 20 62 65 20 73 rPtr);.../* be s
9c10: 75 72 65 20 77 65 20 72 65 74 75 72 6e 73 20 6e ure we returns n
9c20: 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 2a ormalized path *
9c30: 2f 0a 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 /...for (i = 0;
9c40: 69 20 3c 20 73 69 7a 65 3b 20 2b 2b 69 29 7b 0a i < size; ++i){.
9c50: 09 09 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 .. if (result
9c60: 5b 69 5d 20 3d 3d 20 27 5c 5c 27 29 20 72 65 73 [i] == '\\') res
9c70: 75 6c 74 5b 69 5d 20 3d 20 27 2f 27 3b 0a 09 09 ult[i] = '/';...
9c80: 7d 0a 09 09 28 2a 6e 65 74 41 70 69 42 75 66 66 }...(*netApiBuff
9c90: 65 72 46 72 65 65 50 72 6f 63 29 28 28 76 6f 69 erFreeProc)((voi
9ca0: 64 20 2a 29 20 75 69 50 74 72 29 3b 0a 09 20 20 d *) uiPtr);..
9cb0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 }.. Tcl_DSt
9cc0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
9cd0: 7d 0a 09 69 66 20 28 77 44 6f 6d 61 69 6e 20 21 }..if (wDomain !
9ce0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 28 = NULL) {.. (
9cf0: 2a 6e 65 74 41 70 69 42 75 66 66 65 72 46 72 65 *netApiBufferFre
9d00: 65 50 72 6f 63 29 28 28 76 6f 69 64 20 2a 29 20 eProc)((void *)
9d10: 77 44 6f 6d 61 69 6e 29 3b 0a 09 7d 0a 20 20 20 wDomain);..}.
9d20: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c }. if (resul
9d30: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a t == NULL) {../*
9d40: 0a 09 20 2a 20 4c 6f 6f 6b 20 69 6e 20 74 68 65 .. * Look in the
9d50: 20 22 50 61 73 73 77 6f 72 64 20 4c 69 73 74 73 "Password Lists
9d60: 22 20 73 65 63 74 69 6f 6e 20 6f 66 20 73 79 73 " section of sys
9d70: 74 65 6d 2e 69 6e 69 20 66 6f 72 20 74 68 65 20 tem.ini for the
9d80: 6c 6f 63 61 6c 0a 09 20 2a 20 75 73 65 72 2e 20 local.. * user.
9d90: 54 68 65 72 65 20 61 72 65 20 61 6c 73 6f 20 65 There are also e
9da0: 6e 74 72 69 65 73 20 69 6e 20 74 68 61 74 20 73 ntries in that s
9db0: 65 63 74 69 6f 6e 20 74 68 61 74 20 62 65 67 69 ection that begi
9dc0: 6e 20 77 69 74 68 20 61 20 22 2a 22 0a 09 20 2a n with a "*".. *
9dd0: 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 character that
9de0: 61 72 65 20 75 73 65 64 20 62 79 20 57 69 6e 64 are used by Wind
9df0: 6f 77 73 20 66 6f 72 20 6f 74 68 65 72 20 70 75 ows for other pu
9e00: 72 70 6f 73 65 73 3b 20 69 67 6e 6f 72 65 20 75 rposes; ignore u
9e10: 73 65 72 0a 09 20 2a 20 6e 61 6d 65 73 20 62 65 ser.. * names be
9e20: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 61 20 22 ginning with a "
9e30: 2a 22 2e 0a 09 20 2a 2f 0a 0a 09 63 68 61 72 20 *"... */...char
9e40: 62 75 66 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 0a buf[MAX_PATH];..
9e50: 09 69 66 20 28 6e 61 6d 65 5b 30 5d 20 21 3d 20 .if (name[0] !=
9e60: 27 2a 27 29 20 7b 0a 09 20 20 20 20 69 66 20 28 '*') {.. if (
9e70: 47 65 74 50 72 69 76 61 74 65 50 72 6f 66 69 6c GetPrivateProfil
9e80: 65 53 74 72 69 6e 67 41 28 22 50 61 73 73 77 6f eStringA("Passwo
9e90: 72 64 20 4c 69 73 74 73 22 2c 20 6e 61 6d 65 2c rd Lists", name,
9ea0: 20 22 22 2c 20 62 75 66 2c 0a 09 09 20 20 20 20 "", buf,...
9eb0: 4d 41 58 5f 50 41 54 48 2c 20 22 73 79 73 74 65 MAX_PATH, "syste
9ec0: 6d 2e 69 6e 69 22 29 20 3e 20 30 29 20 7b 0a 09 m.ini") > 0) {..
9ed0: 09 2f 2a 0a 09 09 20 2a 20 55 73 65 72 20 65 78 ./*... * User ex
9ee0: 69 73 74 73 2c 20 62 75 74 20 74 68 65 72 65 20 ists, but there
9ef0: 69 73 20 6e 6f 20 73 75 63 68 20 74 68 69 6e 67 is no such thing
9f00: 20 61 73 20 61 20 68 6f 6d 65 20 64 69 72 65 63 as a home direc
9f10: 74 6f 72 79 0a 09 09 20 2a 20 69 6e 20 73 79 73 tory... * in sys
9f20: 74 65 6d 2e 69 6e 69 2e 20 52 65 74 75 72 6e 20 tem.ini. Return
9f30: 22 7b 57 69 6e 64 6f 77 73 20 64 72 69 76 65 7d "{Windows drive}
9f40: 3a 2f 22 2e 0a 09 09 20 2a 2f 0a 0a 09 09 47 65 :/".... */....Ge
9f50: 74 57 69 6e 64 6f 77 73 44 69 72 65 63 74 6f 72 tWindowsDirector
9f60: 79 41 28 62 75 66 2c 20 4d 41 58 5f 50 41 54 48 yA(buf, MAX_PATH
9f70: 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 );...Tcl_DString
9f80: 41 70 70 65 6e 64 28 62 75 66 66 65 72 50 74 72 Append(bufferPtr
9f90: 2c 20 62 75 66 2c 20 33 29 3b 0a 09 09 72 65 73 , buf, 3);...res
9fa0: 75 6c 74 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e ult = Tcl_DStrin
9fb0: 67 56 61 6c 75 65 28 62 75 66 66 65 72 50 74 72 gValue(bufferPtr
9fc0: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 );.. }..}.
9fd0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }.. return r
9fe0: 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a esult;.}.../*. *
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
a040: 2a 20 4e 61 74 69 76 65 41 63 63 65 73 73 20 2d * NativeAccess -
a050: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
a060: 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 ction replaces t
a070: 68 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 he library versi
a080: 6f 6e 20 6f 66 20 61 63 63 65 73 73 28 29 2c 20 on of access(),
a090: 66 69 78 69 6e 67 20 74 68 65 0a 20 2a 09 66 6f fixing the. *.fo
a0a0: 6c 6c 6f 77 69 6e 67 20 62 75 67 73 3a 0a 20 2a llowing bugs:. *
a0b0: 0a 20 2a 09 31 2e 20 61 63 63 65 73 73 28 29 20 . *.1. access()
a0c0: 72 65 74 75 72 6e 73 20 74 68 61 74 20 61 6c 6c returns that all
a0d0: 20 66 69 6c 65 73 20 68 61 76 65 20 65 78 65 63 files have exec
a0e0: 75 74 65 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a ute permission..
a0f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
a100: 2a 09 53 65 65 20 61 63 63 65 73 73 20 64 6f 63 *.See access doc
a110: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 umentation.. *.
a120: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
a130: 20 2a 09 53 65 65 20 61 63 63 65 73 73 20 64 6f *.See access do
a140: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a cumentation.. *.
a150: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
a160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
a1a0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 61 /..static int.Na
a1b0: 74 69 76 65 41 63 63 65 73 73 28 0a 20 20 20 20 tiveAccess(.
a1c0: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 74 const TCHAR *nat
a1d0: 69 76 65 50 61 74 68 2c 09 2f 2a 20 50 61 74 68 ivePath,./* Path
a1e0: 20 6f 66 20 66 69 6c 65 20 74 6f 20 61 63 63 65 of file to acce
a1f0: 73 73 2c 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 ss, native encod
a200: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ing. */. int
a210: 6d 6f 64 65 29 09 09 09 2f 2a 20 50 65 72 6d 69 mode).../* Permi
a220: 73 73 69 6f 6e 20 73 65 74 74 69 6e 67 2e 20 2a ssion setting. *
a230: 2f 0a 7b 0a 20 20 20 20 44 57 4f 52 44 20 61 74 /.{. DWORD at
a240: 74 72 3b 0a 0a 20 20 20 20 61 74 74 72 20 3d 20 tr;.. attr =
a250: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 (*tclWinProcs->g
a260: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 etFileAttributes
a270: 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 Proc)(nativePath
a280: 29 3b 0a 0a 20 20 20 20 69 66 20 28 61 74 74 72 );.. if (attr
a290: 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66 29 20 == 0xffffffff)
a2a0: 7b 0a 09 2f 2a 0a 09 20 2a 20 46 69 6c 65 20 6d {../*.. * File m
a2b0: 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 2e 0a ight not exist..
a2c0: 09 20 2a 2f 0a 0a 09 44 57 4f 52 44 20 6c 61 73 . */...DWORD las
a2d0: 74 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 terror = GetLast
a2e0: 45 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 6c 61 Error();..if (la
a2f0: 73 74 65 72 72 6f 72 20 21 3d 20 45 52 52 4f 52 sterror != ERROR
a300: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 _SHARING_VIOLATI
a310: 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 57 69 ON) {.. TclWi
a320: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 6c 61 nConvertError(la
a330: 73 74 65 72 72 6f 72 29 3b 0a 09 20 20 20 20 72 sterror);.. r
a340: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 eturn -1;..}.
a350: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 }.. if (mode
a360: 20 3d 3d 20 46 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a == F_OK) {../*.
a370: 09 20 2a 20 46 69 6c 65 20 65 78 69 73 74 73 2c . * File exists,
a380: 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 74 6f nothing else to
a390: 20 63 68 65 63 6b 2e 0a 09 20 2a 2f 0a 0a 09 72 check... */...r
a3a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
a3b0: 20 20 20 20 2f 2a 20 0a 20 20 20 20 20 2a 20 49 /* . * I
a3c0: 66 20 69 74 27 73 20 6e 6f 74 20 61 20 64 69 72 f it's not a dir
a3d0: 65 63 74 6f 72 79 20 28 61 73 73 75 6d 65 20 66 ectory (assume f
a3e0: 69 6c 65 29 2c 20 64 6f 20 73 65 76 65 72 61 6c ile), do several
a3f0: 20 66 61 73 74 20 63 68 65 63 6b 73 3a 0a 20 20 fast checks:.
a400: 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28 */. if (!(
a410: 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 attr & FILE_ATTR
a420: 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 IBUTE_DIRECTORY)
a430: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 ) {../*.. * If t
a440: 68 65 20 61 74 74 72 69 62 75 74 65 73 20 73 61 he attributes sa
a450: 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 77 72 y this is not wr
a460: 69 74 61 62 6c 65 20 61 74 20 61 6c 6c 2e 20 20 itable at all.
a470: 54 68 65 20 66 69 6c 65 20 69 73 20 61 0a 09 20 The file is a..
a480: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 20 28 * regular file (
a490: 69 2e 65 2e 2c 20 6e 6f 74 20 61 20 64 69 72 65 i.e., not a dire
a4a0: 63 74 6f 72 79 29 2c 20 74 68 65 6e 20 74 68 65 ctory), then the
a4b0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 09 20 2a file is not.. *
a4c0: 20 77 72 69 74 61 62 6c 65 2c 20 66 75 6c 6c 20 writable, full
a4d0: 73 74 6f 70 2e 09 20 46 6f 72 20 64 69 72 65 63 stop.. For direc
a4e0: 74 6f 72 69 65 73 2c 20 74 68 65 20 72 65 61 64 tories, the read
a4f0: 2d 6f 6e 6c 79 20 62 69 74 20 69 73 0a 09 20 2a -only bit is.. *
a500: 20 28 6d 6f 73 74 6c 79 29 20 69 67 6e 6f 72 65 (mostly) ignore
a510: 64 20 62 79 20 57 69 6e 64 6f 77 73 2c 20 73 6f d by Windows, so
a520: 20 77 65 20 63 61 6e 27 74 20 61 73 63 65 72 74 we can't ascert
a530: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 61 62 6f ain anything abo
a540: 75 74 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79 ut.. * directory
a550: 20 61 63 63 65 73 73 20 66 72 6f 6d 20 74 68 65 access from the
a560: 20 61 74 74 72 69 62 20 64 61 74 61 2e 20 20 48 attrib data. H
a570: 6f 77 65 76 65 72 2c 20 69 66 20 77 65 20 68 61 owever, if we ha
a580: 76 65 20 74 68 65 0a 09 20 2a 20 61 64 76 61 6e ve the.. * advan
a590: 63 65 64 20 27 67 65 74 46 69 6c 65 53 65 63 75 ced 'getFileSecu
a5a0: 72 69 74 79 50 72 6f 63 27 2c 20 74 68 65 6e 20 rityProc', then
a5b0: 6d 6f 72 65 20 72 6f 62 75 73 74 20 41 43 4c 20 more robust ACL
a5c0: 63 68 65 63 6b 73 0a 09 20 2a 20 77 69 6c 6c 20 checks.. * will
a5d0: 62 65 20 64 6f 6e 65 20 62 65 6c 6f 77 2e 0a 09 be done below...
a5e0: 20 2a 2f 0a 09 69 66 20 28 28 6d 6f 64 65 20 26 */..if ((mode &
a5f0: 20 57 5f 4f 4b 29 20 26 26 20 28 61 74 74 72 20 W_OK) && (attr
a600: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 & FILE_ATTRIBUTE
a610: 5f 52 45 41 44 4f 4e 4c 59 29 29 20 7b 0a 09 20 _READONLY)) {..
a620: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 Tcl_SetErrno(
a630: 45 41 43 43 45 53 29 3b 0a 09 20 20 20 20 72 65 EACCES);.. re
a640: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a turn -1;..}.../*
a650: 20 49 66 20 64 6f 65 73 6e 27 74 20 68 61 76 65 If doesn't have
a660: 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 78 74 the correct ext
a670: 65 6e 73 69 6f 6e 2c 20 69 74 20 63 61 6e 27 74 ension, it can't
a680: 20 62 65 20 65 78 65 63 75 74 61 62 6c 65 20 2a be executable *
a690: 2f 0a 09 69 66 20 28 28 6d 6f 64 65 20 26 20 58 /..if ((mode & X
a6a0: 5f 4f 4b 29 20 26 26 20 21 4e 61 74 69 76 65 49 _OK) && !NativeI
a6b0: 73 45 78 65 63 28 6e 61 74 69 76 65 50 61 74 68 sExec(nativePath
a6c0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 )) {.. Tcl_Se
a6d0: 74 45 72 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a tErrno(EACCES);.
a6e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
a6f0: 09 7d 0a 09 2f 2a 20 53 70 65 63 69 61 6c 20 63 .}../* Special c
a700: 61 73 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69 ase for read/wri
a710: 74 65 2f 65 78 65 63 75 74 61 62 6c 65 20 63 68 te/executable ch
a720: 65 63 6b 20 6f 6e 20 66 69 6c 65 20 2a 2f 0a 09 eck on file */..
a730: 69 66 20 28 28 6d 6f 64 65 20 26 20 28 52 5f 4f if ((mode & (R_O
a740: 4b 7c 57 5f 4f 4b 7c 58 5f 4f 4b 29 29 20 26 26 K|W_OK|X_OK)) &&
a750: 20 21 28 6d 6f 64 65 20 26 20 7e 28 52 5f 4f 4b !(mode & ~(R_OK
a760: 7c 57 5f 4f 4b 7c 58 5f 4f 4b 29 29 29 20 7b 0a |W_OK|X_OK))) {.
a770: 09 20 20 20 20 44 57 4f 52 44 20 6d 61 73 6b 20 . DWORD mask
a780: 3d 20 30 3b 0a 09 20 20 20 20 48 41 4e 44 4c 45 = 0;.. HANDLE
a790: 20 68 46 69 6c 65 3b 0a 09 20 20 20 20 69 66 20 hFile;.. if
a7a0: 28 6d 6f 64 65 20 26 20 52 5f 4f 4b 29 20 7b 20 (mode & R_OK) {
a7b0: 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43 5f mask |= GENERIC_
a7c0: 52 45 41 44 3b 20 20 7d 0a 09 20 20 20 20 69 66 READ; }.. if
a7d0: 20 28 6d 6f 64 65 20 26 20 57 5f 4f 4b 29 20 7b (mode & W_OK) {
a7e0: 20 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43 mask |= GENERIC
a7f0: 5f 57 52 49 54 45 3b 20 7d 0a 09 20 20 20 20 69 _WRITE; }.. i
a800: 66 20 28 6d 6f 64 65 20 26 20 58 5f 4f 4b 29 20 f (mode & X_OK)
a810: 7b 20 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 { mask |= GENERI
a820: 43 5f 45 58 45 43 55 54 45 3b 20 7d 0a 0a 09 20 C_EXECUTE; }...
a830: 20 20 20 68 46 69 6c 65 20 3d 20 28 74 63 6c 57 hFile = (tclW
a840: 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 46 inProcs->createF
a850: 69 6c 65 50 72 6f 63 29 28 6e 61 74 69 76 65 50 ileProc)(nativeP
a860: 61 74 68 2c 20 6d 61 73 6b 2c 0a 09 09 46 49 4c ath, mask,...FIL
a870: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 E_SHARE_READ | F
a880: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 20 ILE_SHARE_WRITE
a890: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 44 45 4c | FILE_SHARE_DEL
a8a0: 45 54 45 2c 20 4e 55 4c 4c 2c 0a 09 09 4f 50 45 ETE, NULL,...OPE
a8b0: 4e 5f 45 58 49 53 54 49 4e 47 2c 20 46 49 4c 45 N_EXISTING, FILE
a8c0: 5f 46 4c 41 47 5f 4e 4f 5f 42 55 46 46 45 52 49 _FLAG_NO_BUFFERI
a8d0: 4e 47 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 NG, NULL);..
a8e0: 69 66 20 28 68 46 69 6c 65 20 21 3d 20 49 4e 56 if (hFile != INV
a8f0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
a900: 45 29 20 7b 0a 09 09 43 6c 6f 73 65 48 61 6e 64 E) {...CloseHand
a910: 6c 65 28 68 46 69 6c 65 29 3b 0a 09 09 72 65 74 le(hFile);...ret
a920: 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 urn 0;.. }..
a930: 20 20 20 2f 2a 20 66 61 73 74 20 65 78 69 74 20 /* fast exit
a940: 69 66 20 61 63 63 65 73 73 20 77 61 73 20 64 65 if access was de
a950: 6e 69 65 64 20 2a 2f 0a 09 20 20 20 20 69 66 20 nied */.. if
a960: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 (GetLastError()
a970: 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f == ERROR_ACCESS_
a980: 44 45 4e 49 45 44 29 20 7b 0a 09 09 54 63 6c 5f DENIED) {...Tcl_
a990: 53 65 74 45 72 72 6e 6f 28 45 41 43 43 45 53 29 SetErrno(EACCES)
a9a0: 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 ;...return -1;..
a9b0: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 57 65 20 }..}../* We
a9c0: 63 61 6e 6e 6e 6f 74 20 76 65 72 69 66 79 20 74 cannnot verify t
a9d0: 68 65 20 61 63 63 65 73 73 20 66 61 73 74 2c 20 he access fast,
a9e0: 63 68 65 63 6b 20 69 74 20 62 65 6c 6f 77 20 75 check it below u
a9f0: 73 69 6e 67 20 73 65 63 75 72 69 74 79 20 69 6e sing security in
aa00: 66 6f 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 fo. */. }..
aa10: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 74 20 6c /*. * It l
aa20: 6f 6f 6b 73 20 61 73 20 69 66 20 74 68 65 20 70 ooks as if the p
aa30: 65 72 6d 69 73 73 69 6f 6e 73 20 61 72 65 20 6f ermissions are o
aa40: 6b 2c 20 62 75 74 20 69 66 20 77 65 20 61 72 65 k, but if we are
aa50: 20 6f 6e 20 4e 54 2c 20 32 30 30 30 20 6f 72 20 on NT, 2000 or
aa60: 58 50 2c 0a 20 20 20 20 20 2a 20 77 65 20 68 61 XP,. * we ha
aa70: 76 65 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 ve a more comple
aa80: 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 73 74 x permissions st
aa90: 72 75 63 74 75 72 65 20 73 6f 20 77 65 20 74 72 ructure so we tr
aaa0: 79 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 2e y to check that.
aab0: 0a 20 20 20 20 20 2a 20 54 68 65 20 63 6f 64 65 . * The code
aac0: 20 62 65 6c 6f 77 20 69 73 20 72 65 6d 61 72 6b below is remark
aad0: 61 62 6c 79 20 63 6f 6d 70 6c 65 78 20 66 6f 72 ably complex for
aae0: 20 73 75 63 68 20 61 20 73 69 6d 70 6c 65 20 74 such a simple t
aaf0: 68 69 6e 67 20 61 73 20 66 69 6e 64 69 6e 67 0a hing as finding.
ab00: 20 20 20 20 20 2a 20 77 68 61 74 20 70 65 72 6d * what perm
ab10: 69 73 73 69 6f 6e 73 20 74 68 65 20 4f 53 20 68 issions the OS h
ab20: 61 73 20 73 65 74 20 66 6f 72 20 61 20 66 69 6c as set for a fil
ab30: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 e.. */..
ab40: 69 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d if (tclWinProcs-
ab50: 3e 67 65 74 46 69 6c 65 53 65 63 75 72 69 74 79 >getFileSecurity
ab60: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a Proc != NULL) {.
ab70: 09 53 45 43 55 52 49 54 59 5f 44 45 53 43 52 49 .SECURITY_DESCRI
ab80: 50 54 4f 52 20 2a 73 64 50 74 72 20 3d 20 4e 55 PTOR *sdPtr = NU
ab90: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f LL;..unsigned lo
aba0: 6e 67 20 73 69 7a 65 3b 0a 09 50 53 49 44 20 70 ng size;..PSID p
abb0: 53 69 64 20 3d 20 30 3b 0a 09 42 4f 4f 4c 20 53 Sid = 0;..BOOL S
abc0: 69 64 44 65 66 61 75 6c 74 65 64 3b 0a 09 53 49 idDefaulted;..SI
abd0: 44 5f 49 44 45 4e 54 49 46 49 45 52 5f 41 55 54 D_IDENTIFIER_AUT
abe0: 48 4f 52 49 54 59 20 73 61 6d 62 61 5f 75 6e 6d HORITY samba_unm
abf0: 61 70 70 65 64 20 3d 20 7b 7b 30 2c 20 30 2c 20 apped = {{0, 0,
ac00: 30 2c 20 30 2c 20 30 2c 20 32 32 7d 7d 3b 0a 09 0, 0, 0, 22}};..
ac10: 47 45 4e 45 52 49 43 5f 4d 41 50 50 49 4e 47 20 GENERIC_MAPPING
ac20: 67 65 6e 4d 61 70 3b 0a 09 48 41 4e 44 4c 45 20 genMap;..HANDLE
ac30: 68 54 6f 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 hToken = NULL;..
ac40: 44 57 4f 52 44 20 64 65 73 69 72 65 64 41 63 63 DWORD desiredAcc
ac50: 65 73 73 20 3d 20 30 2c 20 67 72 61 6e 74 65 64 ess = 0, granted
ac60: 41 63 63 65 73 73 20 3d 20 30 3b 0a 09 42 4f 4f Access = 0;..BOO
ac70: 4c 20 61 63 63 65 73 73 59 65 73 4e 6f 20 3d 20 L accessYesNo =
ac80: 46 41 4c 53 45 3b 0a 09 50 52 49 56 49 4c 45 47 FALSE;..PRIVILEG
ac90: 45 5f 53 45 54 20 70 72 69 76 53 65 74 3b 0a 09 E_SET privSet;..
aca0: 44 57 4f 52 44 20 70 72 69 76 53 65 74 53 69 7a DWORD privSetSiz
acb0: 65 20 3d 20 73 69 7a 65 6f 66 28 50 52 49 56 49 e = sizeof(PRIVI
acc0: 4c 45 47 45 5f 53 45 54 29 3b 0a 09 69 6e 74 20 LEGE_SET);..int
acd0: 65 72 72 6f 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 error;.../*.. *
ace0: 46 69 72 73 74 20 66 69 6e 64 20 6f 75 74 20 68 First find out h
acf0: 6f 77 20 62 69 67 20 74 68 65 20 62 75 66 66 65 ow big the buffe
ad00: 72 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 09 20 r needs to be..
ad10: 2a 2f 0a 0a 09 73 69 7a 65 20 3d 20 30 3b 0a 09 */...size = 0;..
ad20: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 (*tclWinProcs->g
ad30: 65 74 46 69 6c 65 53 65 63 75 72 69 74 79 50 72 etFileSecurityPr
ad40: 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c 0a oc)(nativePath,.
ad50: 09 09 4f 57 4e 45 52 5f 53 45 43 55 52 49 54 59 ..OWNER_SECURITY
ad60: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 47 _INFORMATION | G
ad70: 52 4f 55 50 5f 53 45 43 55 52 49 54 59 5f 49 4e ROUP_SECURITY_IN
ad80: 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c 20 44 41 FORMATION...| DA
ad90: 43 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f CL_SECURITY_INFO
ada0: 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 45 4c 5f RMATION | LABEL_
adb0: 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41 SECURITY_INFORMA
adc0: 54 49 4f 4e 2c 0a 09 09 30 2c 20 30 2c 20 26 73 TION,...0, 0, &s
add0: 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 ize);.../*.. * S
ade0: 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65 hould have faile
adf0: 64 20 77 69 74 68 20 45 52 52 4f 52 5f 49 4e 53 d with ERROR_INS
ae00: 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 UFFICIENT_BUFFER
ae10: 0a 09 20 2a 2f 0a 0a 09 65 72 72 6f 72 20 3d 20 .. */...error =
ae20: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a GetLastError();.
ae30: 09 69 66 20 28 65 72 72 6f 72 20 21 3d 20 45 52 .if (error != ER
ae40: 52 4f 52 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 ROR_INSUFFICIENT
ae50: 5f 42 55 46 46 45 52 29 20 7b 0a 09 20 20 20 20 _BUFFER) {..
ae60: 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 6f 73 74 20 /*.. * Most
ae70: 6c 69 6b 65 6c 79 20 63 61 73 65 20 69 73 20 45 likely case is E
ae80: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 RROR_ACCESS_DENI
ae90: 45 44 2c 20 77 68 69 63 68 20 77 65 20 77 69 6c ED, which we wil
aea0: 6c 20 63 6f 6e 76 65 72 74 0a 09 20 20 20 20 20 l convert..
aeb0: 2a 20 74 6f 20 45 41 43 43 45 53 20 2d 20 6a 75 * to EACCES - ju
aec0: 73 74 20 77 68 61 74 20 77 65 20 77 61 6e 74 21 st what we want!
aed0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
aee0: 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 TclWinConvertErr
aef0: 6f 72 28 28 44 57 4f 52 44 29 20 65 72 72 6f 72 or((DWORD) error
af00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d );.. return -
af10: 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4e 1;..}.../*.. * N
af20: 6f 77 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 73 ow size contains
af30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 62 75 66 the size of buf
af40: 66 65 72 20 6e 65 65 64 65 64 2e 0a 09 20 2a 2f fer needed... */
af50: 0a 0a 09 73 64 50 74 72 20 3d 20 28 53 45 43 55 ...sdPtr = (SECU
af60: 52 49 54 59 5f 44 45 53 43 52 49 50 54 4f 52 20 RITY_DESCRIPTOR
af70: 2a 29 20 48 65 61 70 41 6c 6c 6f 63 28 47 65 74 *) HeapAlloc(Get
af80: 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 ProcessHeap(), 0
af90: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 73 , size);...if (s
afa0: 64 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a dPtr == NULL) {.
afb0: 09 20 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73 . goto access
afc0: 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 Error;..}.../*..
afd0: 20 2a 20 43 61 6c 6c 20 47 65 74 46 69 6c 65 53 * Call GetFileS
afe0: 65 63 75 72 69 74 79 28 29 20 66 6f 72 20 72 65 ecurity() for re
aff0: 61 6c 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 al... */...if (!
b000: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 (*tclWinProcs->g
b010: 65 74 46 69 6c 65 53 65 63 75 72 69 74 79 50 72 etFileSecurityPr
b020: 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c 0a oc)(nativePath,.
b030: 09 09 4f 57 4e 45 52 5f 53 45 43 55 52 49 54 59 ..OWNER_SECURITY
b040: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 47 _INFORMATION | G
b050: 52 4f 55 50 5f 53 45 43 55 52 49 54 59 5f 49 4e ROUP_SECURITY_IN
b060: 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c 20 44 41 FORMATION...| DA
b070: 43 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f CL_SECURITY_INFO
b080: 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 45 4c 5f RMATION | LABEL_
b090: 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41 SECURITY_INFORMA
b0a0: 54 49 4f 4e 2c 0a 09 09 73 64 50 74 72 2c 20 73 TION,...sdPtr, s
b0b0: 69 7a 65 2c 20 26 73 69 7a 65 29 29 20 7b 0a 09 ize, &size)) {..
b0c0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45 /*.. * E
b0d0: 72 72 6f 72 20 67 65 74 74 69 6e 67 20 6f 77 6e rror getting own
b0e0: 65 72 20 53 44 0a 09 20 20 20 20 20 2a 2f 0a 0a er SD.. */..
b0f0: 09 20 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73 . goto access
b100: 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 Error;..}.../*..
b110: 20 2a 20 41 73 20 6f 66 20 53 61 6d 62 61 20 33 * As of Samba 3
b120: 2e 30 2e 32 33 20 28 31 30 2d 4a 75 6c 2d 32 30 .0.23 (10-Jul-20
b130: 30 36 29 2c 20 75 6e 6d 61 70 70 65 64 20 75 73 06), unmapped us
b140: 65 72 73 20 61 6e 64 20 67 72 6f 75 70 73 20 61 ers and groups a
b150: 72 65 0a 09 20 2a 20 61 73 73 69 67 6e 65 64 20 re.. * assigned
b160: 74 6f 20 53 49 44 20 64 6f 6d 61 69 6e 73 20 53 to SID domains S
b170: 2d 31 2d 32 32 2d 31 20 61 6e 64 20 53 2d 31 2d -1-22-1 and S-1-
b180: 32 32 2d 32 2c 20 77 68 65 72 65 20 22 32 32 22 22-2, where "22"
b190: 20 69 73 20 74 68 65 0a 09 20 2a 20 74 6f 70 2d is the.. * top-
b1a0: 6c 65 76 65 6c 20 61 75 74 68 6f 72 69 74 79 2e level authority.
b1b0: 09 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 77 . If the file ow
b1c0: 6e 65 72 20 61 6e 64 20 67 72 6f 75 70 20 69 73 ner and group is
b1d0: 20 75 6e 6d 61 70 70 65 64 20 74 68 65 6e 0a 09 unmapped then..
b1e0: 20 2a 20 74 68 65 20 41 43 4c 20 61 63 63 65 73 * the ACL acces
b1f0: 73 20 63 68 65 63 6b 20 62 65 6c 6f 77 20 77 69 s check below wi
b200: 6c 6c 20 6f 6e 6c 79 20 74 65 73 74 20 61 67 61 ll only test aga
b210: 69 6e 73 74 20 77 6f 72 6c 64 20 61 63 63 65 73 inst world acces
b220: 73 2c 0a 09 20 2a 20 77 68 69 63 68 20 69 73 20 s,.. * which is
b230: 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 6d 6f 72 likely to be mor
b240: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 74 68 e restrictive th
b250: 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 61 63 an the actual ac
b260: 63 65 73 73 0a 09 20 2a 20 72 65 73 74 72 69 63 cess.. * restric
b270: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 74 68 tions. Since th
b280: 65 20 41 43 4c 20 74 65 73 74 73 20 61 72 65 20 e ACL tests are
b290: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 77 72 6f 6e more likely wron
b2a0: 67 20 74 68 61 6e 0a 09 20 2a 20 72 69 67 68 74 g than.. * right
b2b0: 2c 20 73 6b 69 70 20 74 68 65 6d 2e 20 20 4d 6f , skip them. Mo
b2c0: 72 65 6f 76 65 72 2c 20 74 68 65 20 75 6e 69 78 reover, the unix
b2d0: 20 6f 77 6e 65 72 20 61 63 63 65 73 73 20 70 65 owner access pe
b2e0: 72 6d 69 73 73 69 6f 6e 73 20 61 72 65 0a 09 20 rmissions are..
b2f0: 2a 20 75 73 75 61 6c 6c 79 20 6d 61 70 70 65 64 * usually mapped
b300: 20 74 6f 20 74 68 65 20 57 69 6e 64 6f 77 73 20 to the Windows
b310: 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 20 69 attributes, so i
b320: 66 20 74 68 65 20 75 73 65 72 20 69 73 20 74 68 f the user is th
b330: 65 0a 09 20 2a 20 66 69 6c 65 20 6f 77 6e 65 72 e.. * file owner
b340: 20 74 68 65 6e 20 74 68 65 20 61 74 74 72 69 62 then the attrib
b350: 20 63 68 65 63 6b 73 20 61 62 6f 76 65 20 61 72 checks above ar
b360: 65 20 63 6f 72 72 65 63 74 20 28 61 73 20 66 61 e correct (as fa
b370: 72 20 61 73 20 74 68 65 79 0a 09 20 2a 20 67 6f r as they.. * go
b380: 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 28 21 47 65 )... */...if(!Ge
b390: 74 53 65 63 75 72 69 74 79 44 65 73 63 72 69 70 tSecurityDescrip
b3a0: 74 6f 72 4f 77 6e 65 72 28 73 64 50 74 72 2c 26 torOwner(sdPtr,&
b3b0: 70 53 69 64 2c 26 53 69 64 44 65 66 61 75 6c 74 pSid,&SidDefault
b3c0: 65 64 29 20 7c 7c 0a 09 20 20 20 6d 65 6d 63 6d ed) ||.. memcm
b3d0: 70 28 47 65 74 53 69 64 49 64 65 6e 74 69 66 69 p(GetSidIdentifi
b3e0: 65 72 41 75 74 68 6f 72 69 74 79 28 70 53 69 64 erAuthority(pSid
b3f0: 29 2c 26 73 61 6d 62 61 5f 75 6e 6d 61 70 70 65 ),&samba_unmappe
b400: 64 2c 0a 09 09 20 20 73 69 7a 65 6f 66 28 53 49 d,... sizeof(SI
b410: 44 5f 49 44 45 4e 54 49 46 49 45 52 5f 41 55 54 D_IDENTIFIER_AUT
b420: 48 4f 52 49 54 59 29 29 3d 3d 30 29 20 7b 0a 09 HORITY))==0) {..
b430: 20 20 20 20 48 65 61 70 46 72 65 65 28 47 65 74 HeapFree(Get
b440: 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 ProcessHeap(), 0
b450: 2c 20 73 64 50 74 72 29 3b 0a 09 20 20 20 20 72 , sdPtr);.. r
b460: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 41 74 74 72 eturn 0; /* Attr
b470: 69 62 20 74 65 73 74 73 20 73 61 79 20 61 63 63 ib tests say acc
b480: 65 73 73 20 61 6c 6c 6f 77 65 64 2e 20 2a 2f 0a ess allowed. */.
b490: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66 .}.../*.. * Perf
b4a0: 6f 72 6d 20 73 65 63 75 72 69 74 79 20 69 6d 70 orm security imp
b4b0: 65 72 73 6f 6e 61 74 69 6f 6e 20 6f 66 20 74 68 ersonation of th
b4c0: 65 20 75 73 65 72 20 61 6e 64 20 6f 70 65 6e 20 e user and open
b4d0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 09 20 the resulting..
b4e0: 2a 20 74 68 72 65 61 64 20 74 6f 6b 65 6e 2e 0a * thread token..
b4f0: 09 20 2a 2f 0a 0a 09 69 66 20 28 21 28 2a 74 63 . */...if (!(*tc
b500: 6c 57 69 6e 50 72 6f 63 73 2d 3e 69 6d 70 65 72 lWinProcs->imper
b510: 73 6f 6e 61 74 65 53 65 6c 66 50 72 6f 63 29 28 sonateSelfProc)(
b520: 53 65 63 75 72 69 74 79 49 6d 70 65 72 73 6f 6e SecurityImperson
b530: 61 74 69 6f 6e 29 29 20 7b 0a 09 20 20 20 20 2f ation)) {.. /
b540: 2a 0a 09 20 20 20 20 20 2a 20 55 6e 61 62 6c 65 *.. * Unable
b550: 20 74 6f 20 70 65 72 66 6f 72 6d 20 73 65 63 75 to perform secu
b560: 72 69 74 79 20 69 6d 70 65 72 73 6f 6e 61 74 69 rity impersonati
b570: 6f 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 on... */...
b580: 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73 45 72 goto accessEr
b590: 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 21 28 2a ror;..}..if (!(*
b5a0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 6f 70 65 tclWinProcs->ope
b5b0: 6e 54 68 72 65 61 64 54 6f 6b 65 6e 50 72 6f 63 nThreadTokenProc
b5c0: 29 28 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 )(GetCurrentThre
b5d0: 61 64 28 29 2c 0a 09 09 54 4f 4b 45 4e 5f 44 55 ad(),...TOKEN_DU
b5e0: 50 4c 49 43 41 54 45 20 7c 20 54 4f 4b 45 4e 5f PLICATE | TOKEN_
b5f0: 51 55 45 52 59 2c 20 46 41 4c 53 45 2c 20 26 68 QUERY, FALSE, &h
b600: 54 6f 6b 65 6e 29 29 20 7b 0a 09 20 20 20 20 2f Token)) {.. /
b610: 2a 0a 09 20 20 20 20 20 2a 20 55 6e 61 62 6c 65 *.. * Unable
b620: 20 74 6f 20 67 65 74 20 63 75 72 72 65 6e 74 20 to get current
b630: 74 68 72 65 61 64 27 73 20 74 6f 6b 65 6e 2e 0a thread's token..
b640: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 67 . */... g
b650: 6f 74 6f 20 61 63 63 65 73 73 45 72 72 6f 72 3b oto accessError;
b660: 0a 09 7d 0a 0a 09 28 2a 74 63 6c 57 69 6e 50 72 ..}...(*tclWinPr
b670: 6f 63 73 2d 3e 72 65 76 65 72 74 54 6f 53 65 6c ocs->revertToSel
b680: 66 50 72 6f 63 29 28 29 3b 0a 0a 09 2f 2a 0a 09 fProc)();.../*..
b690: 20 2a 20 53 65 74 75 70 20 64 65 73 69 72 65 64 * Setup desired
b6a0: 41 63 63 65 73 73 20 61 63 63 6f 72 64 69 6e 67 Access according
b6b0: 20 74 6f 20 74 68 65 20 61 63 63 65 73 73 20 70 to the access p
b6c0: 72 69 76 65 6c 65 67 65 73 20 77 65 20 61 72 65 riveleges we are
b6d0: 0a 09 20 2a 20 63 68 65 63 6b 69 6e 67 2e 0a 09 .. * checking...
b6e0: 20 2a 2f 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 */...if (mode &
b6f0: 20 52 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65 R_OK) {.. de
b700: 73 69 72 65 64 41 63 63 65 73 73 20 7c 3d 20 46 siredAccess |= F
b710: 49 4c 45 5f 47 45 4e 45 52 49 43 5f 52 45 41 44 ILE_GENERIC_READ
b720: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 ;..}..if (mode &
b730: 20 57 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65 W_OK) {.. de
b740: 73 69 72 65 64 41 63 63 65 73 73 20 7c 3d 20 46 siredAccess |= F
b750: 49 4c 45 5f 47 45 4e 45 52 49 43 5f 57 52 49 54 ILE_GENERIC_WRIT
b760: 45 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 E;..}..if (mode
b770: 26 20 58 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 & X_OK) {.. d
b780: 65 73 69 72 65 64 41 63 63 65 73 73 20 7c 3d 20 esiredAccess |=
b790: 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 45 58 45 FILE_GENERIC_EXE
b7a0: 43 55 54 45 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 CUTE;..}...memse
b7b0: 74 28 26 67 65 6e 4d 61 70 2c 20 30 78 30 2c 20 t(&genMap, 0x0,
b7c0: 73 69 7a 65 6f 66 28 47 45 4e 45 52 49 43 5f 4d sizeof(GENERIC_M
b7d0: 41 50 50 49 4e 47 29 29 3b 0a 09 67 65 6e 4d 61 APPING));..genMa
b7e0: 70 2e 47 65 6e 65 72 69 63 52 65 61 64 20 3d 20 p.GenericRead =
b7f0: 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 52 45 41 FILE_GENERIC_REA
b800: 44 3b 0a 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72 D;..genMap.Gener
b810: 69 63 57 72 69 74 65 20 3d 20 46 49 4c 45 5f 47 icWrite = FILE_G
b820: 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 09 67 ENERIC_WRITE;..g
b830: 65 6e 4d 61 70 2e 47 65 6e 65 72 69 63 45 78 65 enMap.GenericExe
b840: 63 75 74 65 20 3d 20 46 49 4c 45 5f 47 45 4e 45 cute = FILE_GENE
b850: 52 49 43 5f 45 58 45 43 55 54 45 3b 0a 09 67 65 RIC_EXECUTE;..ge
b860: 6e 4d 61 70 2e 47 65 6e 65 72 69 63 41 6c 6c 20 nMap.GenericAll
b870: 3d 20 46 49 4c 45 5f 41 4c 4c 5f 41 43 43 45 53 = FILE_ALL_ACCES
b880: 53 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66 S;.../*.. * Perf
b890: 6f 72 6d 20 61 63 63 65 73 73 20 63 68 65 63 6b orm access check
b8a0: 20 75 73 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e using the token
b8b0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 28 2a ... */...if (!(*
b8c0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 61 63 63 tclWinProcs->acc
b8d0: 65 73 73 43 68 65 63 6b 50 72 6f 63 29 28 73 64 essCheckProc)(sd
b8e0: 50 74 72 2c 20 68 54 6f 6b 65 6e 2c 20 64 65 73 Ptr, hToken, des
b8f0: 69 72 65 64 41 63 63 65 73 73 2c 0a 09 09 26 67 iredAccess,...&g
b900: 65 6e 4d 61 70 2c 20 26 70 72 69 76 53 65 74 2c enMap, &privSet,
b910: 20 26 70 72 69 76 53 65 74 53 69 7a 65 2c 20 26 &privSetSize, &
b920: 67 72 61 6e 74 65 64 41 63 63 65 73 73 2c 0a 09 grantedAccess,..
b930: 09 26 61 63 63 65 73 73 59 65 73 4e 6f 29 29 20 .&accessYesNo))
b940: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
b950: 2a 20 55 6e 61 62 6c 65 20 74 6f 20 70 65 72 66 * Unable to perf
b960: 6f 72 6d 20 61 63 63 65 73 73 20 63 68 65 63 6b orm access check
b970: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 61 63 63 ... */...acc
b980: 65 73 73 45 72 72 6f 72 3a 0a 09 20 20 20 20 54 essError:.. T
b990: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
b9a0: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
b9b0: 29 3b 0a 09 20 20 20 20 69 66 20 28 73 64 50 74 );.. if (sdPt
b9c0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 48 r != NULL) {...H
b9d0: 65 61 70 46 72 65 65 28 47 65 74 50 72 6f 63 65 eapFree(GetProce
b9e0: 73 73 48 65 61 70 28 29 2c 20 30 2c 20 73 64 50 ssHeap(), 0, sdP
b9f0: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 tr);.. }..
ba00: 20 69 66 20 28 68 54 6f 6b 65 6e 20 21 3d 20 4e if (hToken != N
ba10: 55 4c 4c 29 20 7b 0a 09 09 43 6c 6f 73 65 48 61 ULL) {...CloseHa
ba20: 6e 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 20 ndle(hToken);..
ba30: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e }.. return
ba40: 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a -1;..}.../*.. *
ba50: 20 43 6c 65 61 6e 20 75 70 2e 0a 09 20 2a 2f 0a Clean up... */.
ba60: 0a 09 48 65 61 70 46 72 65 65 28 47 65 74 50 72 ..HeapFree(GetPr
ba70: 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 ocessHeap(), 0,
ba80: 73 64 50 74 72 29 3b 0a 09 43 6c 6f 73 65 48 61 sdPtr);..CloseHa
ba90: 6e 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 69 ndle(hToken);..i
baa0: 66 20 28 21 61 63 63 65 73 73 59 65 73 4e 6f 29 f (!accessYesNo)
bab0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 {.. Tcl_SetE
bac0: 72 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a 09 20 rrno(EACCES);..
bad0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d return -1;..}
bae0: 0a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 .. }. retu
baf0: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d rn 0;.}.../*. *-
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 2d 2d ----------------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bb40: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 -----. *. * Nati
bb50: 76 65 49 73 45 78 65 63 20 2d 2d 0a 20 2a 0a 20 veIsExec --. *.
bb60: 2a 09 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 *.Determines if
bb70: 61 20 70 61 74 68 20 69 73 20 65 78 65 63 75 74 a path is execut
bb80: 61 62 6c 65 2e 20 4f 6e 20 77 69 6e 64 6f 77 73 able. On windows
bb90: 20 74 68 69 73 20 69 73 20 73 69 6d 70 6c 79 20 this is simply
bba0: 64 65 66 69 6e 65 64 0a 20 2a 09 62 79 20 77 68 defined. *.by wh
bbb0: 65 74 68 65 72 20 74 68 65 20 70 61 74 68 20 65 ether the path e
bbc0: 6e 64 73 20 69 6e 20 61 20 73 74 61 6e 64 61 72 nds in a standar
bbd0: 64 20 65 78 65 63 75 74 61 62 6c 65 20 65 78 74 d executable ext
bbe0: 65 6e 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 ension.. *. * Re
bbf0: 73 75 6c 74 73 3a 0a 20 2a 09 31 20 3d 20 65 78 sults:. *.1 = ex
bc00: 65 63 75 74 61 62 6c 65 2c 20 30 20 3d 20 6e 6f ecutable, 0 = no
bc10: 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d t.. *. *--------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
bc60: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e */..static int.N
bc70: 61 74 69 76 65 49 73 45 78 65 63 28 0a 20 20 20 ativeIsExec(.
bc80: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 const TCHAR *na
bc90: 74 69 76 65 50 61 74 68 29 0a 7b 0a 20 20 20 20 tivePath).{.
bca0: 69 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d if (tclWinProcs-
bcb0: 3e 75 73 65 57 69 64 65 29 20 7b 0a 09 63 6f 6e >useWide) {..con
bcc0: 73 74 20 57 43 48 41 52 20 2a 70 61 74 68 20 3d st WCHAR *path =
bcd0: 20 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 (const WCHAR *)
bce0: 20 6e 61 74 69 76 65 50 61 74 68 3b 0a 09 69 6e nativePath;..in
bcf0: 74 20 6c 65 6e 20 3d 20 77 63 73 6c 65 6e 28 70 t len = wcslen(p
bd00: 61 74 68 29 3b 0a 0a 09 69 66 20 28 6c 65 6e 20 ath);...if (len
bd10: 3c 20 35 29 20 7b 0a 09 20 20 20 20 72 65 74 75 < 5) {.. retu
bd20: 72 6e 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 rn 0;..}...if (p
bd30: 61 74 68 5b 6c 65 6e 2d 34 5d 20 21 3d 20 4c 27 ath[len-4] != L'
bd40: 2e 27 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 .') {.. retur
bd50: 6e 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a n 0;..}.../*.. *
bd60: 20 55 73 65 20 77 69 64 65 2d 63 68 61 72 20 63 Use wide-char c
bd70: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 ase-insensitive
bd80: 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 20 2a 2f 0a comparison.. */.
bd90: 0a 09 70 61 74 68 20 2b 3d 20 6c 65 6e 2d 33 3b ..path += len-3;
bda0: 0a 09 69 66 20 28 28 5f 77 63 73 69 63 6d 70 28 ..if ((_wcsicmp(
bdb0: 70 61 74 68 2c 20 4c 22 65 78 65 22 29 20 3d 3d path, L"exe") ==
bdc0: 20 30 29 0a 09 09 7c 7c 20 28 5f 77 63 73 69 63 0)...|| (_wcsic
bdd0: 6d 70 28 70 61 74 68 2c 20 4c 22 63 6f 6d 22 29 mp(path, L"com")
bde0: 20 3d 3d 20 30 29 0a 09 09 7c 7c 20 28 5f 77 63 == 0)...|| (_wc
bdf0: 73 69 63 6d 70 28 70 61 74 68 2c 20 4c 22 63 6d sicmp(path, L"cm
be00: 64 22 29 20 3d 3d 20 30 29 0a 09 09 7c 7c 20 28 d") == 0)...|| (
be10: 5f 77 63 73 69 63 6d 70 28 70 61 74 68 2c 20 4c _wcsicmp(path, L
be20: 22 70 73 31 22 29 20 3d 3d 20 30 29 0a 09 09 7c "ps1") == 0)...|
be30: 7c 20 28 5f 77 63 73 69 63 6d 70 28 70 61 74 68 | (_wcsicmp(path
be40: 2c 20 4c 22 62 61 74 22 29 20 3d 3d 20 30 29 29 , L"bat") == 0))
be50: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 {.. return 1
be60: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
be70: 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 {..const char *p
be80: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 61 72 ;.../*.. * We ar
be90: 65 20 6f 6e 6c 79 20 6c 6f 6f 6b 69 6e 67 20 66 e only looking f
bea0: 6f 72 20 70 75 72 65 20 61 73 63 69 69 2e 0a 09 or pure ascii...
beb0: 20 2a 2f 0a 0a 09 70 20 3d 20 73 74 72 72 63 68 */...p = strrch
bec0: 72 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 r((const char *)
bed0: 20 6e 61 74 69 76 65 50 61 74 68 2c 20 27 2e 27 nativePath, '.'
bee0: 29 3b 0a 09 69 66 20 28 70 20 21 3d 20 4e 55 4c );..if (p != NUL
bef0: 4c 29 20 7b 0a 09 20 20 20 20 70 2b 2b 3b 0a 0a L) {.. p++;..
bf00: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
bf10: 4e 6f 74 65 3a 20 69 6e 20 74 68 65 20 6f 6c 64 Note: in the old
bf20: 20 63 6f 64 65 2c 20 73 74 61 74 20 63 6f 6e 73 code, stat cons
bf30: 69 64 65 72 65 64 20 27 2e 70 69 66 27 20 66 69 idered '.pif' fi
bf40: 6c 65 73 20 61 73 0a 09 20 20 20 20 20 2a 20 65 les as.. * e
bf50: 78 65 63 75 74 61 62 6c 65 2c 20 77 68 65 72 65 xecutable, where
bf60: 61 73 20 61 63 63 65 73 73 20 64 69 64 20 6e 6f as access did no
bf70: 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 t... */...
bf80: 20 20 69 66 20 28 28 73 74 72 63 61 73 65 63 6d if ((strcasecm
bf90: 70 28 70 2c 20 22 65 78 65 22 29 20 3d 3d 20 30 p(p, "exe") == 0
bfa0: 29 0a 09 09 20 20 20 20 7c 7c 20 28 73 74 72 63 )... || (strc
bfb0: 61 73 65 63 6d 70 28 70 2c 20 22 63 6f 6d 22 29 asecmp(p, "com")
bfc0: 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 7c 7c 20 == 0)... ||
bfd0: 28 73 74 72 63 61 73 65 63 6d 70 28 70 2c 20 22 (strcasecmp(p, "
bfe0: 63 6d 64 22 29 20 3d 3d 20 30 29 0a 09 09 20 20 cmd") == 0)...
bff0: 20 20 7c 7c 20 28 73 74 72 63 61 73 65 63 6d 70 || (strcasecmp
c000: 28 70 2c 20 22 70 73 31 22 29 20 3d 3d 20 30 29 (p, "ps1") == 0)
c010: 0a 09 09 20 20 20 20 7c 7c 20 28 73 74 72 63 61 ... || (strca
c020: 73 65 63 6d 70 28 70 2c 20 22 62 61 74 22 29 20 secmp(p, "bat")
c030: 3d 3d 20 30 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 == 0)) {.../*...
c040: 20 2a 20 46 69 6c 65 20 74 68 61 74 20 65 6e 64 * File that end
c050: 73 20 77 69 74 68 20 2e 65 78 65 2c 20 2e 63 6f s with .exe, .co
c060: 6d 2c 20 6f 72 20 2e 62 61 74 20 69 73 20 65 78 m, or .bat is ex
c070: 65 63 75 74 61 62 6c 65 2e 0a 09 09 20 2a 2f 0a ecutable.... */.
c080: 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 20 20 ...return 1;..
c090: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 }..}. }.
c0a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f return 0;.}.../
c0b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
c100: 20 54 63 6c 70 4f 62 6a 43 68 64 69 72 20 2d 2d TclpObjChdir --
c110: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
c120: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68 tion replaces th
c130: 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 6f e library versio
c140: 6e 20 6f 66 20 63 68 64 69 72 28 29 2e 0a 20 2a n of chdir().. *
c150: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
c160: 53 65 65 20 63 68 64 69 72 28 29 20 64 6f 63 75 See chdir() docu
c170: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a mentation.. *. *
c180: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
c190: 2a 09 53 65 65 20 63 68 64 69 72 28 29 20 64 6f *.See chdir() do
c1a0: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a cumentation.. *.
c1b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
c1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c1f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e --------. */..in
c200: 74 0a 54 63 6c 70 4f 62 6a 43 68 64 69 72 28 0a t.TclpObjChdir(.
c210: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 Tcl_Obj *pat
c220: 68 50 74 72 29 09 2f 2a 20 50 61 74 68 20 74 6f hPtr)./* Path to
c230: 20 6e 65 77 20 77 6f 72 6b 69 6e 67 20 64 69 72 new working dir
c240: 65 63 74 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 20 ectory. */.{.
c250: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 int result;.
c260: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 const TCHAR *na
c270: 74 69 76 65 50 61 74 68 3b 0a 0a 20 20 20 20 6e tivePath;.. n
c280: 61 74 69 76 65 50 61 74 68 20 3d 20 28 63 6f 6e ativePath = (con
c290: 73 74 20 54 43 48 41 52 20 2a 29 20 54 63 6c 5f st TCHAR *) Tcl_
c2a0: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 FSGetNativePath(
c2b0: 70 61 74 68 50 74 72 29 3b 0a 0a 20 20 20 20 69 pathPtr);.. i
c2c0: 66 20 28 21 6e 61 74 69 76 65 50 61 74 68 29 20 f (!nativePath)
c2d0: 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 {..return -1;.
c2e0: 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d }. result =
c2f0: 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e (*tclWinProcs->
c300: 73 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 setCurrentDirect
c310: 6f 72 79 50 72 6f 63 29 28 6e 61 74 69 76 65 50 oryProc)(nativeP
c320: 61 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 ath);.. if (r
c330: 65 73 75 6c 74 20 3d 3d 20 30 29 20 7b 0a 09 54 esult == 0) {..T
c340: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f clWinConvertErro
c350: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 r(GetLastError()
c360: 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 );..return -1;.
c370: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
c380: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}.../*. *----
c390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c3d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 47 65 74 --. *. * TclpGet
c3e0: 43 77 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 Cwd --. *. *.Thi
c3f0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 s function repla
c400: 63 65 73 20 74 68 65 20 6c 69 62 72 61 72 79 20 ces the library
c410: 76 65 72 73 69 6f 6e 20 6f 66 20 67 65 74 63 77 version of getcw
c420: 64 28 29 2e 20 28 4f 62 73 6f 6c 65 74 65 0a 20 d(). (Obsolete.
c430: 2a 09 66 75 6e 63 74 69 6f 6e 2c 20 6f 6e 6c 79 *.function, only
c440: 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 6f 6c retained for ol
c450: 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 77 68 69 d extensions whi
c460: 63 68 20 6d 61 79 20 63 61 6c 6c 20 69 74 0a 20 ch may call it.
c470: 2a 09 64 69 72 65 63 74 6c 79 29 2e 0a 20 2a 0a *.directly).. *.
c480: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
c490: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 70 he result is a p
c4a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 ointer to a stri
c4b0: 6e 67 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 ng specifying th
c4c0: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 e current direct
c4d0: 6f 72 79 2c 0a 20 2a 09 6f 72 20 4e 55 4c 4c 20 ory,. *.or NULL
c4e0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 if the current d
c4f0: 69 72 65 63 74 6f 72 79 20 63 6f 75 6c 64 20 6e irectory could n
c500: 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 ot be determined
c510: 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 20 2a 09 . If NULL is. *.
c520: 72 65 74 75 72 6e 65 64 2c 20 61 6e 20 65 72 72 returned, an err
c530: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 or message is le
c540: 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 ft in the interp
c550: 27 73 20 72 65 73 75 6c 74 2e 20 53 74 6f 72 61 's result. Stora
c560: 67 65 20 66 6f 72 0a 20 2a 09 74 68 65 20 72 65 ge for. *.the re
c570: 73 75 6c 74 20 73 74 72 69 6e 67 20 69 73 20 61 sult string is a
c580: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 62 75 66 66 llocated in buff
c590: 65 72 50 74 72 3b 20 74 68 65 20 63 61 6c 6c 65 erPtr; the calle
c5a0: 72 20 6d 75 73 74 20 63 61 6c 6c 0a 20 2a 09 54 r must call. *.T
c5b0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 29 cl_DStringFree()
c5c0: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 when the result
c5d0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 is no longer ne
c5e0: 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 eded.. *. * Side
c5f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
c600: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c650: 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a */..const char *
c660: 0a 54 63 6c 70 47 65 74 43 77 64 28 0a 20 20 20 .TclpGetCwd(.
c670: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
c680: 65 72 70 2c 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d erp,../* If non-
c690: 4e 55 4c 4c 2c 20 75 73 65 64 20 66 6f 72 20 65 NULL, used for e
c6a0: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 20 rror reporting.
c6b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 */. Tcl_DStri
c6c0: 6e 67 20 2a 62 75 66 66 65 72 50 74 72 29 09 2f ng *bufferPtr)./
c6d0: 2a 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 * Uninitialized
c6e0: 6f 72 20 66 72 65 65 20 44 53 74 72 69 6e 67 20 or free DString
c6f0: 66 69 6c 6c 65 64 20 77 69 74 68 0a 09 09 09 09 filled with.....
c700: 20 2a 20 6e 61 6d 65 20 6f 66 20 63 75 72 72 65 * name of curre
c710: 6e 74 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f nt directory. */
c720: 0a 7b 0a 20 20 20 20 57 43 48 41 52 20 62 75 66 .{. WCHAR buf
c730: 66 65 72 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 fer[MAX_PATH];.
c740: 20 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20 char *p;..
c750: 20 69 66 20 28 28 2a 74 63 6c 57 69 6e 50 72 6f if ((*tclWinPro
c760: 63 73 2d 3e 67 65 74 43 75 72 72 65 6e 74 44 69 cs->getCurrentDi
c770: 72 65 63 74 6f 72 79 50 72 6f 63 29 28 4d 41 58 rectoryProc)(MAX
c780: 5f 50 41 54 48 2c 20 62 75 66 66 65 72 29 20 3d _PATH, buffer) =
c790: 3d 20 30 29 20 7b 0a 09 54 63 6c 57 69 6e 43 6f = 0) {..TclWinCo
c7a0: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 nvertError(GetLa
c7b0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 69 66 20 stError());..if
c7c0: 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 (interp != NULL)
c7d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
c7e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
c7f0: 20 22 65 72 72 6f 72 20 67 65 74 74 69 6e 67 20 "error getting
c800: 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 working director
c810: 79 20 6e 61 6d 65 3a 20 22 2c 0a 09 09 20 20 20 y name: ",...
c820: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 Tcl_PosixError(
c830: 69 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a interp), NULL);.
c840: 09 7d 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b .}..return NULL;
c850: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
c860: 20 20 20 20 2a 20 57 61 74 63 68 20 66 6f 72 20 * Watch for
c870: 74 68 65 20 77 65 69 72 64 20 57 69 6e 64 6f 77 the weird Window
c880: 73 20 63 3a 5c 5c 55 4e 43 20 73 79 6e 74 61 78 s c:\\UNC syntax
c890: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
c8a0: 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e f (tclWinProcs->
c8b0: 75 73 65 57 69 64 65 29 20 7b 0a 09 57 43 48 41 useWide) {..WCHA
c8c0: 52 20 2a 6e 61 74 69 76 65 3b 0a 0a 09 6e 61 74 R *native;...nat
c8d0: 69 76 65 20 3d 20 28 57 43 48 41 52 20 2a 29 20 ive = (WCHAR *)
c8e0: 62 75 66 66 65 72 3b 0a 09 69 66 20 28 28 6e 61 buffer;..if ((na
c8f0: 74 69 76 65 5b 30 5d 20 21 3d 20 27 5c 30 27 29 tive[0] != '\0')
c900: 20 26 26 20 28 6e 61 74 69 76 65 5b 31 5d 20 3d && (native[1] =
c910: 3d 20 27 3a 27 29 0a 09 09 26 26 20 28 6e 61 74 = ':')...&& (nat
c920: 69 76 65 5b 32 5d 20 3d 3d 20 27 5c 5c 27 29 20 ive[2] == '\\')
c930: 26 26 20 28 6e 61 74 69 76 65 5b 33 5d 20 3d 3d && (native[3] ==
c940: 20 27 5c 5c 27 29 29 20 7b 0a 09 20 20 20 20 6e '\\')) {.. n
c950: 61 74 69 76 65 20 2b 3d 20 32 3b 0a 09 7d 0a 09 ative += 2;..}..
c960: 54 63 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 Tcl_WinTCharToUt
c970: 66 28 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69 f((TCHAR *) nati
c980: 76 65 2c 20 2d 31 2c 20 62 75 66 66 65 72 50 74 ve, -1, bufferPt
c990: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b r);. } else {
c9a0: 0a 09 63 68 61 72 20 2a 6e 61 74 69 76 65 3b 0a ..char *native;.
c9b0: 0a 09 6e 61 74 69 76 65 20 3d 20 28 63 68 61 72 ..native = (char
c9c0: 20 2a 29 20 62 75 66 66 65 72 3b 0a 09 69 66 20 *) buffer;..if
c9d0: 28 28 6e 61 74 69 76 65 5b 30 5d 20 21 3d 20 27 ((native[0] != '
c9e0: 5c 30 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b \0') && (native[
c9f0: 31 5d 20 3d 3d 20 27 3a 27 29 0a 09 09 26 26 20 1] == ':')...&&
ca00: 28 6e 61 74 69 76 65 5b 32 5d 20 3d 3d 20 27 5c (native[2] == '\
ca10: 5c 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b 33 \') && (native[3
ca20: 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20 ] == '\\')) {..
ca30: 20 20 20 6e 61 74 69 76 65 20 2b 3d 20 32 3b 0a native += 2;.
ca40: 09 7d 0a 09 54 63 6c 5f 57 69 6e 54 43 68 61 72 .}..Tcl_WinTChar
ca50: 54 6f 55 74 66 28 28 54 43 48 41 52 20 2a 29 20 ToUtf((TCHAR *)
ca60: 6e 61 74 69 76 65 2c 20 2d 31 2c 20 62 75 66 66 native, -1, buff
ca70: 65 72 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 erPtr);. }..
ca80: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e /*. * Con
ca90: 76 65 72 74 20 74 6f 20 66 6f 72 77 61 72 64 20 vert to forward
caa0: 73 6c 61 73 68 65 73 20 66 6f 72 20 65 61 73 69 slashes for easi
cab0: 65 72 20 75 73 65 20 69 6e 20 73 63 72 69 70 74 er use in script
cac0: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 s.. */..
cad0: 66 6f 72 20 28 70 20 3d 20 54 63 6c 5f 44 53 74 for (p = Tcl_DSt
cae0: 72 69 6e 67 56 61 6c 75 65 28 62 75 66 66 65 72 ringValue(buffer
caf0: 50 74 72 29 3b 20 2a 70 20 21 3d 20 27 5c 30 27 Ptr); *p != '\0'
cb00: 3b 20 70 2b 2b 29 20 7b 0a 09 69 66 20 28 2a 70 ; p++) {..if (*p
cb10: 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 20 == '\\') {..
cb20: 20 2a 70 20 3d 20 27 2f 27 3b 0a 09 7d 0a 20 20 *p = '/';..}.
cb30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
cb40: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
cb50: 62 75 66 66 65 72 50 74 72 29 3b 0a 7d 0a 0c 0a bufferPtr);.}...
cb60: 69 6e 74 0a 54 63 6c 70 4f 62 6a 53 74 61 74 28 int.TclpObjStat(
cb70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 . Tcl_Obj *pa
cb80: 74 68 50 74 72 2c 09 09 2f 2a 20 50 61 74 68 20 thPtr,../* Path
cb90: 6f 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74 2e of file to stat.
cba0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 74 61 74 */. Tcl_Stat
cbb0: 42 75 66 20 2a 73 74 61 74 50 74 72 29 09 2f 2a Buf *statPtr)./*
cbc0: 20 46 69 6c 6c 65 64 20 77 69 74 68 20 72 65 73 Filled with res
cbd0: 75 6c 74 73 20 6f 66 20 73 74 61 74 20 63 61 6c ults of stat cal
cbe0: 6c 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20 l. */.{. /*.
cbf0: 20 20 20 20 2a 20 45 6e 73 75 72 65 20 63 6f 72 * Ensure cor
cc00: 72 65 63 74 20 66 69 6c 65 20 73 69 7a 65 73 20 rect file sizes
cc10: 62 79 20 66 6f 72 63 69 6e 67 20 74 68 65 20 4f by forcing the O
cc20: 53 20 74 6f 20 77 72 69 74 65 20 61 6e 79 20 70 S to write any p
cc30: 65 6e 64 69 6e 67 20 64 61 74 61 0a 20 20 20 20 ending data.
cc40: 20 2a 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 * to disk. This
cc50: 20 69 73 20 64 6f 6e 65 20 6f 6e 6c 79 20 66 6f is done only fo
cc60: 72 20 63 68 61 6e 6e 65 6c 73 20 77 68 69 63 68 r channels which
cc70: 20 61 72 65 20 64 69 72 74 79 2c 20 69 2e 65 2e are dirty, i.e.
cc80: 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 have been.
cc90: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 73 69 6e * written to sin
cca0: 63 65 20 74 68 65 20 6c 61 73 74 20 66 6c 75 73 ce the last flus
ccb0: 68 20 68 65 72 65 2e 0a 20 20 20 20 20 2a 2f 0a h here.. */.
ccc0: 0a 20 20 20 20 54 63 6c 57 69 6e 46 6c 75 73 68 . TclWinFlush
ccd0: 44 69 72 74 79 43 68 61 6e 6e 65 6c 73 28 29 3b DirtyChannels();
cce0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74 .. return Nat
ccf0: 69 76 65 53 74 61 74 28 28 63 6f 6e 73 74 20 54 iveStat((const T
cd00: 43 48 41 52 20 2a 29 20 54 63 6c 5f 46 53 47 65 CHAR *) Tcl_FSGe
cd10: 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68 tNativePath(path
cd20: 50 74 72 29 2c 0a 09 20 20 20 20 73 74 61 74 50 Ptr),.. statP
cd30: 74 72 2c 20 30 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 tr, 0);.}.../*.
cd40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cd80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 -------. *. * Na
cd90: 74 69 76 65 53 74 61 74 20 2d 2d 0a 20 2a 0a 20 tiveStat --. *.
cda0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
cdb0: 72 65 70 6c 61 63 65 73 20 74 68 65 20 6c 69 62 replaces the lib
cdc0: 72 61 72 79 20 76 65 72 73 69 6f 6e 20 6f 66 20 rary version of
cdd0: 73 74 61 74 28 29 2c 20 66 69 78 69 6e 67 20 74 stat(), fixing t
cde0: 68 65 0a 20 2a 09 66 6f 6c 6c 6f 77 69 6e 67 20 he. *.following
cdf0: 62 75 67 73 3a 0a 20 2a 0a 20 2a 09 31 2e 20 73 bugs:. *. *.1. s
ce00: 74 61 74 28 22 63 3a 22 29 20 72 65 74 75 72 6e tat("c:") return
ce10: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 32 s an error.. *.2
ce20: 2e 20 42 6f 72 6c 61 6e 64 20 73 74 61 74 28 29 . Borland stat()
ce30: 20 72 65 74 75 72 6e 20 74 69 6d 65 20 69 6e 20 return time in
ce40: 47 4d 54 20 69 6e 73 74 65 61 64 20 6f 66 20 6c GMT instead of l
ce50: 6f 63 61 6c 74 69 6d 65 2e 0a 20 2a 09 33 2e 20 ocaltime.. *.3.
ce60: 73 74 61 74 28 22 5c 5c 73 65 72 76 65 72 5c 6d stat("\\server\m
ce70: 6f 75 6e 74 22 29 20 77 6f 75 6c 64 20 72 65 74 ount") would ret
ce80: 75 72 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 34 2e urn error.. *.4.
ce90: 20 41 63 63 65 70 74 73 20 73 6c 61 73 68 65 73 Accepts slashes
cea0: 20 6f 72 20 62 61 63 6b 73 6c 61 73 68 65 73 2e or backslashes.
ceb0: 0a 20 2a 09 35 2e 20 73 74 5f 64 65 76 20 61 6e . *.5. st_dev an
cec0: 64 20 73 74 5f 72 64 65 76 20 77 65 72 65 20 77 d st_rdev were w
ced0: 72 6f 6e 67 20 66 6f 72 20 55 4e 43 20 70 61 74 rong for UNC pat
cee0: 68 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 hs.. *. * Result
cef0: 73 3a 0a 20 2a 09 53 65 65 20 73 74 61 74 20 64 s:. *.See stat d
cf00: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a ocumentation.. *
cf10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
cf20: 3a 0a 20 2a 09 53 65 65 20 73 74 61 74 20 64 6f :. *.See stat do
cf30: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a cumentation.. *.
cf40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
cf90: 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 53 atic int.NativeS
cfa0: 74 61 74 28 0a 20 20 20 20 63 6f 6e 73 74 20 54 tat(. const T
cfb0: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68 CHAR *nativePath
cfc0: 2c 09 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c ,./* Path of fil
cfd0: 65 20 74 6f 20 73 74 61 74 20 2a 2f 0a 20 20 20 e to stat */.
cfe0: 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 Tcl_StatBuf *st
cff0: 61 74 50 74 72 2c 09 2f 2a 20 46 69 6c 6c 65 64 atPtr,./* Filled
d000: 20 77 69 74 68 20 72 65 73 75 6c 74 73 20 6f 66 with results of
d010: 20 73 74 61 74 20 63 61 6c 6c 2e 20 2a 2f 0a 20 stat call. */.
d020: 20 20 20 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b int checkLink
d030: 73 29 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 s)../* If non-ze
d040: 72 6f 2c 20 62 65 68 61 76 65 20 6c 69 6b 65 20 ro, behave like
d050: 27 6c 73 74 61 74 27 20 2a 2f 0a 7b 0a 20 20 20 'lstat' */.{.
d060: 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 20 DWORD attr;.
d070: 20 69 6e 74 20 64 65 76 2c 20 6e 6c 69 6e 6b 20 int dev, nlink
d080: 3d 20 31 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 1;. unsigne
d090: 64 20 73 68 6f 72 74 20 6d 6f 64 65 3b 0a 20 20 d short mode;.
d0a0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 unsigned int i
d0b0: 6e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 48 41 node = 0;. HA
d0c0: 4e 44 4c 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b NDLE fileHandle;
d0d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
d0e0: 49 66 20 77 65 20 63 61 6e 20 75 73 65 20 27 63 If we can use 'c
d0f0: 72 65 61 74 65 46 69 6c 65 27 20 6f 6e 20 74 68 reateFile' on th
d100: 69 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 is, then we can
d110: 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e use the resultin
d120: 67 0a 20 20 20 20 20 2a 20 66 69 6c 65 48 61 6e g. * fileHan
d130: 64 6c 65 20 74 6f 20 72 65 61 64 20 6d 6f 72 65 dle to read more
d140: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 6e 6c information (nl
d150: 69 6e 6b 2c 20 69 6e 6f 29 20 74 68 61 6e 20 77 ink, ino) than w
d160: 65 20 63 61 6e 20 67 65 74 20 66 72 6f 6d 0a 20 e can get from.
d170: 20 20 20 20 2a 20 6f 74 68 65 72 20 61 74 74 72 * other attr
d180: 69 62 75 74 65 73 20 72 65 61 64 69 6e 67 20 41 ibutes reading A
d190: 50 49 73 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65 PIs. If not, the
d1a0: 6e 20 77 65 20 74 72 79 20 74 6f 20 66 61 6c 6c n we try to fall
d1b0: 20 62 61 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 back on the.
d1c0: 20 20 2a 20 27 67 65 74 46 69 6c 65 41 74 74 72 * 'getFileAttr
d1d0: 69 62 75 74 65 73 45 78 50 72 6f 63 27 2c 20 61 ibutesExProc', a
d1e0: 6e 64 20 69 66 20 74 68 61 74 20 69 73 6e 27 74 nd if that isn't
d1f0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e available, then
d200: 20 6f 6e 20 65 76 65 6e 0a 20 20 20 20 20 2a 20 on even. *
d210: 73 69 6d 70 6c 65 72 20 72 6f 75 74 69 6e 65 73 simpler routines
d220: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 .. */.. f
d230: 69 6c 65 48 61 6e 64 6c 65 20 3d 20 28 74 63 6c ileHandle = (tcl
d240: 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 WinProcs->create
d250: 46 69 6c 65 50 72 6f 63 29 28 6e 61 74 69 76 65 FileProc)(native
d260: 50 61 74 68 2c 20 47 45 4e 45 52 49 43 5f 52 45 Path, GENERIC_RE
d270: 41 44 2c 0a 09 20 20 20 20 46 49 4c 45 5f 53 48 AD,.. FILE_SH
d280: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f ARE_READ | FILE_
d290: 53 48 41 52 45 5f 57 52 49 54 45 2c 20 4e 55 4c SHARE_WRITE, NUL
d2a0: 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 L, OPEN_EXISTING
d2b0: 2c 0a 09 20 20 20 20 46 49 4c 45 5f 46 4c 41 47 ,.. FILE_FLAG
d2c0: 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 49 43 _BACKUP_SEMANTIC
d2d0: 53 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 S | FILE_FLAG_OP
d2e0: 45 4e 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 EN_REPARSE_POINT
d2f0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 , NULL);.. if
d300: 20 28 66 69 6c 65 48 61 6e 64 6c 65 20 21 3d 20 (fileHandle !=
d310: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 INVALID_HANDLE_V
d320: 41 4c 55 45 29 20 7b 0a 09 42 59 5f 48 41 4e 44 ALUE) {..BY_HAND
d330: 4c 45 5f 46 49 4c 45 5f 49 4e 46 4f 52 4d 41 54 LE_FILE_INFORMAT
d340: 49 4f 4e 20 64 61 74 61 3b 0a 0a 09 69 66 20 28 ION data;...if (
d350: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 GetFileInformati
d360: 6f 6e 42 79 48 61 6e 64 6c 65 28 66 69 6c 65 48 onByHandle(fileH
d370: 61 6e 64 6c 65 2c 26 64 61 74 61 29 20 21 3d 20 andle,&data) !=
d380: 54 52 55 45 29 20 7b 0a 09 20 20 20 20 43 6c 6f TRUE) {.. Clo
d390: 73 65 48 61 6e 64 6c 65 28 66 69 6c 65 48 61 6e seHandle(fileHan
d3a0: 64 6c 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 dle);.. Tcl_S
d3b0: 65 74 45 72 72 6e 6f 28 45 4e 4f 45 4e 54 29 3b etErrno(ENOENT);
d3c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
d3d0: 0a 09 7d 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65 ..}..CloseHandle
d3e0: 28 66 69 6c 65 48 61 6e 64 6c 65 29 3b 0a 0a 09 (fileHandle);...
d3f0: 61 74 74 72 20 3d 20 64 61 74 61 2e 64 77 46 69 attr = data.dwFi
d400: 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 0a 09 leAttributes;...
d410: 73 74 61 74 50 74 72 2d 3e 73 74 5f 73 69 7a 65 statPtr->st_size
d420: 20 3d 20 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 = ((Tcl_WideInt
d430: 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 ) data.nFileSize
d440: 4c 6f 77 29 20 7c 0a 09 09 28 28 28 54 63 6c 5f Low) |...(((Tcl_
d450: 57 69 64 65 49 6e 74 29 20 64 61 74 61 2e 6e 46 WideInt) data.nF
d460: 69 6c 65 53 69 7a 65 48 69 67 68 29 20 3c 3c 20 ileSizeHigh) <<
d470: 33 32 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 32);..statPtr->s
d480: 74 5f 61 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d t_atime = ToCTim
d490: 65 28 64 61 74 61 2e 66 74 4c 61 73 74 41 63 63 e(data.ftLastAcc
d4a0: 65 73 73 54 69 6d 65 29 3b 0a 09 73 74 61 74 50 essTime);..statP
d4b0: 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d 20 54 tr->st_mtime = T
d4c0: 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 4c 61 oCTime(data.ftLa
d4d0: 73 74 57 72 69 74 65 54 69 6d 65 29 3b 0a 09 73 stWriteTime);..s
d4e0: 74 61 74 50 74 72 2d 3e 73 74 5f 63 74 69 6d 65 tatPtr->st_ctime
d4f0: 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e = ToCTime(data.
d500: 66 74 43 72 65 61 74 69 6f 6e 54 69 6d 65 29 3b ftCreationTime);
d510: 0a 0a 09 2f 2a 0a 09 20 2a 20 4f 6e 20 55 6e 69 .../*.. * On Uni
d520: 78 2c 20 66 6f 72 20 64 69 72 65 63 74 6f 72 69 x, for directori
d530: 65 73 2c 20 6e 6c 69 6e 6b 20 61 70 70 61 72 65 es, nlink appare
d540: 6e 74 6c 79 20 64 65 70 65 6e 64 73 20 6f 6e 20 ntly depends on
d550: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 09 20 the number of..
d560: 2a 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64 * files in the d
d570: 69 72 65 63 74 6f 72 79 2e 20 20 57 65 20 63 6f irectory. We co
d580: 75 6c 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68 uld calculate th
d590: 61 74 2c 20 62 75 74 20 69 74 20 77 6f 75 6c 64 at, but it would
d5a0: 20 62 65 20 61 0a 09 20 2a 20 62 69 74 20 6f 66 be a.. * bit of
d5b0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 a performance p
d5c0: 65 6e 61 6c 74 79 2c 20 49 20 74 68 69 6e 6b 2e enalty, I think.
d5d0: 20 48 65 6e 63 65 20 77 65 20 6a 75 73 74 20 75 Hence we just u
d5e0: 73 65 20 77 68 61 74 0a 09 20 2a 20 57 69 6e 64 se what.. * Wind
d5f0: 6f 77 73 20 67 69 76 65 73 20 75 73 2c 20 77 68 ows gives us, wh
d600: 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 ich is the same
d610: 61 73 20 55 6e 69 78 20 66 6f 72 20 66 69 6c 65 as Unix for file
d620: 73 2c 20 61 74 20 6c 65 61 73 74 2e 0a 09 20 2a s, at least... *
d630: 2f 0a 0a 09 6e 6c 69 6e 6b 20 3d 20 64 61 74 61 /...nlink = data
d640: 2e 6e 4e 75 6d 62 65 72 4f 66 4c 69 6e 6b 73 3b .nNumberOfLinks;
d650: 0a 0a 09 2f 2a 0a 09 20 2a 20 55 6e 66 6f 72 74 .../*.. * Unfort
d660: 75 6e 61 74 65 6c 79 20 6f 75 72 20 73 74 61 74 unately our stat
d670: 20 64 65 66 69 6e 69 74 69 6f 6e 27 73 20 69 6e definition's in
d680: 6f 64 65 20 66 69 65 6c 64 20 28 75 6e 73 69 67 ode field (unsig
d690: 6e 65 64 20 73 68 6f 72 74 29 0a 09 20 2a 20 77 ned short).. * w
d6a0: 69 6c 6c 20 74 68 72 6f 77 20 61 77 61 79 20 6d ill throw away m
d6b0: 6f 73 74 20 6f 66 20 74 68 65 20 70 72 65 63 69 ost of the preci
d6c0: 73 69 6f 6e 20 77 65 20 68 61 76 65 20 68 65 72 sion we have her
d6d0: 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77 e, which means w
d6e0: 65 0a 09 20 2a 20 63 61 6e 27 74 20 72 65 6c 79 e.. * can't rely
d6f0: 20 6f 6e 20 69 6e 6f 64 65 20 61 73 20 61 20 75 on inode as a u
d700: 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72 nique identifier
d710: 20 6f 66 20 61 20 66 69 6c 65 2e 20 57 65 27 64 of a file. We'd
d720: 20 72 65 61 6c 6c 79 0a 09 20 2a 20 6c 69 6b 65 really.. * like
d730: 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 to do something
d740: 20 6c 69 6b 65 20 68 6f 77 20 77 65 20 68 61 6e like how we han
d750: 64 6c 65 20 27 73 74 5f 73 69 7a 65 27 2e 0a 09 dle 'st_size'...
d760: 20 2a 2f 0a 0a 09 69 6e 6f 64 65 20 3d 20 64 61 */...inode = da
d770: 74 61 2e 6e 46 69 6c 65 49 6e 64 65 78 48 69 67 ta.nFileIndexHig
d780: 68 20 7c 20 64 61 74 61 2e 6e 46 69 6c 65 49 6e h | data.nFileIn
d790: 64 65 78 4c 6f 77 3b 0a 20 20 20 20 7d 20 65 6c dexLow;. } el
d7a0: 73 65 20 69 66 20 28 74 63 6c 57 69 6e 50 72 6f se if (tclWinPro
d7b0: 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 69 cs->getFileAttri
d7c0: 62 75 74 65 73 45 78 50 72 6f 63 20 21 3d 20 4e butesExProc != N
d7d0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 46 ULL) {../*.. * F
d7e0: 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 74 68 65 20 all back on the
d7f0: 6c 65 73 73 20 63 61 70 61 62 6c 65 20 72 6f 75 less capable rou
d800: 74 69 6e 65 73 2e 20 54 68 69 73 20 6d 65 61 6e tines. This mean
d810: 73 20 6e 6f 20 6e 6c 69 6e 6b 20 6f 72 20 69 6e s no nlink or in
d820: 6f 2e 0a 09 20 2a 2f 0a 0a 09 57 49 4e 33 32 5f o... */...WIN32_
d830: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 FILE_ATTRIBUTE_D
d840: 41 54 41 20 64 61 74 61 3b 0a 0a 09 69 66 20 28 ATA data;...if (
d850: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 (*tclWinProcs->g
d860: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 etFileAttributes
d870: 45 78 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 ExProc)(nativePa
d880: 74 68 2c 0a 09 09 47 65 74 46 69 6c 65 45 78 49 th,...GetFileExI
d890: 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 26 64 61 nfoStandard, &da
d8a0: 74 61 29 20 21 3d 20 54 52 55 45 29 20 7b 0a 09 ta) != TRUE) {..
d8b0: 20 20 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 HANDLE hFind
d8c0: 3b 0a 09 20 20 20 20 57 49 4e 33 32 5f 46 49 4e ;.. WIN32_FIN
d8d0: 44 5f 44 41 54 41 54 20 66 66 64 3b 0a 09 20 20 D_DATAT ffd;..
d8e0: 20 20 44 57 4f 52 44 20 6c 61 73 74 65 72 72 6f DWORD lasterro
d8f0: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 r = GetLastError
d900: 28 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 6c 61 ();... if (la
d910: 73 74 65 72 72 6f 72 20 21 3d 20 45 52 52 4f 52 sterror != ERROR
d920: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 _SHARING_VIOLATI
d930: 4f 4e 29 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f ON) {...TclWinCo
d940: 6e 76 65 72 74 45 72 72 6f 72 28 6c 61 73 74 65 nvertError(laste
d950: 72 72 6f 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 rror);...return
d960: 2d 31 3b 0a 09 09 7d 0a 09 20 20 20 20 68 46 69 -1;...}.. hFi
d970: 6e 64 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f nd = (*tclWinPro
d980: 63 73 2d 3e 66 69 6e 64 46 69 72 73 74 46 69 6c cs->findFirstFil
d990: 65 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 eProc)(nativePat
d9a0: 68 2c 20 26 66 66 64 29 3b 0a 09 20 20 20 20 69 h, &ffd);.. i
d9b0: 66 20 28 68 46 69 6e 64 20 3d 3d 20 49 4e 56 41 f (hFind == INVA
d9c0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 LID_HANDLE_VALUE
d9d0: 29 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f 6e 76 ) {...TclWinConv
d9e0: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 ertError(GetLast
d9f0: 45 72 72 6f 72 28 29 29 3b 0a 09 09 72 65 74 75 Error());...retu
da00: 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 rn -1;.. }..
da10: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c memcpy(&data,
da20: 20 26 66 66 64 2c 20 73 69 7a 65 6f 66 28 64 61 &ffd, sizeof(da
da30: 74 61 29 29 3b 0a 09 20 20 20 20 46 69 6e 64 43 ta));.. FindC
da40: 6c 6f 73 65 28 68 46 69 6e 64 29 3b 0a 09 7d 0a lose(hFind);..}.
da50: 0a 09 61 74 74 72 20 3d 20 64 61 74 61 2e 64 77 ..attr = data.dw
da60: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a FileAttributes;.
da70: 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 73 69 ..statPtr->st_si
da80: 7a 65 20 3d 20 28 28 54 63 6c 5f 57 69 64 65 49 ze = ((Tcl_WideI
da90: 6e 74 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 nt) data.nFileSi
daa0: 7a 65 4c 6f 77 29 20 7c 0a 09 09 28 28 28 54 63 zeLow) |...(((Tc
dab0: 6c 5f 57 69 64 65 49 6e 74 29 20 64 61 74 61 2e l_WideInt) data.
dac0: 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 29 20 3c nFileSizeHigh) <
dad0: 3c 20 33 32 29 3b 0a 09 73 74 61 74 50 74 72 2d < 32);..statPtr-
dae0: 3e 73 74 5f 61 74 69 6d 65 20 3d 20 54 6f 43 54 >st_atime = ToCT
daf0: 69 6d 65 28 64 61 74 61 2e 66 74 4c 61 73 74 41 ime(data.ftLastA
db00: 63 63 65 73 73 54 69 6d 65 29 3b 0a 09 73 74 61 ccessTime);..sta
db10: 74 50 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d tPtr->st_mtime =
db20: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 ToCTime(data.ft
db30: 4c 61 73 74 57 72 69 74 65 54 69 6d 65 29 3b 0a LastWriteTime);.
db40: 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 63 74 69 .statPtr->st_cti
db50: 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 me = ToCTime(dat
db60: 61 2e 66 74 43 72 65 61 74 69 6f 6e 54 69 6d 65 a.ftCreationTime
db70: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
db80: 09 2f 2a 0a 09 20 2a 20 57 65 20 64 6f 6e 27 74 ./*.. * We don't
db90: 20 68 61 76 65 20 74 68 65 20 66 61 73 74 65 72 have the faster
dba0: 20 61 74 74 72 69 62 75 74 65 73 20 70 72 6f 63 attributes proc
dbb0: 2c 20 73 6f 20 77 65 27 72 65 20 70 72 6f 62 61 , so we're proba
dbc0: 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 09 20 2a 20 bly running.. *
dbd0: 6f 6e 20 57 69 6e 39 35 2e 0a 09 20 2a 2f 0a 0a on Win95... */..
dbe0: 09 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 .WIN32_FIND_DATA
dbf0: 54 20 64 61 74 61 3b 0a 09 48 41 4e 44 4c 45 20 T data;..HANDLE
dc00: 68 61 6e 64 6c 65 3b 0a 0a 09 68 61 6e 64 6c 65 handle;...handle
dc10: 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 = (*tclWinProcs
dc20: 2d 3e 66 69 6e 64 46 69 72 73 74 46 69 6c 65 50 ->findFirstFileP
dc30: 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c roc)(nativePath,
dc40: 20 26 64 61 74 61 29 3b 0a 09 69 66 20 28 68 61 &data);..if (ha
dc50: 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f ndle == INVALID_
dc60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a HANDLE_VALUE) {.
dc70: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
dc80: 46 69 6e 64 46 69 72 73 74 46 69 6c 65 28 29 20 FindFirstFile()
dc90: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 6f 6e 20 doesn't work on
dca0: 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73 root directories
dcb0: 2c 20 73 6f 20 63 61 6c 6c 0a 09 20 20 20 20 20 , so call..
dcc0: 2a 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 * GetFileAttribu
dcd0: 74 65 73 28 29 20 74 6f 20 73 65 65 20 69 66 20 tes() to see if
dce0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 the specified fi
dcf0: 6c 65 20 65 78 69 73 74 73 2e 0a 09 20 20 20 20 le exists...
dd00: 20 2a 2f 0a 0a 09 20 20 20 20 61 74 74 72 20 3d */... attr =
dd10: 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e (*tclWinProcs->
dd20: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 getFileAttribute
dd30: 73 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 sProc)(nativePat
dd40: 68 29 3b 0a 09 20 20 20 20 69 66 20 28 61 74 74 h);.. if (att
dd50: 72 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c r == INVALID_FIL
dd60: 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a E_ATTRIBUTES) {.
dd70: 09 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 ..Tcl_SetErrno(E
dd80: 4e 4f 45 4e 54 29 3b 0a 09 09 72 65 74 75 72 6e NOENT);...return
dd90: 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 -1;.. }...
dda0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 61 6b /*.. * Mak
ddb0: 65 20 75 70 20 73 6f 6d 65 20 66 61 6b 65 20 69 e up some fake i
ddc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 nformation for t
ddd0: 68 69 73 20 66 69 6c 65 2e 20 49 74 20 68 61 73 his file. It has
dde0: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 09 20 20 the correct..
ddf0: 20 20 20 2a 20 66 69 6c 65 20 61 74 74 72 69 62 * file attrib
de00: 75 74 65 73 20 61 6e 64 20 61 20 74 69 6d 65 20 utes and a time
de10: 6f 66 20 30 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a of 0... */..
de20: 09 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 . memset(&dat
de30: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 61 74 a, 0, sizeof(dat
de40: 61 29 29 3b 0a 09 20 20 20 20 64 61 74 61 2e 61 a));.. data.a
de50: 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 .dwFileAttribute
de60: 73 20 3d 20 61 74 74 72 3b 0a 09 7d 20 65 6c 73 s = attr;..} els
de70: 65 20 7b 0a 09 20 20 20 20 46 69 6e 64 43 6c 6f e {.. FindClo
de80: 73 65 28 68 61 6e 64 6c 65 29 3b 0a 09 7d 0a 0a se(handle);..}..
de90: 09 61 74 74 72 20 3d 20 64 61 74 61 2e 61 2e 64 .attr = data.a.d
dea0: 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b wFileAttributes;
deb0: 0a 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 73 ...statPtr->st_s
dec0: 69 7a 65 20 3d 20 28 28 54 63 6c 5f 57 69 64 65 ize = ((Tcl_Wide
ded0: 49 6e 74 29 20 64 61 74 61 2e 61 2e 6e 46 69 6c Int) data.a.nFil
dee0: 65 53 69 7a 65 4c 6f 77 29 20 7c 0a 09 09 28 28 eSizeLow) |...((
def0: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 64 61 (Tcl_WideInt) da
df00: 74 61 2e 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 ta.a.nFileSizeHi
df10: 67 68 29 20 3c 3c 20 33 32 29 3b 0a 09 73 74 61 gh) << 32);..sta
df20: 74 50 74 72 2d 3e 73 74 5f 61 74 69 6d 65 20 3d tPtr->st_atime =
df30: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 61 2e ToCTime(data.a.
df40: 66 74 4c 61 73 74 41 63 63 65 73 73 54 69 6d 65 ftLastAccessTime
df50: 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f );..statPtr->st_
df60: 6d 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28 mtime = ToCTime(
df70: 64 61 74 61 2e 61 2e 66 74 4c 61 73 74 57 72 69 data.a.ftLastWri
df80: 74 65 54 69 6d 65 29 3b 0a 09 73 74 61 74 50 74 teTime);..statPt
df90: 72 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20 54 6f r->st_ctime = To
dfa0: 43 54 69 6d 65 28 64 61 74 61 2e 61 2e 66 74 43 CTime(data.a.ftC
dfb0: 72 65 61 74 69 6f 6e 54 69 6d 65 29 3b 0a 20 20 reationTime);.
dfc0: 20 20 7d 0a 0a 20 20 20 20 64 65 76 20 3d 20 4e }.. dev = N
dfd0: 61 74 69 76 65 44 65 76 28 6e 61 74 69 76 65 50 ativeDev(nativeP
dfe0: 61 74 68 29 3b 0a 20 20 20 20 6d 6f 64 65 20 3d ath);. mode =
dff0: 20 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28 NativeStatMode(
e000: 61 74 74 72 2c 20 63 68 65 63 6b 4c 69 6e 6b 73 attr, checkLinks
e010: 2c 20 4e 61 74 69 76 65 49 73 45 78 65 63 28 6e , NativeIsExec(n
e020: 61 74 69 76 65 50 61 74 68 29 29 3b 0a 0a 20 20 ativePath));..
e030: 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 64 65 statPtr->st_de
e040: 76 09 3d 20 28 64 65 76 5f 74 29 20 64 65 76 3b v.= (dev_t) dev;
e050: 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 . statPtr->st
e060: 5f 69 6e 6f 09 3d 20 69 6e 6f 64 65 3b 0a 20 20 _ino.= inode;.
e070: 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 6d 6f statPtr->st_mo
e080: 64 65 09 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 73 de.= mode;. s
e090: 74 61 74 50 74 72 2d 3e 73 74 5f 6e 6c 69 6e 6b tatPtr->st_nlink
e0a0: 09 3d 20 6e 6c 69 6e 6b 3b 0a 20 20 20 20 73 74 .= nlink;. st
e0b0: 61 74 50 74 72 2d 3e 73 74 5f 75 69 64 09 3d 20 atPtr->st_uid.=
e0c0: 30 3b 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 0;. statPtr->
e0d0: 73 74 5f 67 69 64 09 3d 20 30 3b 0a 20 20 20 20 st_gid.= 0;.
e0e0: 73 74 61 74 50 74 72 2d 3e 73 74 5f 72 64 65 76 statPtr->st_rdev
e0f0: 09 3d 20 28 64 65 76 5f 74 29 20 64 65 76 3b 0a .= (dev_t) dev;.
e100: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
e110: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
e120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
e160: 0a 20 2a 20 4e 61 74 69 76 65 44 65 76 20 2d 2d . * NativeDev --
e170: 0a 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65 . *. *.Calculate
e180: 20 6a 75 73 74 20 74 68 65 20 27 73 74 5f 64 65 just the 'st_de
e190: 76 27 20 66 69 65 6c 64 20 6f 66 20 61 20 27 73 v' field of a 's
e1a0: 74 61 74 27 20 73 74 72 75 63 74 75 72 65 2e 0a tat' structure..
e1b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
e1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
e200: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 .static int.Nati
e210: 76 65 44 65 76 28 0a 20 20 20 20 63 6f 6e 73 74 veDev(. const
e220: 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 TCHAR *nativePa
e230: 74 68 29 09 2f 2a 20 46 75 6c 6c 20 70 61 74 68 th)./* Full path
e240: 20 6f 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74 of file to stat
e250: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 64 65 */.{. int de
e260: 76 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 v;. Tcl_DStri
e270: 6e 67 20 64 73 3b 0a 20 20 20 20 57 43 48 41 52 ng ds;. WCHAR
e280: 20 6e 61 74 69 76 65 46 75 6c 6c 50 61 74 68 5b nativeFullPath[
e290: 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 54 MAX_PATH];. T
e2a0: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 72 74 CHAR *nativePart
e2b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
e2c0: 20 2a 66 75 6c 6c 50 61 74 68 3b 0a 0a 20 20 20 *fullPath;..
e2d0: 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e (*tclWinProcs->
e2e0: 67 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 50 getFullPathNameP
e2f0: 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c roc)(nativePath,
e300: 20 4d 41 58 5f 50 41 54 48 2c 0a 09 20 20 20 20 MAX_PATH,..
e310: 6e 61 74 69 76 65 46 75 6c 6c 50 61 74 68 2c 20 nativeFullPath,
e320: 26 6e 61 74 69 76 65 50 61 72 74 29 3b 0a 0a 20 &nativePart);..
e330: 20 20 20 66 75 6c 6c 50 61 74 68 20 3d 20 54 63 fullPath = Tc
e340: 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 l_WinTCharToUtf(
e350: 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 (TCHAR *) native
e360: 46 75 6c 6c 50 61 74 68 2c 20 2d 31 2c 20 26 64 FullPath, -1, &d
e370: 73 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 75 s);.. if ((fu
e380: 6c 6c 50 61 74 68 5b 30 5d 20 3d 3d 20 27 5c 5c llPath[0] == '\\
e390: 27 29 20 26 26 20 28 66 75 6c 6c 50 61 74 68 5b ') && (fullPath[
e3a0: 31 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 1] == '\\')) {..
e3b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 09 const char *p;..
e3c0: 44 57 4f 52 44 20 64 77 3b 0a 09 63 6f 6e 73 74 DWORD dw;..const
e3d0: 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 56 6f TCHAR *nativeVo
e3e0: 6c 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 l;..Tcl_DString
e3f0: 76 6f 6c 53 74 72 69 6e 67 3b 0a 0a 09 70 20 3d volString;...p =
e400: 20 73 74 72 63 68 72 28 66 75 6c 6c 50 61 74 68 strchr(fullPath
e410: 20 2b 20 32 2c 20 27 5c 5c 27 29 3b 0a 09 70 20 + 2, '\\');..p
e420: 3d 20 73 74 72 63 68 72 28 70 20 2b 20 31 2c 20 = strchr(p + 1,
e430: 27 5c 5c 27 29 3b 0a 09 69 66 20 28 70 20 3d 3d '\\');..if (p ==
e440: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a NULL) {.. /*
e450: 0a 09 20 20 20 20 20 2a 20 41 64 64 20 74 65 72 .. * Add ter
e460: 6d 69 6e 61 74 69 6e 67 20 62 61 63 6b 73 6c 61 minating backsla
e470: 73 68 20 74 6f 20 66 75 6c 6c 70 61 74 68 20 6f sh to fullpath o
e480: 72 20 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 r GetVolumeInfor
e490: 6d 61 74 69 6f 6e 28 29 0a 09 20 20 20 20 20 2a mation().. *
e4a0: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 0a 09 20 20 won't work...
e4b0: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 66 75 6c 6c */... full
e4c0: 50 61 74 68 20 3d 20 54 63 6c 5f 44 53 74 72 69 Path = Tcl_DStri
e4d0: 6e 67 41 70 70 65 6e 64 28 26 64 73 2c 20 22 5c ngAppend(&ds, "\
e4e0: 5c 22 2c 20 31 29 3b 0a 09 20 20 20 20 70 20 3d \", 1);.. p =
e4f0: 20 66 75 6c 6c 50 61 74 68 20 2b 20 54 63 6c 5f fullPath + Tcl_
e500: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 DStringLength(&d
e510: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 s);..} else {..
e520: 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09 6e 61 74 69 p++;..}..nati
e530: 76 65 56 6f 6c 20 3d 20 54 63 6c 5f 57 69 6e 55 veVol = Tcl_WinU
e540: 74 66 54 6f 54 43 68 61 72 28 66 75 6c 6c 50 61 tfToTChar(fullPa
e550: 74 68 2c 20 70 20 2d 20 66 75 6c 6c 50 61 74 68 th, p - fullPath
e560: 2c 20 26 76 6f 6c 53 74 72 69 6e 67 29 3b 0a 09 , &volString);..
e570: 64 77 20 3d 20 28 44 57 4f 52 44 29 20 2d 31 3b dw = (DWORD) -1;
e580: 0a 09 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d ..(*tclWinProcs-
e590: 3e 67 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d >getVolumeInform
e5a0: 61 74 69 6f 6e 50 72 6f 63 29 28 6e 61 74 69 76 ationProc)(nativ
e5b0: 65 56 6f 6c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 26 eVol, NULL, 0, &
e5c0: 64 77 2c 0a 09 09 4e 55 4c 4c 2c 20 4e 55 4c 4c dw,...NULL, NULL
e5d0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f 2a , NULL, 0);.../*
e5e0: 0a 09 20 2a 20 47 65 74 46 75 6c 6c 50 61 74 68 .. * GetFullPath
e5f0: 4e 61 6d 65 28 29 20 74 75 72 6e 73 20 73 70 65 Name() turns spe
e600: 63 69 61 6c 20 64 65 76 69 63 65 73 20 6c 69 6b cial devices lik
e610: 65 20 22 4e 55 4c 22 20 69 6e 74 6f 20 22 5c 5c e "NUL" into "\\
e620: 2e 5c 4e 55 4c 22 2c 0a 09 20 2a 20 62 75 74 20 .\NUL",.. * but
e630: 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 GetVolumeInforma
e640: 74 69 6f 6e 28 29 20 72 65 74 75 72 6e 73 20 66 tion() returns f
e650: 61 69 6c 75 72 65 20 66 6f 72 20 22 5c 5c 2e 5c ailure for "\\.\
e660: 4e 55 4c 22 2e 20 54 68 69 73 20 77 69 6c 6c 0a NUL". This will.
e670: 09 20 2a 20 63 61 75 73 65 20 22 4e 55 4c 22 20 . * cause "NUL"
e680: 74 6f 20 67 65 74 20 61 20 64 72 69 76 65 20 6e to get a drive n
e690: 75 6d 62 65 72 20 6f 66 20 2d 31 2c 20 77 68 69 umber of -1, whi
e6a0: 63 68 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 61 ch makes about a
e6b0: 73 20 6d 75 63 68 0a 09 20 2a 20 73 65 6e 73 65 s much.. * sense
e6c0: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 73 69 6e as anything sin
e6d0: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 64 ce the special d
e6e0: 65 76 69 63 65 73 20 64 6f 6e 27 74 20 6c 69 76 evices don't liv
e6f0: 65 20 6f 6e 20 61 6e 79 0a 09 20 2a 20 64 72 69 e on any.. * dri
e700: 76 65 2e 0a 09 20 2a 2f 0a 0a 09 64 65 76 20 3d ve... */...dev =
e710: 20 64 77 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e dw;..Tcl_DStrin
e720: 67 46 72 65 65 28 26 76 6f 6c 53 74 72 69 6e 67 gFree(&volString
e730: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 );. } else if
e740: 20 28 28 66 75 6c 6c 50 61 74 68 5b 30 5d 20 21 ((fullPath[0] !
e750: 3d 20 27 5c 30 27 29 20 26 26 20 28 66 75 6c 6c = '\0') && (full
e760: 50 61 74 68 5b 31 5d 20 3d 3d 20 27 3a 27 29 29 Path[1] == ':'))
e770: 20 7b 0a 09 64 65 76 20 3d 20 54 63 6c 5f 55 6e {..dev = Tcl_Un
e780: 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 66 75 6c iCharToLower(ful
e790: 6c 50 61 74 68 5b 30 5d 29 20 2d 20 27 61 27 3b lPath[0]) - 'a';
e7a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 64 . } else {..d
e7b0: 65 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 ev = -1;. }.
e7c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 Tcl_DStringFr
e7d0: 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 72 65 ee(&ds);.. re
e7e0: 74 75 72 6e 20 64 65 76 3b 0a 7d 0a 0c 0a 2f 2a turn dev;.}.../*
e7f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
e800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
e840: 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 20 2d NativeStatMode -
e850: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 -. *. *.Calculat
e860: 65 20 6a 75 73 74 20 74 68 65 20 27 73 74 5f 6d e just the 'st_m
e870: 6f 64 65 27 20 66 69 65 6c 64 20 6f 66 20 61 20 ode' field of a
e880: 27 73 74 61 74 27 20 73 74 72 75 63 74 75 72 65 'stat' structure
e890: 2e 0a 20 2a 0a 20 2a 09 49 6e 20 6d 61 6e 79 20 .. *. *.In many
e8a0: 70 6c 61 63 65 73 20 77 65 20 64 6f 6e 27 74 20 places we don't
e8b0: 6e 65 65 64 20 74 68 65 20 66 75 6c 6c 20 73 74 need the full st
e8c0: 61 74 20 73 74 72 75 63 74 75 72 65 2c 20 61 6e at structure, an
e8d0: 64 20 69 74 27 73 20 6d 75 63 68 0a 20 2a 09 66 d it's much. *.f
e8e0: 61 73 74 65 72 20 6a 75 73 74 20 74 6f 20 63 61 aster just to ca
e8f0: 6c 63 75 6c 61 74 65 20 74 68 65 73 65 20 70 69 lculate these pi
e900: 65 63 65 73 2c 20 69 66 20 74 68 61 74 27 73 20 eces, if that's
e910: 61 6c 6c 20 77 65 20 6e 65 65 64 2e 0a 20 2a 0a all we need.. *.
e920: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
e930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
e970: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 73 68 atic unsigned sh
e980: 6f 72 74 0a 4e 61 74 69 76 65 53 74 61 74 4d 6f ort.NativeStatMo
e990: 64 65 28 0a 20 20 20 20 44 57 4f 52 44 20 61 74 de(. DWORD at
e9a0: 74 72 2c 0a 20 20 20 20 69 6e 74 20 63 68 65 63 tr,. int chec
e9b0: 6b 4c 69 6e 6b 73 2c 0a 20 20 20 20 69 6e 74 20 kLinks,. int
e9c0: 69 73 45 78 65 63 29 0a 7b 0a 20 20 20 20 69 6e isExec).{. in
e9d0: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20 t mode;.. if
e9e0: 28 63 68 65 63 6b 4c 69 6e 6b 73 20 26 26 20 28 (checkLinks && (
e9f0: 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 attr & FILE_ATTR
ea00: 49 42 55 54 45 5f 52 45 50 41 52 53 45 5f 50 4f IBUTE_REPARSE_PO
ea10: 49 4e 54 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 INT)) {../*.. *
ea20: 49 74 20 69 73 20 61 20 6c 69 6e 6b 2e 0a 09 20 It is a link...
ea30: 2a 2f 0a 0a 09 6d 6f 64 65 20 3d 20 53 5f 49 46 */...mode = S_IF
ea40: 4c 4e 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 LNK;. } else
ea50: 7b 0a 09 6d 6f 64 65 20 3d 20 28 61 74 74 72 20 {..mode = (attr
ea60: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 & FILE_ATTRIBUTE
ea70: 5f 44 49 52 45 43 54 4f 52 59 29 20 3f 20 53 5f _DIRECTORY) ? S_
ea80: 49 46 44 49 52 7c 53 5f 49 45 58 45 43 20 3a 20 IFDIR|S_IEXEC :
ea90: 53 5f 49 46 52 45 47 3b 0a 20 20 20 20 7d 0a 20 S_IFREG;. }.
eaa0: 20 20 20 6d 6f 64 65 20 7c 3d 20 28 61 74 74 72 mode |= (attr
eab0: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 & FILE_ATTRIBUT
eac0: 45 5f 52 45 41 44 4f 4e 4c 59 29 20 3f 20 53 5f E_READONLY) ? S_
ead0: 49 52 45 41 44 20 3a 20 53 5f 49 52 45 41 44 7c IREAD : S_IREAD|
eae0: 53 5f 49 57 52 49 54 45 3b 0a 20 20 20 20 69 66 S_IWRITE;. if
eaf0: 20 28 69 73 45 78 65 63 29 20 7b 0a 09 6d 6f 64 (isExec) {..mod
eb00: 65 20 7c 3d 20 53 5f 49 45 58 45 43 3b 0a 20 20 e |= S_IEXEC;.
eb10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
eb20: 20 2a 20 50 72 6f 70 61 67 61 74 65 20 74 68 65 * Propagate the
eb30: 20 53 5f 49 52 45 41 44 2c 20 53 5f 49 57 52 49 S_IREAD, S_IWRI
eb40: 54 45 2c 20 53 5f 49 45 58 45 43 20 62 69 74 73 TE, S_IEXEC bits
eb50: 20 74 6f 20 74 68 65 20 67 72 6f 75 70 20 61 6e to the group an
eb60: 64 20 6f 74 68 65 72 0a 20 20 20 20 20 2a 20 70 d other. * p
eb70: 6f 73 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 2a ositions.. *
eb80: 2f 0a 0a 20 20 20 20 6d 6f 64 65 20 7c 3d 20 28 /.. mode |= (
eb90: 6d 6f 64 65 20 26 20 28 53 5f 49 52 45 41 44 7c mode & (S_IREAD|
eba0: 53 5f 49 57 52 49 54 45 7c 53 5f 49 45 58 45 43 S_IWRITE|S_IEXEC
ebb0: 29 29 20 3e 3e 20 33 3b 0a 20 20 20 20 6d 6f 64 )) >> 3;. mod
ebc0: 65 20 7c 3d 20 28 6d 6f 64 65 20 26 20 28 53 5f e |= (mode & (S_
ebd0: 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45 7c 53 IREAD|S_IWRITE|S
ebe0: 5f 49 45 58 45 43 29 29 20 3e 3e 20 36 3b 0a 20 _IEXEC)) >> 6;.
ebf0: 20 20 20 72 65 74 75 72 6e 20 28 75 6e 73 69 67 return (unsig
ec00: 6e 65 64 20 73 68 6f 72 74 29 20 6d 6f 64 65 3b ned short) mode;
ec10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
ec20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ec60: 2d 2d 0a 20 2a 0a 20 2a 20 54 6f 43 54 69 6d 65 --. *. * ToCTime
ec70: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 --. *. *.Conver
ec80: 74 73 20 61 20 57 69 6e 64 6f 77 73 20 46 49 4c ts a Windows FIL
ec90: 45 54 49 4d 45 20 74 6f 20 61 20 74 69 6d 65 5f ETIME to a time_
eca0: 74 20 69 6e 20 55 54 43 2e 0a 20 2a 0a 20 2a 20 t in UTC.. *. *
ecb0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
ecc0: 72 6e 73 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 rns the count of
ecd0: 20 73 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74 68 seconds from th
ece0: 65 20 50 6f 73 69 78 20 65 70 6f 63 68 2e 0a 20 e Posix epoch..
ecf0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
ed00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ed30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
ed40: 0a 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 0a ..static time_t.
ed50: 54 6f 43 54 69 6d 65 28 0a 20 20 20 20 46 49 4c ToCTime(. FIL
ed60: 45 54 49 4d 45 20 66 69 6c 65 54 69 6d 65 29 09 ETIME fileTime).
ed70: 09 2f 2a 20 55 54 43 20 74 69 6d 65 20 2a 2f 0a ./* UTC time */.
ed80: 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 {. LARGE_INTE
ed90: 47 45 52 20 63 6f 6e 76 65 72 74 65 64 54 69 6d GER convertedTim
eda0: 65 3b 0a 0a 20 20 20 20 63 6f 6e 76 65 72 74 65 e;.. converte
edb0: 64 54 69 6d 65 2e 4c 6f 77 50 61 72 74 20 3d 20 dTime.LowPart =
edc0: 66 69 6c 65 54 69 6d 65 2e 64 77 4c 6f 77 44 61 fileTime.dwLowDa
edd0: 74 65 54 69 6d 65 3b 0a 20 20 20 20 63 6f 6e 76 teTime;. conv
ede0: 65 72 74 65 64 54 69 6d 65 2e 48 69 67 68 50 61 ertedTime.HighPa
edf0: 72 74 20 3d 20 28 4c 4f 4e 47 29 20 66 69 6c 65 rt = (LONG) file
ee00: 54 69 6d 65 2e 64 77 48 69 67 68 44 61 74 65 54 Time.dwHighDateT
ee10: 69 6d 65 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e ime;.. return
ee20: 20 28 74 69 6d 65 5f 74 29 20 28 28 63 6f 6e 76 (time_t) ((conv
ee30: 65 72 74 65 64 54 69 6d 65 2e 51 75 61 64 50 61 ertedTime.QuadPa
ee40: 72 74 20 2d 0a 09 20 20 20 20 28 54 63 6c 5f 57 rt -.. (Tcl_W
ee50: 69 64 65 49 6e 74 29 20 50 4f 53 49 58 5f 45 50 ideInt) POSIX_EP
ee60: 4f 43 48 5f 41 53 5f 46 49 4c 45 54 49 4d 45 29 OCH_AS_FILETIME)
ee70: 20 2f 20 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 / (Tcl_WideInt)
ee80: 20 31 30 30 30 30 30 30 30 29 3b 0a 7d 0a 0c 0a 10000000);.}...
ee90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
eee0: 0a 20 2a 20 46 72 6f 6d 43 54 69 6d 65 20 2d 2d . * FromCTime --
eef0: 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 73 20 . *. *.Converts
ef00: 61 20 74 69 6d 65 5f 74 20 74 6f 20 61 20 57 69 a time_t to a Wi
ef10: 6e 64 6f 77 73 20 46 49 4c 45 54 49 4d 45 0a 20 ndows FILETIME.
ef20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
ef30: 09 52 65 74 75 72 6e 73 20 74 68 65 20 63 6f 75 .Returns the cou
ef40: 6e 74 20 6f 66 20 31 30 30 2d 6e 73 20 74 69 63 nt of 100-ns tic
ef50: 6b 73 20 73 65 63 6f 6e 64 73 20 66 72 6f 6d 20 ks seconds from
ef60: 74 68 65 20 57 69 6e 64 6f 77 73 20 65 70 6f 63 the Windows epoc
ef70: 68 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d h.. *. *--------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
efa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
efb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
efc0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 . */..static voi
efd0: 64 0a 46 72 6f 6d 43 54 69 6d 65 28 0a 20 20 20 d.FromCTime(.
efe0: 20 74 69 6d 65 5f 74 20 70 6f 73 69 78 54 69 6d time_t posixTim
eff0: 65 2c 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 e,. FILETIME
f000: 2a 66 69 6c 65 54 69 6d 65 29 09 09 2f 2a 20 55 *fileTime)../* U
f010: 54 43 20 54 69 6d 65 20 2a 2f 0a 7b 0a 20 20 20 TC Time */.{.
f020: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 63 LARGE_INTEGER c
f030: 6f 6e 76 65 72 74 65 64 54 69 6d 65 3b 0a 20 20 onvertedTime;.
f040: 20 20 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e convertedTime.
f050: 51 75 61 64 50 61 72 74 20 3d 20 28 28 4c 4f 4e QuadPart = ((LON
f060: 47 4c 4f 4e 47 29 20 70 6f 73 69 78 54 69 6d 65 GLONG) posixTime
f070: 29 20 2a 20 31 30 30 30 30 30 30 30 0a 09 2b 20 ) * 10000000..+
f080: 50 4f 53 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46 POSIX_EPOCH_AS_F
f090: 49 4c 45 54 49 4d 45 3b 0a 20 20 20 20 66 69 6c ILETIME;. fil
f0a0: 65 54 69 6d 65 2d 3e 64 77 4c 6f 77 44 61 74 65 eTime->dwLowDate
f0b0: 54 69 6d 65 20 3d 20 63 6f 6e 76 65 72 74 65 64 Time = converted
f0c0: 54 69 6d 65 2e 4c 6f 77 50 61 72 74 3b 0a 20 20 Time.LowPart;.
f0d0: 20 20 66 69 6c 65 54 69 6d 65 2d 3e 64 77 48 69 fileTime->dwHi
f0e0: 67 68 44 61 74 65 54 69 6d 65 20 3d 20 63 6f 6e ghDateTime = con
f0f0: 76 65 72 74 65 64 54 69 6d 65 2e 48 69 67 68 50 vertedTime.HighP
f100: 61 72 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d art;.}.../*. *--
f110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
f160: 54 63 6c 70 47 65 74 4e 61 74 69 76 65 43 77 64 TclpGetNativeCwd
f170: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
f180: 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 unction replaces
f190: 20 74 68 65 20 6c 69 62 72 61 72 79 20 76 65 72 the library ver
f1a0: 73 69 6f 6e 20 6f 66 20 67 65 74 63 77 64 28 29 sion of getcwd()
f1b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
f1c0: 0a 20 2a 09 54 68 65 20 69 6e 70 75 74 20 61 6e . *.The input an
f1d0: 64 20 6f 75 74 70 75 74 20 61 72 65 20 66 69 6c d output are fil
f1e0: 65 73 79 73 74 65 6d 20 70 61 74 68 73 20 69 6e esystem paths in
f1f0: 20 6e 61 74 69 76 65 20 66 6f 72 6d 2e 20 54 68 native form. Th
f200: 65 20 72 65 73 75 6c 74 0a 20 2a 09 69 73 20 65 e result. *.is e
f210: 69 74 68 65 72 20 74 68 65 20 67 69 76 65 6e 20 ither the given
f220: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 66 20 74 clientData, if t
f230: 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 he working direc
f240: 74 6f 72 79 20 68 61 73 6e 27 74 0a 20 2a 09 63 tory hasn't. *.c
f250: 68 61 6e 67 65 64 2c 20 6f 72 20 61 20 6e 65 77 hanged, or a new
f260: 20 63 6c 69 65 6e 74 44 61 74 61 20 28 6f 77 6e clientData (own
f270: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 ed by our caller
f280: 29 2c 20 67 69 76 69 6e 67 20 74 68 65 20 6e 65 ), giving the ne
f290: 77 0a 20 2a 09 6e 61 74 69 76 65 20 70 61 74 68 w. *.native path
f2a0: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 , or NULL if the
f2b0: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f current directo
f2c0: 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 ry could not be
f2d0: 64 65 74 65 72 6d 69 6e 65 64 2e 0a 20 2a 09 49 determined.. *.I
f2e0: 66 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e f NULL is return
f2f0: 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 63 ed, the caller c
f300: 61 6e 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 an examine the s
f310: 74 61 6e 64 61 72 64 20 70 6f 73 69 78 20 65 72 tandard posix er
f320: 72 6f 72 0a 20 2a 09 63 6f 64 65 73 20 74 6f 20 ror. *.codes to
f330: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 61 determine the ca
f340: 75 73 65 20 6f 66 20 74 68 65 20 70 72 6f 62 6c use of the probl
f350: 65 6d 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 em.. *. * Side e
f360: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e ffects:. *.None.
f370: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
f3c0: 0a 0a 43 6c 69 65 6e 74 44 61 74 61 0a 54 63 6c ..ClientData.Tcl
f3d0: 70 47 65 74 4e 61 74 69 76 65 43 77 64 28 0a 20 pGetNativeCwd(.
f3e0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ClientData cl
f3f0: 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20 20 20 ientData).{.
f400: 57 43 48 41 52 20 62 75 66 66 65 72 5b 4d 41 58 WCHAR buffer[MAX
f410: 5f 50 41 54 48 5d 3b 0a 0a 20 20 20 20 69 66 20 _PATH];.. if
f420: 28 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e ((*tclWinProcs->
f430: 67 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 getCurrentDirect
f440: 6f 72 79 50 72 6f 63 29 28 4d 41 58 5f 50 41 54 oryProc)(MAX_PAT
f450: 48 2c 20 62 75 66 66 65 72 29 20 3d 3d 20 30 29 H, buffer) == 0)
f460: 20 7b 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 {..TclWinConver
f470: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 tError(GetLastEr
f480: 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 ror());..return
f490: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
f4a0: 20 69 66 20 28 63 6c 69 65 6e 74 44 61 74 61 20 if (clientData
f4b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
f4c0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 75 73 65 tclWinProcs->use
f4d0: 57 69 64 65 29 20 7b 0a 09 20 20 20 20 2f 2a 0a Wide) {.. /*.
f4e0: 09 20 20 20 20 20 2a 20 55 6e 69 63 6f 64 65 20 . * Unicode
f4f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 representation w
f500: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4e hen running on N
f510: 54 2f 32 4b 2f 58 50 2e 0a 09 20 20 20 20 20 2a T/2K/XP... *
f520: 2f 0a 0a 09 20 20 20 20 69 66 20 28 77 63 73 63 /... if (wcsc
f530: 6d 70 28 28 63 6f 6e 73 74 20 57 43 48 41 52 2a mp((const WCHAR*
f540: 29 63 6c 69 65 6e 74 44 61 74 61 2c 20 28 63 6f )clientData, (co
f550: 6e 73 74 20 57 43 48 41 52 2a 29 62 75 66 66 65 nst WCHAR*)buffe
f560: 72 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 r) == 0) {...ret
f570: 75 72 6e 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a urn clientData;.
f580: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b . }..} else {
f590: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
f5a0: 20 41 4e 53 49 20 72 65 70 72 65 73 65 6e 74 61 ANSI representa
f5b0: 74 69 6f 6e 20 77 68 65 6e 20 72 75 6e 6e 69 6e tion when runnin
f5c0: 67 20 6f 6e 20 39 35 2f 39 38 2f 4d 45 2e 0a 09 g on 95/98/ME...
f5d0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
f5e0: 20 28 73 74 72 63 6d 70 28 28 63 6f 6e 73 74 20 (strcmp((const
f5f0: 63 68 61 72 2a 29 20 63 6c 69 65 6e 74 44 61 74 char*) clientDat
f600: 61 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 a, (const char*)
f610: 20 62 75 66 66 65 72 29 20 3d 3d 20 30 29 20 7b buffer) == 0) {
f620: 0a 09 09 72 65 74 75 72 6e 20 63 6c 69 65 6e 74 ...return client
f630: 44 61 74 61 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a Data;.. }..}.
f640: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
f650: 6e 20 54 63 6c 4e 61 74 69 76 65 44 75 70 49 6e n TclNativeDupIn
f660: 74 65 72 6e 61 6c 52 65 70 28 28 43 6c 69 65 6e ternalRep((Clien
f670: 74 44 61 74 61 29 20 62 75 66 66 65 72 29 3b 0a tData) buffer);.
f680: 7d 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 41 }...int.TclpObjA
f690: 63 63 65 73 73 28 0a 20 20 20 20 54 63 6c 5f 4f ccess(. Tcl_O
f6a0: 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 20 bj *pathPtr,.
f6b0: 20 69 6e 74 20 6d 6f 64 65 29 0a 7b 0a 20 20 20 int mode).{.
f6c0: 20 72 65 74 75 72 6e 20 4e 61 74 69 76 65 41 63 return NativeAc
f6d0: 63 65 73 73 28 28 63 6f 6e 73 74 20 54 43 48 41 cess((const TCHA
f6e0: 52 20 2a 29 20 54 63 6c 5f 46 53 47 65 74 4e 61 R *) Tcl_FSGetNa
f6f0: 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72 tivePath(pathPtr
f700: 29 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0c 0a 69 6e ), mode);.}...in
f710: 74 0a 54 63 6c 70 4f 62 6a 4c 73 74 61 74 28 0a t.TclpObjLstat(.
f720: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 Tcl_Obj *pat
f730: 68 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f 53 74 hPtr,. Tcl_St
f740: 61 74 42 75 66 20 2a 73 74 61 74 50 74 72 29 0a atBuf *statPtr).
f750: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 {. /*. *
f760: 45 6e 73 75 72 65 20 63 6f 72 72 65 63 74 20 66 Ensure correct f
f770: 69 6c 65 20 73 69 7a 65 73 20 62 79 20 66 6f 72 ile sizes by for
f780: 63 69 6e 67 20 74 68 65 20 4f 53 20 74 6f 20 77 cing the OS to w
f790: 72 69 74 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 rite any pending
f7a0: 20 64 61 74 61 0a 20 20 20 20 20 2a 20 74 6f 20 data. * to
f7b0: 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 64 6f disk. This is do
f7c0: 6e 65 20 6f 6e 6c 79 20 66 6f 72 20 63 68 61 6e ne only for chan
f7d0: 6e 65 6c 73 20 77 68 69 63 68 20 61 72 65 20 64 nels which are d
f7e0: 69 72 74 79 2c 20 69 2e 65 2e 20 68 61 76 65 20 irty, i.e. have
f7f0: 62 65 65 6e 0a 20 20 20 20 20 2a 20 77 72 69 74 been. * writ
f800: 74 65 6e 20 74 6f 20 73 69 6e 63 65 20 74 68 65 ten to since the
f810: 20 6c 61 73 74 20 66 6c 75 73 68 20 68 65 72 65 last flush here
f820: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 .. */.. T
f830: 63 6c 57 69 6e 46 6c 75 73 68 44 69 72 74 79 43 clWinFlushDirtyC
f840: 68 61 6e 6e 65 6c 73 28 29 3b 0a 0a 20 20 20 20 hannels();..
f850: 72 65 74 75 72 6e 20 4e 61 74 69 76 65 53 74 61 return NativeSta
f860: 74 28 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a t((const TCHAR *
f870: 29 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 ) Tcl_FSGetNativ
f880: 65 50 61 74 68 28 70 61 74 68 50 74 72 29 2c 0a ePath(pathPtr),.
f890: 09 20 20 20 20 73 74 61 74 50 74 72 2c 20 31 29 . statPtr, 1)
f8a0: 3b 0a 7d 0a 0c 0a 23 69 66 64 65 66 20 53 5f 49 ;.}...#ifdef S_I
f8b0: 46 4c 4e 4b 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 FLNK.Tcl_Obj *.T
f8c0: 63 6c 70 4f 62 6a 4c 69 6e 6b 28 0a 20 20 20 20 clpObjLink(.
f8d0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 Tcl_Obj *pathPtr
f8e0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 ,. Tcl_Obj *t
f8f0: 6f 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 6c 69 oPtr,. int li
f900: 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 20 20 20 nkAction).{.
f910: 69 66 20 28 74 6f 50 74 72 20 21 3d 20 4e 55 4c if (toPtr != NUL
f920: 4c 29 20 7b 0a 09 69 6e 74 20 72 65 73 3b 0a 09 L) {..int res;..
f930: 54 43 48 41 52 20 2a 4c 69 6e 6b 54 61 72 67 65 TCHAR *LinkTarge
f940: 74 3b 0a 09 54 43 48 41 52 20 2a 4c 69 6e 6b 53 t;..TCHAR *LinkS
f950: 6f 75 72 63 65 20 3d 20 28 54 43 48 41 52 20 2a ource = (TCHAR *
f960: 29 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 ) Tcl_FSGetNativ
f970: 65 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a ePath(pathPtr);.
f980: 09 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 61 6c .Tcl_Obj *normal
f990: 69 7a 65 64 54 6f 50 74 72 20 3d 20 54 63 6c 5f izedToPtr = Tcl_
f9a0: 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 FSGetNormalizedP
f9b0: 61 74 68 28 4e 55 4c 4c 2c 20 74 6f 50 74 72 29 ath(NULL, toPtr)
f9c0: 3b 0a 0a 09 69 66 20 28 6e 6f 72 6d 61 6c 69 7a ;...if (normaliz
f9d0: 65 64 54 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 edToPtr == NULL)
f9e0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e {.. return N
f9f0: 55 4c 4c 3b 0a 09 7d 0a 0a 09 4c 69 6e 6b 54 61 ULL;..}...LinkTa
fa00: 72 67 65 74 20 3d 20 28 54 43 48 41 52 20 2a 29 rget = (TCHAR *)
fa10: 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 Tcl_FSGetNative
fa20: 50 61 74 68 28 6e 6f 72 6d 61 6c 69 7a 65 64 54 Path(normalizedT
fa30: 6f 50 74 72 29 3b 0a 0a 09 69 66 20 28 4c 69 6e oPtr);...if (Lin
fa40: 6b 53 6f 75 72 63 65 20 3d 3d 20 4e 55 4c 4c 20 kSource == NULL
fa50: 7c 7c 20 4c 69 6e 6b 54 61 72 67 65 74 20 3d 3d || LinkTarget ==
fa60: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 NULL) {.. re
fa70: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 72 turn NULL;..}..r
fa80: 65 73 20 3d 20 57 69 6e 4c 69 6e 6b 28 4c 69 6e es = WinLink(Lin
fa90: 6b 53 6f 75 72 63 65 2c 20 4c 69 6e 6b 54 61 72 kSource, LinkTar
faa0: 67 65 74 2c 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 get, linkAction)
fab0: 3b 0a 09 69 66 20 28 72 65 73 20 3d 3d 20 30 29 ;..if (res == 0)
fac0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 74 {.. return t
fad0: 6f 50 74 72 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a oPtr;..} else {.
fae0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
faf0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
fb00: 7b 0a 09 54 43 48 41 52 20 2a 4c 69 6e 6b 53 6f {..TCHAR *LinkSo
fb10: 75 72 63 65 20 3d 20 28 54 43 48 41 52 20 2a 29 urce = (TCHAR *)
fb20: 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 Tcl_FSGetNative
fb30: 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a 0a Path(pathPtr);..
fb40: 09 69 66 20 28 4c 69 6e 6b 53 6f 75 72 63 65 20 .if (LinkSource
fb50: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
fb60: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a return NULL;..}.
fb70: 09 72 65 74 75 72 6e 20 57 69 6e 52 65 61 64 4c .return WinReadL
fb80: 69 6e 6b 28 4c 69 6e 6b 53 6f 75 72 63 65 29 3b ink(LinkSource);
fb90: 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a . }.}.#endif.
fba0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fbf0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 46 69 6c --. *. * TclpFil
fc00: 65 73 79 73 74 65 6d 50 61 74 68 54 79 70 65 20 esystemPathType
fc10: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
fc20: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f nction is part o
fc30: 66 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c f the native fil
fc40: 65 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 2c esystem support,
fc50: 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 and returns. *.
fc60: 74 68 65 20 70 61 74 68 20 74 79 70 65 20 6f 66 the path type of
fc70: 20 74 68 65 20 67 69 76 65 6e 20 70 61 74 68 2e the given path.
fc80: 20 52 65 74 75 72 6e 73 20 4e 54 46 53 20 6f 72 Returns NTFS or
fc90: 20 46 41 54 20 6f 72 20 77 68 61 74 65 76 65 72 FAT or whatever
fca0: 20 69 73 0a 20 2a 09 72 65 74 75 72 6e 65 64 20 is. *.returned
fcb0: 62 79 20 74 68 65 20 27 76 6f 6c 75 6d 65 20 69 by the 'volume i
fcc0: 6e 66 6f 72 6d 61 74 69 6f 6e 27 20 70 72 6f 63 nformation' proc
fcd0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
fce0: 0a 20 2a 09 4e 55 4c 4c 20 61 74 20 70 72 65 73 . *.NULL at pres
fcf0: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ent.. *. * Side
fd00: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
fd10: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
fd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd60: 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 --. */..Tcl_Obj
fd70: 2a 0a 54 63 6c 70 46 69 6c 65 73 79 73 74 65 6d *.TclpFilesystem
fd80: 50 61 74 68 54 79 70 65 28 0a 20 20 20 20 54 63 PathType(. Tc
fd90: 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 0a l_Obj *pathPtr).
fda0: 7b 0a 23 64 65 66 69 6e 65 20 56 4f 4c 5f 42 55 {.#define VOL_BU
fdb0: 46 5f 53 49 5a 45 20 33 32 0a 20 20 20 20 69 6e F_SIZE 32. in
fdc0: 74 20 66 6f 75 6e 64 3b 0a 20 20 20 20 57 43 48 t found;. WCH
fdd0: 41 52 20 76 6f 6c 54 79 70 65 5b 56 4f 4c 5f 42 AR volType[VOL_B
fde0: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 63 68 UF_SIZE];. ch
fdf0: 61 72 20 2a 66 69 72 73 74 53 65 70 61 72 61 74 ar *firstSeparat
fe00: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 or;. const ch
fe10: 61 72 20 2a 70 61 74 68 3b 0a 20 20 20 20 54 63 ar *path;. Tc
fe20: 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 50 61 74 68 20 l_Obj *normPath
fe30: 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 = Tcl_FSGetNorma
fe40: 6c 69 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 lizedPath(NULL,
fe50: 70 61 74 68 50 74 72 29 3b 0a 0a 20 20 20 20 69 pathPtr);.. i
fe60: 66 20 28 6e 6f 72 6d 50 61 74 68 20 3d 3d 20 4e f (normPath == N
fe70: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ULL) {..return N
fe80: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 ULL;. }. p
fe90: 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ath = Tcl_GetStr
fea0: 69 6e 67 28 6e 6f 72 6d 50 61 74 68 29 3b 0a 20 ing(normPath);.
feb0: 20 20 20 69 66 20 28 70 61 74 68 20 3d 3d 20 4e if (path == N
fec0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e ULL) {..return N
fed0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
fee0: 66 69 72 73 74 53 65 70 61 72 61 74 6f 72 20 3d firstSeparator =
fef0: 20 73 74 72 63 68 72 28 70 61 74 68 2c 20 27 2f strchr(path, '/
ff00: 27 29 3b 0a 20 20 20 20 69 66 20 28 66 69 72 73 ');. if (firs
ff10: 74 53 65 70 61 72 61 74 6f 72 20 3d 3d 20 4e 55 tSeparator == NU
ff20: 4c 4c 29 20 7b 0a 09 66 6f 75 6e 64 20 3d 20 74 LL) {..found = t
ff30: 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 56 clWinProcs->getV
ff40: 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 6f 6e olumeInformation
ff50: 50 72 6f 63 28 0a 09 09 54 63 6c 5f 46 53 47 65 Proc(...Tcl_FSGe
ff60: 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68 tNativePath(path
ff70: 50 74 72 29 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e Ptr), NULL, 0, N
ff80: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c ULL, NULL, NULL,
ff90: 0a 09 09 28 57 43 48 41 52 20 2a 29 20 76 6f 6c ...(WCHAR *) vol
ffa0: 54 79 70 65 2c 20 56 4f 4c 5f 42 55 46 5f 53 49 Type, VOL_BUF_SI
ffb0: 5a 45 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ZE);. } else
ffc0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 64 72 69 76 {..Tcl_Obj *driv
ffd0: 65 4e 61 6d 65 20 3d 20 54 63 6c 5f 4e 65 77 53 eName = Tcl_NewS
ffe0: 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 2c 20 66 tringObj(path, f
fff0: 69 72 73 74 53 65 70 61 72 61 74 6f 72 20 2d 20 irstSeparator -
10000 70 61 74 68 2b 31 29 3b 0a 0a 09 54 63 6c 5f 49 path+1);...Tcl_I
10010 6e 63 72 52 65 66 43 6f 75 6e 74 28 64 72 69 76 ncrRefCount(driv
10020 65 4e 61 6d 65 29 3b 0a 09 66 6f 75 6e 64 20 3d eName);..found =
10030 20 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 tclWinProcs->ge
10040 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 tVolumeInformati
10050 6f 6e 50 72 6f 63 28 0a 09 09 54 63 6c 5f 46 53 onProc(...Tcl_FS
10060 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 64 72 GetNativePath(dr
10070 69 76 65 4e 61 6d 65 29 2c 20 4e 55 4c 4c 2c 20 iveName), NULL,
10080 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 0, NULL, NULL, N
10090 55 4c 4c 2c 0a 09 09 28 57 43 48 41 52 20 2a 29 ULL,...(WCHAR *)
100a0 20 76 6f 6c 54 79 70 65 2c 20 56 4f 4c 5f 42 55 volType, VOL_BU
100b0 46 5f 53 49 5a 45 29 3b 0a 09 54 63 6c 5f 44 65 F_SIZE);..Tcl_De
100c0 63 72 52 65 66 43 6f 75 6e 74 28 64 72 69 76 65 crRefCount(drive
100d0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 Name);. }..
100e0 20 20 69 66 20 28 66 6f 75 6e 64 20 3d 3d 20 30 if (found == 0
100f0 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
10100 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
10110 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a Tcl_DString ds;.
10120 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 .Tcl_Obj *objPtr
10130 3b 0a 0a 09 54 63 6c 5f 57 69 6e 54 43 68 61 72 ;...Tcl_WinTChar
10140 54 6f 55 74 66 28 28 63 6f 6e 73 74 20 63 68 61 ToUtf((const cha
10150 72 20 2a 29 20 76 6f 6c 54 79 70 65 2c 20 2d 31 r *) volType, -1
10160 2c 20 26 64 73 29 3b 0a 09 6f 62 6a 50 74 72 20 , &ds);..objPtr
10170 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
10180 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 bj(Tcl_DStringVa
10190 6c 75 65 28 26 64 73 29 2c 0a 09 09 54 63 6c 5f lue(&ds),...Tcl_
101a0 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 DStringLength(&d
101b0 73 29 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e s));..Tcl_DStrin
101c0 67 46 72 65 65 28 26 64 73 29 3b 0a 09 72 65 74 gFree(&ds);..ret
101d0 75 72 6e 20 6f 62 6a 50 74 72 3b 0a 20 20 20 20 urn objPtr;.
101e0 7d 0a 23 75 6e 64 65 66 20 56 4f 4c 5f 42 55 46 }.#undef VOL_BUF
101f0 5f 53 49 5a 45 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 _SIZE.}.../*. *
10200 54 68 69 73 20 64 65 66 69 6e 65 20 63 61 6e 20 This define can
10210 62 65 20 74 75 72 6e 65 64 20 6f 6e 20 74 6f 20 be turned on to
10220 65 78 70 65 72 69 6d 65 6e 74 20 77 69 74 68 20 experiment with
10230 61 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 20 a different way
10240 6f 66 0a 20 2a 20 6e 6f 72 6d 61 6c 69 7a 69 6e of. * normalizin
10250 67 20 70 61 74 68 73 20 28 75 73 69 6e 67 20 61 g paths (using a
10260 20 64 69 66 66 65 72 65 6e 74 20 57 69 6e 64 6f different Windo
10270 77 73 20 41 50 49 29 2e 20 55 6e 66 6f 72 74 75 ws API). Unfortu
10280 6e 61 74 65 6c 79 20 74 68 65 20 6e 65 77 0a 20 nately the new.
10290 2a 20 70 61 74 68 20 73 65 65 6d 73 20 74 6f 20 * path seems to
102a0 74 61 6b 65 20 61 6c 6d 6f 73 74 20 65 78 61 63 take almost exac
102b0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f tly the same amo
102c0 75 6e 74 20 6f 66 20 74 69 6d 65 20 61 73 20 74 unt of time as t
102d0 68 65 20 6f 6c 64 20 70 61 74 68 21 0a 20 2a 20 he old path!. *
102e0 54 68 65 20 70 72 69 6d 61 72 79 20 74 69 6d 65 The primary time
102f0 20 74 61 6b 65 6e 20 62 79 20 6e 6f 72 6d 61 6c taken by normal
10300 69 7a 61 74 69 6f 6e 20 69 73 20 69 6e 0a 20 2a ization is in. *
10310 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 GetFileAttribut
10320 65 73 45 78 2f 46 69 6e 64 46 69 72 73 74 46 69 esEx/FindFirstFi
10330 6c 65 20 6f 72 20 47 65 74 46 69 6c 65 41 74 74 le or GetFileAtt
10340 72 69 62 75 74 65 73 45 78 2f 47 65 74 4c 6f 6e ributesEx/GetLon
10350 67 50 61 74 68 4e 61 6d 65 2e 0a 20 2a 20 43 6f gPathName.. * Co
10360 6e 76 65 72 73 69 6f 6e 20 74 6f 2f 66 72 6f 6d nversion to/from
10370 20 6e 61 74 69 76 65 20 69 73 20 6e 6f 74 20 61 native is not a
10380 20 73 69 67 6e 69 66 69 63 61 6e 74 20 66 61 63 significant fac
10390 74 6f 72 20 61 74 20 61 6c 6c 2e 0a 20 2a 0a 20 tor at all.. *.
103a0 2a 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 77 65 * Also, since we
103b0 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 66 have to check f
103c0 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b or symbolic link
103d0 73 20 28 72 65 70 61 72 73 65 20 70 6f 69 6e 74 s (reparse point
103e0 73 29 20 74 68 65 6e 20 77 65 0a 20 2a 20 68 61 s) then we. * ha
103f0 76 65 20 74 6f 20 63 61 6c 6c 20 47 65 74 46 69 ve to call GetFi
10400 6c 65 41 74 74 72 69 62 75 74 65 73 20 6f 6e 20 leAttributes on
10410 65 61 63 68 20 70 61 74 68 20 73 65 67 6d 65 6e each path segmen
10420 74 20 61 6e 79 77 61 79 2c 20 73 6f 20 74 68 65 t anyway, so the
10430 72 65 27 73 20 6e 6f 0a 20 2a 20 62 65 6e 65 66 re's no. * benef
10440 69 74 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 74 it to doing anyt
10450 68 69 6e 67 20 63 6c 65 76 65 72 20 74 68 65 72 hing clever ther
10460 65 2e 0a 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 e.. */../* #defi
10470 6e 65 20 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f ne TclNORM_LONG_
10480 50 41 54 48 20 2a 2f 0a 0c 0a 2f 2a 0a 20 2a 2d PATH */.../*. *-
10490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
104a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
104b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
104c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
104d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
104e0 20 54 63 6c 70 4f 62 6a 4e 6f 72 6d 61 6c 69 7a TclpObjNormaliz
104f0 65 50 61 74 68 20 2d 2d 0a 20 2a 0a 20 2a 09 54 ePath --. *. *.T
10500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 63 61 his function sca
10510 6e 73 20 74 68 72 6f 75 67 68 20 61 20 70 61 74 ns through a pat
10520 68 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 h specification
10530 61 6e 64 20 72 65 70 6c 61 63 65 73 20 69 74 2c and replaces it,
10540 20 69 6e 0a 20 2a 09 70 6c 61 63 65 2c 20 77 69 in. *.place, wi
10550 74 68 20 61 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 th a normalized
10560 76 65 72 73 69 6f 6e 2e 20 54 68 69 73 20 6d 65 version. This me
10570 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 27 6c ans using the 'l
10580 6f 6e 67 6e 61 6d 65 27 2c 20 61 6e 64 0a 20 2a ongname', and. *
10590 09 65 78 70 61 6e 64 69 6e 67 20 61 6e 79 20 73 .expanding any s
105a0 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 63 6f ymbolic links co
105b0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 ntained within t
105c0 68 65 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 52 he path.. *. * R
105d0 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e esults:. *.The n
105e0 65 77 20 27 6e 65 78 74 43 68 65 63 6b 70 6f 69 ew 'nextCheckpoi
105f0 6e 74 27 20 76 61 6c 75 65 2c 20 67 69 76 69 6e nt' value, givin
10600 67 20 61 73 20 66 61 72 20 61 73 20 77 65 20 63 g as far as we c
10610 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 0a ould understand.
10620 20 2a 09 69 6e 20 74 68 65 20 70 61 74 68 2e 0a *.in the path..
10630 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
10640 74 73 3a 0a 20 2a 09 54 68 65 20 70 61 74 68 50 ts:. *.The pathP
10650 74 72 20 73 74 72 69 6e 67 2c 20 77 68 69 63 68 tr string, which
10660 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20 must contain a
10670 76 61 6c 69 64 20 70 61 74 68 2c 20 69 73 20 70 valid path, is p
10680 6f 73 73 69 62 6c 79 0a 20 2a 09 6d 6f 64 69 66 ossibly. *.modif
10690 69 65 64 20 69 6e 20 70 6c 61 63 65 2e 0a 20 2a ied in place.. *
106a0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
106f0 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 4e */..int.TclpObjN
10700 6f 72 6d 61 6c 69 7a 65 50 61 74 68 28 0a 20 20 ormalizePath(.
10710 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
10720 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 terp,. Tcl_Ob
10730 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 20 20 j *pathPtr,.
10740 69 6e 74 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 int nextCheckpoi
10750 6e 74 29 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a nt).{. char *
10760 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 lastValidPathEnd
10770 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
10780 5f 44 53 74 72 69 6e 67 20 64 73 4e 6f 72 6d 3b _DString dsNorm;
10790 09 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 68 ../* This will h
107a0 6f 6c 64 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a old the normaliz
107b0 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 ed string. */.
107c0 20 20 63 68 61 72 20 2a 70 61 74 68 2c 20 2a 63 char *path, *c
107d0 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 urrentPathEndPos
107e0 69 74 69 6f 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f ition;. Tcl_O
107f0 62 6a 20 2a 74 65 6d 70 20 3d 20 4e 55 4c 4c 3b bj *temp = NULL;
10800 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e .. Tcl_DStrin
10810 67 49 6e 69 74 28 26 64 73 4e 6f 72 6d 29 3b 0a gInit(&dsNorm);.
10820 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c 5f 47 path = Tcl_G
10830 65 74 53 74 72 69 6e 67 28 70 61 74 68 50 74 72 etString(pathPtr
10840 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 57 );.. if (TclW
10850 69 6e 47 65 74 50 6c 61 74 66 6f 72 6d 49 64 28 inGetPlatformId(
10860 29 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 ) == VER_PLATFOR
10870 4d 5f 57 49 4e 33 32 5f 57 49 4e 44 4f 57 53 29 M_WIN32_WINDOWS)
10880 20 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 27 72 65 {../*.. * We're
10890 20 6f 6e 20 57 69 6e 39 35 2c 20 39 38 20 6f 72 on Win95, 98 or
108a0 20 4d 45 2e 20 54 68 65 72 65 20 61 72 65 20 74 ME. There are t
108b0 77 6f 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 69 wo assumptions i
108c0 6e 20 74 68 69 73 20 62 6c 6f 63 6b 0a 09 20 2a n this block.. *
108d0 20 6f 66 20 63 6f 64 65 2e 20 46 69 72 73 74 20 of code. First
108e0 74 68 61 74 20 74 68 65 20 6e 61 74 69 76 65 20 that the native
108f0 28 4e 55 4c 4c 29 20 65 6e 63 6f 64 69 6e 67 20 (NULL) encoding
10900 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 73 63 is basically asc
10910 69 69 2c 0a 09 20 2a 20 61 6e 64 20 73 65 63 6f ii,.. * and seco
10920 6e 64 20 74 68 61 74 20 73 79 6d 62 6f 6c 69 63 nd that symbolic
10930 20 6c 69 6e 6b 73 20 61 72 65 20 6e 6f 74 20 70 links are not p
10940 6f 73 73 69 62 6c 65 2e 20 42 6f 74 68 20 6f 66 ossible. Both of
10950 20 74 68 65 73 65 0a 09 20 2a 20 61 73 73 75 6d these.. * assum
10960 70 74 69 6f 6e 73 20 61 70 70 65 61 72 20 74 6f ptions appear to
10970 20 62 65 20 74 72 75 65 20 6f 66 20 74 68 65 73 be true of thes
10980 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 e operating syst
10990 65 6d 73 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20 ems... */...int
109a0 69 73 44 72 69 76 65 20 3d 20 31 3b 0a 09 54 63 isDrive = 1;..Tc
109b0 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 0a 09 l_DString ds;...
109c0 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f currentPathEndPo
109d0 73 69 74 69 6f 6e 20 3d 20 70 61 74 68 20 2b 20 sition = path +
109e0 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a nextCheckpoint;.
109f0 09 69 66 20 28 2a 63 75 72 72 65 6e 74 50 61 74 .if (*currentPat
10a00 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 3d 20 hEndPosition ==
10a10 27 2f 27 29 20 7b 0a 09 20 20 20 20 63 75 72 72 '/') {.. curr
10a20 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 entPathEndPositi
10a30 6f 6e 2b 2b 3b 0a 09 7d 0a 0a 09 77 68 69 6c 65 on++;..}...while
10a40 20 28 31 29 20 7b 0a 09 20 20 20 20 63 68 61 72 (1) {.. char
10a50 20 63 75 72 20 3d 20 2a 63 75 72 72 65 6e 74 50 cur = *currentP
10a60 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a athEndPosition;.
10a70 0a 09 20 20 20 20 69 66 20 28 28 63 75 72 3d 3d .. if ((cur==
10a80 27 2f 27 20 7c 7c 20 63 75 72 3d 3d 30 29 20 26 '/' || cur==0) &
10a90 26 20 28 70 61 74 68 20 21 3d 20 63 75 72 72 65 & (path != curre
10aa0 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
10ab0 6e 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 n)) {.../*... *
10ac0 52 65 61 63 68 65 64 20 64 69 72 65 63 74 6f 72 Reached director
10ad0 79 20 73 65 70 61 72 61 74 6f 72 2c 20 6f 72 20 y separator, or
10ae0 65 6e 64 20 6f 66 20 73 74 72 69 6e 67 2e 0a 09 end of string...
10af0 09 20 2a 2f 0a 0a 09 09 63 6f 6e 73 74 20 63 68 . */....const ch
10b00 61 72 20 2a 6e 61 74 69 76 65 50 61 74 68 20 3d ar *nativePath =
10b10 20 54 63 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e Tcl_UtfToExtern
10b20 61 6c 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 alDString(NULL,
10b30 70 61 74 68 2c 0a 09 09 09 63 75 72 72 65 6e 74 path,....current
10b40 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 PathEndPosition
10b50 2d 20 70 61 74 68 2c 20 26 64 73 29 3b 0a 0a 09 - path, &ds);...
10b60 09 2f 2a 0a 09 09 20 2a 20 4e 6f 77 20 77 65 20 ./*... * Now we
10b70 63 6f 6e 76 65 72 74 20 74 68 65 20 74 61 69 6c convert the tail
10b80 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 of the current
10b90 70 61 74 68 20 74 6f 20 69 74 73 20 27 6c 6f 6e path to its 'lon
10ba0 67 0a 09 09 20 2a 20 66 6f 72 6d 27 2c 20 61 6e g... * form', an
10bb0 64 20 61 70 70 65 6e 64 20 69 74 20 74 6f 20 27 d append it to '
10bc0 64 73 4e 6f 72 6d 27 20 77 68 69 63 68 20 68 6f dsNorm' which ho
10bd0 6c 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a lds the current.
10be0 09 09 20 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 .. * normalized
10bf0 70 61 74 68 2c 20 69 66 20 74 68 65 20 66 69 6c path, if the fil
10c00 65 20 65 78 69 73 74 73 2e 0a 09 09 20 2a 2f 0a e exists.... */.
10c10 0a 09 09 69 66 20 28 69 73 44 72 69 76 65 29 20 ...if (isDrive)
10c20 7b 0a 09 09 20 20 20 20 69 66 20 28 47 65 74 46 {... if (GetF
10c30 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 6e ileAttributesA(n
10c40 61 74 69 76 65 50 61 74 68 29 0a 09 09 09 20 20 ativePath)....
10c50 20 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c == INVALID_FIL
10c60 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a E_ATTRIBUTES) {.
10c70 09 09 09 2f 2a 0a 09 09 09 20 2a 20 46 69 6c 65 .../*.... * File
10c80 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a doesn't exist..
10c90 09 09 09 20 2a 2f 0a 0a 09 09 09 69 66 20 28 69 ... */.....if (i
10ca0 73 44 72 69 76 65 29 20 7b 0a 09 09 09 20 20 20 sDrive) {....
10cb0 20 69 6e 74 20 6c 65 6e 20 3d 20 57 69 6e 49 73 int len = WinIs
10cc0 52 65 73 65 72 76 65 64 28 70 61 74 68 29 3b 0a Reserved(path);.
10cd0 0a 09 09 09 20 20 20 20 69 66 20 28 6c 65 6e 20 .... if (len
10ce0 3e 20 30 29 20 7b 0a 09 09 09 09 2f 2a 0a 09 09 > 0) {...../*...
10cf0 09 09 20 2a 20 41 63 74 75 61 6c 6c 79 20 69 74 .. * Actually it
10d00 20 64 6f 65 73 20 65 78 69 73 74 20 2d 20 43 4f does exist - CO
10d10 4d 31 2c 20 65 74 63 2e 0a 09 09 09 09 20 2a 2f M1, etc...... */
10d20 0a 0a 09 09 09 09 69 6e 74 20 69 3b 0a 0a 09 09 ......int i;....
10d30 09 09 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c 6c ..for (i=0 ; i<l
10d40 65 6e 20 3b 20 69 2b 2b 29 20 7b 0a 09 09 09 09 en ; i++) {.....
10d50 20 20 20 20 69 66 20 28 6e 61 74 69 76 65 50 61 if (nativePa
10d60 74 68 5b 69 5d 20 3e 3d 20 27 61 27 29 20 7b 0a th[i] >= 'a') {.
10d70 09 09 09 09 09 28 28 63 68 61 72 20 2a 29 20 6e .....((char *) n
10d80 61 74 69 76 65 50 61 74 68 29 5b 69 5d 20 2d 3d ativePath)[i] -=
10d90 20 28 27 61 27 2d 27 41 27 29 3b 0a 09 09 09 09 ('a'-'A');.....
10da0 20 20 20 20 7d 0a 09 09 09 09 7d 0a 09 09 09 09 }.....}.....
10db0 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e Tcl_DStringAppen
10dc0 64 28 26 64 73 4e 6f 72 6d 2c 20 6e 61 74 69 76 d(&dsNorm, nativ
10dd0 65 50 61 74 68 2c 20 6c 65 6e 29 3b 0a 09 09 09 ePath, len);....
10de0 09 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e .lastValidPathEn
10df0 64 20 3d 20 63 75 72 72 65 6e 74 50 61 74 68 45 d = currentPathE
10e00 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 09 09 09 20 ndPosition;....
10e10 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6e 65 } else if (ne
10e20 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d 3d 20 xtCheckpoint ==
10e30 30 29 20 7b 0a 09 09 09 09 2f 2a 20 50 61 74 68 0) {...../* Path
10e40 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 starts with a d
10e50 72 69 76 65 20 64 65 73 69 67 6e 61 74 69 6f 6e rive designation
10e60 0a 09 09 09 09 20 2a 20 74 68 61 74 27 73 20 6e ..... * that's n
10e70 6f 74 20 61 63 74 75 61 6c 6c 79 20 6f 6e 20 74 ot actually on t
10e80 68 65 20 73 79 73 74 65 6d 2e 0a 09 09 09 09 20 he system......
10e90 2a 20 57 65 20 73 74 69 6c 6c 20 6d 75 73 74 20 * We still must
10ea0 6e 6f 72 6d 61 6c 69 7a 65 20 75 70 20 70 61 73 normalize up pas
10eb0 74 20 74 68 65 0a 09 09 09 09 20 2a 20 66 69 72 t the..... * fir
10ec0 73 74 20 73 65 70 61 72 61 74 6f 72 2e 20 20 5b st separator. [
10ed0 42 75 67 20 33 36 30 33 34 33 34 5d 20 2a 2f 0a Bug 3603434] */.
10ee0 09 09 09 09 63 75 72 72 65 6e 74 50 61 74 68 45 ....currentPathE
10ef0 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 09 09 ndPosition++;...
10f00 09 20 20 20 20 7d 0a 09 09 09 7d 0a 09 09 09 54 . }....}....T
10f10 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 cl_DStringFree(&
10f20 64 73 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 ds);....break;..
10f30 09 20 20 20 20 7d 0a 09 09 20 20 20 20 69 66 20 . }... if
10f40 28 6e 61 74 69 76 65 50 61 74 68 5b 30 5d 20 3e (nativePath[0] >
10f50 3d 20 27 61 27 29 20 7b 0a 09 09 09 28 28 63 68 = 'a') {....((ch
10f60 61 72 20 2a 29 20 6e 61 74 69 76 65 50 61 74 68 ar *) nativePath
10f70 29 5b 30 5d 20 2d 3d 20 28 27 61 27 20 2d 20 27 )[0] -= ('a' - '
10f80 41 27 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 A');... }...
10f90 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 Tcl_DStringAp
10fa0 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 6e 61 pend(&dsNorm, na
10fb0 74 69 76 65 50 61 74 68 2c 0a 09 09 09 20 20 20 tivePath,....
10fc0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 Tcl_DStringLeng
10fd0 74 68 28 26 64 73 29 29 3b 0a 09 09 7d 20 65 6c th(&ds));...} el
10fe0 73 65 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20 se {... char
10ff0 2a 63 68 65 63 6b 44 6f 74 73 20 3d 20 4e 55 4c *checkDots = NUL
11000 4c 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 6c 61 L;.... if (la
11010 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 5b 31 stValidPathEnd[1
11020 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 09 63 ] == '.') {....c
11030 68 65 63 6b 44 6f 74 73 20 3d 20 6c 61 73 74 56 heckDots = lastV
11040 61 6c 69 64 50 61 74 68 45 6e 64 20 2b 20 31 3b alidPathEnd + 1;
11050 0a 09 09 09 77 68 69 6c 65 20 28 63 68 65 63 6b ....while (check
11060 44 6f 74 73 20 3c 20 63 75 72 72 65 6e 74 50 61 Dots < currentPa
11070 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 29 20 7b thEndPosition) {
11080 0a 09 09 09 20 20 20 20 69 66 20 28 2a 63 68 65 .... if (*che
11090 63 6b 44 6f 74 73 20 21 3d 20 27 2e 27 29 20 7b ckDots != '.') {
110a0 0a 09 09 09 09 63 68 65 63 6b 44 6f 74 73 20 3d .....checkDots =
110b0 20 4e 55 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b NULL;.....break
110c0 3b 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 20 20 ;.... }....
110d0 20 20 63 68 65 63 6b 44 6f 74 73 2b 2b 3b 0a 09 checkDots++;..
110e0 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 ..}... }...
110f0 20 20 69 66 20 28 63 68 65 63 6b 44 6f 74 73 20 if (checkDots
11100 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 6e != NULL) {....in
11110 74 20 64 6f 74 4c 65 6e 20 3d 20 63 75 72 72 65 t dotLen = curre
11120 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
11130 6e 2d 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 n-lastValidPathE
11140 6e 64 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a nd;...../*.... *
11150 20 50 61 74 68 20 69 73 20 6a 75 73 74 20 64 6f Path is just do
11160 74 73 2e 20 57 65 20 73 68 6f 75 6c 64 6e 27 74 ts. We shouldn't
11170 20 72 65 61 6c 6c 79 20 65 76 65 72 20 73 65 65 really ever see
11180 20 61 0a 09 09 09 20 2a 20 70 61 74 68 20 6c 69 a.... * path li
11190 6b 65 20 74 68 61 74 2e 20 48 6f 77 65 76 65 72 ke that. However
111a0 2c 20 74 6f 20 62 65 20 6e 69 63 65 20 77 65 20 , to be nice we
111b0 61 74 20 6c 65 61 73 74 0a 09 09 09 20 2a 20 64 at least.... * d
111c0 6f 6e 27 74 20 6d 61 6e 67 6c 65 20 74 68 65 20 on't mangle the
111d0 70 61 74 68 20 2d 20 77 65 20 6a 75 73 74 20 61 path - we just a
111e0 64 64 20 74 68 65 20 64 6f 74 73 20 61 73 20 61 dd the dots as a
111f0 0a 09 09 09 20 2a 20 70 61 74 68 20 73 65 67 6d .... * path segm
11200 65 6e 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 ent and continue
11210 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 54 63 6c 5f .... */.....Tcl_
11220 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 DStringAppend(&d
11230 73 4e 6f 72 6d 2c 20 28 54 43 48 41 52 20 2a 29 sNorm, (TCHAR *)
11240 0a 09 09 09 09 28 6e 61 74 69 76 65 50 61 74 68 .....(nativePath
11250 20 2b 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 + Tcl_DStringLe
11260 6e 67 74 68 28 26 64 73 29 2d 64 6f 74 4c 65 6e ngth(&ds)-dotLen
11270 29 2c 0a 09 09 09 09 64 6f 74 4c 65 6e 29 3b 0a ),.....dotLen);.
11280 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
11290 09 09 2f 2a 0a 09 09 09 20 2a 20 4e 6f 72 6d 61 ../*.... * Norma
112a0 6c 20 70 61 74 68 2e 0a 09 09 09 20 2a 2f 0a 0a l path..... */..
112b0 09 09 09 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 ...WIN32_FIND_DA
112c0 54 41 20 66 44 61 74 61 3b 0a 09 09 09 48 41 4e TA fData;....HAN
112d0 44 4c 45 20 68 61 6e 64 6c 65 3b 0a 0a 09 09 09 DLE handle;.....
112e0 68 61 6e 64 6c 65 20 3d 20 46 69 6e 64 46 69 72 handle = FindFir
112f0 73 74 46 69 6c 65 41 28 6e 61 74 69 76 65 50 61 stFileA(nativePa
11300 74 68 2c 20 26 66 44 61 74 61 29 3b 0a 09 09 09 th, &fData);....
11310 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e if (handle == IN
11320 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c VALID_HANDLE_VAL
11330 55 45 29 20 7b 0a 09 09 09 20 20 20 20 69 66 20 UE) {.... if
11340 28 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 (GetFileAttribut
11350 65 73 41 28 6e 61 74 69 76 65 50 61 74 68 29 0a esA(nativePath).
11360 09 09 09 09 20 20 20 20 3d 3d 20 49 4e 56 41 4c .... == INVAL
11370 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 ID_FILE_ATTRIBUT
11380 45 53 29 20 7b 0a 09 09 09 09 2f 2a 0a 09 09 09 ES) {...../*....
11390 09 20 2a 20 46 69 6c 65 20 64 6f 65 73 6e 27 74 . * File doesn't
113a0 20 65 78 69 73 74 2e 0a 09 09 09 09 20 2a 2f 0a exist...... */.
113b0 0a 09 09 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 .....Tcl_DString
113c0 46 72 65 65 28 26 64 73 29 3b 0a 09 09 09 09 62 Free(&ds);.....b
113d0 72 65 61 6b 3b 0a 09 09 09 20 20 20 20 7d 0a 0a reak;.... }..
113e0 09 09 09 20 20 20 20 2f 2a 0a 09 09 09 20 20 20 ... /*....
113f0 20 20 2a 20 54 68 69 73 20 69 73 20 75 73 75 61 * This is usua
11400 6c 6c 79 20 74 68 65 20 27 2f 27 20 69 6e 20 27 lly the '/' in '
11410 63 3a 2f 27 20 61 74 20 65 6e 64 20 6f 66 0a 09 c:/' at end of..
11420 09 09 20 20 20 20 20 2a 20 73 74 72 69 6e 67 2e .. * string.
11430 0a 09 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 09 .... */.....
11440 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 Tcl_DStringA
11450 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 22 2f ppend(&dsNorm,"/
11460 22 2c 20 31 29 3b 0a 09 09 09 7d 20 65 6c 73 65 ", 1);....} else
11470 20 7b 0a 09 09 09 20 20 20 20 63 68 61 72 20 2a {.... char *
11480 6e 61 74 69 76 65 4e 61 6d 65 3b 0a 0a 09 09 09 nativeName;.....
11490 20 20 20 20 69 66 20 28 66 44 61 74 61 2e 63 46 if (fData.cF
114a0 69 6c 65 4e 61 6d 65 5b 30 5d 20 21 3d 20 27 5c ileName[0] != '\
114b0 30 27 29 20 7b 0a 09 09 09 09 6e 61 74 69 76 65 0') {.....native
114c0 4e 61 6d 65 20 3d 20 66 44 61 74 61 2e 63 46 69 Name = fData.cFi
114d0 6c 65 4e 61 6d 65 3b 0a 09 09 09 20 20 20 20 7d leName;.... }
114e0 20 65 6c 73 65 20 7b 0a 09 09 09 09 6e 61 74 69 else {.....nati
114f0 76 65 4e 61 6d 65 20 3d 20 66 44 61 74 61 2e 63 veName = fData.c
11500 41 6c 74 65 72 6e 61 74 65 46 69 6c 65 4e 61 6d AlternateFileNam
11510 65 3b 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 20 e;.... }....
11520 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 61 6e FindClose(han
11530 64 6c 65 29 3b 0a 09 09 09 20 20 20 20 54 63 6c dle);.... Tcl
11540 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 _DStringAppend(&
11550 64 73 4e 6f 72 6d 2c 22 2f 22 2c 20 31 29 3b 0a dsNorm,"/", 1);.
11560 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ... Tcl_DStri
11570 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d ngAppend(&dsNorm
11580 2c 6e 61 74 69 76 65 4e 61 6d 65 2c 2d 31 29 3b ,nativeName,-1);
11590 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 ....}... }...
115a0 7d 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 }...Tcl_DStringF
115b0 72 65 65 28 26 64 73 29 3b 0a 09 09 6c 61 73 74 ree(&ds);...last
115c0 56 61 6c 69 64 50 61 74 68 45 6e 64 20 3d 20 63 ValidPathEnd = c
115d0 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 urrentPathEndPos
115e0 69 74 69 6f 6e 3b 0a 09 09 69 66 20 28 63 75 72 ition;...if (cur
115f0 20 3d 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 62 == 0) {... b
11600 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a reak;...}..../*.
11610 09 09 20 2a 20 49 66 20 77 65 20 67 65 74 20 68 .. * If we get h
11620 65 72 65 2c 20 77 65 27 76 65 20 67 6f 74 20 70 ere, we've got p
11630 61 73 74 20 6f 6e 65 20 64 69 72 65 63 74 6f 72 ast one director
11640 79 20 64 65 6c 69 6d 69 74 65 72 2c 20 73 6f 0a y delimiter, so.
11650 09 09 20 2a 20 77 65 20 6b 6e 6f 77 20 69 74 20 .. * we know it
11660 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 20 64 is no longer a d
11670 72 69 76 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 rive.... */....i
11680 73 44 72 69 76 65 20 3d 20 30 3b 0a 09 20 20 20 sDrive = 0;..
11690 20 7d 0a 09 20 20 20 20 63 75 72 72 65 6e 74 50 }.. currentP
116a0 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b athEndPosition++
116b0 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ;..}. } else
116c0 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 27 72 65 20 {../*.. * We're
116d0 6f 6e 20 57 69 6e 4e 54 20 28 6f 72 20 32 30 30 on WinNT (or 200
116e0 30 20 6f 72 20 58 50 3b 20 73 6f 6d 65 74 68 69 0 or XP; somethi
116f0 6e 67 20 77 69 74 68 20 61 6e 20 4e 54 20 63 6f ng with an NT co
11700 72 65 29 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20 re)... */...int
11710 69 73 44 72 69 76 65 20 3d 20 31 3b 0a 09 54 63 isDrive = 1;..Tc
11720 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 0a 09 l_DString ds;...
11730 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f currentPathEndPo
11740 73 69 74 69 6f 6e 20 3d 20 70 61 74 68 20 2b 20 sition = path +
11750 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a nextCheckpoint;.
11760 09 69 66 20 28 2a 63 75 72 72 65 6e 74 50 61 74 .if (*currentPat
11770 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 3d 20 hEndPosition ==
11780 27 2f 27 29 20 7b 0a 09 20 20 20 20 63 75 72 72 '/') {.. curr
11790 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 entPathEndPositi
117a0 6f 6e 2b 2b 3b 0a 09 7d 0a 09 77 68 69 6c 65 20 on++;..}..while
117b0 28 31 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 (1) {.. char
117c0 63 75 72 20 3d 20 2a 63 75 72 72 65 6e 74 50 61 cur = *currentPa
117d0 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 0a thEndPosition;..
117e0 09 20 20 20 20 69 66 20 28 28 63 75 72 3d 3d 27 . if ((cur=='
117f0 2f 27 20 7c 7c 20 63 75 72 3d 3d 30 29 20 26 26 /' || cur==0) &&
11800 20 28 70 61 74 68 20 21 3d 20 63 75 72 72 65 6e (path != curren
11810 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e tPathEndPosition
11820 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 52 )) {.../*... * R
11830 65 61 63 68 65 64 20 64 69 72 65 63 74 6f 72 79 eached directory
11840 20 73 65 70 61 72 61 74 6f 72 2c 20 6f 72 20 65 separator, or e
11850 6e 64 20 6f 66 20 73 74 72 69 6e 67 2e 0a 09 09 nd of string....
11860 20 2a 2f 0a 0a 09 09 57 49 4e 33 32 5f 46 49 4c */....WIN32_FIL
11870 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 E_ATTRIBUTE_DATA
11880 20 64 61 74 61 3b 0a 09 09 63 6f 6e 73 74 20 63 data;...const c
11890 68 61 72 20 2a 6e 61 74 69 76 65 50 61 74 68 20 har *nativePath
118a0 3d 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54 43 = Tcl_WinUtfToTC
118b0 68 61 72 28 70 61 74 68 2c 0a 09 09 09 63 75 72 har(path,....cur
118c0 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 rentPathEndPosit
118d0 69 6f 6e 20 2d 20 70 61 74 68 2c 20 26 64 73 29 ion - path, &ds)
118e0 3b 0a 0a 09 09 69 66 20 28 28 2a 74 63 6c 57 69 ;....if ((*tclWi
118f0 6e 50 72 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 nProcs->getFileA
11900 74 74 72 69 62 75 74 65 73 45 78 50 72 6f 63 29 ttributesExProc)
11910 28 6e 61 74 69 76 65 50 61 74 68 2c 0a 09 09 09 (nativePath,....
11920 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 GetFileExInfoSta
11930 6e 64 61 72 64 2c 20 26 64 61 74 61 29 20 21 3d ndard, &data) !=
11940 20 54 52 55 45 29 20 7b 0a 09 09 20 20 20 20 2f TRUE) {... /
11950 2a 0a 09 09 20 20 20 20 20 2a 20 46 69 6c 65 20 *... * File
11960 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a 09 doesn't exist...
11970 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 . */....
11980 69 66 20 28 69 73 44 72 69 76 65 29 20 7b 0a 09 if (isDrive) {..
11990 09 09 69 6e 74 20 6c 65 6e 20 3d 20 57 69 6e 49 ..int len = WinI
119a0 73 52 65 73 65 72 76 65 64 28 70 61 74 68 29 3b sReserved(path);
119b0 0a 0a 09 09 09 69 66 20 28 6c 65 6e 20 3e 20 30 .....if (len > 0
119c0 29 20 7b 0a 09 09 09 20 20 20 20 2f 2a 0a 09 09 ) {.... /*...
119d0 09 20 20 20 20 20 2a 20 41 63 74 75 61 6c 6c 79 . * Actually
119e0 20 69 74 20 64 6f 65 73 20 65 78 69 73 74 20 2d it does exist -
119f0 20 43 4f 4d 31 2c 20 65 74 63 2e 0a 09 09 09 20 COM1, etc.....
11a00 20 20 20 20 2a 2f 0a 0a 09 09 09 20 20 20 20 69 */..... i
11a10 6e 74 20 69 3b 0a 0a 09 09 09 20 20 20 20 66 6f nt i;..... fo
11a20 72 20 28 69 3d 30 20 3b 20 69 3c 6c 65 6e 20 3b r (i=0 ; i<len ;
11a30 20 69 2b 2b 29 20 7b 0a 09 09 09 09 57 43 48 41 i++) {.....WCHA
11a40 52 20 77 63 20 3d 20 28 28 57 43 48 41 52 20 2a R wc = ((WCHAR *
11a50 29 20 6e 61 74 69 76 65 50 61 74 68 29 5b 69 5d ) nativePath)[i]
11a60 3b 0a 0a 09 09 09 09 69 66 20 28 77 63 20 3e 3d ;......if (wc >=
11a70 20 4c 27 61 27 29 20 7b 0a 09 09 09 09 20 20 20 L'a') {.....
11a80 20 77 63 20 2d 3d 20 28 4c 27 61 27 20 2d 20 4c wc -= (L'a' - L
11a90 27 41 27 29 3b 0a 09 09 09 09 20 20 20 20 28 28 'A');..... ((
11aa0 57 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 WCHAR *) nativeP
11ab0 61 74 68 29 5b 69 5d 20 3d 20 77 63 3b 0a 09 09 ath)[i] = wc;...
11ac0 09 09 7d 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 ..}.... }....
11ad0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 Tcl_DStringA
11ae0 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 6e ppend(&dsNorm, n
11af0 61 74 69 76 65 50 61 74 68 2c 0a 09 09 09 09 20 ativePath,.....
11b00 20 20 20 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 (int)(sizeof(
11b10 57 43 48 41 52 29 20 2a 20 6c 65 6e 29 29 3b 0a WCHAR) * len));.
11b20 09 09 09 20 20 20 20 6c 61 73 74 56 61 6c 69 64 ... lastValid
11b30 50 61 74 68 45 6e 64 20 3d 20 63 75 72 72 65 6e PathEnd = curren
11b40 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e tPathEndPosition
11b50 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 ;....} else if (
11b60 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d nextCheckpoint =
11b70 3d 20 30 29 20 7b 0a 09 09 09 20 20 20 20 2f 2a = 0) {.... /*
11b80 20 50 61 74 68 20 73 74 61 72 74 73 20 77 69 74 Path starts wit
11b90 68 20 61 20 64 72 69 76 65 20 64 65 73 69 67 6e h a drive design
11ba0 61 74 69 6f 6e 0a 09 09 09 20 20 20 20 20 2a 20 ation.... *
11bb0 74 68 61 74 27 73 20 6e 6f 74 20 61 63 74 75 61 that's not actua
11bc0 6c 6c 79 20 6f 6e 20 74 68 65 20 73 79 73 74 65 lly on the syste
11bd0 6d 2e 0a 09 09 09 20 20 20 20 20 2a 20 57 65 20 m..... * We
11be0 73 74 69 6c 6c 20 6d 75 73 74 20 6e 6f 72 6d 61 still must norma
11bf0 6c 69 7a 65 20 75 70 20 70 61 73 74 20 74 68 65 lize up past the
11c00 0a 09 09 09 20 20 20 20 20 2a 20 66 69 72 73 74 .... * first
11c10 20 73 65 70 61 72 61 74 6f 72 2e 20 20 5b 42 75 separator. [Bu
11c20 67 20 33 36 30 33 34 33 34 5d 20 2a 2f 0a 09 09 g 3603434] */...
11c30 09 20 20 20 20 63 75 72 72 65 6e 74 50 61 74 68 . currentPath
11c40 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 09 EndPosition++;..
11c50 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 ..}... }...
11c60 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 Tcl_DStringFre
11c70 65 28 26 64 73 29 3b 0a 09 09 20 20 20 20 62 72 e(&ds);... br
11c80 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a 09 eak;...}..../*..
11c90 09 20 2a 20 46 69 6c 65 20 27 6e 61 74 69 76 65 . * File 'native
11ca0 50 61 74 68 27 20 64 6f 65 73 20 65 78 69 73 74 Path' does exist
11cb0 20 69 66 20 77 65 20 67 65 74 20 68 65 72 65 2e if we get here.
11cc0 20 57 65 20 6e 6f 77 20 77 61 6e 74 20 74 6f 0a We now want to.
11cd0 09 09 20 2a 20 63 68 65 63 6b 20 69 66 20 69 74 .. * check if it
11ce0 20 69 73 20 61 20 73 79 6d 6c 69 6e 6b 20 61 6e is a symlink an
11cf0 64 20 6f 74 68 65 72 77 69 73 65 20 63 6f 6e 74 d otherwise cont
11d00 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a 09 09 inue with the...
11d10 20 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 70 * rest of the p
11d20 61 74 68 2e 0a 09 09 20 2a 2f 0a 0a 09 09 2f 2a ath.... */..../*
11d30 0a 09 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 ... * Check for
11d40 73 79 6d 6c 69 6e 6b 73 2c 20 65 78 63 65 70 74 symlinks, except
11d50 20 61 74 20 6c 61 73 74 20 63 6f 6d 70 6f 6e 65 at last compone
11d60 6e 74 20 6f 66 20 70 61 74 68 20 28 77 65 0a 09 nt of path (we..
11d70 09 20 2a 20 64 6f 6e 27 74 20 66 6f 6c 6c 6f 77 . * don't follow
11d80 20 66 69 6e 61 6c 20 73 79 6d 6c 69 6e 6b 73 29 final symlinks)
11d90 2e 20 41 6c 73 6f 20 61 20 64 72 69 76 65 20 28 . Also a drive (
11da0 43 3a 2f 29 20 66 6f 72 0a 09 09 20 2a 20 65 78 C:/) for... * ex
11db0 61 6d 70 6c 65 2c 20 6d 61 79 20 73 6f 6d 65 74 ample, may somet
11dc0 69 6d 65 73 20 68 61 76 65 20 74 68 65 20 72 65 imes have the re
11dd0 70 61 72 73 65 20 66 6c 61 67 20 73 65 74 20 66 parse flag set f
11de0 6f 72 20 73 6f 6d 65 0a 09 09 20 2a 20 72 65 61 or some... * rea
11df0 73 6f 6e 20 49 20 64 6f 6e 27 74 20 75 6e 64 65 son I don't unde
11e00 72 73 74 61 6e 64 2e 20 57 65 20 74 68 65 72 65 rstand. We there
11e10 66 6f 72 65 20 64 6f 6e 27 74 20 70 65 72 66 6f fore don't perfo
11e20 72 6d 20 74 68 69 73 0a 09 09 20 2a 20 63 68 65 rm this... * che
11e30 63 6b 20 66 6f 72 20 64 72 69 76 65 73 2e 0a 09 ck for drives...
11e40 09 20 2a 2f 0a 0a 09 09 69 66 20 28 63 75 72 20 . */....if (cur
11e50 21 3d 20 30 20 26 26 20 21 69 73 44 72 69 76 65 != 0 && !isDrive
11e60 20 26 26 0a 09 09 09 64 61 74 61 2e 64 77 46 69 &&....data.dwFi
11e70 6c 65 41 74 74 72 69 62 75 74 65 73 20 26 20 46 leAttributes & F
11e80 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 ILE_ATTRIBUTE_RE
11e90 50 41 52 53 45 5f 50 4f 49 4e 54 29 7b 0a 09 09 PARSE_POINT){...
11ea0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 6f 20 Tcl_Obj *to
11eb0 3d 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 = WinReadLinkDir
11ec0 65 63 74 6f 72 79 28 6e 61 74 69 76 65 50 61 74 ectory(nativePat
11ed0 68 29 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 74 h);.... if (t
11ee0 6f 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 o != NULL) {....
11ef0 2f 2a 0a 09 09 09 20 2a 20 52 65 61 64 20 74 68 /*.... * Read th
11f00 65 20 72 65 70 61 72 73 65 20 70 6f 69 6e 74 20 e reparse point
11f10 6f 6b 2e 20 4e 6f 77 2c 20 72 65 70 61 72 73 65 ok. Now, reparse
11f20 20 70 6f 69 6e 74 73 20 6e 65 65 64 0a 09 09 09 points need....
11f30 20 2a 20 6e 6f 74 20 62 65 20 6e 6f 72 6d 61 6c * not be normal
11f40 69 7a 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20 ized, otherwise
11f50 77 65 20 63 6f 75 6c 64 20 75 73 65 3a 0a 09 09 we could use:...
11f60 09 20 2a 0a 09 09 09 20 2a 20 54 63 6c 5f 47 65 . *.... * Tcl_Ge
11f70 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 74 tStringFromObj(t
11f80 6f 2c 20 26 70 61 74 68 4c 65 6e 29 3b 0a 09 09 o, &pathLen);...
11f90 09 20 2a 20 6e 65 78 74 43 68 65 63 6b 70 6f 69 . * nextCheckpoi
11fa0 6e 74 20 3d 20 70 61 74 68 4c 65 6e 0a 09 09 09 nt = pathLen....
11fb0 20 2a 0a 09 09 09 20 2a 20 53 6f 2c 20 69 6e 73 *.... * So, ins
11fc0 74 65 61 64 20 77 65 20 68 61 76 65 20 74 6f 20 tead we have to
11fd0 73 74 61 72 74 20 66 72 6f 6d 20 74 68 65 20 62 start from the b
11fe0 65 67 69 6e 6e 69 6e 67 2e 0a 09 09 09 20 2a 2f eginning..... */
11ff0 0a 0a 09 09 09 6e 65 78 74 43 68 65 63 6b 70 6f .....nextCheckpo
12000 69 6e 74 20 3d 20 30 3b 0a 09 09 09 54 63 6c 5f int = 0;....Tcl_
12010 41 70 70 65 6e 64 54 6f 4f 62 6a 28 74 6f 2c 20 AppendToObj(to,
12020 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f currentPathEndPo
12030 73 69 74 69 6f 6e 2c 20 2d 31 29 3b 0a 0a 09 09 sition, -1);....
12040 09 2f 2a 0a 09 09 09 20 2a 20 43 6f 6e 76 65 72 ./*.... * Conver
12050 74 20 6c 69 6e 6b 20 74 6f 20 66 6f 72 77 61 72 t link to forwar
12060 64 20 73 6c 61 73 68 65 73 2e 0a 09 09 09 20 2a d slashes..... *
12070 2f 0a 0a 09 09 09 66 6f 72 20 28 70 61 74 68 20 /.....for (path
12080 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 = Tcl_GetString(
12090 74 6f 29 3b 20 2a 70 61 74 68 20 21 3d 20 30 3b to); *path != 0;
120a0 20 70 61 74 68 2b 2b 29 20 7b 0a 09 09 09 20 20 path++) {....
120b0 20 20 69 66 20 28 2a 70 61 74 68 20 3d 3d 20 27 if (*path == '
120c0 5c 5c 27 29 20 7b 0a 09 09 09 09 2a 70 61 74 68 \\') {.....*path
120d0 20 3d 20 27 2f 27 3b 0a 09 09 09 20 20 20 20 7d = '/';.... }
120e0 0a 09 09 09 7d 0a 09 09 09 70 61 74 68 20 3d 20 ....}....path =
120f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 74 6f Tcl_GetString(to
12100 29 3b 0a 09 09 09 63 75 72 72 65 6e 74 50 61 74 );....currentPat
12110 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 20 70 hEndPosition = p
12120 61 74 68 20 2b 20 6e 65 78 74 43 68 65 63 6b 70 ath + nextCheckp
12130 6f 69 6e 74 3b 0a 09 09 09 69 66 20 28 74 65 6d oint;....if (tem
12140 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 p != NULL) {....
12150 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
12160 6f 75 6e 74 28 74 65 6d 70 29 3b 0a 09 09 09 7d ount(temp);....}
12170 0a 09 09 09 74 65 6d 70 20 3d 20 74 6f 3b 0a 0a ....temp = to;..
12180 09 09 09 2f 2a 0a 09 09 09 20 2a 20 52 65 73 65 .../*.... * Rese
12190 74 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77 t variables so w
121a0 65 20 63 61 6e 20 72 65 73 74 61 72 74 20 6e 6f e can restart no
121b0 72 6d 61 6c 69 7a 61 74 69 6f 6e 2e 0a 09 09 09 rmalization.....
121c0 20 2a 2f 0a 0a 09 09 09 69 73 44 72 69 76 65 20 */.....isDrive
121d0 3d 20 31 3b 0a 09 09 09 54 63 6c 5f 44 53 74 72 = 1;....Tcl_DStr
121e0 69 6e 67 46 72 65 65 28 26 64 73 4e 6f 72 6d 29 ingFree(&dsNorm)
121f0 3b 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 ;....Tcl_DString
12200 49 6e 69 74 28 26 64 73 4e 6f 72 6d 29 3b 0a 09 Init(&dsNorm);..
12210 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 ..Tcl_DStringFre
12220 65 28 26 64 73 29 3b 0a 09 09 09 63 6f 6e 74 69 e(&ds);....conti
12230 6e 75 65 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d nue;... }...}
12240 0a 0a 23 69 66 6e 64 65 66 20 54 63 6c 4e 4f 52 ..#ifndef TclNOR
12250 4d 5f 4c 4f 4e 47 5f 50 41 54 48 0a 09 09 2f 2a M_LONG_PATH.../*
12260 0a 09 09 20 2a 20 4e 6f 77 20 77 65 20 63 6f 6e ... * Now we con
12270 76 65 72 74 20 74 68 65 20 74 61 69 6c 20 6f 66 vert the tail of
12280 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 the current pat
12290 68 20 74 6f 20 69 74 73 20 27 6c 6f 6e 67 0a 09 h to its 'long..
122a0 09 20 2a 20 66 6f 72 6d 27 2c 20 61 6e 64 20 61 . * form', and a
122b0 70 70 65 6e 64 20 69 74 20 74 6f 20 27 64 73 4e ppend it to 'dsN
122c0 6f 72 6d 27 20 77 68 69 63 68 20 68 6f 6c 64 73 orm' which holds
122d0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 09 09 20 the current...
122e0 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 * normalized pat
122f0 68 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 69 h... */....if (i
12300 73 44 72 69 76 65 29 20 7b 0a 09 09 20 20 20 20 sDrive) {...
12310 57 43 48 41 52 20 64 72 69 76 65 20 3d 20 28 28 WCHAR drive = ((
12320 57 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 WCHAR *) nativeP
12330 61 74 68 29 5b 30 5d 3b 0a 09 09 20 20 20 20 69 ath)[0];... i
12340 66 20 28 64 72 69 76 65 20 3e 3d 20 4c 27 61 27 f (drive >= L'a'
12350 29 20 7b 0a 09 09 09 64 72 69 76 65 20 2d 3d 20 ) {....drive -=
12360 28 4c 27 61 27 20 2d 20 4c 27 41 27 29 3b 0a 09 (L'a' - L'A');..
12370 09 09 28 28 57 43 48 41 52 20 2a 29 20 6e 61 74 ..((WCHAR *) nat
12380 69 76 65 50 61 74 68 29 5b 30 5d 20 3d 20 64 72 ivePath)[0] = dr
12390 69 76 65 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 ive;... }...
123a0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 Tcl_DStringAp
123b0 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 6e 61 pend(&dsNorm, na
123c0 74 69 76 65 50 61 74 68 2c 0a 09 09 09 20 20 20 tivePath,....
123d0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 Tcl_DStringLeng
123e0 74 68 28 26 64 73 29 29 3b 0a 09 09 7d 20 65 6c th(&ds));...} el
123f0 73 65 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20 se {... char
12400 2a 63 68 65 63 6b 44 6f 74 73 20 3d 20 4e 55 4c *checkDots = NUL
12410 4c 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 6c 61 L;.... if (la
12420 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 5b 31 stValidPathEnd[1
12430 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 09 63 ] == '.') {....c
12440 68 65 63 6b 44 6f 74 73 20 3d 20 6c 61 73 74 56 heckDots = lastV
12450 61 6c 69 64 50 61 74 68 45 6e 64 20 2b 20 31 3b alidPathEnd + 1;
12460 0a 09 09 09 77 68 69 6c 65 20 28 63 68 65 63 6b ....while (check
12470 44 6f 74 73 20 3c 20 63 75 72 72 65 6e 74 50 61 Dots < currentPa
12480 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 29 20 7b thEndPosition) {
12490 0a 09 09 09 20 20 20 20 69 66 20 28 2a 63 68 65 .... if (*che
124a0 63 6b 44 6f 74 73 20 21 3d 20 27 2e 27 29 20 7b ckDots != '.') {
124b0 0a 09 09 09 09 63 68 65 63 6b 44 6f 74 73 20 3d .....checkDots =
124c0 20 4e 55 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b NULL;.....break
124d0 3b 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 20 20 ;.... }....
124e0 20 20 63 68 65 63 6b 44 6f 74 73 2b 2b 3b 0a 09 checkDots++;..
124f0 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 ..}... }...
12500 20 20 69 66 20 28 63 68 65 63 6b 44 6f 74 73 20 if (checkDots
12510 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 6e != NULL) {....in
12520 74 20 64 6f 74 4c 65 6e 20 3d 20 63 75 72 72 65 t dotLen = curre
12530 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f ntPathEndPositio
12540 6e 2d 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 n-lastValidPathE
12550 6e 64 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a nd;...../*.... *
12560 20 50 61 74 68 20 69 73 20 6a 75 73 74 20 64 6f Path is just do
12570 74 73 2e 20 57 65 20 73 68 6f 75 6c 64 6e 27 74 ts. We shouldn't
12580 20 72 65 61 6c 6c 79 20 65 76 65 72 20 73 65 65 really ever see
12590 20 61 0a 09 09 09 20 2a 20 70 61 74 68 20 6c 69 a.... * path li
125a0 6b 65 20 74 68 61 74 2e 20 48 6f 77 65 76 65 72 ke that. However
125b0 2c 20 74 6f 20 62 65 20 6e 69 63 65 20 77 65 20 , to be nice we
125c0 61 74 20 6c 65 61 73 74 0a 09 09 09 20 2a 20 64 at least.... * d
125d0 6f 6e 27 74 20 6d 61 6e 67 6c 65 20 74 68 65 20 on't mangle the
125e0 70 61 74 68 20 2d 20 77 65 20 6a 75 73 74 20 61 path - we just a
125f0 64 64 20 74 68 65 20 64 6f 74 73 20 61 73 20 61 dd the dots as a
12600 0a 09 09 09 20 2a 20 70 61 74 68 20 73 65 67 6d .... * path segm
12610 65 6e 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 ent and continue
12620 2e 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 54 63 6c ..... */.....Tcl
12630 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 _DStringAppend(&
12640 64 73 4e 6f 72 6d 2c 20 28 54 43 48 41 52 20 2a dsNorm, (TCHAR *
12650 29 0a 09 09 09 09 28 28 57 43 48 41 52 2a 29 28 ).....((WCHAR*)(
12660 6e 61 74 69 76 65 50 61 74 68 20 2b 20 54 63 6c nativePath + Tcl
12670 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 _DStringLength(&
12680 64 73 29 29 0a 09 09 09 09 2d 20 64 6f 74 4c 65 ds)).....- dotLe
12690 6e 29 2c 20 28 69 6e 74 29 28 64 6f 74 4c 65 6e n), (int)(dotLen
126a0 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 * sizeof(WCHAR)
126b0 29 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 ));... } else
126c0 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 4e {..../*.... * N
126d0 6f 72 6d 61 6c 20 70 61 74 68 2e 0a 09 09 09 20 ormal path.....
126e0 2a 2f 0a 0a 09 09 09 57 49 4e 33 32 5f 46 49 4e */.....WIN32_FIN
126f0 44 5f 44 41 54 41 57 20 66 44 61 74 61 3b 0a 09 D_DATAW fData;..
12700 09 09 48 41 4e 44 4c 45 20 68 61 6e 64 6c 65 3b ..HANDLE handle;
12710 0a 0a 09 09 09 68 61 6e 64 6c 65 20 3d 20 46 69 .....handle = Fi
12720 6e 64 46 69 72 73 74 46 69 6c 65 57 28 28 57 43 ndFirstFileW((WC
12730 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 61 74 HAR *) nativePat
12740 68 2c 20 26 66 44 61 74 61 29 3b 0a 09 09 09 69 h, &fData);....i
12750 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 f (handle == INV
12760 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
12770 45 29 20 7b 0a 09 09 09 20 20 20 20 2f 2a 0a 09 E) {.... /*..
12780 09 09 20 20 20 20 20 2a 20 54 68 69 73 20 69 73 .. * This is
12790 20 75 73 75 61 6c 6c 79 20 74 68 65 20 27 2f 27 usually the '/'
127a0 20 69 6e 20 27 63 3a 2f 27 20 61 74 20 65 6e 64 in 'c:/' at end
127b0 20 6f 66 0a 09 09 09 20 20 20 20 20 2a 20 73 74 of.... * st
127c0 72 69 6e 67 2e 0a 09 09 09 20 20 20 20 20 2a 2f ring..... */
127d0 0a 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 ..... Tcl_DSt
127e0 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f ringAppend(&dsNo
127f0 72 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 rm, (const char
12800 2a 29 20 4c 22 2f 22 2c 0a 09 09 09 09 20 20 20 *) L"/",.....
12810 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b sizeof(WCHAR));
12820 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 ....} else {....
12830 20 20 20 20 57 43 48 41 52 20 2a 6e 61 74 69 76 WCHAR *nativ
12840 65 4e 61 6d 65 3b 0a 0a 09 09 09 20 20 20 20 69 eName;..... i
12850 66 20 28 66 44 61 74 61 2e 63 46 69 6c 65 4e 61 f (fData.cFileNa
12860 6d 65 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b me[0] != '\0') {
12870 0a 09 09 09 09 6e 61 74 69 76 65 4e 61 6d 65 20 .....nativeName
12880 3d 20 66 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d = fData.cFileNam
12890 65 3b 0a 09 09 09 20 20 20 20 7d 20 65 6c 73 65 e;.... } else
128a0 20 7b 0a 09 09 09 09 6e 61 74 69 76 65 4e 61 6d {.....nativeNam
128b0 65 20 3d 20 66 44 61 74 61 2e 63 41 6c 74 65 72 e = fData.cAlter
128c0 6e 61 74 65 46 69 6c 65 4e 61 6d 65 3b 0a 09 09 nateFileName;...
128d0 09 20 20 20 20 7d 0a 09 09 09 20 20 20 20 46 69 . }.... Fi
128e0 6e 64 43 6c 6f 73 65 28 68 61 6e 64 6c 65 29 3b ndClose(handle);
128f0 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 .... Tcl_DStr
12900 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 ingAppend(&dsNor
12910 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a m, (const char *
12920 29 20 4c 22 2f 22 2c 0a 09 09 09 09 20 20 20 20 ) L"/",.....
12930 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a sizeof(WCHAR));.
12940 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 ... Tcl_DStri
12950 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d ngAppend(&dsNorm
12960 2c 20 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69 , (TCHAR *) nati
12970 76 65 4e 61 6d 65 2c 0a 09 09 09 09 20 20 20 20 veName,.....
12980 28 69 6e 74 29 20 28 77 63 73 6c 65 6e 28 6e 61 (int) (wcslen(na
12990 74 69 76 65 4e 61 6d 65 29 2a 73 69 7a 65 6f 66 tiveName)*sizeof
129a0 28 57 43 48 41 52 29 29 29 3b 0a 09 09 09 7d 0a (WCHAR)));....}.
129b0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 23 65 6e 64 .. }...}.#end
129c0 69 66 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 if...Tcl_DString
129d0 46 72 65 65 28 26 64 73 29 3b 0a 09 09 6c 61 73 Free(&ds);...las
129e0 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20 3d 20 tValidPathEnd =
129f0 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f currentPathEndPo
12a00 73 69 74 69 6f 6e 3b 0a 09 09 69 66 20 28 63 75 sition;...if (cu
12a10 72 20 3d 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 r == 0) {...
12a20 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a break;...}..../*
12a30 0a 09 09 20 2a 20 49 66 20 77 65 20 67 65 74 20 ... * If we get
12a40 68 65 72 65 2c 20 77 65 27 76 65 20 67 6f 74 20 here, we've got
12a50 70 61 73 74 20 6f 6e 65 20 64 69 72 65 63 74 6f past one directo
12a60 72 79 20 64 65 6c 69 6d 69 74 65 72 2c 20 73 6f ry delimiter, so
12a70 0a 09 09 20 2a 20 77 65 20 6b 6e 6f 77 20 69 74 ... * we know it
12a80 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 20 is no longer a
12a90 64 72 69 76 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 drive.... */....
12aa0 69 73 44 72 69 76 65 20 3d 20 30 3b 0a 09 20 20 isDrive = 0;..
12ab0 20 20 7d 0a 09 20 20 20 20 63 75 72 72 65 6e 74 }.. current
12ac0 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2b PathEndPosition+
12ad0 2b 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 54 63 +;..}..#ifdef Tc
12ae0 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 54 48 0a lNORM_LONG_PATH.
12af0 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72 74 20 ./*.. * Convert
12b00 74 68 65 20 65 6e 74 69 72 65 20 6b 6e 6f 77 6e the entire known
12b10 20 70 61 74 68 20 74 6f 20 6c 6f 6e 67 20 66 6f path to long fo
12b20 72 6d 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 31 rm... */...if (1
12b30 29 20 7b 0a 09 20 20 20 20 57 43 48 41 52 20 77 ) {.. WCHAR w
12b40 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a path[MAX_PATH];.
12b50 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
12b60 2a 6e 61 74 69 76 65 50 61 74 68 20 3d 0a 09 09 *nativePath =...
12b70 20 20 20 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f Tcl_WinUtfTo
12b80 54 43 68 61 72 28 70 61 74 68 2c 20 6c 61 73 74 TChar(path, last
12b90 56 61 6c 69 64 50 61 74 68 45 6e 64 20 2d 20 70 ValidPathEnd - p
12ba0 61 74 68 2c 20 26 64 73 29 3b 0a 09 20 20 20 20 ath, &ds);..
12bb0 44 57 4f 52 44 20 77 70 61 74 68 6c 65 6e 20 3d DWORD wpathlen =
12bc0 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e (*tclWinProcs->
12bd0 67 65 74 4c 6f 6e 67 50 61 74 68 4e 61 6d 65 50 getLongPathNameP
12be0 72 6f 63 29 28 0a 09 09 20 20 20 20 6e 61 74 69 roc)(... nati
12bf0 76 65 50 61 74 68 2c 20 28 54 43 48 41 52 20 2a vePath, (TCHAR *
12c00 29 20 77 70 61 74 68 2c 20 4d 41 58 5f 50 41 54 ) wpath, MAX_PAT
12c10 48 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 H);... /*..
12c20 20 20 20 2a 20 57 65 20 68 61 76 65 20 74 6f 20 * We have to
12c30 6d 61 6b 65 20 74 68 65 20 64 72 69 76 65 20 6c make the drive l
12c40 65 74 74 65 72 20 75 70 70 65 72 63 61 73 65 2e etter uppercase.
12c50 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
12c60 69 66 20 28 77 70 61 74 68 5b 30 5d 20 3e 3d 20 if (wpath[0] >=
12c70 4c 27 61 27 29 20 7b 0a 09 09 77 70 61 74 68 5b L'a') {...wpath[
12c80 30 5d 20 2d 3d 20 28 4c 27 61 27 20 2d 20 4c 27 0] -= (L'a' - L'
12c90 41 27 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 A');.. }..
12ca0 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 Tcl_DStringAppe
12cb0 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 28 54 43 48 nd(&dsNorm, (TCH
12cc0 41 52 2a 29 77 70 61 74 68 2c 20 77 70 61 74 68 AR*)wpath, wpath
12cd0 6c 65 6e 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 len*sizeof(WCHAR
12ce0 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 ));.. Tcl_DSt
12cf0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 ringFree(&ds);..
12d00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a }.#endif. }..
12d10 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f /*. * Co
12d20 6d 6d 6f 6e 20 63 6f 64 65 20 70 61 74 68 20 66 mmon code path f
12d30 6f 72 20 61 6c 6c 20 57 69 6e 64 6f 77 73 20 70 or all Windows p
12d40 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 20 20 20 2a latforms.. *
12d50 2f 0a 0a 20 20 20 20 6e 65 78 74 43 68 65 63 6b /.. nextCheck
12d60 70 6f 69 6e 74 20 3d 20 63 75 72 72 65 6e 74 50 point = currentP
12d70 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 2d athEndPosition -
12d80 20 70 61 74 68 3b 0a 20 20 20 20 69 66 20 28 6c path;. if (l
12d90 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20 astValidPathEnd
12da0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 != NULL) {../*..
12db0 20 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65 20 74 * Concatenate t
12dc0 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 73 74 he normalized st
12dd0 72 69 6e 67 20 69 6e 20 64 73 4e 6f 72 6d 20 77 ring in dsNorm w
12de0 69 74 68 20 74 68 65 20 74 61 69 6c 20 6f 66 20 ith the tail of
12df0 74 68 65 0a 09 20 2a 20 70 61 74 68 20 77 68 69 the.. * path whi
12e00 63 68 20 77 65 20 64 69 64 6e 27 74 20 72 65 63 ch we didn't rec
12e10 6f 67 6e 69 73 65 2e 20 54 68 65 20 73 74 72 69 ognise. The stri
12e20 6e 67 20 69 6e 20 64 73 4e 6f 72 6d 20 69 73 20 ng in dsNorm is
12e30 69 6e 20 74 68 65 0a 09 20 2a 20 6e 61 74 69 76 in the.. * nativ
12e40 65 20 65 6e 63 6f 64 69 6e 67 2c 20 73 6f 20 77 e encoding, so w
12e50 65 20 68 61 76 65 20 74 6f 20 63 6f 6e 76 65 72 e have to conver
12e60 74 20 69 74 20 74 6f 20 55 74 66 2e 0a 09 20 2a t it to Utf... *
12e70 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 /...Tcl_DString
12e80 64 73 54 65 6d 70 3b 0a 0a 09 54 63 6c 5f 57 69 dsTemp;...Tcl_Wi
12e90 6e 54 43 68 61 72 54 6f 55 74 66 28 54 63 6c 5f nTCharToUtf(Tcl_
12ea0 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 DStringValue(&ds
12eb0 4e 6f 72 6d 29 2c 0a 09 09 54 63 6c 5f 44 53 74 Norm),...Tcl_DSt
12ec0 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 4e 6f ringLength(&dsNo
12ed0 72 6d 29 2c 20 26 64 73 54 65 6d 70 29 3b 0a 09 rm), &dsTemp);..
12ee0 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d nextCheckpoint =
12ef0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 Tcl_DStringLeng
12f00 74 68 28 26 64 73 54 65 6d 70 29 3b 0a 09 69 66 th(&dsTemp);..if
12f10 20 28 2a 6c 61 73 74 56 61 6c 69 64 50 61 74 68 (*lastValidPath
12f20 45 6e 64 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 End != 0) {..
12f30 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 74 20 /*.. * Not
12f40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 the end of the s
12f50 74 72 69 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a tring... */.
12f60 0a 09 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 09 .. int len;..
12f70 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 3b 0a char *path;.
12f80 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 6d . Tcl_Obj *tm
12f90 70 50 61 74 68 50 74 72 3b 0a 0a 09 20 20 20 20 pPathPtr;...
12fa0 74 6d 70 50 61 74 68 50 74 72 20 3d 20 54 63 6c tmpPathPtr = Tcl
12fb0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 _NewStringObj(Tc
12fc0 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
12fd0 64 73 54 65 6d 70 29 2c 0a 09 09 20 20 20 20 6e dsTemp),... n
12fe0 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 29 3b 0a extCheckpoint);.
12ff0 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 . Tcl_AppendT
13000 6f 4f 62 6a 28 74 6d 70 50 61 74 68 50 74 72 2c oObj(tmpPathPtr,
13010 20 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e lastValidPathEn
13020 64 2c 20 2d 31 29 3b 0a 09 20 20 20 20 70 61 74 d, -1);.. pat
13030 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e h = Tcl_GetStrin
13040 67 46 72 6f 6d 4f 62 6a 28 74 6d 70 50 61 74 68 gFromObj(tmpPath
13050 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 Ptr, &len);..
13060 20 54 63 6c 5f 53 65 74 53 74 72 69 6e 67 4f 62 Tcl_SetStringOb
13070 6a 28 70 61 74 68 50 74 72 2c 20 70 61 74 68 2c j(pathPtr, path,
13080 20 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f len);.. Tcl_
13090 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 6d 70 DecrRefCount(tmp
130a0 50 61 74 68 50 74 72 29 3b 0a 09 7d 20 65 6c 73 PathPtr);..} els
130b0 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 e {.. /*..
130c0 20 20 2a 20 45 6e 64 20 6f 66 20 73 74 72 69 6e * End of strin
130d0 67 20 77 61 73 20 72 65 61 63 68 65 64 20 61 62 g was reached ab
130e0 6f 76 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ove... */...
130f0 20 20 20 20 54 63 6c 5f 53 65 74 53 74 72 69 6e Tcl_SetStrin
13100 67 4f 62 6a 28 70 61 74 68 50 74 72 2c 20 54 63 gObj(pathPtr, Tc
13110 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 l_DStringValue(&
13120 64 73 54 65 6d 70 29 2c 0a 09 09 20 20 20 20 6e dsTemp),... n
13130 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 29 3b 0a extCheckpoint);.
13140 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 .}..Tcl_DStringF
13150 72 65 65 28 26 64 73 54 65 6d 70 29 3b 0a 20 20 ree(&dsTemp);.
13160 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 }. Tcl_DStr
13170 69 6e 67 46 72 65 65 28 26 64 73 4e 6f 72 6d 29 ingFree(&dsNorm)
13180 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
13190 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f This must be do
131a0 6e 65 20 61 66 74 65 72 20 77 65 20 61 72 65 20 ne after we are
131b0 74 6f 74 61 6c 6c 79 20 66 69 6e 69 73 68 65 64 totally finished
131c0 20 77 69 74 68 20 27 70 61 74 68 27 20 61 73 20 with 'path' as
131d0 77 65 20 61 72 65 0a 20 20 20 20 20 2a 20 73 68 we are. * sh
131e0 61 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 75 aring the same u
131f0 6e 64 65 72 6c 79 69 6e 67 20 73 74 72 69 6e 67 nderlying string
13200 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
13210 66 20 28 74 65 6d 70 20 21 3d 20 4e 55 4c 4c 29 f (temp != NULL)
13220 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {..Tcl_DecrRefC
13230 6f 75 6e 74 28 74 65 6d 70 29 3b 0a 20 20 20 20 ount(temp);.
13240 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 65 78 }. return nex
13250 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a 7d 0a 0c tCheckpoint;.}..
13260 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
13270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
132b0 2d 0a 20 2a 0a 20 2a 20 54 63 6c 57 69 6e 56 6f -. *. * TclWinVo
132c0 6c 75 6d 65 52 65 6c 61 74 69 76 65 4e 6f 72 6d lumeRelativeNorm
132d0 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 4f alize --. *. *.O
132e0 6e 6c 79 20 57 69 6e 64 6f 77 73 20 68 61 73 20 nly Windows has
132f0 76 6f 6c 75 6d 65 2d 72 65 6c 61 74 69 76 65 20 volume-relative
13300 70 61 74 68 73 2e 20 54 68 65 73 65 20 70 61 74 paths. These pat
13310 68 73 20 61 72 65 20 72 61 74 68 65 72 20 72 61 hs are rather ra
13320 72 65 2c 0a 20 2a 09 62 75 74 20 69 74 20 69 73 re,. *.but it is
13330 20 6e 69 63 65 20 69 66 20 54 63 6c 20 63 61 6e nice if Tcl can
13340 20 68 61 6e 64 6c 65 20 74 68 65 6d 2e 20 49 74 handle them. It
13350 20 69 73 20 6d 75 63 68 20 62 65 74 74 65 72 20 is much better
13360 69 66 20 77 65 20 63 61 6e 0a 20 2a 09 68 61 6e if we can. *.han
13370 64 6c 65 20 74 68 65 6d 20 68 65 72 65 2c 20 72 dle them here, r
13380 61 74 68 65 72 20 74 68 61 6e 20 69 6e 20 74 68 ather than in th
13390 65 20 6e 61 74 69 76 65 20 66 73 20 63 6f 64 65 e native fs code
133a0 2c 20 62 65 63 61 75 73 65 20 77 65 20 72 65 61 , because we rea
133b0 6c 6c 79 0a 20 2a 09 6e 65 65 64 20 74 6f 20 68 lly. *.need to h
133c0 61 76 65 20 61 20 72 65 61 6c 20 61 62 73 6f 6c ave a real absol
133d0 75 74 65 20 70 61 74 68 20 6a 75 73 74 20 62 65 ute path just be
133e0 6c 6f 77 2e 0a 20 2a 0a 20 2a 09 57 65 20 64 6f low.. *. *.We do
133f0 20 6e 6f 74 20 6c 65 74 20 74 68 69 73 20 62 6c not let this bl
13400 6f 63 6b 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 6e ock compile on n
13410 6f 6e 2d 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 on-Windows platf
13420 6f 72 6d 73 20 62 65 63 61 75 73 65 20 74 68 65 orms because the
13430 0a 20 2a 09 74 65 73 74 20 73 75 69 74 65 27 73 . *.test suite's
13440 20 6d 61 6e 75 61 6c 20 66 6f 72 63 69 6e 67 20 manual forcing
13450 6f 66 20 74 63 6c 50 6c 61 74 66 6f 72 6d 20 63 of tclPlatform c
13460 61 6e 20 6f 74 68 65 72 77 69 73 65 20 63 61 75 an otherwise cau
13470 73 65 20 74 68 69 73 0a 20 2a 09 63 6f 64 65 20 se this. *.code
13480 70 61 74 68 20 74 6f 20 62 65 20 65 78 65 63 75 path to be execu
13490 74 65 64 2c 20 63 61 75 73 69 6e 67 20 76 61 72 ted, causing var
134a0 69 6f 75 73 20 65 72 72 6f 72 73 20 62 65 63 61 ious errors beca
134b0 75 73 65 0a 20 2a 09 76 6f 6c 75 6d 65 2d 72 65 use. *.volume-re
134c0 6c 61 74 69 76 65 20 70 61 74 68 73 20 72 65 61 lative paths rea
134d0 6c 6c 79 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 lly do not exist
134e0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
134f0 0a 20 2a 09 41 20 76 61 6c 69 64 20 6e 6f 72 6d . *.A valid norm
13500 61 6c 69 7a 65 64 20 70 61 74 68 2e 0a 20 2a 0a alized path.. *.
13510 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
13520 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d . *.None.. *. *-
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
13580 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 57 69 6e Tcl_Obj *.TclWin
13590 56 6f 6c 75 6d 65 52 65 6c 61 74 69 76 65 4e 6f VolumeRelativeNo
135a0 72 6d 61 6c 69 7a 65 28 0a 20 20 20 20 54 63 6c rmalize(. Tcl
135b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
135c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
135d0 2a 70 61 74 68 2c 0a 20 20 20 20 54 63 6c 5f 4f *path,. Tcl_O
135e0 62 6a 20 2a 2a 75 73 65 54 68 69 73 43 77 64 50 bj **useThisCwdP
135f0 74 72 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 tr).{. Tcl_Ob
13600 6a 20 2a 61 62 73 6f 6c 75 74 65 50 61 74 68 2c j *absolutePath,
13610 20 2a 75 73 65 54 68 69 73 43 77 64 3b 0a 0a 20 *useThisCwd;..
13620 20 20 20 75 73 65 54 68 69 73 43 77 64 20 3d 20 useThisCwd =
13630 54 63 6c 5f 46 53 47 65 74 43 77 64 28 69 6e 74 Tcl_FSGetCwd(int
13640 65 72 70 29 3b 0a 20 20 20 20 69 66 20 28 75 73 erp);. if (us
13650 65 54 68 69 73 43 77 64 20 3d 3d 20 4e 55 4c 4c eThisCwd == NULL
13660 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c ) {..return NULL
13670 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
13680 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 29 (path[0] == '/')
13690 20 7b 0a 09 2f 2a 0a 09 20 2a 20 50 61 74 68 20 {../*.. * Path
136a0 6f 66 20 66 6f 72 6d 20 2f 66 6f 6f 2f 62 61 72 of form /foo/bar
136b0 20 77 68 69 63 68 20 69 73 20 61 20 70 61 74 68 which is a path
136c0 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 64 69 72 in the root dir
136d0 65 63 74 6f 72 79 20 6f 66 20 74 68 65 0a 09 20 ectory of the..
136e0 2a 20 63 75 72 72 65 6e 74 20 76 6f 6c 75 6d 65 * current volume
136f0 2e 0a 09 20 2a 2f 0a 0a 09 63 6f 6e 73 74 20 63 ... */...const c
13700 68 61 72 20 2a 64 72 69 76 65 20 3d 20 54 63 6c har *drive = Tcl
13710 5f 47 65 74 53 74 72 69 6e 67 28 75 73 65 54 68 _GetString(useTh
13720 69 73 43 77 64 29 3b 0a 0a 09 61 62 73 6f 6c 75 isCwd);...absolu
13730 74 65 50 61 74 68 20 3d 20 54 63 6c 5f 4e 65 77 tePath = Tcl_New
13740 53 74 72 69 6e 67 4f 62 6a 28 64 72 69 76 65 2c StringObj(drive,
13750 32 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 2);..Tcl_AppendT
13760 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 65 50 61 74 oObj(absolutePat
13770 68 2c 20 70 61 74 68 2c 20 2d 31 29 3b 0a 09 54 h, path, -1);..T
13780 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
13790 61 62 73 6f 6c 75 74 65 50 61 74 68 29 3b 0a 0a absolutePath);..
137a0 09 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20 ./*.. * We have
137b0 61 20 72 65 66 43 6f 75 6e 74 20 6f 6e 20 74 68 a refCount on th
137c0 65 20 63 77 64 2e 0a 09 20 2a 2f 0a 20 20 20 20 e cwd... */.
137d0 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a } else {../*.. *
137e0 20 50 61 74 68 20 6f 66 20 66 6f 72 6d 20 43 3a Path of form C:
137f0 66 6f 6f 2f 62 61 72 2c 20 62 75 74 20 74 68 69 foo/bar, but thi
13800 73 20 6f 6e 6c 79 20 6d 61 6b 65 73 20 73 65 6e s only makes sen
13810 73 65 20 69 66 20 74 68 65 20 63 77 64 20 69 73 se if the cwd is
13820 0a 09 20 2a 20 61 6c 73 6f 20 6f 6e 20 64 72 69 .. * also on dri
13830 76 65 20 43 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 ve C... */...int
13840 20 63 77 64 4c 65 6e 3b 0a 09 63 6f 6e 73 74 20 cwdLen;..const
13850 63 68 61 72 20 2a 64 72 69 76 65 20 3d 0a 09 09 char *drive =...
13860 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
13870 6d 4f 62 6a 28 75 73 65 54 68 69 73 43 77 64 2c mObj(useThisCwd,
13880 20 26 63 77 64 4c 65 6e 29 3b 0a 09 63 68 61 72 &cwdLen);..char
13890 20 64 72 69 76 65 5f 63 75 72 20 3d 20 70 61 74 drive_cur = pat
138a0 68 5b 30 5d 3b 0a 0a 09 69 66 20 28 64 72 69 76 h[0];...if (driv
138b0 65 5f 63 75 72 20 3e 3d 20 27 61 27 29 20 7b 0a e_cur >= 'a') {.
138c0 09 20 20 20 20 64 72 69 76 65 5f 63 75 72 20 2d . drive_cur -
138d0 3d 20 28 27 61 27 20 2d 20 27 41 27 29 3b 0a 09 = ('a' - 'A');..
138e0 7d 0a 09 69 66 20 28 64 72 69 76 65 5b 30 5d 20 }..if (drive[0]
138f0 3d 3d 20 64 72 69 76 65 5f 63 75 72 29 20 7b 0a == drive_cur) {.
13900 09 20 20 20 20 61 62 73 6f 6c 75 74 65 50 61 74 . absolutePat
13910 68 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 h = Tcl_Duplicat
13920 65 4f 62 6a 28 75 73 65 54 68 69 73 43 77 64 29 eObj(useThisCwd)
13930 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 ;... /*..
13940 20 2a 20 57 65 20 68 61 76 65 20 61 20 72 65 66 * We have a ref
13950 43 6f 75 6e 74 20 6f 6e 20 74 68 65 20 63 77 64 Count on the cwd
13960 2c 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 , which we will
13970 72 65 6c 65 61 73 65 20 6c 61 74 65 72 2e 0a 09 release later...
13980 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
13990 20 28 64 72 69 76 65 5b 63 77 64 4c 65 6e 2d 31 (drive[cwdLen-1
139a0 5d 20 21 3d 20 27 2f 27 20 26 26 20 28 70 61 74 ] != '/' && (pat
139b0 68 5b 32 5d 20 21 3d 20 27 5c 30 27 29 29 20 7b h[2] != '\0')) {
139c0 0a 09 09 2f 2a 0a 09 09 20 2a 20 4f 6e 6c 79 20 .../*... * Only
139d0 61 64 64 20 61 20 74 72 61 69 6c 69 6e 67 20 27 add a trailing '
139e0 2f 27 20 69 66 20 6e 65 65 64 65 64 2c 20 77 68 /' if needed, wh
139f0 69 63 68 20 69 73 20 69 66 20 74 68 65 72 65 20 ich is if there
13a00 69 73 6e 27 74 0a 09 09 20 2a 20 6f 6e 65 20 61 isn't... * one a
13a10 6c 72 65 61 64 79 2c 20 61 6e 64 20 69 66 20 77 lready, and if w
13a20 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 62 e are going to b
13a30 65 20 61 64 64 69 6e 67 20 73 6f 6d 65 20 6d 6f e adding some mo
13a40 72 65 0a 09 09 20 2a 20 63 68 61 72 61 63 74 65 re... * characte
13a50 72 73 2e 0a 09 09 20 2a 2f 0a 0a 09 09 54 63 6c rs.... */....Tcl
13a60 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73 _AppendToObj(abs
13a70 6f 6c 75 74 65 50 61 74 68 2c 20 22 2f 22 2c 20 olutePath, "/",
13a80 31 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 1);.. }..} el
13a90 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 se {.. Tcl_De
13aa0 63 72 52 65 66 43 6f 75 6e 74 28 75 73 65 54 68 crRefCount(useTh
13ab0 69 73 43 77 64 29 3b 0a 09 20 20 20 20 75 73 65 isCwd);.. use
13ac0 54 68 69 73 43 77 64 20 3d 20 4e 55 4c 4c 3b 0a ThisCwd = NULL;.
13ad0 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
13ae0 20 54 68 65 20 70 61 74 68 20 69 73 20 6e 6f 74 The path is not
13af0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 in the current
13b00 64 72 69 76 65 2c 20 62 75 74 20 69 73 20 76 6f drive, but is vo
13b10 6c 75 6d 65 2d 72 65 6c 61 74 69 76 65 2e 0a 09 lume-relative...
13b20 20 20 20 20 20 2a 20 54 68 65 20 77 61 79 20 54 * The way T
13b30 63 6c 20 38 2e 33 20 68 61 6e 64 6c 65 73 20 74 cl 8.3 handles t
13b40 68 69 73 20 69 73 20 74 68 61 74 20 69 74 20 74 his is that it t
13b50 72 65 61 74 73 20 73 75 63 68 20 61 20 70 61 74 reats such a pat
13b60 68 20 61 73 0a 09 20 20 20 20 20 2a 20 72 65 6c h as.. * rel
13b70 61 74 69 76 65 20 74 6f 20 74 68 65 20 72 6f 6f ative to the roo
13b80 74 20 6f 66 20 74 68 65 20 64 72 69 76 65 2e 20 t of the drive.
13b90 57 65 20 74 68 65 72 65 66 6f 72 65 20 62 65 68 We therefore beh
13ba0 61 76 65 20 74 68 65 20 73 61 6d 65 0a 09 20 20 ave the same..
13bb0 20 20 20 2a 20 68 65 72 65 2e 20 54 68 69 73 20 * here. This
13bc0 62 65 68 61 76 69 6f 75 72 20 69 73 2c 20 68 6f behaviour is, ho
13bd0 77 65 76 65 72 2c 20 64 69 66 66 65 72 65 6e 74 wever, different
13be0 20 74 6f 20 74 68 61 74 20 6f 66 20 74 68 65 0a to that of the.
13bf0 09 20 20 20 20 20 2a 20 77 69 6e 64 6f 77 73 20 . * windows
13c00 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 20 49 66 command-line. If
13c10 20 77 65 20 77 61 6e 74 20 74 6f 20 66 69 78 20 we want to fix
13c20 74 68 69 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 this at some poi
13c30 6e 74 20 69 6e 0a 09 20 20 20 20 20 2a 20 74 68 nt in.. * th
13c40 65 20 66 75 74 75 72 65 20 28 61 74 20 74 68 65 e future (at the
13c50 20 65 78 70 65 6e 73 65 20 6f 66 20 61 20 62 65 expense of a be
13c60 68 61 76 69 6f 75 72 20 63 68 61 6e 67 65 20 74 haviour change t
13c70 6f 20 54 63 6c 29 2c 20 77 65 0a 09 20 20 20 20 o Tcl), we..
13c80 20 2a 20 63 6f 75 6c 64 20 75 73 65 20 74 68 65 * could use the
13c90 20 27 5f 64 67 65 74 64 63 77 64 27 20 57 69 6e '_dgetdcwd' Win
13ca0 33 32 20 41 50 49 20 74 6f 20 67 65 74 20 74 68 32 API to get th
13cb0 65 20 64 72 69 76 65 27 73 20 63 77 64 2e 0a 09 e drive's cwd...
13cc0 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 61 62 */... ab
13cd0 73 6f 6c 75 74 65 50 61 74 68 20 3d 20 54 63 6c solutePath = Tcl
13ce0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 61 _NewStringObj(pa
13cf0 74 68 2c 20 32 29 3b 0a 09 20 20 20 20 54 63 6c th, 2);.. Tcl
13d00 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73 _AppendToObj(abs
13d10 6f 6c 75 74 65 50 61 74 68 2c 20 22 2f 22 2c 20 olutePath, "/",
13d20 31 29 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72 1);..}..Tcl_Incr
13d30 52 65 66 43 6f 75 6e 74 28 61 62 73 6f 6c 75 74 RefCount(absolut
13d40 65 50 61 74 68 29 3b 0a 09 54 63 6c 5f 41 70 70 ePath);..Tcl_App
13d50 65 6e 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 endToObj(absolut
13d60 65 50 61 74 68 2c 20 70 61 74 68 2b 32 2c 20 2d ePath, path+2, -
13d70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 75 1);. }. *u
13d80 73 65 54 68 69 73 43 77 64 50 74 72 20 3d 20 75 seThisCwdPtr = u
13d90 73 65 54 68 69 73 43 77 64 3b 0a 20 20 20 20 72 seThisCwd;. r
13da0 65 74 75 72 6e 20 61 62 73 6f 6c 75 74 65 50 61 eturn absolutePa
13db0 74 68 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d th;.}.../*. *---
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
13e10 63 6c 70 4e 61 74 69 76 65 54 6f 4e 6f 72 6d 61 clpNativeToNorma
13e20 6c 69 7a 65 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 lized --. *. *.C
13e30 6f 6e 76 65 72 74 20 6e 61 74 69 76 65 20 66 6f onvert native fo
13e40 72 6d 61 74 20 74 6f 20 61 20 6e 6f 72 6d 61 6c rmat to a normal
13e50 69 7a 65 64 20 70 61 74 68 20 6f 62 6a 65 63 74 ized path object
13e60 2c 20 77 69 74 68 20 72 65 66 43 6f 75 6e 74 20 , with refCount
13e70 6f 66 0a 20 2a 09 7a 65 72 6f 2e 0a 20 2a 0a 20 of. *.zero.. *.
13e80 2a 09 43 75 72 72 65 6e 74 6c 79 20 61 73 73 75 *.Currently assu
13e90 6d 65 73 20 61 6c 6c 20 6e 61 74 69 76 65 20 70 mes all native p
13ea0 61 74 68 73 20 61 72 65 20 61 63 74 75 61 6c 6c aths are actuall
13eb0 79 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 61 6c 72 y normalized alr
13ec0 65 61 64 79 2c 20 73 6f 0a 20 2a 09 69 66 20 74 eady, so. *.if t
13ed0 68 65 20 70 61 74 68 20 67 69 76 65 6e 20 69 73 he path given is
13ee0 20 6e 6f 74 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 not normalized
13ef0 74 68 69 73 20 77 69 6c 6c 20 61 63 74 75 61 6c this will actual
13f00 6c 79 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 20 ly just convert
13f10 74 6f 0a 20 2a 09 61 20 76 61 6c 69 64 20 73 74 to. *.a valid st
13f20 72 69 6e 67 20 70 61 74 68 2c 20 62 75 74 20 6e ring path, but n
13f30 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 ot necessarily a
13f40 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 6f 6e 65 2e normalized one.
13f50 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
13f60 20 2a 09 41 20 76 61 6c 69 64 20 6e 6f 72 6d 61 *.A valid norma
13f70 6c 69 7a 65 64 20 70 61 74 68 2e 0a 20 2a 0a 20 lized path.. *.
13f80 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
13f90 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d *.None.. *. *--
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 ---------. */..T
13ff0 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 70 4e 61 74 cl_Obj *.TclpNat
14000 69 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65 64 28 iveToNormalized(
14010 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
14020 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20 clientData).{.
14030 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 Tcl_DString ds
14040 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
14050 62 6a 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6c bjPtr;. int l
14060 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6f en;. char *co
14070 70 79 2c 20 2a 70 3b 0a 0a 20 20 20 20 54 63 6c py, *p;.. Tcl
14080 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 _WinTCharToUtf((
14090 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 63 6c const char *) cl
140a0 69 65 6e 74 44 61 74 61 2c 20 2d 31 2c 20 26 64 ientData, -1, &d
140b0 73 29 3b 0a 20 20 20 20 63 6f 70 79 20 3d 20 54 s);. copy = T
140c0 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 cl_DStringValue(
140d0 26 64 73 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 &ds);. len =
140e0 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 Tcl_DStringLengt
140f0 68 28 26 64 73 29 3b 0a 0a 20 20 20 20 2f 2a 0a h(&ds);.. /*.
14100 20 20 20 20 20 2a 20 43 65 72 74 61 69 6e 20 6e * Certain n
14110 61 74 69 76 65 20 70 61 74 68 20 72 65 70 72 65 ative path repre
14120 73 65 6e 74 61 74 69 6f 6e 73 20 6f 6e 20 57 69 sentations on Wi
14130 6e 64 6f 77 73 20 68 61 76 65 20 74 68 69 73 20 ndows have this
14140 73 70 65 63 69 61 6c 20 70 72 65 66 69 78 0a 20 special prefix.
14150 20 20 20 20 2a 20 74 6f 20 69 6e 64 69 63 61 74 * to indicat
14160 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 e that they are
14170 74 6f 20 62 65 20 74 72 65 61 74 65 64 20 73 70 to be treated sp
14180 65 63 69 61 6c 6c 79 2e 20 46 6f 72 20 65 78 61 ecially. For exa
14190 6d 70 6c 65 0a 20 20 20 20 20 2a 20 65 78 74 72 mple. * extr
141a0 65 6d 65 6c 79 20 6c 6f 6e 67 20 70 61 74 68 73 emely long paths
141b0 2c 20 6f 72 20 73 79 6d 6c 69 6e 6b 73 2e 0a 20 , or symlinks..
141c0 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
141d0 2a 63 6f 70 79 20 3d 3d 20 27 5c 5c 27 29 20 7b *copy == '\\') {
141e0 0a 09 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 ..if (0 == strnc
141f0 6d 70 28 63 6f 70 79 2c 22 5c 5c 3f 3f 5c 5c 22 mp(copy,"\\??\\"
14200 2c 34 29 29 20 7b 0a 09 20 20 20 20 63 6f 70 79 ,4)) {.. copy
14210 20 2b 3d 20 34 3b 0a 09 20 20 20 20 6c 65 6e 20 += 4;.. len
14220 2d 3d 20 34 3b 0a 09 7d 20 65 6c 73 65 20 69 66 -= 4;..} else if
14230 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 63 (0 == strncmp(c
14240 6f 70 79 2c 22 5c 5c 5c 5c 3f 5c 5c 22 2c 34 29 opy,"\\\\?\\",4)
14250 29 20 7b 0a 09 20 20 20 20 63 6f 70 79 20 2b 3d ) {.. copy +=
14260 20 34 3b 0a 09 20 20 20 20 6c 65 6e 20 2d 3d 20 4;.. len -=
14270 34 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 4;..}. }..
14280 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 /*. * Ensur
14290 65 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 66 e we are using f
142a0 6f 72 77 61 72 64 20 73 6c 61 73 68 65 73 20 6f orward slashes o
142b0 6e 6c 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 nly.. */..
142c0 20 20 66 6f 72 20 28 70 20 3d 20 63 6f 70 79 3b for (p = copy;
142d0 20 2a 70 20 21 3d 20 27 5c 30 27 3b 20 70 2b 2b *p != '\0'; p++
142e0 29 20 7b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27 ) {..if (*p == '
142f0 5c 5c 27 29 20 7b 0a 09 20 20 20 20 2a 70 20 3d \\') {.. *p =
14300 20 27 2f 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a '/';..}. }..
14310 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c objPtr = Tcl
14320 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f _NewStringObj(co
14330 70 79 2c 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c py,len);. Tcl
14340 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 _DStringFree(&ds
14350 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6f );.. return o
14360 62 6a 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a bjPtr;.}.../*. *
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
143b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
143c0 2a 20 54 63 6c 4e 61 74 69 76 65 43 72 65 61 74 * TclNativeCreat
143d0 65 4e 61 74 69 76 65 52 65 70 20 2d 2d 0a 20 2a eNativeRep --. *
143e0 0a 20 2a 09 43 72 65 61 74 65 20 61 20 6e 61 74 . *.Create a nat
143f0 69 76 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 ive representati
14400 6f 6e 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e on for the given
14410 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 52 65 73 path.. *. * Res
14420 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 61 74 ults:. *.The nat
14430 69 76 65 50 61 74 68 20 72 65 70 72 65 73 65 6e ivePath represen
14440 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69 tation.. *. * Si
14450 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d de effects:. *.M
14460 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 61 6c emory will be al
14470 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 70 61 74 located. The pat
14480 68 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 h may need to be
14490 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0a 20 2a 0a normalized.. *.
144a0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
144f0 2f 0a 0a 43 6c 69 65 6e 74 44 61 74 61 0a 54 63 /..ClientData.Tc
14500 6c 4e 61 74 69 76 65 43 72 65 61 74 65 4e 61 74 lNativeCreateNat
14510 69 76 65 52 65 70 28 0a 20 20 20 20 54 63 6c 5f iveRep(. Tcl_
14520 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 0a 7b 0a Obj *pathPtr).{.
14530 20 20 20 20 63 68 61 72 20 2a 6e 61 74 69 76 65 char *native
14540 50 61 74 68 50 74 72 2c 20 2a 73 74 72 3b 0a 20 PathPtr, *str;.
14550 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 Tcl_DString d
14560 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a s;. Tcl_Obj *
14570 76 61 6c 69 64 50 61 74 68 50 74 72 3b 0a 20 20 validPathPtr;.
14580 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 int len;..
14590 69 66 20 28 54 63 6c 46 53 43 77 64 49 73 4e 61 if (TclFSCwdIsNa
145a0 74 69 76 65 28 29 29 20 7b 0a 09 2f 2a 0a 09 20 tive()) {../*..
145b0 2a 20 54 68 65 20 63 77 64 20 69 73 20 6e 61 74 * The cwd is nat
145c0 69 76 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 ive, which means
145d0 20 77 65 20 63 61 6e 20 75 73 65 20 74 68 65 20 we can use the
145e0 74 72 61 6e 73 6c 61 74 65 64 20 70 61 74 68 0a translated path.
145f0 09 20 2a 20 77 69 74 68 6f 75 74 20 77 6f 72 72 . * without worr
14600 79 69 6e 67 20 61 62 6f 75 74 20 6e 6f 72 6d 61 ying about norma
14610 6c 69 7a 61 74 69 6f 6e 20 28 74 68 69 73 20 77 lization (this w
14620 69 6c 6c 20 61 6c 73 6f 20 75 73 75 61 6c 6c 79 ill also usually
14630 20 62 65 0a 09 20 2a 20 73 68 6f 72 74 65 72 20 be.. * shorter
14640 73 6f 20 74 68 65 20 75 74 66 2d 74 6f 2d 65 78 so the utf-to-ex
14650 74 65 72 6e 61 6c 20 63 6f 6e 76 65 72 73 69 6f ternal conversio
14660 6e 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 77 68 n will be somewh
14670 61 74 20 66 61 73 74 65 72 29 2e 0a 09 20 2a 2f at faster)... */
14680 0a 0a 09 76 61 6c 69 64 50 61 74 68 50 74 72 20 ...validPathPtr
14690 3d 20 54 63 6c 5f 46 53 47 65 74 54 72 61 6e 73 = Tcl_FSGetTrans
146a0 6c 61 74 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 latedPath(NULL,
146b0 70 61 74 68 50 74 72 29 3b 0a 09 69 66 20 28 76 pathPtr);..if (v
146c0 61 6c 69 64 50 61 74 68 50 74 72 20 3d 3d 20 4e alidPathPtr == N
146d0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ULL) {.. retu
146e0 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 rn NULL;..}.
146f0 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a } else {../*.. *
14700 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e Make sure the n
14710 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 69 ormalized path i
14720 73 20 73 65 74 2e 0a 09 20 2a 2f 0a 0a 09 76 61 s set... */...va
14730 6c 69 64 50 61 74 68 50 74 72 20 3d 20 54 63 6c lidPathPtr = Tcl
14740 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 _FSGetNormalized
14750 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 74 68 50 Path(NULL, pathP
14760 74 72 29 3b 0a 09 69 66 20 28 76 61 6c 69 64 50 tr);..if (validP
14770 61 74 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 athPtr == NULL)
14780 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 {.. return NU
14790 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72 LL;..}..Tcl_Incr
147a0 52 65 66 43 6f 75 6e 74 28 76 61 6c 69 64 50 61 RefCount(validPa
147b0 74 68 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 thPtr);. }..
147c0 20 20 20 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 str = Tcl_Get
147d0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 61 StringFromObj(va
147e0 6c 69 64 50 61 74 68 50 74 72 2c 20 26 6c 65 6e lidPathPtr, &len
147f0 29 3b 0a 20 20 20 20 54 63 6c 5f 57 69 6e 55 74 );. Tcl_WinUt
14800 66 54 6f 54 43 68 61 72 28 73 74 72 2c 20 6c 65 fToTChar(str, le
14810 6e 2c 20 26 64 73 29 3b 0a 20 20 20 20 69 66 20 n, &ds);. if
14820 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 75 73 (tclWinProcs->us
14830 65 57 69 64 65 29 20 7b 0a 09 57 43 48 41 52 20 eWide) {..WCHAR
14840 2a 77 70 20 3d 20 28 57 43 48 41 52 20 2a 29 20 *wp = (WCHAR *)
14850 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 Tcl_DStringValue
14860 28 26 64 73 29 3b 0a 09 2f 2a 20 46 6f 72 20 61 (&ds);../* For a
14870 20 72 65 73 65 72 76 65 64 20 64 65 76 69 63 65 reserved device
14880 2c 20 73 74 72 69 70 20 61 20 70 6f 73 73 69 62 , strip a possib
14890 6c 65 20 70 6f 73 74 66 69 78 20 27 3a 27 20 2a le postfix ':' *
148a0 2f 0a 09 6c 65 6e 20 3d 20 57 69 6e 49 73 52 65 /..len = WinIsRe
148b0 73 65 72 76 65 64 28 73 74 72 29 3b 0a 09 2f 2a served(str);../*
148c0 20 46 6f 72 20 6e 6f 72 6d 61 6c 20 64 65 76 69 For normal devi
148d0 63 65 73 20 2a 2f 0a 09 69 66 20 28 6c 65 6e 20 ces */..if (len
148e0 3d 3d 20 30 29 20 6c 65 6e 20 3d 20 54 63 6c 5f == 0) len = Tcl_
148f0 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 DStringLength(&d
14900 73 29 3e 3e 31 3b 0a 09 2f 2a 0a 09 2a 2a 20 49 s)>>1;../*..** I
14910 66 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69 f path starts wi
14920 74 68 20 22 2f 2f 3f 2f 22 20 6f 72 20 22 5c 5c th "//?/" or "\\
14930 3f 5c 22 20 28 65 78 74 65 6e 64 65 64 20 70 61 ?\" (extended pa
14940 74 68 29 2c 20 74 72 61 6e 73 6c 61 74 65 0a 09 th), translate..
14950 2a 2a 20 61 6e 79 20 73 6c 61 73 68 65 73 20 74 ** any slashes t
14960 6f 20 62 61 63 6b 73 6c 61 73 68 65 73 20 62 75 o backslashes bu
14970 74 20 61 63 63 65 70 74 20 74 68 65 20 27 3f 27 t accept the '?'
14980 20 61 73 20 62 65 69 6e 67 20 76 61 6c 69 64 2e as being valid.
14990 0a 09 2a 2f 0a 09 69 66 20 28 28 73 74 72 5b 30 ..*/..if ((str[0
149a0 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 30 ]=='\\' || str[0
149b0 5d 3d 3d 27 2f 27 29 20 26 26 20 28 73 74 72 5b ]=='/') && (str[
149c0 31 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 1]=='\\' || str[
149d0 31 5d 3d 3d 27 2f 27 29 0a 09 09 26 26 20 73 74 1]=='/')...&& st
149e0 72 5b 32 5d 3d 3d 27 3f 27 20 26 26 20 28 73 74 r[2]=='?' && (st
149f0 72 5b 33 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 74 r[3]=='\\' || st
14a00 72 5b 33 5d 3d 3d 27 2f 27 29 29 20 7b 0a 09 20 r[3]=='/')) {..
14a10 20 20 20 77 70 5b 30 5d 20 3d 20 77 70 5b 31 5d wp[0] = wp[1]
14a20 20 3d 20 77 70 5b 33 5d 20 3d 20 27 5c 5c 27 3b = wp[3] = '\\';
14a30 0a 09 20 20 20 20 73 74 72 20 2b 3d 20 34 3b 0a .. str += 4;.
14a40 09 20 20 20 20 77 70 20 2b 3d 20 34 3b 0a 09 20 . wp += 4;..
14a50 20 20 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d 0a len -= 4;..}.
14a60 09 2f 2a 0a 09 2a 2a 20 49 66 20 74 68 65 72 65 ./*..** If there
14a70 20 69 73 20 61 20 64 72 69 76 65 20 70 72 65 66 is a drive pref
14a80 69 78 2c 20 74 68 65 20 27 3a 27 20 6d 75 73 74 ix, the ':' must
14a90 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 be considered v
14aa0 61 6c 69 64 2e 0a 09 2a 2a 2f 0a 09 69 66 20 28 alid...**/..if (
14ab0 28 28 73 74 72 5b 30 5d 3e 3d 27 41 27 26 26 73 ((str[0]>='A'&&s
14ac0 74 72 5b 30 5d 3c 3d 27 5a 27 29 20 7c 7c 20 28 tr[0]<='Z') || (
14ad0 73 74 72 5b 30 5d 3e 3d 27 61 27 26 26 73 74 72 str[0]>='a'&&str
14ae0 5b 30 5d 3c 3d 27 7a 27 29 29 0a 09 09 26 26 20 [0]<='z'))...&&
14af0 73 74 72 5b 31 5d 3d 3d 27 3a 27 29 20 7b 0a 09 str[1]==':') {..
14b00 20 20 20 20 77 70 20 2b 3d 20 32 3b 0a 09 20 20 wp += 2;..
14b10 20 20 6c 65 6e 20 2d 3d 20 32 3b 0a 09 7d 0a 09 len -= 2;..}..
14b20 77 68 69 6c 65 20 28 6c 65 6e 2d 2d 3e 30 29 20 while (len-->0)
14b30 7b 0a 09 20 20 20 20 69 66 20 28 28 2a 77 70 20 {.. if ((*wp
14b40 3c 20 27 20 27 29 20 7c 7c 20 77 63 73 63 68 72 < ' ') || wcschr
14b50 28 4c 22 5c 22 2a 3a 3c 3e 3f 7c 22 2c 20 2a 77 (L"\"*:<>?|", *w
14b60 70 29 29 20 7b 0a 09 09 54 63 6c 5f 44 65 63 72 p)) {...Tcl_Decr
14b70 52 65 66 43 6f 75 6e 74 28 76 61 6c 69 64 50 61 RefCount(validPa
14b80 74 68 50 74 72 29 3b 0a 09 09 54 63 6c 5f 44 53 thPtr);...Tcl_DS
14b90 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a tringFree(&ds);.
14ba0 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 ..return NULL;..
14bb0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 2a } else if (*
14bc0 77 70 3d 3d 27 2f 27 29 20 7b 0a 09 09 2a 77 70 wp=='/') {...*wp
14bd0 20 3d 20 27 5c 5c 27 3b 0a 09 20 20 20 20 7d 0a = '\\';.. }.
14be0 09 20 20 20 20 2b 2b 77 70 3b 0a 09 7d 0a 09 6c . ++wp;..}..l
14bf0 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 en = Tcl_DString
14c00 4c 65 6e 67 74 68 28 26 64 73 29 20 2b 20 73 69 Length(&ds) + si
14c10 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 20 zeof(WCHAR);.
14c20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 68 61 72 20 } else {..char
14c30 2a 70 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 *p = Tcl_DString
14c40 56 61 6c 75 65 28 26 64 73 29 3b 0a 09 6c 65 6e Value(&ds);..len
14c50 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 = Tcl_DStringLe
14c60 6e 67 74 68 28 26 64 73 29 3b 0a 09 2f 2a 0a 09 ngth(&ds);../*..
14c70 2a 2a 20 49 66 20 70 61 74 68 20 73 74 61 72 74 ** If path start
14c80 73 20 77 69 74 68 20 22 2f 2f 3f 2f 22 20 6f 72 s with "//?/" or
14c90 20 22 5c 5c 3f 5c 22 20 28 65 78 74 65 6e 64 65 "\\?\" (extende
14ca0 64 20 70 61 74 68 29 2c 20 74 72 61 6e 73 6c 61 d path), transla
14cb0 74 65 0a 09 2a 2a 20 61 6e 79 20 73 6c 61 73 68 te..** any slash
14cc0 65 73 20 74 6f 20 62 61 63 6b 73 6c 61 73 68 65 es to backslashe
14cd0 73 20 62 75 74 20 61 63 63 65 70 74 20 74 68 65 s but accept the
14ce0 20 27 3f 27 20 61 73 20 62 65 69 6e 67 20 76 61 '?' as being va
14cf0 6c 69 64 2e 0a 09 2a 2f 0a 09 69 66 20 28 28 73 lid...*/..if ((s
14d00 74 72 5b 30 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 tr[0]=='\\' || s
14d10 74 72 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 28 tr[0]=='/') && (
14d20 73 74 72 5b 31 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 str[1]=='\\' ||
14d30 73 74 72 5b 31 5d 3d 3d 27 2f 27 29 0a 09 09 26 str[1]=='/')...&
14d40 26 20 73 74 72 5b 32 5d 3d 3d 27 3f 27 20 26 26 & str[2]=='?' &&
14d50 20 28 73 74 72 5b 33 5d 3d 3d 27 5c 5c 27 20 7c (str[3]=='\\' |
14d60 7c 20 73 74 72 5b 33 5d 3d 3d 27 2f 27 29 29 20 | str[3]=='/'))
14d70 7b 0a 09 20 20 20 20 70 5b 30 5d 20 3d 20 70 5b {.. p[0] = p[
14d80 31 5d 20 3d 20 70 5b 33 5d 20 3d 20 27 5c 5c 27 1] = p[3] = '\\'
14d90 3b 0a 09 20 20 20 20 73 74 72 20 2b 3d 20 34 3b ;.. str += 4;
14da0 0a 09 20 20 20 20 70 20 2b 3d 20 34 3b 0a 09 20 .. p += 4;..
14db0 20 20 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d 0a len -= 4;..}.
14dc0 09 2f 2a 0a 09 2a 2a 20 49 66 20 74 68 65 72 65 ./*..** If there
14dd0 20 69 73 20 61 20 64 72 69 76 65 20 70 72 65 66 is a drive pref
14de0 69 78 2c 20 74 68 65 20 27 3a 27 20 6d 75 73 74 ix, the ':' must
14df0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 be considered v
14e00 61 6c 69 64 2e 0a 09 2a 2a 2f 0a 09 69 66 20 28 alid...**/..if (
14e10 28 28 73 74 72 5b 30 5d 3e 3d 27 41 27 26 26 73 ((str[0]>='A'&&s
14e20 74 72 5b 30 5d 3c 3d 27 5a 27 29 20 7c 7c 20 28 tr[0]<='Z') || (
14e30 73 74 72 5b 30 5d 3e 3d 27 61 27 26 26 73 74 72 str[0]>='a'&&str
14e40 5b 30 5d 3c 3d 27 7a 27 29 29 0a 09 09 26 26 20 [0]<='z'))...&&
14e50 73 74 72 5b 31 5d 3d 3d 27 3a 27 29 20 7b 0a 09 str[1]==':') {..
14e60 20 20 20 20 70 20 2b 3d 20 32 3b 0a 09 20 20 20 p += 2;..
14e70 20 6c 65 6e 20 2d 3d 20 32 3b 0a 09 7d 0a 09 77 len -= 2;..}..w
14e80 68 69 6c 65 20 28 6c 65 6e 2d 2d 3e 30 29 20 7b hile (len-->0) {
14e90 0a 09 20 20 20 20 69 66 20 28 28 2a 70 20 3c 20 .. if ((*p <
14ea0 27 20 27 29 20 7c 7c 20 73 74 72 63 68 72 28 22 ' ') || strchr("
14eb0 5c 22 2a 3a 3c 3e 3f 7c 22 2c 20 2a 70 29 29 20 \"*:<>?|", *p))
14ec0 7b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {...Tcl_DecrRefC
14ed0 6f 75 6e 74 28 76 61 6c 69 64 50 61 74 68 50 74 ount(validPathPt
14ee0 72 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e r);...Tcl_DStrin
14ef0 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 72 65 gFree(&ds);...re
14f00 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 turn NULL;..
14f10 7d 20 65 6c 73 65 20 69 66 20 28 2a 70 3d 3d 27 } else if (*p=='
14f20 2f 27 29 20 7b 0a 09 09 2a 70 20 3d 20 27 5c 5c /') {...*p = '\\
14f30 27 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2b ';.. }.. +
14f40 2b 70 3b 0a 09 7d 0a 09 6c 65 6e 20 3d 20 54 63 +p;..}..len = Tc
14f50 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 l_DStringLength(
14f60 26 64 73 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 &ds) + sizeof(ch
14f70 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ar);. }. T
14f80 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
14f90 76 61 6c 69 64 50 61 74 68 50 74 72 29 3b 0a 20 validPathPtr);.
14fa0 20 20 20 6e 61 74 69 76 65 50 61 74 68 50 74 72 nativePathPtr
14fb0 20 3d 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 = ckalloc((unsi
14fc0 67 6e 65 64 29 20 6c 65 6e 29 3b 0a 20 20 20 20 gned) len);.
14fd0 6d 65 6d 63 70 79 28 6e 61 74 69 76 65 50 61 74 memcpy(nativePat
14fe0 68 50 74 72 2c 20 54 63 6c 5f 44 53 74 72 69 6e hPtr, Tcl_DStrin
14ff0 67 56 61 6c 75 65 28 26 64 73 29 2c 20 28 73 69 gValue(&ds), (si
15000 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 0a 20 20 20 ze_t) len);..
15010 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 Tcl_DStringFree
15020 28 26 64 73 29 3b 0a 20 20 20 20 72 65 74 75 72 (&ds);. retur
15030 6e 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6e n (ClientData) n
15040 61 74 69 76 65 50 61 74 68 50 74 72 3b 0a 7d 0a ativePathPtr;.}.
15050 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
15060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
150a0 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4e 61 74 69 --. *. * TclNati
150b0 76 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 veDupInternalRep
150c0 20 2d 2d 0a 20 2a 0a 20 2a 09 44 75 70 6c 69 63 --. *. *.Duplic
150d0 61 74 65 20 74 68 65 20 6e 61 74 69 76 65 20 72 ate the native r
150e0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 epresentation..
150f0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
15100 09 54 68 65 20 63 6f 70 69 65 64 20 6e 61 74 69 .The copied nati
15110 76 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f ve representatio
15120 6e 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 n, or NULL if it
15130 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 is not possible
15140 20 74 6f 0a 20 2a 09 63 6f 70 79 20 74 68 65 20 to. *.copy the
15150 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a representation..
15160 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
15170 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 61 6c ts:. *.Memory al
15180 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 location for the
15190 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d copy.. *. *----
151a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c 69 -------. */..Cli
151f0 65 6e 74 44 61 74 61 0a 54 63 6c 4e 61 74 69 76 entData.TclNativ
15200 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 28 eDupInternalRep(
15210 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
15220 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20 clientData).{.
15230 20 20 63 68 61 72 20 2a 63 6f 70 79 3b 0a 20 20 char *copy;.
15240 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 0a 20 size_t len;..
15250 20 20 20 69 66 20 28 63 6c 69 65 6e 74 44 61 74 if (clientDat
15260 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 a == NULL) {..re
15270 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
15280 0a 0a 20 20 20 20 69 66 20 28 74 63 6c 57 69 6e .. if (tclWin
15290 50 72 6f 63 73 2d 3e 75 73 65 57 69 64 65 29 20 Procs->useWide)
152a0 7b 0a 09 2f 2a 0a 09 20 2a 20 55 6e 69 63 6f 64 {../*.. * Unicod
152b0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e e representation
152c0 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e when running on
152d0 20 4e 54 2f 32 4b 2f 58 50 2e 0a 09 20 2a 2f 0a NT/2K/XP... */.
152e0 0a 09 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 57 ..len = sizeof(W
152f0 43 48 41 52 29 20 2a 20 28 77 63 73 6c 65 6e 28 CHAR) * (wcslen(
15300 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 20 (const WCHAR *)
15310 63 6c 69 65 6e 74 44 61 74 61 29 20 2b 20 31 29 clientData) + 1)
15320 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
15330 2f 2a 0a 09 20 2a 20 41 4e 53 49 20 72 65 70 72 /*.. * ANSI repr
15340 65 73 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 esentation when
15350 72 75 6e 6e 69 6e 67 20 6f 6e 20 39 35 2f 39 38 running on 95/98
15360 2f 4d 45 2e 0a 09 20 2a 2f 0a 0a 09 6c 65 6e 20 /ME... */...len
15370 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20 2a = sizeof(char) *
15380 20 28 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 (strlen((const
15390 63 68 61 72 20 2a 29 20 63 6c 69 65 6e 74 44 61 char *) clientDa
153a0 74 61 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a ta) + 1);. }.
153b0 0a 20 20 20 20 63 6f 70 79 20 3d 20 28 63 68 61 . copy = (cha
153c0 72 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 6c 65 6e r *) ckalloc(len
153d0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 63 6f );. memcpy(co
153e0 70 79 2c 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 py, clientData,
153f0 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e len);. return
15400 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 63 6f (ClientData) co
15410 70 79 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d py;.}.../*. *---
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
15470 63 6c 70 55 74 69 6d 65 20 2d 2d 0a 20 2a 0a 20 clpUtime --. *.
15480 2a 09 53 65 74 20 74 68 65 20 6d 6f 64 69 66 69 *.Set the modifi
15490 63 61 74 69 6f 6e 20 64 61 74 65 20 66 6f 72 20 cation date for
154a0 61 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 a file.. *. * Re
154b0 73 75 6c 74 73 3a 0a 20 2a 09 30 20 6f 6e 20 73 sults:. *.0 on s
154c0 75 63 63 65 73 73 2c 20 2d 31 20 6f 6e 20 65 72 uccess, -1 on er
154d0 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ror.. *. * Side
154e0 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
154f0 20 65 72 72 6e 6f 20 74 6f 20 61 20 72 65 70 72 errno to a repr
15500 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e esentation of an
15510 79 20 57 69 6e 64 6f 77 73 20 70 72 6f 62 6c 65 y Windows proble
15520 6d 20 74 68 61 74 27 73 20 6f 62 73 65 72 76 65 m that's observe
15530 64 0a 20 2a 09 69 6e 20 74 68 65 20 70 72 6f 63 d. *.in the proc
15540 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ess.. *. *------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15590 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
155a0 63 6c 70 55 74 69 6d 65 28 0a 20 20 20 20 54 63 clpUtime(. Tc
155b0 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 09 l_Obj *pathPtr,.
155c0 09 2f 2a 20 46 69 6c 65 20 74 6f 20 6d 6f 64 69 ./* File to modi
155d0 66 79 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 fy */. struct
155e0 20 75 74 69 6d 62 75 66 20 2a 74 76 61 6c 29 09 utimbuf *tval).
155f0 2f 2a 20 4e 65 77 20 6d 6f 64 69 66 69 63 61 74 /* New modificat
15600 69 6f 6e 20 64 61 74 65 20 73 74 72 75 63 74 75 ion date structu
15610 72 65 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 re */.{. int
15620 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 48 41 4e res = 0;. HAN
15630 44 4c 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b 0a DLE fileHandle;.
15640 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 const TCHAR
15650 2a 6e 61 74 69 76 65 3b 0a 20 20 20 20 44 57 4f *native;. DWO
15660 52 44 20 61 74 74 72 20 3d 20 30 3b 0a 20 20 20 RD attr = 0;.
15670 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 DWORD flags = F
15680 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f ILE_ATTRIBUTE_NO
15690 52 4d 41 4c 3b 0a 20 20 20 20 46 49 4c 45 54 49 RMAL;. FILETI
156a0 4d 45 20 6c 61 73 74 41 63 63 65 73 73 54 69 6d ME lastAccessTim
156b0 65 2c 20 6c 61 73 74 4d 6f 64 54 69 6d 65 3b 0a e, lastModTime;.
156c0 0a 20 20 20 20 46 72 6f 6d 43 54 69 6d 65 28 74 . FromCTime(t
156d0 76 61 6c 2d 3e 61 63 74 69 6d 65 2c 20 26 6c 61 val->actime, &la
156e0 73 74 41 63 63 65 73 73 54 69 6d 65 29 3b 0a 20 stAccessTime);.
156f0 20 20 20 46 72 6f 6d 43 54 69 6d 65 28 74 76 61 FromCTime(tva
15700 6c 2d 3e 6d 6f 64 74 69 6d 65 2c 20 26 6c 61 73 l->modtime, &las
15710 74 4d 6f 64 54 69 6d 65 29 3b 0a 0a 20 20 20 20 tModTime);..
15720 6e 61 74 69 76 65 20 3d 20 28 63 6f 6e 73 74 20 native = (const
15730 54 43 48 41 52 20 2a 29 20 54 63 6c 5f 46 53 47 TCHAR *) Tcl_FSG
15740 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 etNativePath(pat
15750 68 50 74 72 29 3b 0a 0a 20 20 20 20 61 74 74 72 hPtr);.. attr
15760 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 = (*tclWinProcs
15770 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 ->getFileAttribu
15780 74 65 73 50 72 6f 63 29 28 6e 61 74 69 76 65 29 tesProc)(native)
15790 3b 0a 0a 20 20 20 20 69 66 20 28 61 74 74 72 20 ;.. if (attr
157a0 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f != INVALID_FILE_
157b0 41 54 54 52 49 42 55 54 45 53 20 26 26 20 61 74 ATTRIBUTES && at
157c0 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 tr & FILE_ATTRIB
157d0 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20 7b UTE_DIRECTORY) {
157e0 0a 09 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46 ..flags = FILE_F
157f0 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e LAG_BACKUP_SEMAN
15800 54 49 43 53 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 TICS;. }..
15810 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 75 73 /*. * We us
15820 65 20 74 68 65 20 6e 61 74 69 76 65 20 41 50 49 e the native API
15830 73 20 28 6e 6f 74 20 27 75 74 69 6d 65 27 29 20 s (not 'utime')
15840 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72 because there ar
15850 65 20 73 6f 6d 65 20 64 61 79 6c 69 67 68 74 0a e some daylight.
15860 20 20 20 20 20 2a 20 73 61 76 69 6e 67 73 20 63 * savings c
15870 6f 6d 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 omplications tha
15880 74 20 75 74 69 6d 65 20 67 65 74 73 20 77 72 6f t utime gets wro
15890 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ng.. */..
158a0 20 66 69 6c 65 48 61 6e 64 6c 65 20 3d 20 28 74 fileHandle = (t
158b0 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 clWinProcs->crea
158c0 74 65 46 69 6c 65 50 72 6f 63 29 28 6e 61 74 69 teFileProc)(nati
158d0 76 65 2c 20 46 49 4c 45 5f 57 52 49 54 45 5f 41 ve, FILE_WRITE_A
158e0 54 54 52 49 42 55 54 45 53 2c 0a 09 20 20 20 20 TTRIBUTES,..
158f0 30 2c 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 0, NULL, OPEN_EX
15900 49 53 54 49 4e 47 2c 20 66 6c 61 67 73 2c 20 4e ISTING, flags, N
15910 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 66 ULL);.. if (f
15920 69 6c 65 48 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 ileHandle == INV
15930 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 ALID_HANDLE_VALU
15940 45 20 7c 7c 0a 09 20 20 20 20 21 53 65 74 46 69 E ||.. !SetFi
15950 6c 65 54 69 6d 65 28 66 69 6c 65 48 61 6e 64 6c leTime(fileHandl
15960 65 2c 20 4e 55 4c 4c 2c 20 26 6c 61 73 74 41 63 e, NULL, &lastAc
15970 63 65 73 73 54 69 6d 65 2c 20 26 6c 61 73 74 4d cessTime, &lastM
15980 6f 64 54 69 6d 65 29 29 20 7b 0a 09 54 63 6c 57 odTime)) {..TclW
15990 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 inConvertError(G
159a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a etLastError());.
159b0 09 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d .res = -1;. }
159c0 0a 20 20 20 20 69 66 20 28 66 69 6c 65 48 61 6e . if (fileHan
159d0 64 6c 65 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 dle != INVALID_H
159e0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 ANDLE_VALUE) {..
159f0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 66 69 6c 65 CloseHandle(file
15a00 48 61 6e 64 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 Handle);. }.
15a10 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
15a20 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 .../*. * Local V
15a30 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 ariables:. * mod
15a40 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73 69 63 2d e: c. * c-basic-
15a50 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 66 69 6c offset: 4. * fil
15a60 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 l-column: 78. *
15a70 45 6e 64 3a 0a 20 2a 2f 0a End:. */.