Tcl Source Code

Hex Artifact Content
Login

Artifact be08ee828fe6085642aca51c7d818644f7550e6f2f9c21beca928adcf85816b6:


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 c2 a9  . * Copyright ©
0110: 20 31 39 39 35 2d 31 39 39 38 20 53 75 6e 20 4d   1995-1998 Sun M
0120: 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63  icrosystems, Inc
0130: 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 20  .. *. * See the 
0140: 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 65  file "license.te
0150: 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d 61  rms" for informa
0160: 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 6e  tion on usage an
0170: 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e  d redistribution
0180: 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c 65   of. * this file
0190: 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53 43  , and for a DISC
01a0: 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 41  LAIMER OF ALL WA
01b0: 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a 23  RRANTIES.. */..#
01c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 57 69 6e 49  include "tclWinI
01d0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
01e0: 74 63 6c 46 69 6c 65 53 79 73 74 65 6d 2e 68 22  tclFileSystem.h"
01f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 69 6f  .#include <winio
0200: 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ctl.h>.#include 
0210: 3c 73 68 6c 6f 62 6a 2e 68 3e 0a 23 69 6e 63 6c  <shlobj.h>.#incl
0220: 75 64 65 20 3c 6c 6d 2e 68 3e 09 09 20 20 20 20  ude <lm.h>..    
0230: 20 20 20 20 2f 2a 20 46 6f 72 20 54 63 6c 70 47      /* For TclpG
0240: 65 74 55 73 65 72 48 6f 6d 65 28 29 2e 20 2a 2f  etUserHome(). */
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 73 65 72 65  .#include <usere
0260: 6e 76 2e 68 3e 09 09 2f 2a 20 46 6f 72 20 54 63  nv.h>../* For Tc
0270: 6c 70 47 65 74 55 73 65 72 48 6f 6d 65 28 29 2e  lpGetUserHome().
0280: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 63   */.#include <ac
0290: 6c 61 70 69 2e 68 3e 20 20 20 20 20 20 20 20 20  lapi.h>         
02a0: 20 20 20 20 2f 2a 20 46 6f 72 20 47 65 74 4e 61      /* For GetNa
02b0: 6d 65 64 53 65 63 75 72 69 74 79 49 6e 66 6f 20  medSecurityInfo 
02c0: 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f  */..#ifdef _MSC_
02d0: 56 45 52 0a 23 20 20 20 70 72 61 67 6d 61 20 63  VER.#   pragma c
02e0: 6f 6d 6d 65 6e 74 28 6c 69 62 2c 20 22 75 73 65  omment(lib, "use
02f0: 72 65 6e 76 2e 6c 69 62 22 29 0a 23 65 6e 64 69  renv.lib").#endi
0300: 66 0a 2f 2a 0a 20 2a 20 54 68 65 20 6e 75 6d 62  f./*. * The numb
0310: 65 72 20 6f 66 20 31 30 30 2d 6e 73 20 69 6e 74  er of 100-ns int
0320: 65 72 76 61 6c 73 20 62 65 74 77 65 65 6e 20 74  ervals between t
0330: 68 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  he Windows syste
0340: 6d 20 65 70 6f 63 68 20 28 31 36 30 31 2d 30 31  m epoch (1601-01
0350: 2d 30 31 0a 20 2a 20 6f 6e 20 74 68 65 20 70 72  -01. * on the pr
0360: 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
0370: 6e 20 63 61 6c 65 6e 64 61 72 29 20 61 6e 64 20  n calendar) and 
0380: 74 68 65 20 50 6f 73 69 78 20 65 70 6f 63 68 20  the Posix epoch 
0390: 28 31 39 37 30 2d 30 31 2d 30 31 29 2e 0a 20 2a  (1970-01-01).. *
03a0: 2f 0a 0a 23 64 65 66 69 6e 65 20 50 4f 53 49 58  /..#define POSIX
03b0: 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45 54 49  _EPOCH_AS_FILETI
03c0: 4d 45 09 5c 0a 09 28 28 6c 6f 6e 67 20 6c 6f 6e  ME.\..((long lon
03d0: 67 29 20 31 31 36 34 34 34 37 33 36 20 2a 20 28  g) 116444736 * (
03e0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 31 30 30 30 30  long long) 10000
03f0: 30 30 30 30 30 29 0a 0a 2f 2a 0a 20 2a 20 44 65  00000)../*. * De
0400: 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 27  clarations for '
0410: 6c 69 6e 6b 27 20 72 65 6c 61 74 65 64 20 69 6e  link' related in
0420: 66 6f 72 6d 61 74 69 6f 6e 2e 20 54 68 69 73 20  formation. This 
0430: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 68 6f 75  information shou
0440: 6c 64 20 63 6f 6d 65 0a 20 2a 20 77 69 74 68 20  ld come. * with 
0450: 56 43 2b 2b 20 36 2e 30 2c 20 62 75 74 20 69 73  VC++ 6.0, but is
0460: 20 6e 6f 74 20 69 6e 20 73 6f 6d 65 20 6f 6c 64   not in some old
0470: 65 72 20 53 44 4b 73 2e 20 49 6e 20 61 6e 79 20  er SDKs. In any 
0480: 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 77  case it is not w
0490: 65 6c 6c 0a 20 2a 20 64 6f 63 75 6d 65 6e 74 65  ell. * documente
04a0: 64 2e 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  d.. */..#ifndef 
04b0: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 52  IO_REPARSE_TAG_R
04c0: 45 53 45 52 56 45 44 5f 4f 4e 45 0a 23 20 20 64  ESERVED_ONE.#  d
04d0: 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45  efine IO_REPARSE
04e0: 5f 54 41 47 5f 52 45 53 45 52 56 45 44 5f 4f 4e  _TAG_RESERVED_ON
04f0: 45 09 30 78 30 30 30 30 30 30 30 30 31 0a 23 65  E.0x000000001.#e
0500: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f  ndif.#ifndef IO_
0510: 52 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45  REPARSE_TAG_RESE
0520: 52 56 45 44 5f 52 41 4e 47 45 0a 23 20 20 64 65  RVED_RANGE.#  de
0530: 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f  fine IO_REPARSE_
0540: 54 41 47 5f 52 45 53 45 52 56 45 44 5f 52 41 4e  TAG_RESERVED_RAN
0550: 47 45 09 30 78 30 30 30 30 30 30 30 30 31 0a 23  GE.0x000000001.#
0560: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f  endif.#ifndef IO
0570: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 56 41 4c  _REPARSE_TAG_VAL
0580: 49 44 5f 56 41 4c 55 45 53 0a 23 20 20 64 65 66  ID_VALUES.#  def
0590: 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54  ine IO_REPARSE_T
05a0: 41 47 5f 56 41 4c 49 44 5f 56 41 4c 55 45 53 09  AG_VALID_VALUES.
05b0: 30 78 30 45 30 30 30 46 46 46 46 0a 23 65 6e 64  0x0E000FFFF.#end
05c0: 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45  if.#ifndef IO_RE
05d0: 50 41 52 53 45 5f 54 41 47 5f 48 53 4d 0a 23 20  PARSE_TAG_HSM.# 
05e0: 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 52   define IO_REPAR
05f0: 53 45 5f 54 41 47 5f 48 53 4d 09 09 30 78 30 43  SE_TAG_HSM..0x0C
0600: 30 30 30 30 30 30 34 0a 23 65 6e 64 69 66 0a 23  0000004.#endif.#
0610: 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53  ifndef IO_REPARS
0620: 45 5f 54 41 47 5f 4e 53 53 0a 23 20 20 64 65 66  E_TAG_NSS.#  def
0630: 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54  ine IO_REPARSE_T
0640: 41 47 5f 4e 53 53 09 09 30 78 30 38 30 30 30 30  AG_NSS..0x080000
0650: 30 30 35 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  005.#endif.#ifnd
0660: 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41  ef IO_REPARSE_TA
0670: 47 5f 4e 53 53 52 45 43 4f 56 45 52 0a 23 20 20  G_NSSRECOVER.#  
0680: 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53  define IO_REPARS
0690: 45 5f 54 41 47 5f 4e 53 53 52 45 43 4f 56 45 52  E_TAG_NSSRECOVER
06a0: 09 30 78 30 38 30 30 30 30 30 30 36 0a 23 65 6e  .0x080000006.#en
06b0: 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52  dif.#ifndef IO_R
06c0: 45 50 41 52 53 45 5f 54 41 47 5f 53 49 53 0a 23  EPARSE_TAG_SIS.#
06d0: 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41    define IO_REPA
06e0: 52 53 45 5f 54 41 47 5f 53 49 53 09 09 30 78 30  RSE_TAG_SIS..0x0
06f0: 38 30 30 30 30 30 30 37 0a 23 65 6e 64 69 66 0a  80000007.#endif.
0700: 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52  #ifndef IO_REPAR
0710: 53 45 5f 54 41 47 5f 44 46 53 0a 23 20 20 64 65  SE_TAG_DFS.#  de
0720: 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f  fine IO_REPARSE_
0730: 54 41 47 5f 44 46 53 09 09 30 78 30 38 30 30 30  TAG_DFS..0x08000
0740: 30 30 30 38 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0008.#endif..#if
0750: 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f  ndef IO_REPARSE_
0760: 54 41 47 5f 52 45 53 45 52 56 45 44 5f 5a 45 52  TAG_RESERVED_ZER
0770: 4f 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52  O.#  define IO_R
0780: 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52  EPARSE_TAG_RESER
0790: 56 45 44 5f 5a 45 52 4f 09 30 78 30 30 30 30 30  VED_ZERO.0x00000
07a0: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  000.#endif.#ifnd
07b0: 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45  ef FILE_FLAG_OPE
07c0: 4e 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 0a  N_REPARSE_POINT.
07d0: 23 20 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46  #  define FILE_F
07e0: 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45  LAG_OPEN_REPARSE
07f0: 5f 50 4f 49 4e 54 09 30 78 30 30 32 30 30 30 30  _POINT.0x0020000
0800: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
0810: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f   IO_REPARSE_TAG_
0820: 4d 4f 55 4e 54 5f 50 4f 49 4e 54 0a 23 20 20 64  MOUNT_POINT.#  d
0830: 65 66 69 6e 65 20 49 4f 5f 52 45 50 41 52 53 45  efine IO_REPARSE
0840: 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54  _TAG_MOUNT_POINT
0850: 09 30 78 41 30 30 30 30 30 30 33 0a 23 65 6e 64  .0xA0000003.#end
0860: 69 66 0a 23 69 66 6e 64 65 66 20 49 73 52 65 70  if.#ifndef IsRep
0870: 61 72 73 65 54 61 67 56 61 6c 69 64 0a 23 20 20  arseTagValid.#  
0880: 64 65 66 69 6e 65 20 49 73 52 65 70 61 72 73 65  define IsReparse
0890: 54 61 67 56 61 6c 69 64 28 78 29 20 5c 0a 20 20  TagValid(x) \.  
08a0: 20 20 28 21 28 28 78 29 26 7e 49 4f 5f 52 45 50    (!((x)&~IO_REP
08b0: 41 52 53 45 5f 54 41 47 5f 56 41 4c 49 44 5f 56  ARSE_TAG_VALID_V
08c0: 41 4c 55 45 53 29 26 26 28 28 78 29 3e 49 4f 5f  ALUES)&&((x)>IO_
08d0: 52 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45  REPARSE_TAG_RESE
08e0: 52 56 45 44 5f 52 41 4e 47 45 29 29 0a 23 65 6e  RVED_RANGE)).#en
08f0: 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52  dif.#ifndef IO_R
0900: 45 50 41 52 53 45 5f 54 41 47 5f 53 59 4d 42 4f  EPARSE_TAG_SYMBO
0910: 4c 49 43 5f 4c 49 4e 4b 0a 23 20 20 64 65 66 69  LIC_LINK.#  defi
0920: 6e 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41  ne IO_REPARSE_TA
0930: 47 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 09  G_SYMBOLIC_LINK.
0940: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 52  IO_REPARSE_TAG_R
0950: 45 53 45 52 56 45 44 5f 5a 45 52 4f 0a 23 65 6e  ESERVED_ZERO.#en
0960: 64 69 66 0a 23 69 66 6e 64 65 66 20 46 49 4c 45  dif.#ifndef FILE
0970: 5f 53 50 45 43 49 41 4c 5f 41 43 43 45 53 53 0a  _SPECIAL_ACCESS.
0980: 23 20 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 53  #  define FILE_S
0990: 50 45 43 49 41 4c 5f 41 43 43 45 53 53 09 09 28  PECIAL_ACCESS..(
09a0: 46 49 4c 45 5f 41 4e 59 5f 41 43 43 45 53 53 29  FILE_ANY_ACCESS)
09b0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
09c0: 46 53 43 54 4c 5f 53 45 54 5f 52 45 50 41 52 53  FSCTL_SET_REPARS
09d0: 45 5f 50 4f 49 4e 54 0a 23 20 20 64 65 66 69 6e  E_POINT.#  defin
09e0: 65 20 46 53 43 54 4c 5f 53 45 54 5f 52 45 50 41  e FSCTL_SET_REPA
09f0: 52 53 45 5f 50 4f 49 4e 54 20 5c 0a 20 20 20 20  RSE_POINT \.    
0a00: 43 54 4c 5f 43 4f 44 45 28 46 49 4c 45 5f 44 45  CTL_CODE(FILE_DE
0a10: 56 49 43 45 5f 46 49 4c 45 5f 53 59 53 54 45 4d  VICE_FILE_SYSTEM
0a20: 2c 20 34 31 2c 20 4d 45 54 48 4f 44 5f 42 55 46  , 41, METHOD_BUF
0a30: 46 45 52 45 44 2c 20 46 49 4c 45 5f 53 50 45 43  FERED, FILE_SPEC
0a40: 49 41 4c 5f 41 43 43 45 53 53 29 0a 23 20 20 64  IAL_ACCESS).#  d
0a50: 65 66 69 6e 65 20 46 53 43 54 4c 5f 47 45 54 5f  efine FSCTL_GET_
0a60: 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 5c 0a  REPARSE_POINT \.
0a70: 20 20 20 20 43 54 4c 5f 43 4f 44 45 28 46 49 4c      CTL_CODE(FIL
0a80: 45 5f 44 45 56 49 43 45 5f 46 49 4c 45 5f 53 59  E_DEVICE_FILE_SY
0a90: 53 54 45 4d 2c 20 34 32 2c 20 4d 45 54 48 4f 44  STEM, 42, METHOD
0aa0: 5f 42 55 46 46 45 52 45 44 2c 20 46 49 4c 45 5f  _BUFFERED, FILE_
0ab0: 41 4e 59 5f 41 43 43 45 53 53 29 0a 23 20 20 64  ANY_ACCESS).#  d
0ac0: 65 66 69 6e 65 20 46 53 43 54 4c 5f 44 45 4c 45  efine FSCTL_DELE
0ad0: 54 45 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54  TE_REPARSE_POINT
0ae0: 20 5c 0a 20 20 20 20 43 54 4c 5f 43 4f 44 45 28   \.    CTL_CODE(
0af0: 46 49 4c 45 5f 44 45 56 49 43 45 5f 46 49 4c 45  FILE_DEVICE_FILE
0b00: 5f 53 59 53 54 45 4d 2c 20 34 33 2c 20 4d 45 54  _SYSTEM, 43, MET
0b10: 48 4f 44 5f 42 55 46 46 45 52 45 44 2c 20 46 49  HOD_BUFFERED, FI
0b20: 4c 45 5f 53 50 45 43 49 41 4c 5f 41 43 43 45 53  LE_SPECIAL_ACCES
0b30: 53 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  S).#endif.#ifnde
0b40: 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  f INVALID_FILE_A
0b50: 54 54 52 49 42 55 54 45 53 0a 23 64 65 66 69 6e  TTRIBUTES.#defin
0b60: 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  e INVALID_FILE_A
0b70: 54 54 52 49 42 55 54 45 53 09 09 28 28 44 57 4f  TTRIBUTES..((DWO
0b80: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
0b90: 2a 0a 20 2a 20 4d 61 78 69 6d 75 6d 20 72 65 70  *. * Maximum rep
0ba0: 61 72 73 65 20 62 75 66 66 65 72 20 69 6e 66 6f  arse buffer info
0bb0: 20 73 69 7a 65 2e 20 54 68 65 20 6d 61 78 20 75   size. The max u
0bc0: 73 65 72 20 64 65 66 69 6e 65 64 20 72 65 70 61  ser defined repa
0bd0: 72 73 65 20 64 61 74 61 20 69 73 0a 20 2a 20 31  rse data is. * 1
0be0: 36 4b 42 2c 20 70 6c 75 73 20 74 68 65 72 65 27  6KB, plus there'
0bf0: 73 20 61 20 68 65 61 64 65 72 2e 0a 20 2a 2f 0a  s a header.. */.
0c00: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 52 45 50  .#define MAX_REP
0c10: 41 52 53 45 5f 53 49 5a 45 09 09 31 37 30 30 30  ARSE_SIZE..17000
0c20: 0a 0a 2f 2a 0a 20 2a 20 55 6e 64 6f 63 75 6d 65  ../*. * Undocume
0c30: 6e 74 65 64 20 52 45 50 41 52 53 45 5f 4d 4f 55  nted REPARSE_MOU
0c40: 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 52 5f 53  NTPOINT_HEADER_S
0c50: 49 5a 45 20 73 74 72 75 63 74 75 72 65 20 64 65  IZE structure de
0c60: 66 69 6e 69 74 69 6f 6e 2e 20 54 68 69 73 20 69  finition. This i
0c70: 73 0a 20 2a 20 66 6f 75 6e 64 20 69 6e 20 77 69  s. * found in wi
0c80: 6e 6e 74 2e 68 2e 0a 20 2a 0a 20 2a 20 49 4d 50  nnt.h.. *. * IMP
0c90: 4f 52 54 41 4e 54 3a 20 63 61 75 74 69 6f 6e 20  ORTANT: caution 
0ca0: 77 68 65 6e 20 75 73 69 6e 67 20 74 68 69 73 20  when using this 
0cb0: 73 74 72 75 63 74 75 72 65 2c 20 73 69 6e 63 65  structure, since
0cc0: 20 74 68 65 20 61 63 74 75 61 6c 20 73 74 72 75   the actual stru
0cd0: 63 74 75 72 65 73 0a 20 2a 20 75 73 65 64 20 77  ctures. * used w
0ce0: 69 6c 6c 20 77 61 6e 74 20 74 6f 20 73 74 6f 72  ill want to stor
0cf0: 65 20 61 20 66 75 6c 6c 20 70 61 74 68 20 69 6e  e a full path in
0d00: 20 74 68 65 20 27 50 61 74 68 42 75 66 66 65 72   the 'PathBuffer
0d10: 27 20 66 69 65 6c 64 2c 20 62 75 74 20 74 68 65  ' field, but the
0d20: 72 65 0a 20 2a 20 69 73 6e 27 74 20 72 6f 6f 6d  re. * isn't room
0d30: 20 28 74 68 65 72 65 27 73 20 6f 6e 6c 79 20 61   (there's only a
0d40: 20 73 69 6e 67 6c 65 20 57 43 48 41 52 21 29 2e   single WCHAR!).
0d50: 20 54 68 65 72 65 66 6f 72 65 20 6f 6e 65 20 6d   Therefore one m
0d60: 75 73 74 20 61 72 74 69 66 69 63 69 61 6c 6c 79  ust artificially
0d70: 0a 20 2a 20 63 72 65 61 74 65 20 61 20 6c 61 72  . * create a lar
0d80: 67 65 72 20 73 70 61 63 65 20 6f 66 20 6d 65 6d  ger space of mem
0d90: 6f 72 79 20 61 6e 64 20 74 68 65 6e 20 63 61 73  ory and then cas
0da0: 74 20 69 74 20 74 6f 20 74 68 69 73 20 74 79 70  t it to this typ
0db0: 65 2e 20 57 65 20 75 73 65 20 74 68 65 0a 20 2a  e. We use the. *
0dc0: 20 27 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f   'DUMMY_REPARSE_
0dd0: 42 55 46 46 45 52 27 20 73 74 72 75 63 74 20 6a  BUFFER' struct j
0de0: 75 73 74 20 62 65 6c 6f 77 20 74 6f 20 64 65 61  ust below to dea
0df0: 6c 20 77 69 74 68 20 74 68 69 73 20 70 72 6f 62  l with this prob
0e00: 6c 65 6d 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e  lem.. */..#defin
0e10: 65 20 52 45 50 41 52 53 45 5f 4d 4f 55 4e 54 50  e REPARSE_MOUNTP
0e20: 4f 49 4e 54 5f 48 45 41 44 45 52 5f 53 49 5a 45  OINT_HEADER_SIZE
0e30: 09 20 38 0a 23 69 66 6e 64 65 66 20 52 45 50 41  . 8.#ifndef REPA
0e40: 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 5f  RSE_DATA_BUFFER_
0e50: 48 45 41 44 45 52 5f 53 49 5a 45 0a 74 79 70 65  HEADER_SIZE.type
0e60: 64 65 66 20 73 74 72 75 63 74 20 5f 52 45 50 41  def struct _REPA
0e70: 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20  RSE_DATA_BUFFER 
0e80: 7b 0a 20 20 20 20 44 57 4f 52 44 20 52 65 70 61  {.    DWORD Repa
0e90: 72 73 65 54 61 67 3b 0a 20 20 20 20 57 4f 52 44  rseTag;.    WORD
0ea0: 20 52 65 70 61 72 73 65 44 61 74 61 4c 65 6e 67   ReparseDataLeng
0eb0: 74 68 3b 0a 20 20 20 20 57 4f 52 44 20 52 65 73  th;.    WORD Res
0ec0: 65 72 76 65 64 3b 0a 20 20 20 20 75 6e 69 6f 6e  erved;.    union
0ed0: 20 7b 0a 09 73 74 72 75 63 74 20 7b 0a 09 20 20   {..struct {..  
0ee0: 20 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74    WORD Substitut
0ef0: 65 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20 20  eNameOffset;..  
0f00: 20 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74    WORD Substitut
0f10: 65 4e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20  eNameLength;..  
0f20: 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d 65    WORD PrintName
0f30: 4f 66 66 73 65 74 3b 0a 09 20 20 20 20 57 4f 52  Offset;..    WOR
0f40: 44 20 50 72 69 6e 74 4e 61 6d 65 4c 65 6e 67 74  D PrintNameLengt
0f50: 68 3b 0a 09 20 20 20 20 55 4c 4f 4e 47 20 46 6c  h;..    ULONG Fl
0f60: 61 67 73 3b 0a 09 20 20 20 20 57 43 48 41 52 20  ags;..    WCHAR 
0f70: 50 61 74 68 42 75 66 66 65 72 5b 31 5d 3b 0a 09  PathBuffer[1];..
0f80: 7d 20 53 79 6d 62 6f 6c 69 63 4c 69 6e 6b 52 65  } SymbolicLinkRe
0f90: 70 61 72 73 65 42 75 66 66 65 72 3b 0a 09 73 74  parseBuffer;..st
0fa0: 72 75 63 74 20 7b 0a 09 20 20 20 20 57 4f 52 44  ruct {..    WORD
0fb0: 20 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 4f   SubstituteNameO
0fc0: 66 66 73 65 74 3b 0a 09 20 20 20 20 57 4f 52 44  ffset;..    WORD
0fd0: 20 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 4c   SubstituteNameL
0fe0: 65 6e 67 74 68 3b 0a 09 20 20 20 20 57 4f 52 44  ength;..    WORD
0ff0: 20 50 72 69 6e 74 4e 61 6d 65 4f 66 66 73 65 74   PrintNameOffset
1000: 3b 0a 09 20 20 20 20 57 4f 52 44 20 50 72 69 6e  ;..    WORD Prin
1010: 74 4e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20  tNameLength;..  
1020: 20 20 57 43 48 41 52 20 50 61 74 68 42 75 66 66    WCHAR PathBuff
1030: 65 72 5b 31 5d 3b 0a 09 7d 20 4d 6f 75 6e 74 50  er[1];..} MountP
1040: 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65  ointReparseBuffe
1050: 72 3b 0a 09 73 74 72 75 63 74 20 7b 0a 09 20 20  r;..struct {..  
1060: 20 20 42 59 54 45 20 44 61 74 61 42 75 66 66 65    BYTE DataBuffe
1070: 72 5b 31 5d 3b 0a 09 7d 20 47 65 6e 65 72 69 63  r[1];..} Generic
1080: 52 65 70 61 72 73 65 42 75 66 66 65 72 3b 0a 20  ReparseBuffer;. 
1090: 20 20 20 7d 3b 0a 7d 20 52 45 50 41 52 53 45 5f     };.} REPARSE_
10a0: 44 41 54 41 5f 42 55 46 46 45 52 3b 0a 23 65 6e  DATA_BUFFER;.#en
10b0: 64 69 66 0a 0a 74 79 70 65 64 65 66 20 73 74 72  dif..typedef str
10c0: 75 63 74 20 7b 0a 20 20 20 20 52 45 50 41 52 53  uct {.    REPARS
10d0: 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 64 75  E_DATA_BUFFER du
10e0: 6d 6d 79 3b 0a 20 20 20 20 57 43 48 41 52 20 64  mmy;.    WCHAR d
10f0: 75 6d 6d 79 42 75 66 5b 4d 41 58 5f 50 41 54 48  ummyBuf[MAX_PATH
1100: 20 2a 20 33 5d 3b 0a 7d 20 44 55 4d 4d 59 5f 52   * 3];.} DUMMY_R
1110: 45 50 41 52 53 45 5f 42 55 46 46 45 52 3b 0a 0a  EPARSE_BUFFER;..
1120: 2f 2a 0a 20 2a 20 4f 74 68 65 72 20 74 79 70 65  /*. * Other type
1130: 64 65 66 73 20 72 65 71 75 69 72 65 64 20 62 79  defs required by
1140: 20 74 68 69 73 20 63 6f 64 65 2e 0a 20 2a 2f 0a   this code.. */.
1150: 0a 73 74 61 74 69 63 20 5f 5f 74 69 6d 65 36 34  .static __time64
1160: 5f 74 09 54 6f 43 54 69 6d 65 28 46 49 4c 45 54  _t.ToCTime(FILET
1170: 49 4d 45 20 66 69 6c 65 54 69 6d 65 29 3b 0a 73  IME fileTime);.s
1180: 74 61 74 69 63 20 76 6f 69 64 09 09 46 72 6f 6d  tatic void..From
1190: 43 54 69 6d 65 28 5f 5f 74 69 6d 65 36 34 5f 74  CTime(__time64_t
11a0: 20 70 6f 73 69 78 54 69 6d 65 2c 20 46 49 4c 45   posixTime, FILE
11b0: 54 49 4d 45 20 2a 66 69 6c 65 54 69 6d 65 29 3b  TIME *fileTime);
11c0: 0a 0a 2f 2a 0a 20 2a 20 44 65 63 6c 61 72 61 74  ../*. * Declarat
11d0: 69 6f 6e 73 20 66 6f 72 20 6c 6f 63 61 6c 20 66  ions for local f
11e0: 75 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64  unctions defined
11f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 3a 0a 20   in this file:. 
1200: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09  */..static int..
1210: 4e 61 74 69 76 65 41 63 63 65 73 73 28 63 6f 6e  NativeAccess(con
1220: 73 74 20 57 43 48 41 52 20 2a 70 61 74 68 2c 20  st WCHAR *path, 
1230: 69 6e 74 20 6d 6f 64 65 29 3b 0a 73 74 61 74 69  int mode);.stati
1240: 63 20 69 6e 74 09 09 4e 61 74 69 76 65 44 65 76  c int..NativeDev
1250: 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 70 61  (const WCHAR *pa
1260: 74 68 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  th);.static int.
1270: 09 4e 61 74 69 76 65 53 74 61 74 28 63 6f 6e 73  .NativeStat(cons
1280: 74 20 57 43 48 41 52 20 2a 70 61 74 68 2c 20 54  t WCHAR *path, T
1290: 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74  cl_StatBuf *stat
12a0: 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e 74 20  Ptr,....    int 
12b0: 63 68 65 63 6b 4c 69 6e 6b 73 29 3b 0a 73 74 61  checkLinks);.sta
12c0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  tic unsigned sho
12d0: 72 74 09 4e 61 74 69 76 65 53 74 61 74 4d 6f 64  rt.NativeStatMod
12e0: 65 28 44 57 4f 52 44 20 61 74 74 72 2c 20 69 6e  e(DWORD attr, in
12f0: 74 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a 09 09  t checkLinks,...
1300: 09 20 20 20 20 69 6e 74 20 69 73 45 78 65 63 29  .    int isExec)
1310: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61  ;.static int..Na
1320: 74 69 76 65 49 73 45 78 65 63 28 63 6f 6e 73 74  tiveIsExec(const
1330: 20 57 43 48 41 52 20 2a 70 61 74 68 29 3b 0a 73   WCHAR *path);.s
1340: 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74 69 76  tatic int..Nativ
1350: 65 52 65 61 64 52 65 70 61 72 73 65 28 63 6f 6e  eReadReparse(con
1360: 73 74 20 57 43 48 41 52 20 2a 4c 69 6e 6b 44 69  st WCHAR *LinkDi
1370: 72 65 63 74 6f 72 79 2c 0a 09 09 09 20 20 20 20  rectory,....    
1380: 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46  REPARSE_DATA_BUF
1390: 46 45 52 20 2a 62 75 66 66 65 72 2c 20 44 57 4f  FER *buffer, DWO
13a0: 52 44 20 64 65 73 69 72 65 64 41 63 63 65 73 73  RD desiredAccess
13b0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e  );.static int..N
13c0: 61 74 69 76 65 57 72 69 74 65 52 65 70 61 72 73  ativeWriteRepars
13d0: 65 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 4c  e(const WCHAR *L
13e0: 69 6e 6b 44 69 72 65 63 74 6f 72 79 2c 0a 09 09  inkDirectory,...
13f0: 09 20 20 20 20 52 45 50 41 52 53 45 5f 44 41 54  .    REPARSE_DAT
1400: 41 5f 42 55 46 46 45 52 20 2a 62 75 66 66 65 72  A_BUFFER *buffer
1410: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e  );.static int..N
1420: 61 74 69 76 65 4d 61 74 63 68 54 79 70 65 28 69  ativeMatchType(i
1430: 6e 74 20 69 73 44 72 69 76 65 2c 20 44 57 4f 52  nt isDrive, DWOR
1440: 44 20 61 74 74 72 2c 0a 09 09 09 20 20 20 20 63  D attr,....    c
1450: 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69  onst WCHAR *nati
1460: 76 65 4e 61 6d 65 2c 20 54 63 6c 5f 47 6c 6f 62  veName, Tcl_Glob
1470: 54 79 70 65 44 61 74 61 20 2a 74 79 70 65 73 29  TypeData *types)
1480: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 57 69  ;.static int..Wi
1490: 6e 49 73 44 72 69 76 65 28 63 6f 6e 73 74 20 63  nIsDrive(const c
14a0: 68 61 72 20 2a 6e 61 6d 65 2c 20 73 69 7a 65 5f  har *name, size_
14b0: 74 20 6e 61 6d 65 4c 65 6e 29 3b 0a 73 74 61 74  t nameLen);.stat
14c0: 69 63 20 73 69 7a 65 5f 74 09 09 57 69 6e 49 73  ic size_t..WinIs
14d0: 52 65 73 65 72 76 65 64 28 63 6f 6e 73 74 20 63  Reserved(const c
14e0: 68 61 72 20 2a 70 61 74 68 29 3b 0a 73 74 61 74  har *path);.stat
14f0: 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 09 57 69 6e  ic Tcl_Obj *.Win
1500: 52 65 61 64 4c 69 6e 6b 28 63 6f 6e 73 74 20 57  ReadLink(const W
1510: 43 48 41 52 20 2a 4c 69 6e 6b 53 6f 75 72 63 65  CHAR *LinkSource
1520: 29 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  );.static Tcl_Ob
1530: 6a 20 2a 09 57 69 6e 52 65 61 64 4c 69 6e 6b 44  j *.WinReadLinkD
1540: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 57  irectory(const W
1550: 43 48 41 52 20 2a 4c 69 6e 6b 44 69 72 65 63 74  CHAR *LinkDirect
1560: 6f 72 79 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ory);.static int
1570: 09 09 57 69 6e 4c 69 6e 6b 28 63 6f 6e 73 74 20  ..WinLink(const 
1580: 57 43 48 41 52 20 2a 4c 69 6e 6b 53 6f 75 72 63  WCHAR *LinkSourc
1590: 65 2c 0a 09 09 09 20 20 20 20 63 6f 6e 73 74 20  e,....    const 
15a0: 57 43 48 41 52 20 2a 4c 69 6e 6b 54 61 72 67 65  WCHAR *LinkTarge
15b0: 74 2c 20 69 6e 74 20 6c 69 6e 6b 41 63 74 69 6f  t, int linkActio
15c0: 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09  n);.static int..
15d0: 57 69 6e 53 79 6d 4c 69 6e 6b 44 69 72 65 63 74  WinSymLinkDirect
15e0: 6f 72 79 28 63 6f 6e 73 74 20 57 43 48 41 52 20  ory(const WCHAR 
15f0: 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 2c 0a  *LinkDirectory,.
1600: 09 09 09 20 20 20 20 63 6f 6e 73 74 20 57 43 48  ...    const WCH
1610: 41 52 20 2a 4c 69 6e 6b 54 61 72 67 65 74 29 3b  AR *LinkTarget);
1620: 0a 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 76 6f  .MODULE_SCOPE vo
1630: 69 64 09 74 63 6c 57 69 6e 44 65 62 75 67 50 61  id.tclWinDebugPa
1640: 6e 69 63 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nic(const char *
1650: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 3b 0a 0c 0a  format, ...);...
1660: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
16b0: 57 69 6e 4c 69 6e 6b 20 2d 2d 0a 20 2a 0a 20 2a  WinLink --. *. *
16c0: 09 4d 61 6b 65 20 61 20 6c 69 6e 6b 20 66 72 6f  .Make a link fro
16d0: 6d 20 73 6f 75 72 63 65 20 74 6f 20 74 61 72 67  m source to targ
16e0: 65 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  et.. *. *-------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1730: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69  /..static int.Wi
1740: 6e 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74  nLink(.    const
1750: 20 57 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72   WCHAR *linkSour
1760: 63 65 50 61 74 68 2c 0a 20 20 20 20 63 6f 6e 73  cePath,.    cons
1770: 74 20 57 43 48 41 52 20 2a 6c 69 6e 6b 54 61 72  t WCHAR *linkTar
1780: 67 65 74 50 61 74 68 2c 0a 20 20 20 20 69 6e 74  getPath,.    int
1790: 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20   linkAction).{. 
17a0: 20 20 20 57 43 48 41 52 20 74 65 6d 70 46 69 6c     WCHAR tempFil
17b0: 65 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b  eName[MAX_PATH];
17c0: 0a 20 20 20 20 57 43 48 41 52 20 2a 74 65 6d 70  .    WCHAR *temp
17d0: 46 69 6c 65 50 61 72 74 3b 0a 20 20 20 20 44 57  FilePart;.    DW
17e0: 4f 52 44 20 61 74 74 72 3b 0a 0a 20 20 20 20 2f  ORD attr;..    /
17f0: 2a 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65  *.     * Get the
1800: 20 66 75 6c 6c 20 70 61 74 68 20 72 65 66 65 72   full path refer
1810: 65 6e 63 65 64 20 62 79 20 74 68 65 20 74 61 72  enced by the tar
1820: 67 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  get..     */..  
1830: 20 20 69 66 20 28 21 47 65 74 46 75 6c 6c 50 61    if (!GetFullPa
1840: 74 68 4e 61 6d 65 57 28 6c 69 6e 6b 54 61 72 67  thNameW(linkTarg
1850: 65 74 50 61 74 68 2c 20 4d 41 58 5f 50 41 54 48  etPath, MAX_PATH
1860: 2c 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 0a  , tempFileName,.
1870: 09 20 20 20 20 26 74 65 6d 70 46 69 6c 65 50 61  .    &tempFilePa
1880: 72 74 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49  rt)) {../*.. * I
1890: 6e 76 61 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a  nvalid file... *
18a0: 2f 0a 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65  /...Tcl_WinConve
18b0: 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
18c0: 72 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e  rror());..return
18d0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
18e0: 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73  /*.     * Make s
18f0: 75 72 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20  ure source file 
1900: 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a 20  doesn't exist.. 
1910: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 61 74 74 72      */..    attr
1920: 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
1930: 75 74 65 73 57 28 6c 69 6e 6b 53 6f 75 72 63 65  utesW(linkSource
1940: 50 61 74 68 29 3b 0a 20 20 20 20 69 66 20 28 61  Path);.    if (a
1950: 74 74 72 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46  ttr != INVALID_F
1960: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20  ILE_ATTRIBUTES) 
1970: 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28  {..Tcl_SetErrno(
1980: 45 45 58 49 53 54 29 3b 0a 09 72 65 74 75 72 6e  EEXIST);..return
1990: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
19a0: 2f 2a 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68  /*.     * Get th
19b0: 65 20 66 75 6c 6c 20 70 61 74 68 20 72 65 66 65  e full path refe
19c0: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 6f  renced by the so
19d0: 75 72 63 65 20 66 69 6c 65 2f 64 69 72 65 63 74  urce file/direct
19e0: 6f 72 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ory..     */..  
19f0: 20 20 69 66 20 28 21 47 65 74 46 75 6c 6c 50 61    if (!GetFullPa
1a00: 74 68 4e 61 6d 65 57 28 6c 69 6e 6b 53 6f 75 72  thNameW(linkSour
1a10: 63 65 50 61 74 68 2c 20 4d 41 58 5f 50 41 54 48  cePath, MAX_PATH
1a20: 2c 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 0a  , tempFileName,.
1a30: 09 20 20 20 20 26 74 65 6d 70 46 69 6c 65 50 61  .    &tempFilePa
1a40: 72 74 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49  rt)) {../*.. * I
1a50: 6e 76 61 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a  nvalid file... *
1a60: 2f 0a 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65  /...Tcl_WinConve
1a70: 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
1a80: 72 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e  rror());..return
1a90: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1aa0: 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20  /*.     * Check 
1ab0: 74 68 65 20 74 61 72 67 65 74 2e 0a 20 20 20 20  the target..    
1ac0: 20 2a 2f 0a 0a 20 20 20 20 61 74 74 72 20 3d 20   */..    attr = 
1ad0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1ae0: 73 57 28 6c 69 6e 6b 54 61 72 67 65 74 50 61 74  sW(linkTargetPat
1af0: 68 29 3b 0a 20 20 20 20 69 66 20 28 61 74 74 72  h);.    if (attr
1b00: 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
1b10: 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a 09  _ATTRIBUTES) {..
1b20: 2f 2a 0a 09 20 2a 20 54 68 65 20 74 61 72 67 65  /*.. * The targe
1b30: 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e  t doesn't exist.
1b40: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 57 69 6e 43  .. */...Tcl_WinC
1b50: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c  onvertError(GetL
1b60: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
1b70: 20 7d 20 65 6c 73 65 20 69 66 20 28 28 61 74 74   } else if ((att
1b80: 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
1b90: 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20 3d 3d  TE_DIRECTORY) ==
1ba0: 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 74   0) {../*.. * It
1bb0: 20 69 73 20 61 20 66 69 6c 65 2e 0a 09 20 2a 2f   is a file... */
1bc0: 0a 0a 09 69 66 20 28 6c 69 6e 6b 41 63 74 69 6f  ...if (linkActio
1bd0: 6e 20 26 20 54 43 4c 5f 43 52 45 41 54 45 5f 48  n & TCL_CREATE_H
1be0: 41 52 44 5f 4c 49 4e 4b 29 20 7b 0a 09 20 20 20  ARD_LINK) {..   
1bf0: 20 69 66 20 28 43 72 65 61 74 65 48 61 72 64 4c   if (CreateHardL
1c00: 69 6e 6b 57 28 6c 69 6e 6b 53 6f 75 72 63 65 50  inkW(linkSourceP
1c10: 61 74 68 2c 20 6c 69 6e 6b 54 61 72 67 65 74 50  ath, linkTargetP
1c20: 61 74 68 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 09  ath, NULL)) {...
1c30: 2f 2a 0a 09 09 20 2a 20 53 75 63 63 65 73 73 21  /*... * Success!
1c40: 0a 09 09 20 2a 2f 0a 0a 09 09 72 65 74 75 72 6e  ... */....return
1c50: 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20   0;..    }...   
1c60: 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45   Tcl_WinConvertE
1c70: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f  rror(GetLastErro
1c80: 72 28 29 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  r());..} else if
1c90: 20 28 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20 54   (linkAction & T
1ca0: 43 4c 5f 43 52 45 41 54 45 5f 53 59 4d 42 4f 4c  CL_CREATE_SYMBOL
1cb0: 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 20 20 20 20  IC_LINK) {..    
1cc0: 69 66 20 28 43 72 65 61 74 65 53 79 6d 62 6f 6c  if (CreateSymbol
1cd0: 69 63 4c 69 6e 6b 57 28 6c 69 6e 6b 53 6f 75 72  icLinkW(linkSour
1ce0: 63 65 50 61 74 68 2c 20 6c 69 6e 6b 54 61 72 67  cePath, linkTarg
1cf0: 65 74 50 61 74 68 2c 0a 09 09 20 20 20 20 30 78  etPath,...    0x
1d00: 32 20 2f 2a 20 53 59 4d 42 4f 4c 49 43 5f 4c 49  2 /* SYMBOLIC_LI
1d10: 4e 4b 5f 46 4c 41 47 5f 41 4c 4c 4f 57 5f 55 4e  NK_FLAG_ALLOW_UN
1d20: 50 52 49 56 49 4c 45 47 45 44 5f 43 52 45 41 54  PRIVILEGED_CREAT
1d30: 45 20 2a 2f 29 29 20 7b 0a 09 09 2f 2a 0a 09 09  E */)) {.../*...
1d40: 20 2a 20 53 75 63 63 65 73 73 21 0a 09 09 20 2a   * Success!... *
1d50: 2f 0a 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  /....return 0;..
1d60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54      } else {...T
1d70: 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72  cl_WinConvertErr
1d80: 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  or(GetLastError(
1d90: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  ));..    }..} el
1da0: 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  se {..    Tcl_Se
1db0: 74 45 72 72 6e 6f 28 45 4e 4f 44 45 56 29 3b 0a  tErrno(ENODEV);.
1dc0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
1dd0: 09 2f 2a 0a 09 20 2a 20 57 65 27 76 65 20 67 6f  ./*.. * We've go
1de0: 74 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 4e  t a directory. N
1df0: 6f 77 20 63 68 65 63 6b 20 77 68 65 74 68 65 72  ow check whether
1e00: 20 77 68 61 74 20 77 65 27 72 65 20 74 72 79 69   what we're tryi
1e10: 6e 67 20 74 6f 20 64 6f 20 69 73 0a 09 20 2a 20  ng to do is.. * 
1e20: 72 65 61 73 6f 6e 61 62 6c 65 2e 0a 09 20 2a 2f  reasonable... */
1e30: 0a 0a 09 69 66 20 28 6c 69 6e 6b 41 63 74 69 6f  ...if (linkActio
1e40: 6e 20 26 20 54 43 4c 5f 43 52 45 41 54 45 5f 53  n & TCL_CREATE_S
1e50: 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a  YMBOLIC_LINK) {.
1e60: 09 20 20 20 20 72 65 74 75 72 6e 20 57 69 6e 53  .    return WinS
1e70: 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28  ymLinkDirectory(
1e80: 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 20  linkSourcePath, 
1e90: 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 29 3b  linkTargetPath);
1ea0: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 69  ...} else if (li
1eb0: 6e 6b 41 63 74 69 6f 6e 20 26 20 54 43 4c 5f 43  nkAction & TCL_C
1ec0: 52 45 41 54 45 5f 48 41 52 44 5f 4c 49 4e 4b 29  REATE_HARD_LINK)
1ed0: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
1ee0: 20 2a 20 43 61 6e 27 74 20 68 61 72 64 20 6c 69   * Can't hard li
1ef0: 6e 6b 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0a  nk directories..
1f00: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54  .     */...    T
1f10: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 53 44  cl_SetErrno(EISD
1f20: 49 52 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  IR);..} else {..
1f30: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f      Tcl_SetErrno
1f40: 28 45 4e 4f 44 45 56 29 3b 0a 09 7d 0a 20 20 20  (ENODEV);..}.   
1f50: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31   }.    return -1
1f60: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1fb0: 20 2a 0a 20 2a 20 57 69 6e 52 65 61 64 4c 69 6e   *. * WinReadLin
1fc0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 68 61 74 20  k --. *. *.What 
1fd0: 64 6f 65 73 20 27 4c 69 6e 6b 53 6f 75 72 63 65  does 'LinkSource
1fe0: 27 20 70 6f 69 6e 74 20 74 6f 3f 0a 20 2a 0a 20  ' point to?. *. 
1ff0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
2040: 63 20 54 63 6c 5f 4f 62 6a 20 2a 0a 57 69 6e 52  c Tcl_Obj *.WinR
2050: 65 61 64 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e  eadLink(.    con
2060: 73 74 20 57 43 48 41 52 20 2a 6c 69 6e 6b 53 6f  st WCHAR *linkSo
2070: 75 72 63 65 50 61 74 68 29 0a 7b 0a 20 20 20 20  urcePath).{.    
2080: 57 43 48 41 52 20 74 65 6d 70 46 69 6c 65 4e 61  WCHAR tempFileNa
2090: 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  me[MAX_PATH];.  
20a0: 20 20 57 43 48 41 52 20 2a 74 65 6d 70 46 69 6c    WCHAR *tempFil
20b0: 65 50 61 72 74 3b 0a 20 20 20 20 44 57 4f 52 44  ePart;.    DWORD
20c0: 20 61 74 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20   attr;..    /*. 
20d0: 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 66 75      * Get the fu
20e0: 6c 6c 20 70 61 74 68 20 72 65 66 65 72 65 6e 63  ll path referenc
20f0: 65 64 20 62 79 20 74 68 65 20 74 61 72 67 65 74  ed by the target
2100: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
2110: 66 20 28 21 47 65 74 46 75 6c 6c 50 61 74 68 4e  f (!GetFullPathN
2120: 61 6d 65 57 28 6c 69 6e 6b 53 6f 75 72 63 65 50  ameW(linkSourceP
2130: 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c 20 74  ath, MAX_PATH, t
2140: 65 6d 70 46 69 6c 65 4e 61 6d 65 2c 0a 09 20 20  empFileName,..  
2150: 20 20 26 74 65 6d 70 46 69 6c 65 50 61 72 74 29    &tempFilePart)
2160: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e 76 61  ) {../*.. * Inva
2170: 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a 2f 0a 0a  lid file... */..
2180: 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45  .Tcl_WinConvertE
2190: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f  rror(GetLastErro
21a0: 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  r());..return NU
21b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
21c0: 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75  *.     * Make su
21d0: 72 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 64  re source file d
21e0: 6f 65 73 20 65 78 69 73 74 2e 0a 20 20 20 20 20  oes exist..     
21f0: 2a 2f 0a 0a 20 20 20 20 61 74 74 72 20 3d 20 47  */..    attr = G
2200: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2210: 57 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61 74 68  W(linkSourcePath
2220: 29 3b 0a 20 20 20 20 69 66 20 28 61 74 74 72 20  );.    if (attr 
2230: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
2240: 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a 09 2f  ATTRIBUTES) {../
2250: 2a 0a 09 20 2a 20 54 68 65 20 73 6f 75 72 63 65  *.. * The source
2260: 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a   doesn't exist..
2270: 09 20 2a 2f 0a 0a 09 54 63 6c 5f 57 69 6e 43 6f  . */...Tcl_WinCo
2280: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61  nvertError(GetLa
2290: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72 65 74  stError());..ret
22a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 7d  urn NULL;..    }
22b0: 20 65 6c 73 65 20 69 66 20 28 28 61 74 74 72 20   else if ((attr 
22c0: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
22d0: 5f 44 49 52 45 43 54 4f 52 59 29 20 3d 3d 20 30  _DIRECTORY) == 0
22e0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 74 20 69  ) {../*.. * It i
22f0: 73 20 61 20 66 69 6c 65 20 2d 20 74 68 69 73 20  s a file - this 
2300: 69 73 20 6e 6f 74 20 79 65 74 20 73 75 70 70 6f  is not yet suppo
2310: 72 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c  rted... */...Tcl
2320: 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f 54 44 49  _SetErrno(ENOTDI
2330: 52 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  R);..return NULL
2340: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
2350: 75 72 6e 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44  urn WinReadLinkD
2360: 69 72 65 63 74 6f 72 79 28 6c 69 6e 6b 53 6f 75  irectory(linkSou
2370: 72 63 65 50 61 74 68 29 3b 0a 7d 0a 0c 0a 2f 2a  rcePath);.}.../*
2380: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 57 69  -------. *. * Wi
23d0: 6e 53 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72  nSymLinkDirector
23e0: 79 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  y --. *. *.This 
23f0: 72 6f 75 74 69 6e 65 20 63 72 65 61 74 65 73 20  routine creates 
2400: 61 20 4e 54 46 53 20 6a 75 6e 63 74 69 6f 6e 2c  a NTFS junction,
2410: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 64 6f 63   using the undoc
2420: 75 6d 65 6e 74 65 64 0a 20 2a 09 46 53 43 54 4c  umented. *.FSCTL
2430: 5f 53 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49  _SET_REPARSE_POI
2440: 4e 54 20 73 74 72 75 63 74 75 72 65 20 57 69 6e  NT structure Win
2450: 32 4b 20 75 73 65 73 20 66 6f 72 20 6d 6f 75 6e  2K uses for moun
2460: 74 20 70 6f 69 6e 74 73 20 61 6e 64 0a 20 2a 09  t points and. *.
2470: 6a 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a  junctions.. *. *
2480: 09 41 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74  .Assumption that
2490: 20 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 20   linkTargetPath 
24a0: 69 73 20 61 20 76 61 6c 69 64 2c 20 65 78 69 73  is a valid, exis
24b0: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a  ting directory..
24c0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
24d0: 2a 09 5a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  *.Zero on succes
24e0: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2530: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 6e  ..static int.Win
2540: 53 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79  SymLinkDirectory
2550: 28 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41  (.    const WCHA
2560: 52 20 2a 6c 69 6e 6b 44 69 72 50 61 74 68 2c 0a  R *linkDirPath,.
2570: 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20      const WCHAR 
2580: 2a 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 29  *linkTargetPath)
2590: 0a 7b 0a 20 20 20 20 44 55 4d 4d 59 5f 52 45 50  .{.    DUMMY_REP
25a0: 41 52 53 45 5f 42 55 46 46 45 52 20 64 75 6d 6d  ARSE_BUFFER dumm
25b0: 79 3b 0a 20 20 20 20 52 45 50 41 52 53 45 5f 44  y;.    REPARSE_D
25c0: 41 54 41 5f 42 55 46 46 45 52 20 2a 72 65 70 61  ATA_BUFFER *repa
25d0: 72 73 65 42 75 66 66 65 72 20 3d 20 28 52 45 50  rseBuffer = (REP
25e0: 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52  ARSE_DATA_BUFFER
25f0: 20 2a 29 20 26 64 75 6d 6d 79 3b 0a 20 20 20 20   *) &dummy;.    
2600: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 57 43 48  int len;.    WCH
2610: 41 52 20 6e 61 74 69 76 65 54 61 72 67 65 74 5b  AR nativeTarget[
2620: 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 57  MAX_PATH];.    W
2630: 43 48 41 52 20 2a 6c 6f 6f 70 3b 0a 0a 20 20 20  CHAR *loop;..   
2640: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
2650: 74 68 65 20 6e 61 74 69 76 65 20 74 61 72 67 65  the native targe
2660: 74 20 6e 61 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a  t name..     */.
2670: 0a 20 20 20 20 6d 65 6d 63 70 79 28 6e 61 74 69  .    memcpy(nati
2680: 76 65 54 61 72 67 65 74 2c 20 4c 22 5c 5c 3f 3f  veTarget, L"\\??
2690: 5c 5c 22 2c 20 34 20 2a 20 73 69 7a 65 6f 66 28  \\", 4 * sizeof(
26a0: 57 43 48 41 52 29 29 3b 0a 20 20 20 20 6d 65 6d  WCHAR));.    mem
26b0: 63 70 79 28 6e 61 74 69 76 65 54 61 72 67 65 74  cpy(nativeTarget
26c0: 20 2b 20 34 2c 20 6c 69 6e 6b 54 61 72 67 65 74   + 4, linkTarget
26d0: 50 61 74 68 2c 0a 09 20 20 20 73 69 7a 65 6f 66  Path,..   sizeof
26e0: 28 57 43 48 41 52 29 20 2a 20 28 31 2b 77 63 73  (WCHAR) * (1+wcs
26f0: 6c 65 6e 28 28 57 43 48 41 52 20 2a 29 20 6c 69  len((WCHAR *) li
2700: 6e 6b 54 61 72 67 65 74 50 61 74 68 29 29 29 3b  nkTargetPath)));
2710: 0a 20 20 20 20 6c 65 6e 20 3d 20 77 63 73 6c 65  .    len = wcsle
2720: 6e 28 6e 61 74 69 76 65 54 61 72 67 65 74 29 3b  n(nativeTarget);
2730: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
2740: 57 65 20 6d 75 73 74 20 68 61 76 65 20 62 61 63  We must have bac
2750: 6b 73 6c 61 73 68 65 73 20 6f 6e 6c 79 2e 20 54  kslashes only. T
2760: 68 69 73 20 69 73 20 56 45 52 59 20 49 4d 50 4f  his is VERY IMPO
2770: 52 54 41 4e 54 2e 20 49 66 20 77 65 20 68 61 76  RTANT. If we hav
2780: 65 20 61 6e 79 0a 20 20 20 20 20 2a 20 66 6f 72  e any.     * for
2790: 77 61 72 64 20 73 6c 61 73 68 65 73 20 65 76 65  ward slashes eve
27a0: 72 79 74 68 69 6e 67 20 61 70 70 65 61 72 73 20  rything appears 
27b0: 74 6f 20 77 6f 72 6b 2c 20 62 75 74 20 74 68 65  to work, but the
27c0: 20 72 65 73 75 6c 74 69 6e 67 20 73 79 6d 6c 69   resulting symli
27d0: 6e 6b 0a 20 20 20 20 20 2a 20 69 73 20 75 73 65  nk.     * is use
27e0: 6c 65 73 73 21 0a 20 20 20 20 20 2a 2f 0a 0a 20  less!.     */.. 
27f0: 20 20 20 66 6f 72 20 28 6c 6f 6f 70 20 3d 20 6e     for (loop = n
2800: 61 74 69 76 65 54 61 72 67 65 74 3b 20 2a 6c 6f  ativeTarget; *lo
2810: 6f 70 20 21 3d 20 30 3b 20 6c 6f 6f 70 2b 2b 29  op != 0; loop++)
2820: 20 7b 0a 09 69 66 20 28 2a 6c 6f 6f 70 20 3d 3d   {..if (*loop ==
2830: 20 27 2f 27 29 20 7b 0a 09 20 20 20 20 2a 6c 6f   '/') {..    *lo
2840: 6f 70 20 3d 20 27 5c 5c 27 3b 0a 09 7d 0a 20 20  op = '\\';..}.  
2850: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6e 61 74    }.    if ((nat
2860: 69 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d 31 5d  iveTarget[len-1]
2870: 20 3d 3d 20 27 5c 5c 27 29 20 26 26 20 28 6e 61   == '\\') && (na
2880: 74 69 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d 32  tiveTarget[len-2
2890: 5d 20 21 3d 20 27 3a 27 29 29 20 7b 0a 09 6e 61  ] != ':')) {..na
28a0: 74 69 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d 31  tiveTarget[len-1
28b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  ] = 0;.    }..  
28c0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 75 69 6c    /*.     * Buil
28d0: 64 20 74 68 65 20 72 65 70 61 72 73 65 20 69 6e  d the reparse in
28e0: 66 6f 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  fo..     */..   
28f0: 20 6d 65 6d 73 65 74 28 72 65 70 61 72 73 65 42   memset(reparseB
2900: 75 66 66 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  uffer, 0, sizeof
2910: 28 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42  (DUMMY_REPARSE_B
2920: 55 46 46 45 52 29 29 3b 0a 20 20 20 20 72 65 70  UFFER));.    rep
2930: 61 72 73 65 42 75 66 66 65 72 2d 3e 52 65 70 61  arseBuffer->Repa
2940: 72 73 65 54 61 67 20 3d 20 49 4f 5f 52 45 50 41  rseTag = IO_REPA
2950: 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f  RSE_TAG_MOUNT_PO
2960: 49 4e 54 3b 0a 20 20 20 20 72 65 70 61 72 73 65  INT;.    reparse
2970: 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69  Buffer->MountPoi
2980: 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72 2e  ntReparseBuffer.
2990: 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65  SubstituteNameLe
29a0: 6e 67 74 68 20 3d 0a 09 20 20 20 20 77 63 73 6c  ngth =..    wcsl
29b0: 65 6e 28 6e 61 74 69 76 65 54 61 72 67 65 74 29  en(nativeTarget)
29c0: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
29d0: 3b 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 66  ;.    reparseBuf
29e0: 66 65 72 2d 3e 52 65 73 65 72 76 65 64 20 3d 20  fer->Reserved = 
29f0: 30 3b 0a 20 20 20 20 72 65 70 61 72 73 65 42 75  0;.    reparseBu
2a00: 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74  ffer->MountPoint
2a10: 52 65 70 61 72 73 65 42 75 66 66 65 72 2e 50 72  ReparseBuffer.Pr
2a20: 69 6e 74 4e 61 6d 65 4c 65 6e 67 74 68 20 3d 20  intNameLength = 
2a30: 30 3b 0a 20 20 20 20 72 65 70 61 72 73 65 42 75  0;.    reparseBu
2a40: 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74  ffer->MountPoint
2a50: 52 65 70 61 72 73 65 42 75 66 66 65 72 2e 50 72  ReparseBuffer.Pr
2a60: 69 6e 74 4e 61 6d 65 4f 66 66 73 65 74 20 3d 0a  intNameOffset =.
2a70: 09 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66  .    reparseBuff
2a80: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65  er->MountPointRe
2a90: 70 61 72 73 65 42 75 66 66 65 72 2e 53 75 62 73  parseBuffer.Subs
2aa0: 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68  tituteNameLength
2ab0: 0a 09 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 57  ..    + sizeof(W
2ac0: 43 48 41 52 29 3b 0a 20 20 20 20 6d 65 6d 63 70  CHAR);.    memcp
2ad0: 79 28 72 65 70 61 72 73 65 42 75 66 66 65 72 2d  y(reparseBuffer-
2ae0: 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72  >MountPointRepar
2af0: 73 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66  seBuffer.PathBuf
2b00: 66 65 72 2c 20 6e 61 74 69 76 65 54 61 72 67 65  fer, nativeTarge
2b10: 74 2c 0a 09 20 20 20 20 73 69 7a 65 6f 66 28 57  t,..    sizeof(W
2b20: 43 48 41 52 29 0a 09 20 20 20 20 2b 20 72 65 70  CHAR)..    + rep
2b30: 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e  arseBuffer->Moun
2b40: 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66  tPointReparseBuf
2b50: 66 65 72 2e 53 75 62 73 74 69 74 75 74 65 4e 61  fer.SubstituteNa
2b60: 6d 65 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 72  meLength);.    r
2b70: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 52 65  eparseBuffer->Re
2b80: 70 61 72 73 65 44 61 74 61 4c 65 6e 67 74 68 20  parseDataLength 
2b90: 3d 0a 09 20 20 20 20 72 65 70 61 72 73 65 42 75  =..    reparseBu
2ba0: 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74  ffer->MountPoint
2bb0: 52 65 70 61 72 73 65 42 75 66 66 65 72 2e 53 75  ReparseBuffer.Su
2bc0: 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67  bstituteNameLeng
2bd0: 74 68 2b 31 32 3b 0a 0a 20 20 20 20 72 65 74 75  th+12;..    retu
2be0: 72 6e 20 4e 61 74 69 76 65 57 72 69 74 65 52 65  rn NativeWriteRe
2bf0: 70 61 72 73 65 28 6c 69 6e 6b 44 69 72 50 61 74  parse(linkDirPat
2c00: 68 2c 20 72 65 70 61 72 73 65 42 75 66 66 65 72  h, reparseBuffer
2c10: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 0a 20 2a 0a 20 2a 20 54 63 6c 57 69 6e 53 79 6d  . *. * TclWinSym
2c70: 4c 69 6e 6b 43 6f 70 79 44 69 72 65 63 74 6f 72  LinkCopyDirector
2c80: 79 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 70 79 20  y --. *. *.Copy 
2c90: 61 20 57 69 6e 64 6f 77 73 20 4e 54 46 53 20 6a  a Windows NTFS j
2ca0: 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  unction. This fu
2cb0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2cc0: 68 61 74 20 4c 69 6e 6b 4f 72 69 67 69 6e 61 6c  hat LinkOriginal
2cd0: 0a 20 2a 09 65 78 69 73 74 73 20 61 6e 64 20 69  . *.exists and i
2ce0: 73 20 61 20 76 61 6c 69 64 20 6a 75 6e 63 74 69  s a valid juncti
2cf0: 6f 6e 20 70 6f 69 6e 74 2c 20 61 6e 64 20 74 68  on point, and th
2d00: 61 74 20 4c 69 6e 6b 43 6f 70 79 20 64 6f 65 73  at LinkCopy does
2d10: 20 6e 6f 74 0a 20 2a 09 65 78 69 73 74 2e 0a 20   not. *.exist.. 
2d20: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a  *. * Returns:. *
2d30: 09 5a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73  .Zero on success
2d40: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2d90: 0a 69 6e 74 0a 54 63 6c 57 69 6e 53 79 6d 4c 69  .int.TclWinSymLi
2da0: 6e 6b 43 6f 70 79 44 69 72 65 63 74 6f 72 79 28  nkCopyDirectory(
2db0: 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52  .    const WCHAR
2dc0: 20 2a 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 09   *linkOrigPath,.
2dd0: 2f 2a 20 45 78 69 73 74 69 6e 67 20 6a 75 6e 63  /* Existing junc
2de0: 74 69 6f 6e 20 2d 20 72 65 70 61 72 73 65 20 70  tion - reparse p
2df0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  oint */.    cons
2e00: 74 20 57 43 48 41 52 20 2a 6c 69 6e 6b 43 6f 70  t WCHAR *linkCop
2e10: 79 50 61 74 68 29 09 2f 2a 20 57 69 6c 6c 20 62  yPath)./* Will b
2e20: 65 63 6f 6d 65 20 61 20 64 75 70 6c 69 63 61 74  ecome a duplicat
2e30: 65 20 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7b 0a  e junction */.{.
2e40: 20 20 20 20 44 55 4d 4d 59 5f 52 45 50 41 52 53      DUMMY_REPARS
2e50: 45 5f 42 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a  E_BUFFER dummy;.
2e60: 20 20 20 20 52 45 50 41 52 53 45 5f 44 41 54 41      REPARSE_DATA
2e70: 5f 42 55 46 46 45 52 20 2a 72 65 70 61 72 73 65  _BUFFER *reparse
2e80: 42 75 66 66 65 72 20 3d 20 28 52 45 50 41 52 53  Buffer = (REPARS
2e90: 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a 29  E_DATA_BUFFER *)
2ea0: 20 26 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 66   &dummy;..    if
2eb0: 20 28 4e 61 74 69 76 65 52 65 61 64 52 65 70 61   (NativeReadRepa
2ec0: 72 73 65 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68  rse(linkOrigPath
2ed0: 2c 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2c  , reparseBuffer,
2ee0: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 29 29 20   GENERIC_READ)) 
2ef0: 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  {..return -1;.  
2f00: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 4e    }.    return N
2f10: 61 74 69 76 65 57 72 69 74 65 52 65 70 61 72 73  ativeWriteRepars
2f20: 65 28 6c 69 6e 6b 43 6f 70 79 50 61 74 68 2c 20  e(linkCopyPath, 
2f30: 72 65 70 61 72 73 65 42 75 66 66 65 72 29 3b 0a  reparseBuffer);.
2f40: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2f90: 0a 20 2a 20 54 63 6c 57 69 6e 53 79 6d 4c 69 6e  . * TclWinSymLin
2fa0: 6b 44 65 6c 65 74 65 20 2d 2d 0a 20 2a 0a 20 2a  kDelete --. *. *
2fb0: 09 44 65 6c 65 74 65 20 61 20 57 69 6e 64 6f 77  .Delete a Window
2fc0: 73 20 4e 54 46 53 20 6a 75 6e 63 74 69 6f 6e 2e  s NTFS junction.
2fd0: 20 4f 6e 63 65 20 74 68 65 20 6a 75 6e 63 74 69   Once the juncti
2fe0: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  on information i
2ff0: 73 0a 20 2a 09 64 65 6c 65 74 65 64 2c 20 74 68  s. *.deleted, th
3000: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 6f 62 6a  e filesystem obj
3010: 65 63 74 20 62 65 63 6f 6d 65 73 20 61 6e 20 6f  ect becomes an o
3020: 72 64 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72  rdinary director
3030: 79 2e 20 55 6e 6c 65 73 73 0a 20 2a 09 27 6c 69  y. Unless. *.'li
3040: 6e 6b 4f 6e 6c 79 27 20 69 73 20 67 69 76 65 6e  nkOnly' is given
3050: 2c 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  , that directory
3060: 20 69 73 20 61 6c 73 6f 20 72 65 6d 6f 76 65 64   is also removed
3070: 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d 70 74 69  .. *. *.Assumpti
3080: 6f 6e 20 74 68 61 74 20 4c 69 6e 6b 4f 72 69 67  on that LinkOrig
3090: 69 6e 61 6c 20 69 73 20 61 20 76 61 6c 69 64 2c  inal is a valid,
30a0: 20 65 78 69 73 74 69 6e 67 20 6a 75 6e 63 74 69   existing juncti
30b0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  on.. *. * Return
30c0: 73 3a 0a 20 2a 09 5a 65 72 6f 20 6f 6e 20 73 75  s:. *.Zero on su
30d0: 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ccess.. *. *----
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 57 69 6e  . */..int.TclWin
3130: 53 79 6d 4c 69 6e 6b 44 65 6c 65 74 65 28 0a 20  SymLinkDelete(. 
3140: 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a     const WCHAR *
3150: 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 0a 20 20  linkOrigPath,.  
3160: 20 20 69 6e 74 20 6c 69 6e 6b 4f 6e 6c 79 29 0a    int linkOnly).
3170: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  {.    /*.     * 
3180: 49 74 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63  It is a symbolic
3190: 20 6c 69 6e 6b 20 2d 20 72 65 6d 6f 76 65 20 69   link - remove i
31a0: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
31b0: 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55  DUMMY_REPARSE_BU
31c0: 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20  FFER dummy;.    
31d0: 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46  REPARSE_DATA_BUF
31e0: 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 66 66  FER *reparseBuff
31f0: 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f 44 41  er = (REPARSE_DA
3200: 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 64 75  TA_BUFFER *) &du
3210: 6d 6d 79 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20  mmy;.    HANDLE 
3220: 68 46 69 6c 65 3b 0a 20 20 20 20 44 57 4f 52 44  hFile;.    DWORD
3230: 20 72 65 74 75 72 6e 65 64 4c 65 6e 67 74 68 3b   returnedLength;
3240: 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 72 65 70  ..    memset(rep
3250: 61 72 73 65 42 75 66 66 65 72 2c 20 30 2c 20 73  arseBuffer, 0, s
3260: 69 7a 65 6f 66 28 44 55 4d 4d 59 5f 52 45 50 41  izeof(DUMMY_REPA
3270: 52 53 45 5f 42 55 46 46 45 52 29 29 3b 0a 20 20  RSE_BUFFER));.  
3280: 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2d    reparseBuffer-
3290: 3e 52 65 70 61 72 73 65 54 61 67 20 3d 20 49 4f  >ReparseTag = IO
32a0: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55  _REPARSE_TAG_MOU
32b0: 4e 54 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 68 46  NT_POINT;.    hF
32c0: 69 6c 65 20 3d 20 43 72 65 61 74 65 46 69 6c 65  ile = CreateFile
32d0: 57 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 20  W(linkOrigPath, 
32e0: 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20 30  GENERIC_WRITE, 0
32f0: 2c 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49  , NULL, OPEN_EXI
3300: 53 54 49 4e 47 2c 0a 09 20 20 20 20 46 49 4c 45  STING,..    FILE
3310: 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52  _FLAG_OPEN_REPAR
3320: 53 45 5f 50 4f 49 4e 54 20 7c 20 46 49 4c 45 5f  SE_POINT | FILE_
3330: 46 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41  FLAG_BACKUP_SEMA
3340: 4e 54 49 43 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  NTICS, NULL);.. 
3350: 20 20 20 69 66 20 28 68 46 69 6c 65 20 21 3d 20     if (hFile != 
3360: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
3370: 41 4c 55 45 29 20 7b 0a 09 69 66 20 28 21 44 65  ALUE) {..if (!De
3380: 76 69 63 65 49 6f 43 6f 6e 74 72 6f 6c 28 68 46  viceIoControl(hF
3390: 69 6c 65 2c 20 46 53 43 54 4c 5f 44 45 4c 45 54  ile, FSCTL_DELET
33a0: 45 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 2c  E_REPARSE_POINT,
33b0: 20 72 65 70 61 72 73 65 42 75 66 66 65 72 2c 0a   reparseBuffer,.
33c0: 09 09 52 45 50 41 52 53 45 5f 4d 4f 55 4e 54 50  ..REPARSE_MOUNTP
33d0: 4f 49 4e 54 5f 48 45 41 44 45 52 5f 53 49 5a 45  OINT_HEADER_SIZE
33e0: 2c 4e 55 4c 4c 2c 30 2c 26 72 65 74 75 72 6e 65  ,NULL,0,&returne
33f0: 64 4c 65 6e 67 74 68 2c 4e 55 4c 4c 29 29 20 7b  dLength,NULL)) {
3400: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
3410: 20 45 72 72 6f 72 20 73 65 74 74 69 6e 67 20 6a   Error setting j
3420: 75 6e 63 74 69 6f 6e 2e 0a 09 20 20 20 20 20 2a  unction...     *
3430: 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 57 69 6e 43  /...    Tcl_WinC
3440: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c  onvertError(GetL
3450: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20  astError());..  
3460: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 46    CloseHandle(hF
3470: 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ile);..} else {.
3480: 09 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
3490: 28 68 46 69 6c 65 29 3b 0a 09 20 20 20 20 69 66  (hFile);..    if
34a0: 20 28 21 6c 69 6e 6b 4f 6e 6c 79 29 20 7b 0a 09   (!linkOnly) {..
34b0: 09 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79  .RemoveDirectory
34c0: 57 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 29 3b  W(linkOrigPath);
34d0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74  ..    }..    ret
34e0: 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a  urn 0;..}.    }.
34f0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d      return -1;.}
3500: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3550: 20 2a 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69   * WinReadLinkDi
3560: 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a  rectory --. *. *
3570: 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65  .This routine re
3580: 61 64 73 20 61 20 4e 54 46 53 20 6a 75 6e 63 74  ads a NTFS junct
3590: 69 6f 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 75  ion, using the u
35a0: 6e 64 6f 63 75 6d 65 6e 74 65 64 0a 20 2a 09 46  ndocumented. *.F
35b0: 53 43 54 4c 5f 47 45 54 5f 52 45 50 41 52 53 45  SCTL_GET_REPARSE
35c0: 5f 50 4f 49 4e 54 20 73 74 72 75 63 74 75 72 65  _POINT structure
35d0: 20 57 69 6e 32 4b 20 75 73 65 73 20 66 6f 72 20   Win2K uses for 
35e0: 6d 6f 75 6e 74 20 70 6f 69 6e 74 73 20 61 6e 64  mount points and
35f0: 0a 20 2a 09 6a 75 6e 63 74 69 6f 6e 73 2e 0a 20  . *.junctions.. 
3600: 2a 0a 20 2a 09 41 73 73 75 6d 70 74 69 6f 6e 20  *. *.Assumption 
3610: 74 68 61 74 20 4c 69 6e 6b 44 69 72 65 63 74 6f  that LinkDirecto
3620: 72 79 20 69 73 20 61 20 76 61 6c 69 64 2c 20 65  ry is a valid, e
3630: 78 69 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72  xisting director
3640: 79 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  y.. *. * Returns
3650: 3a 0a 20 2a 09 41 20 54 63 6c 5f 4f 62 6a 20 77  :. *.A Tcl_Obj w
3660: 69 74 68 20 72 65 66 43 6f 75 6e 74 20 6f 66 20  ith refCount of 
3670: 31 20 28 69 2e 65 2e 20 6f 77 6e 65 64 20 62 79  1 (i.e. owned by
3680: 20 74 68 65 20 63 61 6c 6c 65 72 29 2c 20 6f 72   the caller), or
3690: 20 4e 55 4c 4c 20 69 66 0a 20 2a 09 61 6e 79 74   NULL if. *.anyt
36a0: 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67 2e  hing went wrong.
36b0: 0a 20 2a 0a 20 2a 09 49 6e 20 74 68 65 20 66 75  . *. *.In the fu
36c0: 74 75 72 65 20 77 65 20 73 68 6f 75 6c 64 20 65  ture we should e
36d0: 6e 68 61 6e 63 65 20 74 68 69 73 20 74 6f 20 72  nhance this to r
36e0: 65 74 75 72 6e 20 61 20 70 61 74 68 20 6f 62 6a  eturn a path obj
36f0: 65 63 74 20 72 61 74 68 65 72 0a 20 2a 09 74 68  ect rather. *.th
3700: 61 6e 20 61 20 73 74 72 69 6e 67 2e 0a 20 2a 0a  an a string.. *.
3710: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20  ------. */..#if 
3760: 64 65 66 69 6e 65 64 20 28 5f 5f 63 6c 61 6e 67  defined (__clang
3770: 5f 5f 29 20 7c 7c 20 28 28 5f 5f 47 4e 55 43 5f  __) || ((__GNUC_
3780: 5f 29 20 20 26 26 20 28 28 5f 5f 47 4e 55 43 5f  _)  && ((__GNUC_
3790: 5f 20 3e 20 34 29 20 7c 7c 20 28 28 5f 5f 47 4e  _ > 4) || ((__GN
37a0: 55 43 5f 5f 20 3d 3d 20 34 29 20 26 26 20 28 5f  UC__ == 4) && (_
37b0: 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3e 20  _GNUC_MINOR__ > 
37c0: 35 29 29 29 29 0a 23 70 72 61 67 6d 61 20 47 43  5)))).#pragma GC
37d0: 43 20 64 69 61 67 6e 6f 73 74 69 63 20 70 75 73  C diagnostic pus
37e0: 68 0a 23 70 72 61 67 6d 61 20 47 43 43 20 64 69  h.#pragma GCC di
37f0: 61 67 6e 6f 73 74 69 63 20 69 67 6e 6f 72 65 64  agnostic ignored
3800: 20 22 2d 57 61 72 72 61 79 2d 62 6f 75 6e 64 73   "-Warray-bounds
3810: 22 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ".#endif..static
3820: 20 54 63 6c 5f 4f 62 6a 20 2a 0a 57 69 6e 52 65   Tcl_Obj *.WinRe
3830: 61 64 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28  adLinkDirectory(
3840: 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52  .    const WCHAR
3850: 20 2a 6c 69 6e 6b 44 69 72 50 61 74 68 29 0a 7b   *linkDirPath).{
3860: 0a 20 20 20 20 69 6e 74 20 61 74 74 72 2c 20 6c  .    int attr, l
3870: 65 6e 2c 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  en, offset;.    
3880: 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55  DUMMY_REPARSE_BU
3890: 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20  FFER dummy;.    
38a0: 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46  REPARSE_DATA_BUF
38b0: 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 66 66  FER *reparseBuff
38c0: 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f 44 41  er = (REPARSE_DA
38d0: 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 64 75  TA_BUFFER *) &du
38e0: 6d 6d 79 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  mmy;.    Tcl_Obj
38f0: 20 2a 72 65 74 56 61 6c 3b 0a 20 20 20 20 54 63   *retVal;.    Tc
3900: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20  l_DString ds;.  
3910: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
3920: 70 79 3b 0a 0a 20 20 20 20 61 74 74 72 20 3d 20  py;..    attr = 
3930: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3940: 73 57 28 6c 69 6e 6b 44 69 72 50 61 74 68 29 3b  sW(linkDirPath);
3950: 0a 20 20 20 20 69 66 20 28 21 28 61 74 74 72 20  .    if (!(attr 
3960: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
3970: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 29 29  _REPARSE_POINT))
3980: 20 7b 0a 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64   {..goto invalid
3990: 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Error;.    }.   
39a0: 20 69 66 20 28 4e 61 74 69 76 65 52 65 61 64 52   if (NativeReadR
39b0: 65 70 61 72 73 65 28 6c 69 6e 6b 44 69 72 50 61  eparse(linkDirPa
39c0: 74 68 2c 20 72 65 70 61 72 73 65 42 75 66 66 65  th, reparseBuffe
39d0: 72 2c 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e  r, 0)) {..return
39e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
39f0: 20 20 73 77 69 74 63 68 20 28 72 65 70 61 72 73    switch (repars
3a00: 65 42 75 66 66 65 72 2d 3e 52 65 70 61 72 73 65  eBuffer->Reparse
3a10: 54 61 67 29 20 7b 0a 20 20 20 20 63 61 73 65 20  Tag) {.    case 
3a20: 30 78 38 30 30 30 30 30 30 30 7c 49 4f 5f 52 45  0x80000000|IO_RE
3a30: 50 41 52 53 45 5f 54 41 47 5f 53 59 4d 42 4f 4c  PARSE_TAG_SYMBOL
3a40: 49 43 5f 4c 49 4e 4b 3a 0a 20 20 20 20 63 61 73  IC_LINK:.    cas
3a50: 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47  e IO_REPARSE_TAG
3a60: 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 3a 0a  _SYMBOLIC_LINK:.
3a70: 20 20 20 20 63 61 73 65 20 49 4f 5f 52 45 50 41      case IO_REPA
3a80: 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f  RSE_TAG_MOUNT_PO
3a90: 49 4e 54 3a 0a 09 2f 2a 0a 09 20 2a 20 43 65 72  INT:../*.. * Cer
3aa0: 74 61 69 6e 20 6e 61 74 69 76 65 20 70 61 74 68  tain native path
3ab0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73   representations
3ac0: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 68 61 76 65   on Windows have
3ad0: 20 61 20 73 70 65 63 69 61 6c 0a 09 20 2a 20 70   a special.. * p
3ae0: 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74  refix to indicat
3af0: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
3b00: 74 6f 20 62 65 20 74 72 65 61 74 65 64 20 73 70  to be treated sp
3b10: 65 63 69 61 6c 6c 79 2e 20 46 6f 72 0a 09 20 2a  ecially. For.. *
3b20: 20 65 78 61 6d 70 6c 65 20 65 78 74 72 65 6d 65   example extreme
3b30: 6c 79 20 6c 6f 6e 67 20 70 61 74 68 73 2c 20 6f  ly long paths, o
3b40: 72 20 73 79 6d 6c 69 6e 6b 73 2c 20 6f 72 20 76  r symlinks, or v
3b50: 6f 6c 75 6d 65 73 20 6d 6f 75 6e 74 65 64 0a 09  olumes mounted..
3b60: 20 2a 20 69 6e 73 69 64 65 20 64 69 72 65 63 74   * inside direct
3b70: 6f 72 69 65 73 2e 0a 09 20 2a 0a 09 20 2a 20 54  ories... *.. * T
3b80: 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 75 6d  here is an assum
3b90: 70 74 69 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f  ption in this co
3ba0: 64 65 20 74 68 61 74 20 27 77 69 64 65 27 20 69  de that 'wide' i
3bb0: 6e 74 65 72 66 61 63 65 73 20 61 72 65 0a 09 20  nterfaces are.. 
3bc0: 2a 20 62 65 69 6e 67 20 75 73 65 64 20 28 73 65  * being used (se
3bd0: 65 20 74 63 6c 57 69 6e 33 32 44 6c 6c 2e 63 29  e tclWin32Dll.c)
3be0: 2c 20 77 68 69 63 68 20 69 73 20 74 72 75 65 20  , which is true 
3bf0: 66 6f 72 20 74 68 65 20 6f 6e 6c 79 20 73 79 73  for the only sys
3c00: 74 65 6d 73 0a 09 20 2a 20 77 68 69 63 68 20 73  tems.. * which s
3c10: 75 70 70 6f 72 74 20 72 65 70 61 72 73 65 20 74  upport reparse t
3c20: 61 67 73 20 61 74 20 70 72 65 73 65 6e 74 2e 20  ags at present. 
3c30: 49 66 20 74 68 61 74 20 63 68 61 6e 67 65 73 20  If that changes 
3c40: 69 6e 20 74 68 65 0a 09 20 2a 20 66 75 74 75 72  in the.. * futur
3c50: 65 2c 20 74 68 69 73 20 63 6f 64 65 20 77 69 6c  e, this code wil
3c60: 6c 20 68 61 76 65 20 74 6f 20 62 65 20 67 65 6e  l have to be gen
3c70: 65 72 61 6c 69 73 65 64 2e 0a 09 20 2a 2f 0a 0a  eralised... */..
3c80: 09 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09 69 66  .offset = 0;..if
3c90: 20 28 72 65 70 61 72 73 65 42 75 66 66 65 72 2d   (reparseBuffer-
3ca0: 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72  >MountPointRepar
3cb0: 73 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66  seBuffer.PathBuf
3cc0: 66 65 72 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20  fer[0] == '\\') 
3cd0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
3ce0: 2a 20 43 68 65 63 6b 20 77 68 65 74 68 65 72 20  * Check whether 
3cf0: 74 68 69 73 20 69 73 20 61 20 6d 6f 75 6e 74 65  this is a mounte
3d00: 64 20 76 6f 6c 75 6d 65 2e 0a 09 20 20 20 20 20  d volume...     
3d10: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 77 63 73  */...    if (wcs
3d20: 6e 63 6d 70 28 72 65 70 61 72 73 65 42 75 66 66  ncmp(reparseBuff
3d30: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65  er->MountPointRe
3d40: 70 61 72 73 65 42 75 66 66 65 72 2e 50 61 74 68  parseBuffer.Path
3d50: 42 75 66 66 65 72 2c 0a 09 09 20 20 20 20 4c 22  Buffer,...    L"
3d60: 5c 5c 3f 3f 5c 5c 56 6f 6c 75 6d 65 7b 22 2c 31  \\??\\Volume{",1
3d70: 31 29 20 3d 3d 20 30 29 20 7b 0a 09 09 63 68 61  1) == 0) {...cha
3d80: 72 20 64 72 69 76 65 3b 0a 0a 09 09 2f 2a 0a 09  r drive;..../*..
3d90: 09 20 2a 20 54 68 65 72 65 20 69 73 20 73 6f 6d  . * There is som
3da0: 65 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 74 77  e confusion betw
3db0: 65 65 6e 20 5c 3f 3f 5c 20 61 6e 64 20 5c 5c 3f  een \??\ and \\?
3dc0: 5c 20 77 68 69 63 68 20 77 65 20 68 61 76 65 0a  \ which we have.
3dd0: 09 09 20 2a 20 74 6f 20 66 69 78 20 68 65 72 65  .. * to fix here
3de0: 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 73 65 65  . It doesn't see
3df0: 6d 20 76 65 72 79 20 77 65 6c 6c 20 64 6f 63 75  m very well docu
3e00: 6d 65 6e 74 65 64 2e 0a 09 09 20 2a 2f 0a 0a 09  mented.... */...
3e10: 09 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e  .reparseBuffer->
3e20: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73  MountPointRepars
3e30: 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66  eBuffer.PathBuff
3e40: 65 72 5b 31 5d 20 3d 20 27 5c 5c 27 3b 0a 0a 09  er[1] = '\\';...
3e50: 09 2f 2a 0a 09 09 20 2a 20 43 68 65 63 6b 20 69  ./*... * Check i
3e60: 66 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  f a correspondin
3e70: 67 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 65  g drive letter e
3e80: 78 69 73 74 73 2c 20 61 6e 64 20 75 73 65 20 74  xists, and use t
3e90: 68 61 74 0a 09 09 20 2a 20 69 66 20 69 74 20 69  hat... * if it i
3ea0: 73 20 66 6f 75 6e 64 0a 09 09 20 2a 2f 0a 0a 09  s found... */...
3eb0: 09 64 72 69 76 65 20 3d 20 54 63 6c 57 69 6e 44  .drive = TclWinD
3ec0: 72 69 76 65 4c 65 74 74 65 72 46 6f 72 56 6f 6c  riveLetterForVol
3ed0: 4d 6f 75 6e 74 50 6f 69 6e 74 28 0a 09 09 09 72  MountPoint(....r
3ee0: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f  eparseBuffer->Mo
3ef0: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42  untPointReparseB
3f00: 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 72  uffer.PathBuffer
3f10: 29 3b 0a 09 09 69 66 20 28 64 72 69 76 65 20 21  );...if (drive !
3f20: 3d 20 2d 31 29 20 7b 0a 09 09 20 20 20 20 63 68  = -1) {...    ch
3f30: 61 72 20 64 72 69 76 65 53 70 65 63 5b 33 5d 20  ar driveSpec[3] 
3f40: 3d 20 7b 0a 09 09 09 27 5c 30 27 2c 20 27 3a 27  = {....'\0', ':'
3f50: 2c 20 27 5c 30 27 0a 09 09 20 20 20 20 7d 3b 0a  , '\0'...    };.
3f60: 0a 09 09 20 20 20 20 64 72 69 76 65 53 70 65 63  ...    driveSpec
3f70: 5b 30 5d 20 3d 20 64 72 69 76 65 3b 0a 09 09 20  [0] = drive;... 
3f80: 20 20 20 72 65 74 56 61 6c 20 3d 20 54 63 6c 5f     retVal = Tcl_
3f90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 64 72 69  NewStringObj(dri
3fa0: 76 65 53 70 65 63 2c 32 29 3b 0a 09 09 20 20 20  veSpec,2);...   
3fb0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
3fc0: 74 28 72 65 74 56 61 6c 29 3b 0a 09 09 20 20 20  t(retVal);...   
3fd0: 20 72 65 74 75 72 6e 20 72 65 74 56 61 6c 3b 0a   return retVal;.
3fe0: 09 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 54  ..}..../*... * T
3ff0: 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
4000: 61 20 6d 6f 75 6e 74 65 64 20 64 72 69 76 65 2c  a mounted drive,
4010: 20 77 68 69 63 68 20 64 6f 65 73 6e 27 74 20 65   which doesn't e
4020: 78 69 73 74 73 20 61 73 20 61 0a 09 09 20 2a 20  xists as a... * 
4030: 44 4f 53 20 64 72 69 76 65 20 6c 65 74 74 65 72  DOS drive letter
4040: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
4050: 20 70 61 74 68 20 69 73 6e 27 74 20 61 63 74 75   path isn't actu
4060: 61 6c 6c 79 20 61 0a 09 09 20 2a 20 6c 69 6e 6b  ally a... * link
4070: 2c 20 61 6c 74 68 6f 75 67 68 20 77 65 20 70 61  , although we pa
4080: 72 74 69 61 6c 6c 79 20 74 72 65 61 74 20 69 74  rtially treat it
4090: 20 6c 69 6b 65 20 6f 6e 65 20 28 27 66 69 6c 65   like one ('file
40a0: 20 74 79 70 65 27 0a 09 09 20 2a 20 77 69 6c 6c   type'... * will
40b0: 20 72 65 74 75 72 6e 20 27 6c 69 6e 6b 27 29 2c   return 'link'),
40c0: 20 62 75 74 20 74 68 65 6e 20 74 68 65 20 6c 69   but then the li
40d0: 6e 6b 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  nk will actually
40e0: 20 6a 75 73 74 0a 09 09 20 2a 20 62 65 20 74 72   just... * be tr
40f0: 65 61 74 65 64 20 6c 69 6b 65 20 61 6e 20 6f 72  eated like an or
4100: 64 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  dinary directory
4110: 2e 20 49 20 64 6f 6e 27 74 20 62 65 6c 69 65 76  . I don't believ
4120: 65 20 61 6e 79 0a 09 09 20 2a 20 73 65 72 69 6f  e any... * serio
4130: 75 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  us inconsistency
4140: 20 77 69 6c 6c 20 61 72 69 73 65 20 66 72 6f 6d   will arise from
4150: 20 74 68 69 73 2c 20 62 75 74 20 69 74 20 69 73   this, but it is
4160: 0a 09 09 20 2a 20 73 6f 6d 65 74 68 69 6e 67 20  ... * something 
4170: 74 6f 20 62 65 20 61 77 61 72 65 20 6f 66 2e 0a  to be aware of..
4180: 09 09 20 2a 2f 0a 0a 09 09 67 6f 74 6f 20 69 6e  .. */....goto in
4190: 76 61 6c 69 64 45 72 72 6f 72 3b 0a 09 20 20 20  validError;..   
41a0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 63 73 6e   } else if (wcsn
41b0: 63 6d 70 28 72 65 70 61 72 73 65 42 75 66 66 65  cmp(reparseBuffe
41c0: 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70  r->MountPointRep
41d0: 61 72 73 65 42 75 66 66 65 72 0a 09 09 20 20 20  arseBuffer...   
41e0: 20 2e 50 61 74 68 42 75 66 66 65 72 2c 20 4c 22   .PathBuffer, L"
41f0: 5c 5c 5c 5c 3f 5c 5c 22 2c 34 29 20 3d 3d 20 30  \\\\?\\",4) == 0
4200: 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 53 74  ) {.../*... * St
4210: 72 69 70 20 6f 66 66 20 74 68 65 20 70 72 65 66  rip off the pref
4220: 69 78 2e 0a 09 09 20 2a 2f 0a 0a 09 09 6f 66 66  ix.... */....off
4230: 73 65 74 20 3d 20 34 3b 0a 09 20 20 20 20 7d 20  set = 4;..    } 
4240: 65 6c 73 65 20 69 66 20 28 77 63 73 6e 63 6d 70  else if (wcsncmp
4250: 28 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e  (reparseBuffer->
4260: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73  MountPointRepars
4270: 65 42 75 66 66 65 72 0a 09 09 20 20 20 20 2e 50  eBuffer...    .P
4280: 61 74 68 42 75 66 66 65 72 2c 20 4c 22 5c 5c 3f  athBuffer, L"\\?
4290: 3f 5c 5c 22 2c 34 29 20 3d 3d 20 30 29 20 7b 0a  ?\\",4) == 0) {.
42a0: 09 09 2f 2a 0a 09 09 20 2a 20 53 74 72 69 70 20  ../*... * Strip 
42b0: 6f 66 66 20 74 68 65 20 70 72 65 66 69 78 2e 0a  off the prefix..
42c0: 09 09 20 2a 2f 0a 0a 09 09 6f 66 66 73 65 74 20  .. */....offset 
42d0: 3d 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  = 4;..    }..}..
42e0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74  .Tcl_DStringInit
42f0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 57 43 68 61  (&ds);..Tcl_WCha
4300: 72 54 6f 55 74 66 44 53 74 72 69 6e 67 28 0a 09  rToUtfDString(..
4310: 09 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e  .reparseBuffer->
4320: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73  MountPointRepars
4330: 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66  eBuffer.PathBuff
4340: 65 72 2c 0a 09 09 72 65 70 61 72 73 65 42 75 66  er,...reparseBuf
4350: 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52  fer->MountPointR
4360: 65 70 61 72 73 65 42 75 66 66 65 72 0a 09 09 2e  eparseBuffer....
4370: 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65  SubstituteNameLe
4380: 6e 67 74 68 3e 3e 31 2c 20 26 64 73 29 3b 0a 0a  ngth>>1, &ds);..
4390: 09 63 6f 70 79 20 3d 20 54 63 6c 5f 44 53 74 72  .copy = Tcl_DStr
43a0: 69 6e 67 56 61 6c 75 65 28 26 64 73 29 2b 6f 66  ingValue(&ds)+of
43b0: 66 73 65 74 3b 0a 09 6c 65 6e 20 3d 20 54 63 6c  fset;..len = Tcl
43c0: 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26  _DStringLength(&
43d0: 64 73 29 2d 6f 66 66 73 65 74 3b 0a 09 72 65 74  ds)-offset;..ret
43e0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
43f0: 69 6e 67 4f 62 6a 28 63 6f 70 79 2c 6c 65 6e 29  ingObj(copy,len)
4400: 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  ;..Tcl_IncrRefCo
4410: 75 6e 74 28 72 65 74 56 61 6c 29 3b 0a 09 54 63  unt(retVal);..Tc
4420: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
4430: 73 29 3b 0a 09 72 65 74 75 72 6e 20 72 65 74 56  s);..return retV
4440: 61 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 69 6e 76  al;.    }..  inv
4450: 61 6c 69 64 45 72 72 6f 72 3a 0a 20 20 20 20 54  alidError:.    T
4460: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56  cl_SetErrno(EINV
4470: 41 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  AL);.    return 
4480: 4e 55 4c 4c 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  NULL;.}..#if def
4490: 69 6e 65 64 20 28 5f 5f 63 6c 61 6e 67 5f 5f 29  ined (__clang__)
44a0: 20 7c 7c 20 28 28 5f 5f 47 4e 55 43 5f 5f 29 20   || ((__GNUC__) 
44b0: 20 26 26 20 28 28 5f 5f 47 4e 55 43 5f 5f 20 3e   && ((__GNUC__ >
44c0: 20 34 29 20 7c 7c 20 28 28 5f 5f 47 4e 55 43 5f   4) || ((__GNUC_
44d0: 5f 20 3d 3d 20 34 29 20 26 26 20 28 5f 5f 47 4e  _ == 4) && (__GN
44e0: 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3e 20 35 29 29  UC_MINOR__ > 5))
44f0: 29 29 0a 23 70 72 61 67 6d 61 20 47 43 43 20 64  )).#pragma GCC d
4500: 69 61 67 6e 6f 73 74 69 63 20 70 6f 70 0a 23 65  iagnostic pop.#e
4510: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
4520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4560: 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 52 65 61  . *. * NativeRea
4570: 64 52 65 70 61 72 73 65 20 2d 2d 0a 20 2a 0a 20  dReparse --. *. 
4580: 2a 09 52 65 61 64 20 74 68 65 20 6a 75 6e 63 74  *.Read the junct
4590: 69 6f 6e 2f 72 65 70 61 72 73 65 20 69 6e 66 6f  ion/reparse info
45a0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 67  rmation from a g
45b0: 69 76 65 6e 20 4e 54 46 53 20 64 69 72 65 63 74  iven NTFS direct
45c0: 6f 72 79 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d  ory.. *. *.Assum
45d0: 70 74 69 6f 6e 20 74 68 61 74 20 6c 69 6e 6b 44  ption that linkD
45e0: 69 72 50 61 74 68 20 69 73 20 61 20 76 61 6c 69  irPath is a vali
45f0: 64 2c 20 65 78 69 73 74 69 6e 67 20 64 69 72 65  d, existing dire
4600: 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 20 52 65 74  ctory.. *. * Ret
4610: 75 72 6e 73 3a 0a 20 2a 09 5a 65 72 6f 20 6f 6e  urns:. *.Zero on
4620: 20 73 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 2d   success.. *. *-
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4670: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
4680: 69 6e 74 0a 4e 61 74 69 76 65 52 65 61 64 52 65  int.NativeReadRe
4690: 70 61 72 73 65 28 0a 20 20 20 20 63 6f 6e 73 74  parse(.    const
46a0: 20 57 43 48 41 52 20 2a 6c 69 6e 6b 44 69 72 50   WCHAR *linkDirP
46b0: 61 74 68 2c 09 2f 2a 20 54 68 65 20 6a 75 6e 63  ath,./* The junc
46c0: 74 69 6f 6e 20 74 6f 20 72 65 61 64 20 2a 2f 0a  tion to read */.
46d0: 20 20 20 20 52 45 50 41 52 53 45 5f 44 41 54 41      REPARSE_DATA
46e0: 5f 42 55 46 46 45 52 20 2a 62 75 66 66 65 72 2c  _BUFFER *buffer,
46f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
4700: 66 66 65 72 2e 20 43 61 6e 6e 6f 74 20 62 65 20  ffer. Cannot be 
4710: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 44 57 4f 52  NULL */.    DWOR
4720: 44 20 64 65 73 69 72 65 64 41 63 63 65 73 73 29  D desiredAccess)
4730: 0a 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 46  .{.    HANDLE hF
4740: 69 6c 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 72  ile;.    DWORD r
4750: 65 74 75 72 6e 65 64 4c 65 6e 67 74 68 3b 0a 0a  eturnedLength;..
4760: 20 20 20 20 68 46 69 6c 65 20 3d 20 43 72 65 61      hFile = Crea
4770: 74 65 46 69 6c 65 57 28 6c 69 6e 6b 44 69 72 50  teFileW(linkDirP
4780: 61 74 68 2c 20 64 65 73 69 72 65 64 41 63 63 65  ath, desiredAcce
4790: 73 73 2c 20 46 49 4c 45 5f 53 48 41 52 45 5f 52  ss, FILE_SHARE_R
47a0: 45 41 44 2c 20 4e 55 4c 4c 2c 0a 09 20 20 20 20  EAD, NULL,..    
47b0: 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09  OPEN_EXISTING,..
47c0: 20 20 20 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50      FILE_FLAG_OP
47d0: 45 4e 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54  EN_REPARSE_POINT
47e0: 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 42 41 43   | FILE_FLAG_BAC
47f0: 4b 55 50 5f 53 45 4d 41 4e 54 49 43 53 2c 20 4e  KUP_SEMANTICS, N
4800: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 68  ULL);..    if (h
4810: 46 69 6c 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  File == INVALID_
4820: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a  HANDLE_VALUE) {.
4830: 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 63 72  ./*.. * Error cr
4840: 65 61 74 69 6e 67 20 64 69 72 65 63 74 6f 72 79  eating directory
4850: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 57 69 6e  ... */...Tcl_Win
4860: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74  ConvertError(Get
4870: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72  LastError());..r
4880: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
4890: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 47  .    /*.     * G
48a0: 65 74 20 74 68 65 20 6c 69 6e 6b 2e 0a 20 20 20  et the link..   
48b0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 44    */..    if (!D
48c0: 65 76 69 63 65 49 6f 43 6f 6e 74 72 6f 6c 28 68  eviceIoControl(h
48d0: 46 69 6c 65 2c 20 46 53 43 54 4c 5f 47 45 54 5f  File, FSCTL_GET_
48e0: 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 2c 20 4e  REPARSE_POINT, N
48f0: 55 4c 4c 2c 20 30 2c 20 62 75 66 66 65 72 2c 0a  ULL, 0, buffer,.
4900: 09 20 20 20 20 73 69 7a 65 6f 66 28 44 55 4d 4d  .    sizeof(DUMM
4910: 59 5f 52 45 50 41 52 53 45 5f 42 55 46 46 45 52  Y_REPARSE_BUFFER
4920: 29 2c 20 26 72 65 74 75 72 6e 65 64 4c 65 6e 67  ), &returnedLeng
4930: 74 68 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 2f 2a  th, NULL)) {../*
4940: 0a 09 20 2a 20 45 72 72 6f 72 20 73 65 74 74 69  .. * Error setti
4950: 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e 0a 09 20 2a  ng junction... *
4960: 2f 0a 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65  /...Tcl_WinConve
4970: 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
4980: 72 72 6f 72 28 29 29 3b 0a 09 43 6c 6f 73 65 48  rror());..CloseH
4990: 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 72  andle(hFile);..r
49a0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
49b0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
49c0: 68 46 69 6c 65 29 3b 0a 0a 20 20 20 20 69 66 20  hFile);..    if 
49d0: 28 21 49 73 52 65 70 61 72 73 65 54 61 67 56 61  (!IsReparseTagVa
49e0: 6c 69 64 28 62 75 66 66 65 72 2d 3e 52 65 70 61  lid(buffer->Repa
49f0: 72 73 65 54 61 67 29 29 20 7b 0a 09 54 63 6c 5f  rseTag)) {..Tcl_
4a00: 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c 29  SetErrno(EINVAL)
4a10: 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  ;..return -1;.  
4a20: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
4a30: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4a80: 20 2a 0a 20 2a 20 4e 61 74 69 76 65 57 72 69 74   *. * NativeWrit
4a90: 65 52 65 70 61 72 73 65 20 2d 2d 0a 20 2a 0a 20  eReparse --. *. 
4aa0: 2a 09 57 72 69 74 65 20 74 68 65 20 72 65 70 61  *.Write the repa
4ab0: 72 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rse information 
4ac0: 66 6f 72 20 61 20 67 69 76 65 6e 20 64 69 72 65  for a given dire
4ad0: 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 09 41 73 73  ctory.. *. *.Ass
4ae0: 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 4c 69 6e  umption that Lin
4af0: 6b 44 69 72 65 63 74 6f 72 79 20 64 6f 65 73 20  kDirectory does 
4b00: 6e 6f 74 20 65 78 69 73 74 2e 0a 20 2a 0a 20 2a  not exist.. *. *
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
4b60: 20 69 6e 74 0a 4e 61 74 69 76 65 57 72 69 74 65   int.NativeWrite
4b70: 52 65 70 61 72 73 65 28 0a 20 20 20 20 63 6f 6e  Reparse(.    con
4b80: 73 74 20 57 43 48 41 52 20 2a 6c 69 6e 6b 44 69  st WCHAR *linkDi
4b90: 72 50 61 74 68 2c 0a 20 20 20 20 52 45 50 41 52  rPath,.    REPAR
4ba0: 53 45 5f 44 41 54 41 5f 42 55 46 46 45 52 20 2a  SE_DATA_BUFFER *
4bb0: 62 75 66 66 65 72 29 0a 7b 0a 20 20 20 20 48 41  buffer).{.    HA
4bc0: 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 20 20 20 20  NDLE hFile;.    
4bd0: 44 57 4f 52 44 20 72 65 74 75 72 6e 65 64 4c 65  DWORD returnedLe
4be0: 6e 67 74 68 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ngth;..    /*.  
4bf0: 20 20 20 2a 20 43 72 65 61 74 65 20 74 68 65 20     * Create the 
4c00: 64 69 72 65 63 74 6f 72 79 20 2d 20 69 74 20 6d  directory - it m
4c10: 75 73 74 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ust not already 
4c20: 65 78 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a  exist..     */..
4c30: 20 20 20 20 69 66 20 28 43 72 65 61 74 65 44 69      if (CreateDi
4c40: 72 65 63 74 6f 72 79 57 28 6c 69 6e 6b 44 69 72  rectoryW(linkDir
4c50: 50 61 74 68 2c 20 4e 55 4c 4c 29 20 3d 3d 20 30  Path, NULL) == 0
4c60: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f  ) {../*.. * Erro
4c70: 72 20 63 72 65 61 74 69 6e 67 20 64 69 72 65 63  r creating direc
4c80: 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c  tory... */...Tcl
4c90: 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72  _WinConvertError
4ca0: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
4cb0: 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  ;..return -1;.  
4cc0: 20 20 7d 0a 20 20 20 20 68 46 69 6c 65 20 3d 20    }.    hFile = 
4cd0: 43 72 65 61 74 65 46 69 6c 65 57 28 6c 69 6e 6b  CreateFileW(link
4ce0: 44 69 72 50 61 74 68 2c 20 47 45 4e 45 52 49 43  DirPath, GENERIC
4cf0: 5f 57 52 49 54 45 2c 20 30 2c 20 4e 55 4c 4c 2c  _WRITE, 0, NULL,
4d00: 0a 09 20 20 20 20 4f 50 45 4e 5f 45 58 49 53 54  ..    OPEN_EXIST
4d10: 49 4e 47 2c 20 46 49 4c 45 5f 46 4c 41 47 5f 4f  ING, FILE_FLAG_O
4d20: 50 45 4e 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e  PEN_REPARSE_POIN
4d30: 54 0a 09 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c  T..    | FILE_FL
4d40: 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54  AG_BACKUP_SEMANT
4d50: 49 43 53 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ICS, NULL);.    
4d60: 69 66 20 28 68 46 69 6c 65 20 3d 3d 20 49 4e 56  if (hFile == INV
4d70: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
4d80: 45 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72  E) {../*.. * Err
4d90: 6f 72 20 63 72 65 61 74 69 6e 67 20 64 69 72 65  or creating dire
4da0: 63 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 54 63  ctory... */...Tc
4db0: 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  l_WinConvertErro
4dc0: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  r(GetLastError()
4dd0: 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20  );..return -1;. 
4de0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
4df0: 20 20 2a 20 53 65 74 20 74 68 65 20 6c 69 6e 6b    * Set the link
4e00: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
4e10: 66 20 28 21 44 65 76 69 63 65 49 6f 43 6f 6e 74  f (!DeviceIoCont
4e20: 72 6f 6c 28 68 46 69 6c 65 2c 20 46 53 43 54 4c  rol(hFile, FSCTL
4e30: 5f 53 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49  _SET_REPARSE_POI
4e40: 4e 54 2c 20 62 75 66 66 65 72 2c 0a 09 20 20 20  NT, buffer,..   
4e50: 20 28 44 57 4f 52 44 29 20 62 75 66 66 65 72 2d   (DWORD) buffer-
4e60: 3e 52 65 70 61 72 73 65 44 61 74 61 4c 65 6e 67  >ReparseDataLeng
4e70: 74 68 20 2b 20 52 45 50 41 52 53 45 5f 4d 4f 55  th + REPARSE_MOU
4e80: 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 52 5f 53  NTPOINT_HEADER_S
4e90: 49 5a 45 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20  IZE,..    NULL, 
4ea0: 30 2c 20 26 72 65 74 75 72 6e 65 64 4c 65 6e 67  0, &returnedLeng
4eb0: 74 68 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 2f 2a  th, NULL)) {../*
4ec0: 0a 09 20 2a 20 45 72 72 6f 72 20 73 65 74 74 69  .. * Error setti
4ed0: 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e 0a 09 20 2a  ng junction... *
4ee0: 2f 0a 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65  /...Tcl_WinConve
4ef0: 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
4f00: 72 72 6f 72 28 29 29 3b 0a 09 43 6c 6f 73 65 48  rror());..CloseH
4f10: 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 52  andle(hFile);..R
4f20: 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 57 28  emoveDirectoryW(
4f30: 6c 69 6e 6b 44 69 72 50 61 74 68 29 3b 0a 09 72  linkDirPath);..r
4f40: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
4f50: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
4f60: 68 46 69 6c 65 29 3b 0a 0a 20 20 20 20 2f 2a 0a  hFile);..    /*.
4f70: 20 20 20 20 20 2a 20 57 65 20 73 75 63 63 65 65       * We succee
4f80: 64 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ded..     */..  
4f90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
4fa0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4ff0: 2a 20 74 63 6c 57 69 6e 44 65 62 75 67 50 61 6e  * tclWinDebugPan
5000: 69 63 20 2d 2d 0a 20 2a 0a 20 2a 09 44 69 73 70  ic --. *. *.Disp
5010: 6c 61 79 20 61 20 6d 65 73 73 61 67 65 2e 20 49  lay a message. I
5020: 66 20 61 20 64 65 62 75 67 67 65 72 20 69 73 20  f a debugger is 
5030: 70 72 65 73 65 6e 74 2c 20 70 72 65 73 65 6e 74  present, present
5040: 20 69 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a   it directly to.
5050: 20 2a 09 74 68 65 20 64 65 62 75 67 67 65 72 2c   *.the debugger,
5060: 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 20 61   otherwise use a
5070: 20 4d 65 73 73 61 67 65 42 6f 78 2e 0a 20 2a 0a   MessageBox.. *.
5080: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5090: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
50a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
50b0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
50c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5100: 2f 0a 0a 76 6f 69 64 0a 74 63 6c 57 69 6e 44 65  /..void.tclWinDe
5110: 62 75 67 50 61 6e 69 63 28 0a 20 20 20 20 63 6f  bugPanic(.    co
5120: 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
5130: 2c 20 2e 2e 2e 29 0a 7b 0a 23 64 65 66 69 6e 65  , ...).{.#define
5140: 20 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f 4c 45   TCL_MAX_WARN_LE
5150: 4e 20 31 30 32 34 0a 20 20 20 20 76 61 5f 6c 69  N 1024.    va_li
5160: 73 74 20 61 72 67 4c 69 73 74 3b 0a 20 20 20 20  st argList;.    
5170: 63 68 61 72 20 62 75 66 5b 54 43 4c 5f 4d 41 58  char buf[TCL_MAX
5180: 5f 57 41 52 4e 5f 4c 45 4e 20 2a 20 33 5d 3b 0a  _WARN_LEN * 3];.
5190: 20 20 20 20 57 43 48 41 52 20 6d 73 67 53 74 72      WCHAR msgStr
51a0: 69 6e 67 5b 54 43 4c 5f 4d 41 58 5f 57 41 52 4e  ing[TCL_MAX_WARN
51b0: 5f 4c 45 4e 5d 3b 0a 0a 20 20 20 20 76 61 5f 73  _LEN];..    va_s
51c0: 74 61 72 74 28 61 72 67 4c 69 73 74 2c 20 66 6f  tart(argList, fo
51d0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 73 6e 70 72  rmat);.    vsnpr
51e0: 69 6e 74 66 28 62 75 66 2c 20 73 69 7a 65 6f 66  intf(buf, sizeof
51f0: 28 62 75 66 29 2c 20 66 6f 72 6d 61 74 2c 20 61  (buf), format, a
5200: 72 67 4c 69 73 74 29 3b 0a 0a 20 20 20 20 6d 73  rgList);..    ms
5210: 67 53 74 72 69 6e 67 5b 54 43 4c 5f 4d 41 58 5f  gString[TCL_MAX_
5220: 57 41 52 4e 5f 4c 45 4e 2d 31 5d 20 3d 20 27 5c  WARN_LEN-1] = '\
5230: 30 27 3b 0a 20 20 20 20 4d 75 6c 74 69 42 79 74  0';.    MultiByt
5240: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
5250: 54 46 38 2c 20 30 2c 20 62 75 66 2c 20 2d 31 2c  TF8, 0, buf, -1,
5260: 20 6d 73 67 53 74 72 69 6e 67 2c 20 54 43 4c 5f   msgString, TCL_
5270: 4d 41 58 5f 57 41 52 4e 5f 4c 45 4e 29 3b 0a 0a  MAX_WARN_LEN);..
5280: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 72      /*.     * Tr
5290: 75 6e 63 61 74 65 20 4d 65 73 73 61 67 65 42 6f  uncate MessageBo
52a0: 78 20 73 74 72 69 6e 67 20 69 66 20 69 74 20 69  x string if it i
52b0: 73 20 74 6f 6f 20 6c 6f 6e 67 20 74 6f 20 6e 6f  s too long to no
52c0: 74 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20 73  t overflow the s
52d0: 63 72 65 65 6e 0a 20 20 20 20 20 2a 20 61 6e 64  creen.     * and
52e0: 20 63 61 75 73 65 20 70 6f 73 73 69 62 6c 65 20   cause possible 
52f0: 6f 76 65 72 73 69 7a 65 64 20 77 69 6e 64 6f 77  oversized window
5300: 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a   error..     */.
5310: 0a 20 20 20 20 69 66 20 28 6d 73 67 53 74 72 69  .    if (msgStri
5320: 6e 67 5b 54 43 4c 5f 4d 41 58 5f 57 41 52 4e 5f  ng[TCL_MAX_WARN_
5330: 4c 45 4e 2d 31 5d 20 21 3d 20 27 5c 30 27 29 20  LEN-1] != '\0') 
5340: 7b 0a 09 6d 65 6d 63 70 79 28 6d 73 67 53 74 72  {..memcpy(msgStr
5350: 69 6e 67 20 2b 20 28 54 43 4c 5f 4d 41 58 5f 57  ing + (TCL_MAX_W
5360: 41 52 4e 5f 4c 45 4e 20 2d 20 35 29 2c 20 4c 22  ARN_LEN - 5), L"
5370: 20 2e 2e 2e 22 2c 20 35 20 2a 20 73 69 7a 65 6f   ...", 5 * sizeo
5380: 66 28 57 43 48 41 52 29 29 3b 0a 20 20 20 20 7d  f(WCHAR));.    }
5390: 0a 20 20 20 20 69 66 20 28 49 73 44 65 62 75 67  .    if (IsDebug
53a0: 67 65 72 50 72 65 73 65 6e 74 28 29 29 20 7b 0a  gerPresent()) {.
53b0: 09 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  .OutputDebugStri
53c0: 6e 67 57 28 6d 73 67 53 74 72 69 6e 67 29 3b 0a  ngW(msgString);.
53d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 4d 65      } else {..Me
53e0: 73 73 61 67 65 42 65 65 70 28 4d 42 5f 49 43 4f  ssageBeep(MB_ICO
53f0: 4e 45 58 43 4c 41 4d 41 54 49 4f 4e 29 3b 0a 09  NEXCLAMATION);..
5400: 4d 65 73 73 61 67 65 42 6f 78 57 28 4e 55 4c 4c  MessageBoxW(NULL
5410: 2c 20 6d 73 67 53 74 72 69 6e 67 2c 20 4c 22 46  , msgString, L"F
5420: 61 74 61 6c 20 45 72 72 6f 72 22 2c 0a 09 09 4d  atal Error",...M
5430: 42 5f 49 43 4f 4e 53 54 4f 50 20 7c 20 4d 42 5f  B_ICONSTOP | MB_
5440: 4f 4b 20 7c 20 4d 42 5f 54 41 53 4b 4d 4f 44 41  OK | MB_TASKMODA
5450: 4c 20 7c 20 4d 42 5f 53 45 54 46 4f 52 45 47 52  L | MB_SETFOREGR
5460: 4f 55 4e 44 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  OUND);.    }.}..
5470: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 46 69 6e 64  -. *. * TclpFind
54d0: 45 78 65 63 75 74 61 62 6c 65 20 2d 2d 0a 20 2a  Executable --. *
54e0: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
54f0: 6e 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 61  n computes the a
5500: 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d  bsolute path nam
5510: 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  e of the current
5520: 0a 20 2a 09 61 70 70 6c 69 63 61 74 69 6f 6e 2e  . *.application.
5530: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5540: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53   *.None.. *. * S
5550: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
5560: 54 68 65 20 63 6f 6d 70 75 74 65 64 20 70 61 74  The computed pat
5570: 68 20 69 73 20 73 74 6f 72 65 64 2e 0a 20 2a 0a  h is stored.. *.
5580: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
55d0: 2f 0a 0a 76 6f 69 64 0a 54 63 6c 70 46 69 6e 64  /..void.TclpFind
55e0: 45 78 65 63 75 74 61 62 6c 65 28 0a 20 20 20 20  Executable(.    
55f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76  const char *argv
5600: 30 29 09 09 2f 2a 20 49 66 20 4e 55 4c 4c 2c 20  0)../* If NULL, 
5610: 69 6e 73 74 61 6c 6c 20 50 61 6e 69 63 4d 65 73  install PanicMes
5620: 73 61 67 65 42 6f 78 2c 20 6f 74 68 65 72 77 69  sageBox, otherwi
5630: 73 65 0a 09 09 09 09 20 2a 20 69 67 6e 6f 72 65  se..... * ignore
5640: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 57 43 48 41 52  . */.{.    WCHAR
5650: 20 77 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d   wName[MAX_PATH]
5660: 3b 0a 20 20 20 20 63 68 61 72 20 6e 61 6d 65 5b  ;.    char name[
5670: 4d 41 58 5f 50 41 54 48 20 2a 20 33 5d 3b 0a 20  MAX_PATH * 3];. 
5680: 20 20 20 28 76 6f 69 64 29 61 72 67 76 30 3b 0a     (void)argv0;.
5690: 0a 20 20 20 20 47 65 74 4d 6f 64 75 6c 65 46 69  .    GetModuleFi
56a0: 6c 65 4e 61 6d 65 57 28 4e 55 4c 4c 2c 20 77 4e  leNameW(NULL, wN
56b0: 61 6d 65 2c 20 73 69 7a 65 6f 66 28 77 4e 61 6d  ame, sizeof(wNam
56c0: 65 29 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  e)/sizeof(WCHAR)
56d0: 29 3b 0a 20 20 20 20 57 69 64 65 43 68 61 72 54  );.    WideCharT
56e0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
56f0: 46 38 2c 20 30 2c 20 77 4e 61 6d 65 2c 20 2d 31  F8, 0, wName, -1
5700: 2c 20 6e 61 6d 65 2c 20 73 69 7a 65 6f 66 28 6e  , name, sizeof(n
5710: 61 6d 65 29 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ame), NULL, NULL
5720: 29 3b 0a 20 20 20 20 54 63 6c 57 69 6e 4e 6f 42  );.    TclWinNoB
5730: 61 63 6b 73 6c 61 73 68 28 6e 61 6d 65 29 3b 0a  ackslash(name);.
5740: 20 20 20 20 54 63 6c 53 65 74 4f 62 6a 4e 61 6d      TclSetObjNam
5750: 65 4f 66 45 78 65 63 75 74 61 62 6c 65 28 54 63  eOfExecutable(Tc
5760: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6e  l_NewStringObj(n
5770: 61 6d 65 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e  ame, TCL_INDEX_N
5780: 4f 4e 45 29 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0c  ONE), NULL);.}..
5790: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
57e0: 20 2a 20 54 63 6c 70 4d 61 74 63 68 49 6e 44 69   * TclpMatchInDi
57f0: 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a  rectory --. *. *
5800: 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73  .This routine is
5810: 20 75 73 65 64 20 62 79 20 74 68 65 20 67 6c 6f   used by the glo
5820: 62 62 69 6e 67 20 63 6f 64 65 20 74 6f 20 73 65  bbing code to se
5830: 61 72 63 68 20 61 20 64 69 72 65 63 74 6f 72 79  arch a directory
5840: 20 66 6f 72 0a 20 2a 09 61 6c 6c 20 66 69 6c 65   for. *.all file
5850: 73 20 77 68 69 63 68 20 6d 61 74 63 68 20 61 20  s which match a 
5860: 67 69 76 65 6e 20 70 61 74 74 65 72 6e 2e 0a 20  given pattern.. 
5870: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5880: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75  .The return valu
5890: 65 20 69 73 20 61 20 73 74 61 6e 64 61 72 64 20  e is a standard 
58a0: 54 63 6c 20 72 65 73 75 6c 74 20 69 6e 64 69 63  Tcl result indic
58b0: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 61 6e  ating whether an
58c0: 20 65 72 72 6f 72 0a 20 2a 09 6f 63 63 75 72 72   error. *.occurr
58d0: 65 64 20 69 6e 20 67 6c 6f 62 62 69 6e 67 2e 20  ed in globbing. 
58e0: 45 72 72 6f 72 73 20 61 72 65 20 6c 65 66 74 20  Errors are left 
58f0: 69 6e 20 69 6e 74 65 72 70 2c 20 67 6f 6f 64 20  in interp, good 
5900: 72 65 73 75 6c 74 73 20 61 72 65 0a 20 2a 09 6c  results are. *.l
5910: 61 70 70 65 6e 64 65 64 20 74 6f 20 72 65 73 75  appended to resu
5920: 6c 74 50 74 72 20 28 77 68 69 63 68 20 6d 75 73  ltPtr (which mus
5930: 74 20 62 65 20 61 20 76 61 6c 69 64 20 6f 62 6a  t be a valid obj
5940: 65 63 74 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ect).. *. * Side
5950: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
5960: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
59b0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4d 61 74 63  */..int.TclpMatc
59c0: 68 49 6e 44 69 72 65 63 74 6f 72 79 28 0a 20 20  hInDirectory(.  
59d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
59e0: 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70  terp,../* Interp
59f0: 72 65 74 65 72 20 74 6f 20 72 65 63 65 69 76 65  reter to receive
5a00: 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 20 20 20   errors. */.    
5a10: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50  Tcl_Obj *resultP
5a20: 74 72 2c 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a  tr,../* List obj
5a30: 65 63 74 20 74 6f 20 6c 61 70 70 65 6e 64 20 72  ect to lappend r
5a40: 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 54  esults. */.    T
5a50: 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c  cl_Obj *pathPtr,
5a60: 09 09 2f 2a 20 43 6f 6e 74 61 69 6e 73 20 70 61  ../* Contains pa
5a70: 74 68 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  th to directory 
5a80: 74 6f 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20  to search. */.  
5a90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
5aa0: 74 74 65 72 6e 2c 09 2f 2a 20 50 61 74 74 65 72  ttern,./* Patter
5ab0: 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  n to match again
5ac0: 73 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47  st. */.    Tcl_G
5ad0: 6c 6f 62 54 79 70 65 44 61 74 61 20 2a 74 79 70  lobTypeData *typ
5ae0: 65 73 29 09 2f 2a 20 4f 62 6a 65 63 74 20 63 6f  es)./* Object co
5af0: 6e 74 61 69 6e 69 6e 67 20 6c 69 73 74 20 6f 66  ntaining list of
5b00: 20 61 63 63 65 70 74 61 62 6c 65 20 74 79 70 65   acceptable type
5b10: 73 2e 0a 09 09 09 09 20 2a 20 4d 61 79 20 62 65  s...... * May be
5b20: 20 4e 55 4c 4c 2e 20 49 6e 20 70 61 72 74 69 63   NULL. In partic
5b30: 75 6c 61 72 20 74 68 65 20 64 69 72 65 63 74 6f  ular the directo
5b40: 72 79 0a 09 09 09 09 20 2a 20 66 6c 61 67 20 69  ry..... * flag i
5b50: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
5b60: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73 74  . */.{.    const
5b70: 20 57 43 48 41 52 20 2a 6e 61 74 69 76 65 3b 0a   WCHAR *native;.
5b80: 0a 20 20 20 20 69 66 20 28 74 79 70 65 73 20 21  .    if (types !
5b90: 3d 20 4e 55 4c 4c 20 26 26 20 74 79 70 65 73 2d  = NULL && types-
5ba0: 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 47 4c 4f  >type == TCL_GLO
5bb0: 42 5f 54 59 50 45 5f 4d 4f 55 4e 54 29 20 7b 0a  B_TYPE_MOUNT) {.
5bc0: 09 2f 2a 0a 09 20 2a 20 54 68 65 20 6e 61 74 69  ./*.. * The nati
5bd0: 76 65 20 66 69 6c 65 73 79 73 74 65 6d 20 6e 65  ve filesystem ne
5be0: 76 65 72 20 61 64 64 73 20 6d 6f 75 6e 74 73 2e  ver adds mounts.
5bf0: 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 54  .. */...return T
5c00: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  CL_OK;.    }..  
5c10: 20 20 69 66 20 28 70 61 74 74 65 72 6e 20 3d 3d    if (pattern ==
5c20: 20 4e 55 4c 4c 20 7c 7c 20 28 2a 70 61 74 74 65   NULL || (*patte
5c30: 72 6e 20 3d 3d 20 27 5c 30 27 29 29 20 7b 0a 09  rn == '\0')) {..
5c40: 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 20 3d 20  Tcl_Obj *norm = 
5c50: 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69  Tcl_FSGetNormali
5c60: 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61  zedPath(NULL, pa
5c70: 74 68 50 74 72 29 3b 0a 0a 09 69 66 20 28 6e 6f  thPtr);...if (no
5c80: 72 6d 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  rm != NULL) {.. 
5c90: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 61     /*..     * Ma
5ca0: 74 63 68 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  tch a single fil
5cb0: 65 20 64 69 72 65 63 74 6c 79 2e 0a 09 20 20 20  e directly...   
5cc0: 20 20 2a 2f 0a 0a 09 20 20 20 20 44 57 4f 52 44    */...    DWORD
5cd0: 20 61 74 74 72 3b 0a 09 20 20 20 20 57 49 4e 33   attr;..    WIN3
5ce0: 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
5cf0: 5f 44 41 54 41 20 64 61 74 61 3b 0a 09 20 20 20  _DATA data;..   
5d00: 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 20 3d 20   Tcl_Size len = 
5d10: 30 3b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68  0;..    const ch
5d20: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 47 65 74  ar *str = TclGet
5d30: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6e 6f  StringFromObj(no
5d40: 72 6d 2c 20 26 6c 65 6e 29 3b 0a 0a 09 20 20 20  rm, &len);...   
5d50: 20 6e 61 74 69 76 65 20 3d 20 28 63 6f 6e 73 74   native = (const
5d60: 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53 47   WCHAR *)Tcl_FSG
5d70: 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74  etNativePath(pat
5d80: 68 50 74 72 29 3b 0a 0a 09 20 20 20 20 69 66 20  hPtr);...    if 
5d90: 28 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  (GetFileAttribut
5da0: 65 73 45 78 57 28 6e 61 74 69 76 65 2c 0a 09 09  esExW(native,...
5db0: 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
5dc0: 6f 53 74 61 6e 64 61 72 64 2c 20 26 64 61 74 61  oStandard, &data
5dd0: 29 20 21 3d 20 54 52 55 45 29 20 7b 0a 09 09 72  ) != TRUE) {...r
5de0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20  eturn TCL_OK;.. 
5df0: 20 20 20 7d 0a 09 20 20 20 20 61 74 74 72 20 3d     }..    attr =
5e00: 20 64 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72   data.dwFileAttr
5e10: 69 62 75 74 65 73 3b 0a 0a 09 20 20 20 20 69 66  ibutes;...    if
5e20: 20 28 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70   (NativeMatchTyp
5e30: 65 28 57 69 6e 49 73 44 72 69 76 65 28 73 74 72  e(WinIsDrive(str
5e40: 2c 20 6c 65 6e 29 2c 20 61 74 74 72 2c 20 6e 61  , len), attr, na
5e50: 74 69 76 65 2c 20 74 79 70 65 73 29 29 20 7b 0a  tive, types)) {.
5e60: 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
5e70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5e80: 70 2c 20 72 65 73 75 6c 74 50 74 72 2c 20 70 61  p, resultPtr, pa
5e90: 74 68 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09  thPtr);..    }..
5ea0: 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  }..return TCL_OK
5eb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5ec0: 44 57 4f 52 44 20 61 74 74 72 3b 0a 09 48 41 4e  DWORD attr;..HAN
5ed0: 44 4c 45 20 68 61 6e 64 6c 65 3b 0a 09 57 49 4e  DLE handle;..WIN
5ee0: 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 64 61  32_FIND_DATAW da
5ef0: 74 61 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ta;..const char 
5f00: 2a 64 69 72 4e 61 6d 65 3b 09 2f 2a 20 55 54 46  *dirName;./* UTF
5f10: 2d 38 20 64 69 72 20 6e 61 6d 65 2c 20 6c 61 74  -8 dir name, lat
5f20: 65 72 20 77 69 74 68 20 70 61 74 74 65 72 6e 0a  er with pattern.
5f30: 09 09 09 09 20 2a 20 61 70 70 65 6e 64 65 64 2e  .... * appended.
5f40: 20 2a 2f 0a 09 54 63 6c 5f 53 69 7a 65 20 64 69   */..Tcl_Size di
5f50: 72 4c 65 6e 67 74 68 3b 0a 09 69 6e 74 20 6d 61  rLength;..int ma
5f60: 74 63 68 53 70 65 63 69 61 6c 44 6f 74 73 3b 0a  tchSpecialDots;.
5f70: 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b  .Tcl_DString ds;
5f80: 09 09 2f 2a 20 4e 61 74 69 76 65 20 65 6e 63 6f  ../* Native enco
5f90: 64 69 6e 67 20 6f 66 20 64 69 72 2c 20 61 6c 73  ding of dir, als
5fa0: 6f 20 75 73 65 64 0a 09 09 09 09 20 2a 20 74 65  o used..... * te
5fb0: 6d 70 6f 72 61 72 69 6c 79 20 66 6f 72 20 6f 74  mporarily for ot
5fc0: 68 65 72 20 74 68 69 6e 67 73 2e 20 2a 2f 0a 09  her things. */..
5fd0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 4f 72  Tcl_DString dsOr
5fe0: 69 67 3b 09 2f 2a 20 55 54 46 2d 38 20 65 6e 63  ig;./* UTF-8 enc
5ff0: 6f 64 69 6e 67 20 6f 66 20 64 69 72 2e 20 2a 2f  oding of dir. */
6000: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4e  ..Tcl_Obj *fileN
6010: 61 6d 65 50 74 72 3b 0a 09 63 68 61 72 20 6c 61  amePtr;..char la
6020: 73 74 43 68 61 72 3b 0a 0a 09 2f 2a 0a 09 20 2a  stChar;.../*.. *
6030: 20 47 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c 69   Get the normali
6040: 7a 65 64 20 70 61 74 68 20 72 65 70 72 65 73 65  zed path represe
6050: 6e 74 61 74 69 6f 6e 20 28 74 68 65 20 6d 61 69  ntation (the mai
6060: 6e 20 74 68 69 6e 67 20 69 73 20 77 65 20 64 6f  n thing is we do
6070: 6e 74 0a 09 20 2a 20 77 61 6e 74 20 61 6e 79 20  nt.. * want any 
6080: 27 7e 27 20 73 65 71 75 65 6e 63 65 73 29 2e 0a  '~' sequences)..
6090: 09 20 2a 2f 0a 0a 09 66 69 6c 65 4e 61 6d 65 50  . */...fileNameP
60a0: 74 72 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f  tr = Tcl_FSGetNo
60b0: 72 6d 61 6c 69 7a 65 64 50 61 74 68 28 69 6e 74  rmalizedPath(int
60c0: 65 72 70 2c 20 70 61 74 68 50 74 72 29 3b 0a 09  erp, pathPtr);..
60d0: 69 66 20 28 66 69 6c 65 4e 61 6d 65 50 74 72 20  if (fileNamePtr 
60e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
60f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6100: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 56 65  ;..}.../*.. * Ve
6110: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 70  rify that the sp
6120: 65 63 69 66 69 65 64 20 70 61 74 68 20 65 78 69  ecified path exi
6130: 73 74 73 20 61 6e 64 20 69 73 20 61 63 74 75 61  sts and is actua
6140: 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e  lly a directory.
6150: 0a 09 20 2a 2f 0a 0a 09 6e 61 74 69 76 65 20 3d  .. */...native =
6160: 20 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29   (const WCHAR *)
6170: 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 50  Tcl_FSGetNativeP
6180: 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a 09 69  ath(pathPtr);..i
6190: 66 20 28 6e 61 74 69 76 65 20 3d 3d 20 4e 55 4c  f (native == NUL
61a0: 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  L) {..    return
61b0: 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 61 74 74   TCL_OK;..}..att
61c0: 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  r = GetFileAttri
61d0: 62 75 74 65 73 57 28 6e 61 74 69 76 65 29 3b 0a  butesW(native);.
61e0: 0a 09 69 66 20 28 28 61 74 74 72 20 3d 3d 20 49  ..if ((attr == I
61f0: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
6200: 49 42 55 54 45 53 29 0a 09 09 7c 7c 20 28 28 61  IBUTES)...|| ((a
6210: 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
6220: 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20  BUTE_DIRECTORY) 
6230: 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 72 65  == 0)) {..    re
6240: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a  turn TCL_OK;..}.
6250: 0a 09 2f 2a 0a 09 20 2a 20 42 75 69 6c 64 20 75  ../*.. * Build u
6260: 70 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  p the directory 
6270: 6e 61 6d 65 20 66 6f 72 20 73 65 61 72 63 68 69  name for searchi
6280: 6e 67 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 20  ng, including a 
6290: 74 72 61 69 6c 69 6e 67 0a 09 20 2a 20 64 69 72  trailing.. * dir
62a0: 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
62b0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74  ... */...Tcl_DSt
62c0: 72 69 6e 67 49 6e 69 74 28 26 64 73 4f 72 69 67  ringInit(&dsOrig
62d0: 29 3b 0a 09 64 69 72 4e 61 6d 65 20 3d 20 54 63  );..dirName = Tc
62e0: 6c 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  lGetStringFromOb
62f0: 6a 28 66 69 6c 65 4e 61 6d 65 50 74 72 2c 20 26  j(fileNamePtr, &
6300: 64 69 72 4c 65 6e 67 74 68 29 3b 0a 09 54 63 6c  dirLength);..Tcl
6310: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
6320: 64 73 4f 72 69 67 2c 20 64 69 72 4e 61 6d 65 2c  dsOrig, dirName,
6330: 20 64 69 72 4c 65 6e 67 74 68 29 3b 0a 0a 09 6c   dirLength);...l
6340: 61 73 74 43 68 61 72 20 3d 20 64 69 72 4e 61 6d  astChar = dirNam
6350: 65 5b 64 69 72 4c 65 6e 67 74 68 20 2d 31 5d 3b  e[dirLength -1];
6360: 0a 09 69 66 20 28 28 6c 61 73 74 43 68 61 72 20  ..if ((lastChar 
6370: 21 3d 20 27 5c 5c 27 29 20 26 26 20 28 6c 61 73  != '\\') && (las
6380: 74 43 68 61 72 20 21 3d 20 27 2f 27 29 20 26 26  tChar != '/') &&
6390: 20 28 6c 61 73 74 43 68 61 72 20 21 3d 20 27 3a   (lastChar != ':
63a0: 27 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 44 53  ')) {..    TclDS
63b0: 74 72 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 72  tringAppendLiter
63c0: 61 6c 28 26 64 73 4f 72 69 67 2c 20 22 2f 22 29  al(&dsOrig, "/")
63d0: 3b 0a 09 20 20 20 20 64 69 72 4c 65 6e 67 74 68  ;..    dirLength
63e0: 2b 2b 3b 0a 09 7d 0a 09 64 69 72 4e 61 6d 65 20  ++;..}..dirName 
63f0: 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  = Tcl_DStringVal
6400: 75 65 28 26 64 73 4f 72 69 67 29 3b 0a 0a 09 2f  ue(&dsOrig);.../
6410: 2a 0a 09 20 2a 20 57 65 20 6e 65 65 64 20 74 6f  *.. * We need to
6420: 20 63 68 65 63 6b 20 61 6c 6c 20 66 69 6c 65 73   check all files
6430: 20 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   in the director
6440: 79 2c 20 73 6f 20 77 65 20 61 70 70 65 6e 64 20  y, so we append 
6450: 27 2a 2e 2a 27 20 74 6f 0a 09 20 2a 20 74 68 65  '*.*' to.. * the
6460: 20 70 61 74 68 2c 20 75 6e 6c 65 73 73 20 74 68   path, unless th
6470: 65 20 70 61 74 74 65 72 6e 20 77 65 27 76 65 20  e pattern we've 
6480: 62 65 65 6e 20 67 69 76 65 6e 20 69 73 20 72 61  been given is ra
6490: 74 68 65 72 20 73 69 6d 70 6c 65 2c 0a 09 20 2a  ther simple,.. *
64a0: 20 77 68 65 6e 20 77 65 20 63 61 6e 20 75 73 65   when we can use
64b0: 20 74 68 61 74 20 69 6e 73 74 65 61 64 2e 0a 09   that instead...
64c0: 20 2a 2f 0a 0a 09 69 66 20 28 73 74 72 70 62 72   */...if (strpbr
64d0: 6b 28 70 61 74 74 65 72 6e 2c 20 22 5b 5d 5c 5c  k(pattern, "[]\\
64e0: 22 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ") == NULL) {.. 
64f0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68     /*..     * Th
6500: 65 20 70 61 74 74 65 72 6e 20 69 73 20 61 20 73  e pattern is a s
6510: 69 6d 70 6c 65 20 6f 6e 65 20 63 6f 6e 74 61 69  imple one contai
6520: 6e 69 6e 67 20 6a 75 73 74 20 27 2a 27 20 61 6e  ning just '*' an
6530: 64 2f 6f 72 20 27 3f 27 2e 0a 09 20 20 20 20 20  d/or '?'...     
6540: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 77 65 20  * This means we 
6550: 63 61 6e 20 67 65 74 20 74 68 65 20 4f 53 20 74  can get the OS t
6560: 6f 20 68 65 6c 70 20 75 73 2c 20 62 79 20 70 61  o help us, by pa
6570: 73 73 69 6e 67 20 69 74 20 74 68 65 0a 09 20 20  ssing it the..  
6580: 20 20 20 2a 20 70 61 74 74 65 72 6e 2e 0a 09 20     * pattern... 
6590: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 64 69 72      */...    dir
65a0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 44 53 74 72 69  Name = Tcl_DStri
65b0: 6e 67 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67  ngAppend(&dsOrig
65c0: 2c 20 70 61 74 74 65 72 6e 2c 20 54 43 4c 5f 49  , pattern, TCL_I
65d0: 4e 44 45 58 5f 4e 4f 4e 45 29 3b 0a 09 7d 20 65  NDEX_NONE);..} e
65e0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 69 72 4e 61  lse {..    dirNa
65f0: 6d 65 20 3d 20 54 63 6c 44 53 74 72 69 6e 67 41  me = TclDStringA
6600: 70 70 65 6e 64 4c 69 74 65 72 61 6c 28 26 64 73  ppendLiteral(&ds
6610: 4f 72 69 67 2c 20 22 2a 2e 2a 22 29 3b 0a 09 7d  Orig, "*.*");..}
6620: 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  ...Tcl_DStringIn
6630: 69 74 28 26 64 73 29 3b 0a 09 6e 61 74 69 76 65  it(&ds);..native
6640: 20 3d 20 54 63 6c 5f 55 74 66 54 6f 57 43 68 61   = Tcl_UtfToWCha
6650: 72 44 53 74 72 69 6e 67 28 64 69 72 4e 61 6d 65  rDString(dirName
6660: 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45  , TCL_INDEX_NONE
6670: 2c 20 26 64 73 29 3b 0a 09 69 66 20 28 28 74 79  , &ds);..if ((ty
6680: 70 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20  pes == NULL) || 
6690: 28 74 79 70 65 73 2d 3e 74 79 70 65 20 21 3d 20  (types->type != 
66a0: 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 44 49  TCL_GLOB_TYPE_DI
66b0: 52 29 29 20 7b 0a 09 20 20 20 20 68 61 6e 64 6c  R)) {..    handl
66c0: 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c  e = FindFirstFil
66d0: 65 57 28 6e 61 74 69 76 65 2c 20 26 64 61 74 61  eW(native, &data
66e0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
66f0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20    /*..     * We 
6700: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6710: 63 69 65 6e 74 2c 20 66 6f 72 20 70 75 72 65 20  cient, for pure 
6720: 64 69 72 65 63 74 6f 72 79 20 72 65 71 75 65 73  directory reques
6730: 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ts...     */... 
6740: 20 20 20 68 61 6e 64 6c 65 20 3d 20 46 69 6e 64     handle = Find
6750: 46 69 72 73 74 46 69 6c 65 45 78 57 28 6e 61 74  FirstFileExW(nat
6760: 69 76 65 2c 0a 09 09 20 20 20 20 46 69 6e 64 45  ive,...    FindE
6770: 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 26  xInfoStandard, &
6780: 64 61 74 61 2c 0a 09 09 20 20 20 20 46 69 6e 64  data,...    Find
6790: 45 78 53 65 61 72 63 68 4c 69 6d 69 74 54 6f 44  ExSearchLimitToD
67a0: 69 72 65 63 74 6f 72 69 65 73 2c 20 4e 55 4c 4c  irectories, NULL
67b0: 2c 20 30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  , 0);..}...if (h
67c0: 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c 49 44  andle == INVALID
67d0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b  _HANDLE_VALUE) {
67e0: 0a 09 20 20 20 20 44 57 4f 52 44 20 65 72 72 20  ..    DWORD err 
67f0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
6800: 3b 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  ;...    Tcl_DStr
6810: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
6820: 20 20 20 69 66 20 28 65 72 72 20 3d 3d 20 45 52     if (err == ER
6830: 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
6840: 4e 44 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20  ND) {.../*... * 
6850: 57 65 20 75 73 65 64 20 6f 75 72 20 27 70 61 74  We used our 'pat
6860: 74 65 72 6e 27 20 61 62 6f 76 65 2c 20 61 6e 64  tern' above, and
6870: 20 6d 61 74 63 68 65 64 20 6e 6f 74 68 69 6e 67   matched nothing
6880: 2e 20 54 68 69 73 0a 09 09 20 2a 20 6d 65 61 6e  . This... * mean
6890: 73 20 77 65 20 6a 75 73 74 20 72 65 74 75 72 6e  s we just return
68a0: 20 54 43 4c 5f 4f 4b 2c 20 69 6e 64 69 63 61 74   TCL_OK, indicat
68b0: 69 6e 67 20 6e 6f 20 72 65 73 75 6c 74 73 20 66  ing no results f
68c0: 6f 75 6e 64 2e 0a 09 09 20 2a 2f 0a 0a 09 09 54  ound.... */....T
68d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
68e0: 64 73 4f 72 69 67 29 3b 0a 09 09 72 65 74 75 72  dsOrig);...retur
68f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d  n TCL_OK;..    }
6900: 0a 0a 09 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f  ...    Tcl_WinCo
6910: 6e 76 65 72 74 45 72 72 6f 72 28 65 72 72 29 3b  nvertError(err);
6920: 0a 09 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
6930: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63   != NULL) {...Tc
6940: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6950: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
6960: 69 6e 74 66 28 0a 09 09 09 22 63 6f 75 6c 64 6e  intf(...."couldn
6970: 27 74 20 72 65 61 64 20 64 69 72 65 63 74 6f 72  't read director
6980: 79 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a 09  y \"%s\": %s",..
6990: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ..Tcl_DStringVal
69a0: 75 65 28 26 64 73 4f 72 69 67 29 2c 20 54 63 6c  ue(&dsOrig), Tcl
69b0: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
69c0: 72 70 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20  rp)));..    }.. 
69d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
69e0: 65 65 28 26 64 73 4f 72 69 67 29 3b 0a 09 20 20  ee(&dsOrig);..  
69f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6a00: 4f 52 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72  OR;..}..Tcl_DStr
6a10: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09  ingFree(&ds);...
6a20: 2f 2a 0a 09 20 2a 20 57 65 20 6d 61 79 20 75 73  /*.. * We may us
6a30: 65 20 74 68 69 73 20 6c 61 74 65 72 2c 20 73 6f  e this later, so
6a40: 20 77 65 20 6d 75 73 74 20 72 65 73 74 6f 72 65   we must restore
6a50: 20 69 74 20 74 6f 20 69 74 73 20 6c 65 6e 67 74   it to its lengt
6a60: 68 0a 09 20 2a 20 69 6e 63 6c 75 64 69 6e 67 20  h.. * including 
6a70: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 64 65  the directory de
6a80: 6c 69 6d 69 74 65 72 2e 0a 09 20 2a 2f 0a 0a 09  limiter... */...
6a90: 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65  Tcl_DStringSetLe
6aa0: 6e 67 74 68 28 26 64 73 4f 72 69 67 2c 20 64 69  ngth(&dsOrig, di
6ab0: 72 4c 65 6e 67 74 68 29 3b 0a 0a 09 2f 2a 0a 09  rLength);.../*..
6ac0: 20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20   * Check to see 
6ad0: 69 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 73  if the pattern s
6ae0: 68 6f 75 6c 64 20 6d 61 74 63 68 20 74 68 65 20  hould match the 
6af0: 73 70 65 63 69 61 6c 20 2e 20 61 6e 64 0a 09 20  special . and.. 
6b00: 2a 20 2e 2e 20 6e 61 6d 65 73 2c 20 72 65 66 65  * .. names, refe
6b10: 72 72 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  rring to the cur
6b20: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 20  rent directory, 
6b30: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
6b40: 0a 09 20 2a 20 61 62 6f 76 65 2e 20 57 65 20 6e  .. * above. We n
6b50: 65 65 64 20 61 20 73 70 65 63 69 61 6c 20 63 68  eed a special ch
6b60: 65 63 6b 20 66 6f 72 20 74 68 69 73 20 62 65 63  eck for this bec
6b70: 61 75 73 65 20 70 61 74 68 73 20 62 65 67 69 6e  ause paths begin
6b80: 6e 69 6e 67 0a 09 20 2a 20 77 69 74 68 20 61 20  ning.. * with a 
6b90: 64 6f 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73  dot are not cons
6ba0: 69 64 65 72 65 64 20 68 69 64 64 65 6e 20 6f 6e  idered hidden on
6bb0: 20 57 69 6e 64 6f 77 73 2c 20 61 6e 64 20 73 6f   Windows, and so
6bc0: 20 6f 74 68 65 72 77 69 73 65 20 61 0a 09 20 2a   otherwise a.. *
6bd0: 20 72 65 6c 61 74 69 76 65 20 67 6c 6f 62 20 6c   relative glob l
6be0: 69 6b 65 20 27 67 6c 6f 62 20 2d 6a 6f 69 6e 20  ike 'glob -join 
6bf0: 2a 20 2a 27 20 77 69 6c 6c 20 61 63 74 75 61 6c  * *' will actual
6c00: 6c 79 20 72 65 74 75 72 6e 0a 09 20 2a 20 27 2e  ly return.. * '.
6c10: 2f 2e 20 2e 2e 2f 2e 2e 27 20 65 74 63 2e 0a 09  /. ../..' etc...
6c20: 20 2a 2f 0a 0a 09 69 66 20 28 28 70 61 74 74 65   */...if ((patte
6c30: 72 6e 5b 30 5d 20 3d 3d 20 27 2e 27 29 0a 09 09  rn[0] == '.')...
6c40: 7c 7c 20 28 28 70 61 74 74 65 72 6e 5b 30 5d 20  || ((pattern[0] 
6c50: 3d 3d 20 27 5c 5c 27 29 20 26 26 20 28 70 61 74  == '\\') && (pat
6c60: 74 65 72 6e 5b 31 5d 20 3d 3d 20 27 2e 27 29 29  tern[1] == '.'))
6c70: 29 20 7b 0a 09 20 20 20 20 6d 61 74 63 68 53 70  ) {..    matchSp
6c80: 65 63 69 61 6c 44 6f 74 73 20 3d 20 31 3b 0a 09  ecialDots = 1;..
6c90: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 61  } else {..    ma
6ca0: 74 63 68 53 70 65 63 69 61 6c 44 6f 74 73 20 3d  tchSpecialDots =
6cb0: 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20   0;..}.../*.. * 
6cc0: 4e 6f 77 20 69 74 65 72 61 74 65 20 6f 76 65 72  Now iterate over
6cd0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 69 6c 65   all of the file
6ce0: 73 20 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f  s in the directo
6cf0: 72 79 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ry, starting wit
6d00: 68 0a 09 20 2a 20 74 68 65 20 66 69 72 73 74 20  h.. * the first 
6d10: 6f 6e 65 20 77 65 20 66 6f 75 6e 64 2e 0a 09 20  one we found... 
6d20: 2a 2f 0a 0a 09 64 6f 20 7b 0a 09 20 20 20 20 63  */...do {..    c
6d30: 6f 6e 73 74 20 63 68 61 72 20 2a 75 74 66 6e 61  onst char *utfna
6d40: 6d 65 3b 0a 09 20 20 20 20 69 6e 74 20 63 68 65  me;..    int che
6d50: 63 6b 44 72 69 76 65 20 3d 20 30 2c 20 69 73 44  ckDrive = 0, isD
6d60: 72 69 76 65 3b 0a 0a 09 20 20 20 20 6e 61 74 69  rive;...    nati
6d70: 76 65 20 3d 20 64 61 74 61 2e 63 46 69 6c 65 4e  ve = data.cFileN
6d80: 61 6d 65 3b 0a 09 20 20 20 20 61 74 74 72 20 3d  ame;..    attr =
6d90: 20 64 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72   data.dwFileAttr
6da0: 69 62 75 74 65 73 3b 0a 09 20 20 20 20 54 63 6c  ibutes;..    Tcl
6db0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
6dc0: 29 3b 0a 09 20 20 20 20 75 74 66 6e 61 6d 65 20  );..    utfname 
6dd0: 3d 20 54 63 6c 5f 57 43 68 61 72 54 6f 55 74 66  = Tcl_WCharToUtf
6de0: 44 53 74 72 69 6e 67 28 6e 61 74 69 76 65 2c 20  DString(native, 
6df0: 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c 20  TCL_INDEX_NONE, 
6e00: 26 64 73 29 3b 0a 0a 09 20 20 20 20 69 66 20 28  &ds);...    if (
6e10: 21 6d 61 74 63 68 53 70 65 63 69 61 6c 44 6f 74  !matchSpecialDot
6e20: 73 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49  s) {.../*... * I
6e30: 66 20 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  f it is exactly 
6e40: 27 2e 27 20 6f 72 20 27 2e 2e 27 20 74 68 65 6e  '.' or '..' then
6e50: 20 77 65 20 69 67 6e 6f 72 65 20 69 74 2e 0a 09   we ignore it...
6e60: 09 20 2a 2f 0a 0a 09 09 69 66 20 28 28 75 74 66  . */....if ((utf
6e70: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 2e 27 29 20  name[0] == '.') 
6e80: 26 26 20 28 75 74 66 6e 61 6d 65 5b 31 5d 20 3d  && (utfname[1] =
6e90: 3d 20 27 5c 30 27 0a 09 09 09 7c 7c 20 28 75 74  = '\0'....|| (ut
6ea0: 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27 2e 27 20  fname[1] == '.' 
6eb0: 26 26 20 75 74 66 6e 61 6d 65 5b 32 5d 20 3d 3d  && utfname[2] ==
6ec0: 20 27 5c 30 27 29 29 29 20 7b 0a 09 09 20 20 20   '\0'))) {...   
6ed0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
6ee0: 28 26 64 73 29 3b 0a 09 09 20 20 20 20 63 6f 6e  (&ds);...    con
6ef0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20  tinue;...}..    
6f00: 7d 20 65 6c 73 65 20 69 66 20 28 75 74 66 6e 61  } else if (utfna
6f10: 6d 65 5b 30 5d 20 3d 3d 20 27 2e 27 20 26 26 20  me[0] == '.' && 
6f20: 75 74 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27 2e  utfname[1] == '.
6f30: 27 0a 09 09 20 20 20 20 26 26 20 75 74 66 6e 61  '...    && utfna
6f40: 6d 65 5b 32 5d 20 3d 3d 20 27 5c 30 27 29 20 7b  me[2] == '\0') {
6f50: 0a 09 09 2f 2a 0a 09 09 20 2a 20 48 61 76 65 20  .../*... * Have 
6f60: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  to check if this
6f70: 20 69 73 20 61 20 64 72 69 76 65 20 62 65 6c 6f   is a drive belo
6f80: 77 2c 20 73 6f 20 77 65 20 63 61 6e 20 63 6f 72  w, so we can cor
6f90: 72 65 63 74 6c 79 0a 09 09 20 2a 20 6d 61 74 63  rectly... * matc
6fa0: 68 20 27 68 69 64 64 65 6e 27 20 61 6e 64 20 6e  h 'hidden' and n
6fb0: 6f 74 20 68 69 64 64 65 6e 20 66 69 6c 65 73 2e  ot hidden files.
6fc0: 0a 09 09 20 2a 2f 0a 0a 09 09 63 68 65 63 6b 44  ... */....checkD
6fd0: 72 69 76 65 20 3d 20 31 3b 0a 09 20 20 20 20 7d  rive = 1;..    }
6fe0: 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  ...    /*..     
6ff0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
7000: 66 20 74 68 65 20 66 69 6c 65 20 6d 61 74 63 68  f the file match
7010: 65 73 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20  es the pattern. 
7020: 4e 6f 74 65 20 74 68 61 74 20 77 65 20 61 72 65  Note that we are
7030: 0a 09 20 20 20 20 20 2a 20 69 67 6e 6f 72 69 6e  ..     * ignorin
7040: 67 20 74 68 65 20 63 61 73 65 20 73 65 6e 73 69  g the case sensi
7050: 74 69 76 69 74 79 20 66 6c 61 67 20 62 65 63 61  tivity flag beca
7060: 75 73 65 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  use Windows does
7070: 6e 27 74 0a 09 20 20 20 20 20 2a 20 68 6f 6e 6f  n't..     * hono
7080: 72 20 63 61 73 65 20 65 76 65 6e 20 69 66 20 74  r case even if t
7090: 68 65 20 76 6f 6c 75 6d 65 20 69 73 20 63 61 73  he volume is cas
70a0: 65 20 73 65 6e 73 69 74 69 76 65 2e 20 49 66 20  e sensitive. If 
70b0: 74 68 65 20 76 6f 6c 75 6d 65 0a 09 20 20 20 20  the volume..    
70c0: 20 2a 20 61 6c 73 6f 20 64 6f 65 73 6e 27 74 20   * also doesn't 
70d0: 70 72 65 73 65 72 76 65 20 63 61 73 65 2c 20 74  preserve case, t
70e0: 68 65 6e 20 77 65 20 70 72 65 76 69 6f 75 73 6c  hen we previousl
70f0: 79 20 72 65 74 75 72 6e 65 64 20 74 68 65 0a 09  y returned the..
7100: 20 20 20 20 20 2a 20 6c 6f 77 65 72 20 63 61 73       * lower cas
7110: 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61  e form of the na
7120: 6d 65 2e 20 54 68 69 73 20 64 69 64 6e 27 74 20  me. This didn't 
7130: 73 65 65 6d 20 71 75 69 74 65 20 72 69 67 68 74  seem quite right
7140: 20 73 69 6e 63 65 0a 09 20 20 20 20 20 2a 20 74   since..     * t
7150: 68 65 72 65 20 61 72 65 20 6e 6f 6e 2d 63 61 73  here are non-cas
7160: 65 2d 70 72 65 73 65 72 76 69 6e 67 20 76 6f 6c  e-preserving vol
7170: 75 6d 65 73 20 74 68 61 74 20 61 63 74 75 61 6c  umes that actual
7180: 6c 79 20 72 65 74 75 72 6e 0a 09 20 20 20 20 20  ly return..     
7190: 2a 20 6d 69 78 65 64 20 63 61 73 65 2e 20 53 6f  * mixed case. So
71a0: 20 6e 6f 77 20 77 65 20 61 72 65 20 72 65 74 75   now we are retu
71b0: 72 6e 69 6e 67 20 65 78 61 63 74 6c 79 20 77 68  rning exactly wh
71c0: 61 74 20 77 65 20 67 65 74 20 66 72 6f 6d 0a 09  at we get from..
71d0: 20 20 20 20 20 2a 20 74 68 65 20 73 79 73 74 65       * the syste
71e0: 6d 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  m...     */...  
71f0: 20 20 69 66 20 28 54 63 6c 5f 53 74 72 69 6e 67    if (Tcl_String
7200: 43 61 73 65 4d 61 74 63 68 28 75 74 66 6e 61 6d  CaseMatch(utfnam
7210: 65 2c 20 70 61 74 74 65 72 6e 2c 20 31 29 29 20  e, pattern, 1)) 
7220: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 74  {.../*... * If t
7230: 68 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73 2c  he file matches,
7240: 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
7250: 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 6d   process the rem
7260: 61 69 6e 64 65 72 0a 09 09 20 2a 20 6f 66 20 74  ainder... * of t
7270: 68 65 20 70 61 74 68 2e 0a 09 09 20 2a 2f 0a 0a  he path.... */..
7280: 09 09 69 66 20 28 63 68 65 63 6b 44 72 69 76 65  ..if (checkDrive
7290: 29 20 7b 0a 09 09 20 20 20 20 63 6f 6e 73 74 20  ) {...    const 
72a0: 63 68 61 72 20 2a 66 75 6c 6c 6e 61 6d 65 20 3d  char *fullname =
72b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
72c0: 6e 64 28 26 64 73 4f 72 69 67 2c 20 75 74 66 6e  nd(&dsOrig, utfn
72d0: 61 6d 65 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f  ame,....    Tcl_
72e0: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
72f0: 73 29 29 3b 0a 0a 09 09 20 20 20 20 69 73 44 72  s));....    isDr
7300: 69 76 65 20 3d 20 57 69 6e 49 73 44 72 69 76 65  ive = WinIsDrive
7310: 28 66 75 6c 6c 6e 61 6d 65 2c 20 54 63 6c 5f 44  (fullname, Tcl_D
7320: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73  StringLength(&ds
7330: 4f 72 69 67 29 29 3b 0a 09 09 20 20 20 20 54 63  Orig));...    Tc
7340: 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67  l_DStringSetLeng
7350: 74 68 28 26 64 73 4f 72 69 67 2c 20 64 69 72 4c  th(&dsOrig, dirL
7360: 65 6e 67 74 68 29 3b 0a 09 09 7d 20 65 6c 73 65  ength);...} else
7370: 20 7b 0a 09 09 20 20 20 20 69 73 44 72 69 76 65   {...    isDrive
7380: 20 3d 20 30 3b 0a 09 09 7d 0a 09 09 69 66 20 28   = 0;...}...if (
7390: 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70 65 28  NativeMatchType(
73a0: 69 73 44 72 69 76 65 2c 20 61 74 74 72 2c 20 6e  isDrive, attr, n
73b0: 61 74 69 76 65 2c 20 74 79 70 65 73 29 29 20 7b  ative, types)) {
73c0: 0a 09 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ...    Tcl_ListO
73d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
73e0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 50 74  interp, resultPt
73f0: 72 2c 0a 09 09 09 20 20 20 20 54 63 6c 4e 65 77  r,....    TclNew
7400: 46 53 50 61 74 68 4f 62 6a 28 70 61 74 68 50 74  FSPathObj(pathPt
7410: 72 2c 20 75 74 66 6e 61 6d 65 2c 0a 09 09 09 09  r, utfname,.....
7420: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c      Tcl_DStringL
7430: 65 6e 67 74 68 28 26 64 73 29 29 29 3b 0a 09 09  ength(&ds)));...
7440: 7d 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f  }..    }...    /
7450: 2a 0a 09 20 20 20 20 20 2a 20 46 72 65 65 20 64  *..     * Free d
7460: 73 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72 65  s here to ensure
7470: 20 74 68 61 74 20 6e 61 74 69 76 65 20 69 73 20   that native is 
7480: 76 61 6c 69 64 20 61 62 6f 76 65 2e 0a 09 20 20  valid above...  
7490: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f     */...    Tcl_
74a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
74b0: 3b 0a 09 7d 20 77 68 69 6c 65 20 28 46 69 6e 64  ;..} while (Find
74c0: 4e 65 78 74 46 69 6c 65 57 28 68 61 6e 64 6c 65  NextFileW(handle
74d0: 2c 20 26 64 61 74 61 29 20 3d 3d 20 54 52 55 45  , &data) == TRUE
74e0: 29 3b 0a 0a 09 46 69 6e 64 43 6c 6f 73 65 28 68  );...FindClose(h
74f0: 61 6e 64 6c 65 29 3b 0a 09 54 63 6c 5f 44 53 74  andle);..Tcl_DSt
7500: 72 69 6e 67 46 72 65 65 28 26 64 73 4f 72 69 67  ringFree(&dsOrig
7510: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  );..return TCL_O
7520: 4b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  K;.    }.}.../*.
7530: 20 2a 20 44 6f 65 73 20 74 68 65 20 67 69 76 65   * Does the give
7540: 6e 20 70 61 74 68 20 72 65 70 72 65 73 65 6e 74  n path represent
7550: 20 61 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 3f 20   a root volume? 
7560: 57 65 20 6e 65 65 64 20 74 68 69 73 20 73 70 65  We need this spe
7570: 63 69 61 6c 20 63 61 73 65 0a 20 2a 20 62 65 63  cial case. * bec
7580: 61 75 73 65 20 66 6f 72 20 4e 54 46 53 20 72 6f  ause for NTFS ro
7590: 6f 74 20 76 6f 6c 75 6d 65 73 2c 20 74 68 65 20  ot volumes, the 
75a0: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  getFileAttribute
75b0: 73 50 72 6f 63 20 72 65 74 75 72 6e 73 20 61 20  sProc returns a 
75c0: 27 68 69 64 64 65 6e 27 0a 20 2a 20 61 74 74 72  'hidden'. * attr
75d0: 69 62 75 74 65 20 77 68 65 6e 20 69 74 20 73 68  ibute when it sh
75e0: 6f 75 6c 64 20 6e 6f 74 2e 0a 20 2a 2f 0a 0a 73  ould not.. */..s
75f0: 74 61 74 69 63 20 69 6e 74 0a 57 69 6e 49 73 44  tatic int.WinIsD
7600: 72 69 76 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  rive(.    const 
7610: 63 68 61 72 20 2a 6e 61 6d 65 2c 09 09 2f 2a 20  char *name,../* 
7620: 4e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  Name (UTF-8) */.
7630: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 29 09      size_t len).
7640: 09 09 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6e  ../* Length of n
7650: 61 6d 65 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74  ame */.{.    int
7660: 20 72 65 6d 6f 76 65 20 3d 20 30 3b 0a 0a 20 20   remove = 0;..  
7670: 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 20 34    while (len > 4
7680: 29 20 7b 0a 09 69 66 20 28 28 6e 61 6d 65 5b 6c  ) {..if ((name[l
7690: 65 6e 2d 31 5d 20 21 3d 20 27 2e 27 20 7c 7c 20  en-1] != '.' || 
76a0: 6e 61 6d 65 5b 6c 65 6e 2d 32 5d 20 21 3d 20 27  name[len-2] != '
76b0: 2e 27 29 0a 09 09 7c 7c 20 28 6e 61 6d 65 5b 6c  .')...|| (name[l
76c0: 65 6e 2d 33 5d 20 21 3d 20 27 2f 27 20 26 26 20  en-3] != '/' && 
76d0: 6e 61 6d 65 5b 6c 65 6e 2d 33 5d 20 21 3d 20 27  name[len-3] != '
76e0: 5c 5c 27 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a  \\')) {..    /*.
76f0: 09 20 20 20 20 20 2a 20 57 65 20 64 6f 6e 27 74  .     * We don't
7700: 20 68 61 76 65 20 27 2f 2e 2e 27 20 61 74 20 74   have '/..' at t
7710: 68 65 20 65 6e 64 2e 0a 09 20 20 20 20 20 2a 2f  he end...     */
7720: 0a 0a 09 20 20 20 20 69 66 20 28 72 65 6d 6f 76  ...    if (remov
7730: 65 20 3d 3d 20 30 29 20 7b 0a 09 09 62 72 65 61  e == 0) {...brea
7740: 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72  k;..    }..    r
7750: 65 6d 6f 76 65 2d 2d 3b 0a 09 20 20 20 20 77 68  emove--;..    wh
7760: 69 6c 65 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a  ile (len > 0) {.
7770: 09 09 6c 65 6e 2d 2d 3b 0a 09 09 69 66 20 28 6e  ..len--;...if (n
7780: 61 6d 65 5b 6c 65 6e 5d 20 3d 3d 20 27 2f 27 20  ame[len] == '/' 
7790: 7c 7c 20 6e 61 6d 65 5b 6c 65 6e 5d 20 3d 3d 20  || name[len] == 
77a0: 27 5c 5c 27 29 20 7b 0a 09 09 20 20 20 20 62 72  '\\') {...    br
77b0: 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  eak;...}..    }.
77c0: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 34  .    if (len < 4
77d0: 29 20 7b 0a 09 09 6c 65 6e 2b 2b 3b 0a 09 09 62  ) {...len++;...b
77e0: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 20  reak;..    }..} 
77f0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  else {..    /*..
7800: 20 20 20 20 20 2a 20 57 65 20 64 6f 20 68 61 76       * We do hav
7810: 65 20 27 2f 2e 2e 27 0a 09 20 20 20 20 20 2a 2f  e '/..'..     */
7820: 0a 0a 09 20 20 20 20 6c 65 6e 20 2d 3d 20 33 3b  ...    len -= 3;
7830: 0a 09 20 20 20 20 72 65 6d 6f 76 65 2b 2b 3b 0a  ..    remove++;.
7840: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
7850: 20 28 6c 65 6e 20 3c 20 34 29 20 7b 0a 09 69 66   (len < 4) {..if
7860: 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 20   (len == 0) {.. 
7870: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f     /*..     * No
7880: 74 20 73 75 72 65 20 69 66 20 74 68 69 73 20 69  t sure if this i
7890: 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20  s possible, but 
78a0: 77 65 20 70 61 73 73 20 69 74 20 6f 6e 20 61 6e  we pass it on an
78b0: 79 77 61 79 2e 0a 09 20 20 20 20 20 2a 2f 0a 09  yway...     */..
78c0: 7d 20 65 6c 73 65 20 69 66 20 28 6c 65 6e 20 3d  } else if (len =
78d0: 3d 20 31 20 26 26 20 28 6e 61 6d 65 5b 30 5d 20  = 1 && (name[0] 
78e0: 3d 3d 20 27 2f 27 20 7c 7c 20 6e 61 6d 65 5b 30  == '/' || name[0
78f0: 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20  ] == '\\')) {.. 
7900: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 50 61     /*..     * Pa
7910: 74 68 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  th is pointing t
7920: 6f 20 74 68 65 20 72 6f 6f 74 20 76 6f 6c 75 6d  o the root volum
7930: 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  e...     */...  
7940: 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 20 65    return 1;..} e
7950: 6c 73 65 20 69 66 20 28 28 6e 61 6d 65 5b 31 5d  lse if ((name[1]
7960: 20 3d 3d 20 27 3a 27 29 0a 09 09 20 20 20 26 26   == ':')...   &&
7970: 20 28 6c 65 6e 20 3d 3d 20 32 20 7c 7c 20 28 6e   (len == 2 || (n
7980: 61 6d 65 5b 32 5d 20 3d 3d 20 27 2f 27 20 7c 7c  ame[2] == '/' ||
7990: 20 6e 61 6d 65 5b 32 5d 20 3d 3d 20 27 5c 5c 27   name[2] == '\\'
79a0: 29 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  ))) {..    /*.. 
79b0: 20 20 20 20 2a 20 50 61 74 68 20 69 73 20 6f 66      * Path is of
79c0: 20 74 68 65 20 66 6f 72 6d 20 27 78 3a 27 20 6f   the form 'x:' o
79d0: 72 20 27 78 3a 2f 27 20 6f 72 20 27 78 3a 5c 27  r 'x:/' or 'x:\'
79e0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
79f0: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
7a00: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 30   }..    return 0
7a10: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 44 6f 65 73  ;.}.../*. * Does
7a20: 20 74 68 65 20 67 69 76 65 6e 20 70 61 74 68 20   the given path 
7a30: 72 65 70 72 65 73 65 6e 74 20 61 20 72 65 73 65  represent a rese
7a40: 72 76 65 64 20 77 69 6e 64 6f 77 20 70 61 74 68  rved window path
7a50: 20 6e 61 6d 65 3f 20 49 66 20 6e 6f 74 20 72 65   name? If not re
7a60: 74 75 72 6e 20 30 2c 0a 20 2a 20 69 66 20 74 72  turn 0,. * if tr
7a70: 75 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ue, return the n
7a80: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
7a90: 65 72 73 20 6f 66 20 74 68 65 20 70 61 74 68 20  ers of the path 
7aa0: 74 68 61 74 20 77 65 20 61 63 74 75 61 6c 6c 79  that we actually
7ab0: 20 77 61 6e 74 0a 20 2a 20 28 6e 6f 74 20 61 6e   want. * (not an
7ac0: 79 20 74 72 61 69 6c 69 6e 67 20 3a 29 2e 0a 20  y trailing :).. 
7ad0: 2a 2f 0a 0a 73 74 61 74 69 63 20 73 69 7a 65 5f  */..static size_
7ae0: 74 0a 57 69 6e 49 73 52 65 73 65 72 76 65 64 28  t.WinIsReserved(
7af0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7b00: 2a 70 61 74 68 29 09 09 2f 2a 20 50 61 74 68 20  *path)../* Path 
7b10: 69 6e 20 55 54 46 2d 38 20 2a 2f 0a 7b 0a 20 20  in UTF-8 */.{.  
7b20: 20 20 69 66 20 28 28 70 61 74 68 5b 30 5d 20 3d    if ((path[0] =
7b30: 3d 20 27 63 27 20 7c 7c 20 70 61 74 68 5b 30 5d  = 'c' || path[0]
7b40: 20 3d 3d 20 27 43 27 29 0a 09 20 20 20 20 26 26   == 'C')..    &&
7b50: 20 28 70 61 74 68 5b 31 5d 20 3d 3d 20 27 6f 27   (path[1] == 'o'
7b60: 20 7c 7c 20 70 61 74 68 5b 31 5d 20 3d 3d 20 27   || path[1] == '
7b70: 4f 27 29 29 20 7b 0a 09 69 66 20 28 28 70 61 74  O')) {..if ((pat
7b80: 68 5b 32 5d 20 3d 3d 20 27 6d 27 20 7c 7c 20 70  h[2] == 'm' || p
7b90: 61 74 68 5b 32 5d 20 3d 3d 20 27 4d 27 29 0a 09  ath[2] == 'M')..
7ba0: 09 26 26 20 70 61 74 68 5b 33 5d 20 3e 3d 20 27  .&& path[3] >= '
7bb0: 31 27 20 26 26 20 70 61 74 68 5b 33 5d 20 3c 3d  1' && path[3] <=
7bc0: 20 27 39 27 29 20 7b 0a 09 20 20 20 20 2f 2a 0a   '9') {..    /*.
7bd0: 09 20 20 20 20 20 2a 20 4d 61 79 20 68 61 76 65  .     * May have
7be0: 20 6d 61 74 63 68 20 66 6f 72 20 27 63 6f 6d 5b   match for 'com[
7bf0: 31 2d 39 5d 3a 3f 27 2c 20 77 68 69 63 68 20 69  1-9]:?', which i
7c00: 73 20 61 20 73 65 72 69 61 6c 20 70 6f 72 74 2e  s a serial port.
7c10: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
7c20: 69 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d 20 27  if (path[4] == '
7c30: 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  \0') {...return 
7c40: 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  4;..    } else i
7c50: 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d 20 27 3a  f (path[4] == ':
7c60: 27 20 26 26 20 70 61 74 68 5b 35 5d 20 3d 3d 20  ' && path[5] == 
7c70: 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e  '\0') {...return
7c80: 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c   4;..    }..} el
7c90: 73 65 20 69 66 20 28 28 70 61 74 68 5b 32 5d 20  se if ((path[2] 
7ca0: 3d 3d 20 27 6e 27 20 7c 7c 20 70 61 74 68 5b 32  == 'n' || path[2
7cb0: 5d 20 3d 3d 20 27 4e 27 29 20 26 26 20 70 61 74  ] == 'N') && pat
7cc0: 68 5b 33 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  h[3] == '\0') {.
7cd0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
7ce0: 48 61 76 65 20 6d 61 74 63 68 20 66 6f 72 20 27  Have match for '
7cf0: 63 6f 6e 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  con'..     */...
7d00: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 09 7d      return 3;..}
7d10: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
7d20: 28 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 6c 27  ((path[0] == 'l'
7d30: 20 7c 7c 20 70 61 74 68 5b 30 5d 20 3d 3d 20 27   || path[0] == '
7d40: 4c 27 29 0a 09 20 20 20 20 26 26 20 28 70 61 74  L')..    && (pat
7d50: 68 5b 31 5d 20 3d 3d 20 27 70 27 20 7c 7c 20 70  h[1] == 'p' || p
7d60: 61 74 68 5b 31 5d 20 3d 3d 20 27 50 27 29 0a 09  ath[1] == 'P')..
7d70: 20 20 20 20 26 26 20 28 70 61 74 68 5b 32 5d 20      && (path[2] 
7d80: 3d 3d 20 27 74 27 20 7c 7c 20 70 61 74 68 5b 32  == 't' || path[2
7d90: 5d 20 3d 3d 20 27 54 27 29 29 20 7b 0a 09 69 66  ] == 'T')) {..if
7da0: 20 28 70 61 74 68 5b 33 5d 20 3e 3d 20 27 31 27   (path[3] >= '1'
7db0: 20 26 26 20 70 61 74 68 5b 33 5d 20 3c 3d 20 27   && path[3] <= '
7dc0: 39 27 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  9') {..    /*.. 
7dd0: 20 20 20 20 2a 20 4d 61 79 20 68 61 76 65 20 6d      * May have m
7de0: 61 74 63 68 20 66 6f 72 20 27 6c 70 74 5b 31 2d  atch for 'lpt[1-
7df0: 39 5d 3a 3f 27 0a 09 20 20 20 20 20 2a 2f 0a 0a  9]:?'..     */..
7e00: 09 20 20 20 20 69 66 20 28 70 61 74 68 5b 34 5d  .    if (path[4]
7e10: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65   == '\0') {...re
7e20: 74 75 72 6e 20 34 3b 0a 09 20 20 20 20 7d 20 65  turn 4;..    } e
7e30: 6c 73 65 20 69 66 20 28 70 61 74 68 5b 34 5d 20  lse if (path[4] 
7e40: 3d 3d 20 27 3a 27 20 26 26 20 70 61 74 68 5b 35  == ':' && path[5
7e50: 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72  ] == '\0') {...r
7e60: 65 74 75 72 6e 20 34 3b 0a 09 20 20 20 20 7d 0a  eturn 4;..    }.
7e70: 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  .}..    } else i
7e80: 66 20 28 21 73 74 72 63 61 73 65 63 6d 70 28 70  f (!strcasecmp(p
7e90: 61 74 68 2c 20 22 70 72 6e 22 29 20 7c 7c 20 21  ath, "prn") || !
7ea0: 73 74 72 63 61 73 65 63 6d 70 28 70 61 74 68 2c  strcasecmp(path,
7eb0: 20 22 6e 75 6c 22 29 0a 09 20 20 20 20 7c 7c 20   "nul")..    || 
7ec0: 21 73 74 72 63 61 73 65 63 6d 70 28 70 61 74 68  !strcasecmp(path
7ed0: 2c 20 22 61 75 78 22 29 29 20 7b 0a 09 2f 2a 0a  , "aux")) {../*.
7ee0: 09 20 2a 20 48 61 76 65 20 6d 61 74 63 68 20 66  . * Have match f
7ef0: 6f 72 20 27 70 72 6e 27 2c 20 27 6e 75 6c 27 20  or 'prn', 'nul' 
7f00: 6f 72 20 27 61 75 78 27 2e 0a 09 20 2a 2f 0a 0a  or 'aux'... */..
7f10: 09 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d  .return 3;.    }
7f20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
7f30: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
7f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7f80: 2a 0a 20 2a 20 4e 61 74 69 76 65 4d 61 74 63 68  *. * NativeMatch
7f90: 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Type --. *. *.Th
7fa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  is function need
7fb0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
7fc0: 20 66 6f 72 20 61 20 70 61 74 68 20 77 68 69 63   for a path whic
7fd0: 68 20 69 73 20 61 20 72 6f 6f 74 20 76 6f 6c 75  h is a root volu
7fe0: 6d 65 2c 0a 20 2a 09 62 65 63 61 75 73 65 20 66  me,. *.because f
7ff0: 6f 72 20 4e 54 46 53 20 72 6f 6f 74 20 76 6f 6c  or NTFS root vol
8000: 75 6d 65 73 2c 20 74 68 65 20 67 65 74 46 69 6c  umes, the getFil
8010: 65 41 74 74 72 69 62 75 74 65 73 50 72 6f 63 20  eAttributesProc 
8020: 72 65 74 75 72 6e 73 20 61 0a 20 2a 09 27 68 69  returns a. *.'hi
8030: 64 64 65 6e 27 20 61 74 74 72 69 62 75 74 65 20  dden' attribute 
8040: 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e  when it should n
8050: 6f 74 2e 0a 20 2a 0a 20 2a 09 57 65 20 6e 65 76  ot.. *. *.We nev
8060: 65 72 20 6d 61 6b 65 20 61 6e 79 20 63 61 6c 6c  er make any call
8070: 73 20 74 6f 20 61 20 27 67 65 74 20 61 74 74 72  s to a 'get attr
8080: 69 62 75 74 65 73 27 20 72 6f 75 74 69 6e 65 20  ibutes' routine 
8090: 68 65 72 65 2c 20 73 69 6e 63 65 20 77 65 0a 20  here, since we. 
80a0: 2a 09 68 61 76 65 20 61 72 72 61 6e 67 65 64 20  *.have arranged 
80b0: 74 68 69 6e 67 73 20 73 6f 20 74 68 61 74 20 6f  things so that o
80c0: 75 72 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  ur caller alread
80d0: 79 20 6b 6e 6f 77 73 20 73 75 63 68 0a 20 2a 09  y knows such. *.
80e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a  information.. *.
80f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30   * Results:. *.0
8100: 20 3d 20 66 69 6c 65 20 64 6f 65 73 6e 27 74 20   = file doesn't 
8110: 6d 61 74 63 68 0a 20 2a 09 31 20 3d 20 66 69 6c  match. *.1 = fil
8120: 65 20 6d 61 74 63 68 65 73 0a 20 2a 0a 20 2a 2d  e matches. *. *-
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8170: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
8180: 63 20 69 6e 74 0a 4e 61 74 69 76 65 4d 61 74 63  c int.NativeMatc
8190: 68 54 79 70 65 28 0a 20 20 20 20 69 6e 74 20 69  hType(.    int i
81a0: 73 44 72 69 76 65 2c 09 09 2f 2a 20 49 73 20 74  sDrive,../* Is t
81b0: 68 69 73 20 61 20 64 72 69 76 65 2e 20 2a 2f 0a  his a drive. */.
81c0: 20 20 20 20 44 57 4f 52 44 20 61 74 74 72 2c 09      DWORD attr,.
81d0: 09 09 2f 2a 20 57 65 20 61 6c 72 65 61 64 79 20  ../* We already 
81e0: 6b 6e 6f 77 20 74 68 65 20 61 74 74 72 69 62 75  know the attribu
81f0: 74 65 73 20 66 6f 72 20 74 68 65 0a 09 09 09 09  tes for the.....
8200: 20 2a 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20   * file. */.    
8210: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74  const WCHAR *nat
8220: 69 76 65 4e 61 6d 65 2c 09 2f 2a 20 4e 61 74 69  iveName,./* Nati
8230: 76 65 20 70 61 74 68 20 74 6f 20 63 68 65 63 6b  ve path to check
8240: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  . */.    Tcl_Glo
8250: 62 54 79 70 65 44 61 74 61 20 2a 74 79 70 65 73  bTypeData *types
8260: 29 09 2f 2a 20 54 79 70 65 20 64 65 73 63 72 69  )./* Type descri
8270: 70 74 69 6f 6e 20 74 6f 20 6d 61 74 63 68 20 61  ption to match a
8280: 67 61 69 6e 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20  gainst. */.{.   
8290: 20 2f 2a 0a 20 20 20 20 20 2a 20 27 61 74 74 72   /*.     * 'attr
82a0: 27 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  ' represents the
82b0: 20 61 74 74 72 69 62 75 74 65 73 20 6f 66 20 74   attributes of t
82c0: 68 65 20 66 69 6c 65 2c 20 62 75 74 20 77 65 20  he file, but we 
82d0: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 0a 20 20 20  only want to.   
82e0: 20 20 2a 20 72 65 74 72 69 65 76 65 20 74 68 69    * retrieve thi
82f0: 73 20 69 6e 66 6f 20 69 66 20 69 74 20 69 73 20  s info if it is 
8300: 61 62 73 6f 6c 75 74 65 6c 79 20 6e 65 63 65 73  absolutely neces
8310: 73 61 72 79 20 62 65 63 61 75 73 65 20 69 74 20  sary because it 
8320: 69 73 20 61 6e 0a 20 20 20 20 20 2a 20 65 78 70  is an.     * exp
8330: 65 6e 73 69 76 65 20 63 61 6c 6c 2e 20 55 6e 66  ensive call. Unf
8340: 6f 72 74 75 6e 61 74 65 6c 79 2c 20 74 6f 20 64  ortunately, to d
8350: 65 61 6c 20 77 69 74 68 20 68 69 64 64 65 6e 20  eal with hidden 
8360: 66 69 6c 65 73 20 70 72 6f 70 65 72 6c 79 2c 20  files properly, 
8370: 77 65 0a 20 20 20 20 20 2a 20 6d 75 73 74 20 61  we.     * must a
8380: 6c 77 61 79 73 20 72 65 74 72 69 65 76 65 20 69  lways retrieve i
8390: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
83a0: 69 66 20 28 74 79 70 65 73 20 3d 3d 20 4e 55 4c  if (types == NUL
83b0: 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20  L) {../*.. * If 
83c0: 69 6e 76 69 73 69 62 6c 65 2c 20 64 6f 6e 27 74  invisible, don't
83d0: 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   return the file
83e0: 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20  ... */...return 
83f0: 21 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54  !(attr & FILE_AT
8400: 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 20 26  TRIBUTE_HIDDEN &
8410: 26 20 21 69 73 44 72 69 76 65 29 3b 0a 20 20 20  & !isDrive);.   
8420: 20 7d 0a 0a 20 20 20 20 69 66 20 28 61 74 74 72   }..    if (attr
8430: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
8440: 45 5f 48 49 44 44 45 4e 20 26 26 20 21 69 73 44  E_HIDDEN && !isD
8450: 72 69 76 65 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  rive) {../*.. * 
8460: 49 66 20 69 6e 76 69 73 69 62 6c 65 2e 0a 09 20  If invisible... 
8470: 2a 2f 0a 0a 09 69 66 20 28 28 74 79 70 65 73 2d  */...if ((types-
8480: 3e 70 65 72 6d 20 3d 3d 20 30 29 20 7c 7c 20 21  >perm == 0) || !
8490: 28 74 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 54  (types->perm & T
84a0: 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 48 49 44  CL_GLOB_PERM_HID
84b0: 44 45 4e 29 29 20 7b 0a 09 20 20 20 20 72 65 74  DEN)) {..    ret
84c0: 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 20  urn 0;..}.    } 
84d0: 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 56  else {../*.. * V
84e0: 69 73 69 62 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 69  isible... */...i
84f0: 66 20 28 74 79 70 65 73 2d 3e 70 65 72 6d 20 26  f (types->perm &
8500: 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 48   TCL_GLOB_PERM_H
8510: 49 44 44 45 4e 29 20 7b 0a 09 20 20 20 20 72 65  IDDEN) {..    re
8520: 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d  turn 0;..}.    }
8530: 0a 0a 20 20 20 20 69 66 20 28 74 79 70 65 73 2d  ..    if (types-
8540: 3e 70 65 72 6d 20 21 3d 20 30 29 20 7b 0a 09 69  >perm != 0) {..i
8550: 66 20 28 28 28 74 79 70 65 73 2d 3e 70 65 72 6d  f (((types->perm
8560: 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d   & TCL_GLOB_PERM
8570: 5f 52 4f 4e 4c 59 29 20 26 26 0a 09 09 20 20 20  _RONLY) &&...   
8580: 20 21 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41   !(attr & FILE_A
8590: 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c  TTRIBUTE_READONL
85a0: 59 29 29 20 7c 7c 0a 09 09 28 28 74 79 70 65 73  Y)) ||...((types
85b0: 2d 3e 70 65 72 6d 20 26 20 54 43 4c 5f 47 4c 4f  ->perm & TCL_GLO
85c0: 42 5f 50 45 52 4d 5f 52 29 20 26 26 0a 09 09 20  B_PERM_R) &&... 
85d0: 20 20 20 28 30 20 2f 2a 20 46 69 6c 65 20 65 78     (0 /* File ex
85e0: 69 73 74 73 20 3d 3e 20 52 5f 4f 4b 20 6f 6e 20  ists => R_OK on 
85f0: 57 69 6e 64 6f 77 73 20 2a 2f 29 29 20 7c 7c 0a  Windows */)) ||.
8600: 09 09 28 28 74 79 70 65 73 2d 3e 70 65 72 6d 20  ..((types->perm 
8610: 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f  & TCL_GLOB_PERM_
8620: 57 29 20 26 26 0a 09 09 20 20 20 20 28 61 74 74  W) &&...    (att
8630: 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
8640: 54 45 5f 52 45 41 44 4f 4e 4c 59 29 29 20 7c 7c  TE_READONLY)) ||
8650: 0a 09 09 28 28 74 79 70 65 73 2d 3e 70 65 72 6d  ...((types->perm
8660: 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d   & TCL_GLOB_PERM
8670: 5f 58 29 20 26 26 0a 09 09 20 20 20 20 28 21 28  _X) &&...    (!(
8680: 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
8690: 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
86a0: 0a 09 09 20 20 20 20 26 26 20 21 4e 61 74 69 76  ...    && !Nativ
86b0: 65 49 73 45 78 65 63 28 6e 61 74 69 76 65 4e 61  eIsExec(nativeNa
86c0: 6d 65 29 29 29 29 20 7b 0a 09 20 20 20 20 72 65  me)))) {..    re
86d0: 74 75 72 6e 20 30 3b 0a 09 7d 0a 20 20 20 20 7d  turn 0;..}.    }
86e0: 0a 0a 20 20 20 20 69 66 20 28 28 74 79 70 65 73  ..    if ((types
86f0: 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47 4c 4f  ->type & TCL_GLO
8700: 42 5f 54 59 50 45 5f 44 49 52 29 0a 09 20 20 20  B_TYPE_DIR)..   
8710: 20 26 26 20 28 61 74 74 72 20 26 20 46 49 4c 45   && (attr & FILE
8720: 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
8730: 54 4f 52 59 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a  TORY)) {../*.. *
8740: 20 51 75 69 63 6b 65 72 20 74 65 73 74 20 66 6f   Quicker test fo
8750: 72 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 69  r directory, whi
8760: 63 68 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 63  ch is a common c
8770: 61 73 65 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75  ase... */...retu
8780: 72 6e 20 31 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  rn 1;..    } els
8790: 65 20 69 66 20 28 74 79 70 65 73 2d 3e 74 79 70  e if (types->typ
87a0: 65 20 21 3d 20 30 29 20 7b 0a 09 75 6e 73 69 67  e != 0) {..unsig
87b0: 6e 65 64 20 73 68 6f 72 74 20 73 74 5f 6d 6f 64  ned short st_mod
87c0: 65 3b 0a 09 69 6e 74 20 69 73 45 78 65 63 20 3d  e;..int isExec =
87d0: 20 4e 61 74 69 76 65 49 73 45 78 65 63 28 6e 61   NativeIsExec(na
87e0: 74 69 76 65 4e 61 6d 65 29 3b 0a 0a 09 73 74 5f  tiveName);...st_
87f0: 6d 6f 64 65 20 3d 20 4e 61 74 69 76 65 53 74 61  mode = NativeSta
8800: 74 4d 6f 64 65 28 61 74 74 72 2c 20 30 2c 20 69  tMode(attr, 0, i
8810: 73 45 78 65 63 29 3b 0a 0a 09 2f 2a 0a 09 20 2a  sExec);.../*.. *
8820: 20 49 6e 20 6f 72 64 65 72 20 62 63 64 70 66 6c   In order bcdpfl
8830: 73 20 61 73 20 69 6e 20 27 66 69 6e 64 20 2d 74  s as in 'find -t
8840: 27 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 28 74  '.. */...if (((t
8850: 79 70 65 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47  ypes->type&TCL_G
8860: 4c 4f 42 5f 54 59 50 45 5f 42 4c 4f 43 4b 29 20  LOB_TYPE_BLOCK) 
8870: 20 20 20 26 26 20 53 5f 49 53 42 4c 4b 28 73 74     && S_ISBLK(st
8880: 5f 6d 6f 64 65 29 29 20 7c 7c 0a 09 09 28 28 74  _mode)) ||...((t
8890: 79 70 65 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47  ypes->type&TCL_G
88a0: 4c 4f 42 5f 54 59 50 45 5f 43 48 41 52 29 20 26  LOB_TYPE_CHAR) &
88b0: 26 20 53 5f 49 53 43 48 52 28 73 74 5f 6d 6f 64  & S_ISCHR(st_mod
88c0: 65 29 29 20 7c 7c 0a 09 09 28 28 74 79 70 65 73  e)) ||...((types
88d0: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f  ->type&TCL_GLOB_
88e0: 54 59 50 45 5f 44 49 52 29 20 20 26 26 20 53 5f  TYPE_DIR)  && S_
88f0: 49 53 44 49 52 28 73 74 5f 6d 6f 64 65 29 29 20  ISDIR(st_mode)) 
8900: 7c 7c 0a 09 09 28 28 74 79 70 65 73 2d 3e 74 79  ||...((types->ty
8910: 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45  pe&TCL_GLOB_TYPE
8920: 5f 50 49 50 45 29 20 26 26 20 53 5f 49 53 46 49  _PIPE) && S_ISFI
8930: 46 4f 28 73 74 5f 6d 6f 64 65 29 29 20 7c 7c 0a  FO(st_mode)) ||.
8940: 23 69 66 64 65 66 20 53 5f 49 53 53 4f 43 4b 0a  #ifdef S_ISSOCK.
8950: 09 09 28 28 74 79 70 65 73 2d 3e 74 79 70 65 26  ..((types->type&
8960: 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 53 4f  TCL_GLOB_TYPE_SO
8970: 43 4b 29 20 26 26 20 53 5f 49 53 53 4f 43 4b 28  CK) && S_ISSOCK(
8980: 73 74 5f 6d 6f 64 65 29 29 20 7c 7c 0a 23 65 6e  st_mode)) ||.#en
8990: 64 69 66 0a 09 09 28 28 74 79 70 65 73 2d 3e 74  dif...((types->t
89a0: 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50  ype&TCL_GLOB_TYP
89b0: 45 5f 46 49 4c 45 29 20 26 26 20 53 5f 49 53 52  E_FILE) && S_ISR
89c0: 45 47 28 73 74 5f 6d 6f 64 65 29 29 29 20 7b 0a  EG(st_mode))) {.
89d0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
89e0: 44 6f 20 6e 6f 74 68 69 6e 67 20 2d 20 74 68 69  Do nothing - thi
89f0: 73 20 66 69 6c 65 20 69 73 20 6f 6b 2e 0a 09 20  s file is ok... 
8a00: 20 20 20 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 7b      */..} else {
8a10: 0a 23 69 66 64 65 66 20 53 5f 49 53 4c 4e 4b 0a  .#ifdef S_ISLNK.
8a20: 09 20 20 20 20 69 66 20 28 74 79 70 65 73 2d 3e  .    if (types->
8a30: 74 79 70 65 20 26 20 54 43 4c 5f 47 4c 4f 42 5f  type & TCL_GLOB_
8a40: 54 59 50 45 5f 4c 49 4e 4b 29 20 7b 0a 09 09 73  TYPE_LINK) {...s
8a50: 74 5f 6d 6f 64 65 20 3d 20 4e 61 74 69 76 65 53  t_mode = NativeS
8a60: 74 61 74 4d 6f 64 65 28 61 74 74 72 2c 20 31 2c  tatMode(attr, 1,
8a70: 20 69 73 45 78 65 63 29 3b 0a 09 09 69 66 20 28   isExec);...if (
8a80: 53 5f 49 53 4c 4e 4b 28 73 74 5f 6d 6f 64 65 29  S_ISLNK(st_mode)
8a90: 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  ) {...    return
8aa0: 20 31 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 23   1;...}..    }.#
8ab0: 65 6e 64 69 66 20 2f 2a 20 53 5f 49 53 4c 4e 4b  endif /* S_ISLNK
8ac0: 20 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20   */..    return 
8ad0: 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  0;..}.    }.    
8ae0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a  return 1;.}.../*
8af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
8b40: 54 63 6c 70 47 65 74 55 73 65 72 48 6f 6d 65 20  TclpGetUserHome 
8b50: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
8b60: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74 68 65  nction takes the
8b70: 20 70 61 73 73 65 64 20 69 6e 20 75 73 65 72 20   passed in user 
8b80: 6e 61 6d 65 20 61 6e 64 20 66 69 6e 64 73 20 74  name and finds t
8b90: 68 65 0a 20 2a 09 63 6f 72 72 65 73 70 6f 6e 64  he. *.correspond
8ba0: 69 6e 67 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  ing home directo
8bb0: 72 79 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ry specified in 
8bc0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 66 69 6c  the password fil
8bd0: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  e.. *. * Results
8be0: 3a 0a 20 2a 09 54 68 65 20 72 65 73 75 6c 74 20  :. *.The result 
8bf0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
8c00: 61 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 79  a string specify
8c10: 69 6e 67 20 74 68 65 20 75 73 65 72 27 73 20 68  ing the user's h
8c20: 6f 6d 65 0a 20 2a 09 64 69 72 65 63 74 6f 72 79  ome. *.directory
8c30: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
8c40: 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72   user's home dir
8c50: 65 63 74 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74  ectory could not
8c60: 20 62 65 0a 20 2a 09 64 65 74 65 72 6d 69 6e 65   be. *.determine
8c70: 64 2e 20 53 74 6f 72 61 67 65 20 66 6f 72 20 74  d. Storage for t
8c80: 68 65 20 72 65 73 75 6c 74 20 73 74 72 69 6e 67  he result string
8c90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
8ca0: 20 62 75 66 66 65 72 50 74 72 3b 0a 20 2a 09 74   bufferPtr;. *.t
8cb0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
8cc0: 61 6c 6c 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  all Tcl_DStringF
8cd0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 72  ree() when the r
8ce0: 65 73 75 6c 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  esult is no long
8cf0: 65 72 0a 20 2a 09 6e 65 65 64 65 64 2e 0a 20 2a  er. *.needed.. *
8d00: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
8d10: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d60: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f 6e 73  ------. */..cons
8d70: 74 20 63 68 61 72 20 2a 0a 54 63 6c 70 47 65 74  t char *.TclpGet
8d80: 55 73 65 72 48 6f 6d 65 28 0a 20 20 20 20 63 6f  UserHome(.    co
8d90: 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 09  nst char *name,.
8da0: 09 2f 2a 20 55 73 65 72 20 6e 61 6d 65 20 66 6f  ./* User name fo
8db0: 72 20 64 65 73 69 72 65 64 20 68 6f 6d 65 20 64  r desired home d
8dc0: 69 72 65 63 74 6f 72 79 2e 20 2a 2f 0a 20 20 20  irectory. */.   
8dd0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 62 75   Tcl_DString *bu
8de0: 66 66 65 72 50 74 72 29 09 2f 2a 20 55 6e 69 6e  fferPtr)./* Unin
8df0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 66 72 65  itialized or fre
8e00: 65 20 44 53 74 72 69 6e 67 20 66 69 6c 6c 65 64  e DString filled
8e10: 20 77 69 74 68 0a 09 09 09 09 20 2a 20 6e 61 6d   with..... * nam
8e20: 65 20 6f 66 20 75 73 65 72 27 73 20 68 6f 6d 65  e of user's home
8e30: 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f 0a 7b   directory. */.{
8e40: 0a 20 20 20 20 63 68 61 72 20 2a 72 65 73 75 6c  .    char *resul
8e50: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 55 53  t = NULL;.    US
8e60: 45 52 5f 49 4e 46 4f 5f 31 20 2a 75 69 50 74 72  ER_INFO_1 *uiPtr
8e70: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
8e80: 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6e 61  g ds;.    int na
8e90: 6d 65 4c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  meLen = -1;.    
8ea0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 20 20  int rc = 0;.    
8eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 6f 6d 61  const char *doma
8ec0: 69 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 2a 77  in;.    WCHAR *w
8ed0: 4e 61 6d 65 2c 20 2a 77 48 6f 6d 65 44 69 72 2c  Name, *wHomeDir,
8ee0: 20 2a 77 44 6f 6d 61 69 6e 3b 0a 0a 20 20 20 20   *wDomain;..    
8ef0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
8f00: 62 75 66 66 65 72 50 74 72 29 3b 0a 0a 20 20 20  bufferPtr);..   
8f10: 20 77 44 6f 6d 61 69 6e 20 3d 20 4e 55 4c 4c 3b   wDomain = NULL;
8f20: 0a 20 20 20 20 64 6f 6d 61 69 6e 20 3d 20 54 63  .    domain = Tc
8f30: 6c 5f 55 74 66 46 69 6e 64 46 69 72 73 74 28 6e  l_UtfFindFirst(n
8f40: 61 6d 65 2c 20 27 40 27 29 3b 0a 20 20 20 20 69  ame, '@');.    i
8f50: 66 20 28 64 6f 6d 61 69 6e 20 3d 3d 20 4e 55 4c  f (domain == NUL
8f60: 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72  L) {..const char
8f70: 20 2a 70 74 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20   *ptr;.../*.. * 
8f80: 54 72 65 61 74 20 74 68 65 20 63 75 72 72 65 6e  Treat the curren
8f90: 74 20 75 73 65 72 20 61 73 20 61 20 73 70 65 63  t user as a spec
8fa0: 69 61 6c 20 63 61 73 65 20 62 65 63 61 75 73 65  ial case because
8fb0: 20 74 68 65 20 67 65 6e 65 72 61 6c 20 63 61 73   the general cas
8fc0: 65 0a 09 20 2a 20 62 65 6c 6f 77 20 64 6f 65 73  e.. * below does
8fd0: 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 20 72 65   not properly re
8fe0: 74 72 69 65 76 65 20 74 68 65 20 70 61 74 68 2e  trieve the path.
8ff0: 20 54 68 65 20 4e 65 74 55 73 65 72 47 65 74 49   The NetUserGetI
9000: 6e 66 6f 0a 09 20 2a 20 63 61 6c 6c 20 72 65 74  nfo.. * call ret
9010: 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 70 61  urns an empty pa
9020: 74 68 20 61 6e 64 20 74 68 65 20 63 6f 64 65 20  th and the code 
9030: 64 65 66 61 75 6c 74 73 20 74 6f 20 74 68 65 20  defaults to the 
9040: 75 73 65 72 27 73 0a 09 20 2a 20 6e 61 6d 65 20  user's.. * name 
9050: 69 6e 20 74 68 65 20 70 72 6f 66 69 6c 65 73 20  in the profiles 
9060: 64 69 72 65 63 74 6f 72 79 2e 20 4f 6e 20 6d 6f  directory. On mo
9070: 64 65 72 6e 20 57 69 6e 64 6f 77 73 20 73 79 73  dern Windows sys
9080: 74 65 6d 73 2c 20 74 68 69 73 0a 09 20 2a 20 69  tems, this.. * i
9090: 73 20 67 65 6e 65 72 61 6c 6c 79 20 77 72 6f 6e  s generally wron
90a0: 67 20 61 73 20 77 68 65 6e 20 74 68 65 20 61 63  g as when the ac
90b0: 63 6f 75 6e 74 20 69 73 20 61 20 4d 69 63 72 6f  count is a Micro
90c0: 73 6f 66 74 20 61 63 63 6f 75 6e 74 2c 0a 09 20  soft account,.. 
90d0: 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 61 62  * for example ab
90e0: 63 64 65 66 67 68 69 40 6f 75 74 6c 6f 6f 6b 2e  cdefghi@outlook.
90f0: 63 6f 6d 2c 20 74 68 65 20 64 69 72 65 63 74 6f  com, the directo
9100: 72 79 20 6e 61 6d 65 20 69 73 0a 09 20 2a 20 61  ry name is.. * a
9110: 62 63 64 65 20 61 6e 64 20 6e 6f 74 20 61 62 63  bcde and not abc
9120: 64 65 66 67 68 69 2e 0a 09 20 2a 0a 09 20 2a 20  defghi... *.. * 
9130: 4e 6f 74 65 20 77 65 20 63 6f 75 6c 64 20 68 61  Note we could ha
9140: 76 65 20 6a 75 73 74 20 75 73 65 64 20 65 6e 76  ve just used env
9150: 28 55 53 45 52 50 52 4f 46 49 4c 45 29 20 68 65  (USERPROFILE) he
9160: 72 65 20 62 75 74 0a 09 20 2a 20 74 68 65 20 69  re but.. * the i
9170: 6e 74 65 6e 74 20 69 73 20 74 6f 20 72 65 74 72  ntent is to retr
9180: 69 65 76 65 20 28 61 73 20 6f 6e 20 55 6e 69 78  ieve (as on Unix
9190: 29 20 74 68 65 20 73 79 73 74 65 6d 27 73 20 76  ) the system's v
91a0: 69 65 77 0a 09 20 2a 20 6f 66 20 74 68 65 20 68  iew.. * of the h
91b0: 6f 6d 65 20 69 72 72 65 73 70 65 63 74 69 76 65  ome irrespective
91c0: 20 6f 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20   of environment 
91d0: 73 65 74 74 69 6e 67 73 20 6f 66 20 48 4f 4d 45  settings of HOME
91e0: 0a 09 20 2a 20 61 6e 64 20 55 53 45 52 50 52 4f  .. * and USERPRO
91f0: 46 49 4c 45 2e 0a 09 20 2a 0a 09 20 2a 20 46 69  FILE... *.. * Fi
9200: 78 69 6e 67 20 74 68 69 73 20 66 6f 72 20 74 68  xing this for th
9210: 65 20 67 65 6e 65 72 61 6c 20 75 73 65 72 20 6e  e general user n
9220: 65 65 64 73 20 6d 6f 72 65 20 69 6e 76 65 73 74  eeds more invest
9230: 69 67 61 74 69 6e 67 20 62 75 74 0a 09 20 2a 20  igating but.. * 
9240: 61 74 20 6c 65 61 73 74 20 66 6f 72 20 74 68 65  at least for the
9250: 20 63 75 72 72 65 6e 74 20 75 73 65 72 20 77 65   current user we
9260: 20 63 61 6e 20 75 73 65 20 61 20 64 69 72 65 63   can use a direc
9270: 74 20 63 61 6c 6c 2e 0a 09 20 2a 2f 0a 09 70 74  t call... */..pt
9280: 72 20 3d 20 54 63 6c 70 47 65 74 55 73 65 72 4e  r = TclpGetUserN
9290: 61 6d 65 28 26 64 73 29 3b 0a 09 69 66 20 28 70  ame(&ds);..if (p
92a0: 74 72 20 21 3d 20 4e 55 4c 4c 20 26 26 20 73 74  tr != NULL && st
92b0: 72 63 61 73 65 63 6d 70 28 6e 61 6d 65 2c 20 70  rcasecmp(name, p
92c0: 74 72 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20  tr) == 0) {..   
92d0: 20 48 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73   HANDLE hProcess
92e0: 3b 0a 09 20 20 20 20 57 43 48 41 52 20 62 75 66  ;..    WCHAR buf
92f0: 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 09 20 20 20  [MAX_PATH];..   
9300: 20 44 57 4f 52 44 20 6e 43 68 61 72 73 20 3d 20   DWORD nChars = 
9310: 73 69 7a 65 6f 66 28 62 75 66 29 20 2f 20 73 69  sizeof(buf) / si
9320: 7a 65 6f 66 28 62 75 66 5b 30 5d 29 3b 0a 09 20  zeof(buf[0]);.. 
9330: 20 20 20 2f 2a 20 53 61 64 6c 79 20 47 65 74 43     /* Sadly GetC
9340: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 54 6f 6b  urrentProcessTok
9350: 65 6e 20 6e 6f 74 20 69 6e 20 57 69 6e 20 37 20  en not in Win 7 
9360: 73 6f 20 73 6c 69 67 68 74 6c 79 20 6c 6f 6e 67  so slightly long
9370: 65 72 20 2a 2f 0a 09 20 20 20 20 68 50 72 6f 63  er */..    hProc
9380: 65 73 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74  ess = GetCurrent
9390: 50 72 6f 63 65 73 73 28 29 3b 20 2f 2a 20 4e 65  Process(); /* Ne
93a0: 65 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ed not be closed
93b0: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 68 50 72   */..    if (hPr
93c0: 6f 63 65 73 73 29 20 7b 0a 09 09 48 41 4e 44 4c  ocess) {...HANDL
93d0: 45 20 68 54 6f 6b 65 6e 3b 0a 09 09 69 66 20 28  E hToken;...if (
93e0: 4f 70 65 6e 50 72 6f 63 65 73 73 54 6f 6b 65 6e  OpenProcessToken
93f0: 28 68 50 72 6f 63 65 73 73 2c 20 54 4f 4b 45 4e  (hProcess, TOKEN
9400: 5f 51 55 45 52 59 2c 20 26 68 54 6f 6b 65 6e 29  _QUERY, &hToken)
9410: 29 20 7b 0a 09 09 20 20 20 20 69 66 20 28 47 65  ) {...    if (Ge
9420: 74 55 73 65 72 50 72 6f 66 69 6c 65 44 69 72 65  tUserProfileDire
9430: 63 74 6f 72 79 57 28 68 54 6f 6b 65 6e 2c 20 62  ctoryW(hToken, b
9440: 75 66 2c 20 26 6e 43 68 61 72 73 29 29 20 7b 0a  uf, &nChars)) {.
9450: 09 09 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f  ...result = Tcl_
9460: 57 43 68 61 72 54 6f 55 74 66 44 53 74 72 69 6e  WCharToUtfDStrin
9470: 67 28 62 75 66 2c 20 6e 43 68 61 72 73 2d 31 2c  g(buf, nChars-1,
9480: 20 28 62 75 66 66 65 72 50 74 72 29 29 3b 0a 09   (bufferPtr));..
9490: 09 09 72 63 20 3d 20 31 3b 0a 09 09 20 20 20 20  ..rc = 1;...    
94a0: 7d 0a 09 09 20 20 20 20 43 6c 6f 73 65 48 61 6e  }...    CloseHan
94b0: 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 09 7d  dle(hToken);...}
94c0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f  ..    }..}..Tcl_
94d0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
94e0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
94f0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9500: 26 64 73 29 3b 0a 09 77 4e 61 6d 65 20 3d 20 54  &ds);..wName = T
9510: 63 6c 5f 55 74 66 54 6f 57 43 68 61 72 44 53 74  cl_UtfToWCharDSt
9520: 72 69 6e 67 28 64 6f 6d 61 69 6e 20 2b 20 31 2c  ring(domain + 1,
9530: 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c   TCL_INDEX_NONE,
9540: 20 26 64 73 29 3b 0a 09 72 63 20 3d 20 4e 65 74   &ds);..rc = Net
9550: 47 65 74 44 43 4e 61 6d 65 28 4e 55 4c 4c 2c 20  GetDCName(NULL, 
9560: 77 4e 61 6d 65 2c 20 28 4c 50 42 59 54 45 20 2a  wName, (LPBYTE *
9570: 29 20 26 77 44 6f 6d 61 69 6e 29 3b 0a 09 54 63  ) &wDomain);..Tc
9580: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
9590: 73 29 3b 0a 09 6e 61 6d 65 4c 65 6e 20 3d 20 64  s);..nameLen = d
95a0: 6f 6d 61 69 6e 20 2d 20 6e 61 6d 65 3b 0a 20 20  omain - name;.  
95b0: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 63 20 3d    }.    if (rc =
95c0: 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72  = 0) {..Tcl_DStr
95d0: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 77  ingInit(&ds);..w
95e0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 55 74 66 54 6f  Name = Tcl_UtfTo
95f0: 57 43 68 61 72 44 53 74 72 69 6e 67 28 6e 61 6d  WCharDString(nam
9600: 65 2c 20 6e 61 6d 65 4c 65 6e 2c 20 26 64 73 29  e, nameLen, &ds)
9610: 3b 0a 09 77 68 69 6c 65 20 28 4e 65 74 55 73 65  ;..while (NetUse
9620: 72 47 65 74 49 6e 66 6f 28 77 44 6f 6d 61 69 6e  rGetInfo(wDomain
9630: 2c 20 77 4e 61 6d 65 2c 20 31 2c 20 28 4c 50 42  , wName, 1, (LPB
9640: 59 54 45 20 2a 29 20 26 75 69 50 74 72 29 20 21  YTE *) &uiPtr) !
9650: 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  = 0) {..    /*..
9660: 20 20 20 20 20 2a 20 55 73 65 72 20 64 6f 65 73       * User does
9670: 20 6e 6f 74 20 65 78 69 73 74 3b 20 69 66 20 64   not exist; if d
9680: 6f 6d 61 69 6e 20 77 61 73 20 6e 6f 74 20 73 70  omain was not sp
9690: 65 63 69 66 69 65 64 2c 20 74 72 79 20 61 67 61  ecified, try aga
96a0: 69 6e 0a 09 20 20 20 20 20 2a 20 75 73 69 6e 67  in..     * using
96b0: 20 63 75 72 72 65 6e 74 20 64 6f 6d 61 69 6e 2e   current domain.
96c0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
96d0: 72 63 20 3d 20 31 3b 0a 09 20 20 20 20 69 66 20  rc = 1;..    if 
96e0: 28 64 6f 6d 61 69 6e 20 21 3d 20 4e 55 4c 4c 29  (domain != NULL)
96f0: 20 7b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20   {...break;..   
9700: 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20   }...    /*..   
9710: 20 20 2a 20 47 65 74 20 63 75 72 72 65 6e 74 20    * Get current 
9720: 64 6f 6d 61 69 6e 0a 09 20 20 20 20 20 2a 2f 0a  domain..     */.
9730: 0a 09 20 20 20 20 72 63 20 3d 20 4e 65 74 47 65  ..    rc = NetGe
9740: 74 44 43 4e 61 6d 65 28 4e 55 4c 4c 2c 20 4e 55  tDCName(NULL, NU
9750: 4c 4c 2c 20 28 4c 50 42 59 54 45 20 2a 29 20 26  LL, (LPBYTE *) &
9760: 77 44 6f 6d 61 69 6e 29 3b 0a 09 20 20 20 20 69  wDomain);..    i
9770: 66 20 28 72 63 20 21 3d 20 30 29 20 7b 0a 09 09  f (rc != 0) {...
9780: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20  break;..    }.. 
9790: 20 20 20 64 6f 6d 61 69 6e 20 3d 20 28 63 6f 6e     domain = (con
97a0: 73 74 20 63 68 61 72 20 2a 29 49 4e 54 32 50 54  st char *)INT2PT
97b0: 52 28 2d 31 29 3b 20 2f 2a 20 72 65 70 65 61 74  R(-1); /* repeat
97c0: 20 6f 6e 63 65 20 2a 2f 0a 09 7d 0a 09 69 66 20   once */..}..if 
97d0: 28 72 63 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20  (rc == 0) {..   
97e0: 20 44 57 4f 52 44 20 69 2c 20 73 69 7a 65 20 3d   DWORD i, size =
97f0: 20 4d 41 58 5f 50 41 54 48 3b 0a 0a 09 20 20 20   MAX_PATH;...   
9800: 20 77 48 6f 6d 65 44 69 72 20 3d 20 75 69 50 74   wHomeDir = uiPt
9810: 72 2d 3e 75 73 72 69 31 5f 68 6f 6d 65 5f 64 69  r->usri1_home_di
9820: 72 3b 0a 09 20 20 20 20 69 66 20 28 28 77 48 6f  r;..    if ((wHo
9830: 6d 65 44 69 72 20 21 3d 20 4e 55 4c 4c 29 20 26  meDir != NULL) &
9840: 26 20 28 77 48 6f 6d 65 44 69 72 5b 30 5d 20 21  & (wHomeDir[0] !
9850: 3d 20 27 5c 30 27 29 29 20 7b 0a 09 09 73 69 7a  = '\0')) {...siz
9860: 65 20 3d 20 6c 73 74 72 6c 65 6e 57 28 77 48 6f  e = lstrlenW(wHo
9870: 6d 65 44 69 72 29 3b 0a 09 09 54 63 6c 5f 57 43  meDir);...Tcl_WC
9880: 68 61 72 54 6f 55 74 66 44 53 74 72 69 6e 67 28  harToUtfDString(
9890: 77 48 6f 6d 65 44 69 72 2c 20 73 69 7a 65 2c 20  wHomeDir, size, 
98a0: 62 75 66 66 65 72 50 74 72 29 3b 0a 09 20 20 20  bufferPtr);..   
98b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 57 43 48 41   } else {...WCHA
98c0: 52 20 62 75 66 5b 4d 41 58 5f 50 41 54 48 5d 3b  R buf[MAX_PATH];
98d0: 0a 09 09 2f 2a 0a 09 09 20 2a 20 55 73 65 72 20  .../*... * User 
98e0: 65 78 69 73 74 73 20 62 75 74 20 68 61 73 20 6e  exists but has n
98f0: 6f 20 68 6f 6d 65 20 64 69 72 2e 20 52 65 74 75  o home dir. Retu
9900: 72 6e 0a 09 09 20 2a 20 22 7b 47 65 74 50 72 6f  rn... * "{GetPro
9910: 66 69 6c 65 73 44 69 72 65 63 74 6f 72 79 7d 2f  filesDirectory}/
9920: 3c 75 73 65 72 3e 22 2e 0a 09 09 20 2a 2f 0a 0a  <user>".... */..
9930: 09 09 47 65 74 50 72 6f 66 69 6c 65 73 44 69 72  ..GetProfilesDir
9940: 65 63 74 6f 72 79 57 28 62 75 66 2c 20 26 73 69  ectoryW(buf, &si
9950: 7a 65 29 3b 0a 09 09 54 63 6c 5f 57 43 68 61 72  ze);...Tcl_WChar
9960: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 62 75 66  ToUtfDString(buf
9970: 2c 20 73 69 7a 65 2d 31 2c 20 62 75 66 66 65 72  , size-1, buffer
9980: 50 74 72 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72  Ptr);...Tcl_DStr
9990: 69 6e 67 41 70 70 65 6e 64 28 62 75 66 66 65 72  ingAppend(buffer
99a0: 50 74 72 2c 20 22 2f 22 2c 20 31 29 3b 0a 09 09  Ptr, "/", 1);...
99b0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
99c0: 64 28 62 75 66 66 65 72 50 74 72 2c 20 6e 61 6d  d(bufferPtr, nam
99d0: 65 2c 20 6e 61 6d 65 4c 65 6e 29 3b 0a 09 20 20  e, nameLen);..  
99e0: 20 20 7d 0a 09 20 20 20 20 72 65 73 75 6c 74 20    }..    result 
99f0: 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  = Tcl_DStringVal
9a00: 75 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a 0a  ue(bufferPtr);..
9a10: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
9a20: 42 65 20 73 75 72 65 20 77 65 20 72 65 74 75 72  Be sure we retur
9a30: 6e 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74  n normalized pat
9a40: 68 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  h..     */...   
9a50: 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
9a60: 20 73 69 7a 65 3b 20 2b 2b 69 29 20 7b 0a 09 09   size; ++i) {...
9a70: 69 66 20 28 72 65 73 75 6c 74 5b 69 5d 20 3d 3d  if (result[i] ==
9a80: 20 27 5c 5c 27 29 20 7b 0a 09 09 20 20 20 20 72   '\\') {...    r
9a90: 65 73 75 6c 74 5b 69 5d 20 3d 20 27 2f 27 3b 0a  esult[i] = '/';.
9aa0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ..}..    }..    
9ab0: 4e 65 74 41 70 69 42 75 66 66 65 72 46 72 65 65  NetApiBufferFree
9ac0: 28 28 76 6f 69 64 20 2a 29 75 69 50 74 72 29 3b  ((void *)uiPtr);
9ad0: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
9ae0: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 7d  Free(&ds);.    }
9af0: 0a 20 20 20 20 69 66 20 28 77 44 6f 6d 61 69 6e  .    if (wDomain
9b00: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 4e 65 74   != NULL) {..Net
9b10: 41 70 69 42 75 66 66 65 72 46 72 65 65 28 28 76  ApiBufferFree((v
9b20: 6f 69 64 20 2a 29 77 44 6f 6d 61 69 6e 29 3b 0a  oid *)wDomain);.
9b30: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
9b40: 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a  n result;.}.../*
9b50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9ba0: 2a 0a 20 2a 20 4e 61 74 69 76 65 41 63 63 65 73  *. * NativeAcces
9bb0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  s --. *. *.This 
9bc0: 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
9bd0: 73 20 74 68 65 20 6c 69 62 72 61 72 79 20 76 65  s the library ve
9be0: 72 73 69 6f 6e 20 6f 66 20 61 63 63 65 73 73 28  rsion of access(
9bf0: 29 2c 20 66 69 78 69 6e 67 20 74 68 65 0a 20 2a  ), fixing the. *
9c00: 09 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 67 73 3a  .following bugs:
9c10: 0a 20 2a 0a 20 2a 09 31 2e 20 61 63 63 65 73 73  . *. *.1. access
9c20: 28 29 20 72 65 74 75 72 6e 73 20 74 68 61 74 20  () returns that 
9c30: 61 6c 6c 20 66 69 6c 65 73 20 68 61 76 65 20 65  all files have e
9c40: 78 65 63 75 74 65 20 70 65 72 6d 69 73 73 69 6f  xecute permissio
9c50: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  n.. *. * Results
9c60: 3a 0a 20 2a 09 53 65 65 20 61 63 63 65 73 73 20  :. *.See access 
9c70: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20  documentation.. 
9c80: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
9c90: 73 3a 0a 20 2a 09 53 65 65 20 61 63 63 65 73 73  s:. *.See access
9ca0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
9cb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d00: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
9d10: 0a 4e 61 74 69 76 65 41 63 63 65 73 73 28 0a 20  .NativeAccess(. 
9d20: 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a     const WCHAR *
9d30: 6e 61 74 69 76 65 50 61 74 68 2c 09 2f 2a 20 50  nativePath,./* P
9d40: 61 74 68 20 6f 66 20 66 69 6c 65 20 74 6f 20 61  ath of file to a
9d50: 63 63 65 73 73 2c 20 6e 61 74 69 76 65 20 65 6e  ccess, native en
9d60: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
9d70: 6e 74 20 6d 6f 64 65 29 09 09 09 2f 2a 20 50 65  nt mode).../* Pe
9d80: 72 6d 69 73 73 69 6f 6e 20 73 65 74 74 69 6e 67  rmission setting
9d90: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 44 57 4f 52 44  . */.{.    DWORD
9da0: 20 61 74 74 72 3b 0a 0a 20 20 20 20 61 74 74 72   attr;..    attr
9db0: 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
9dc0: 75 74 65 73 57 28 6e 61 74 69 76 65 50 61 74 68  utesW(nativePath
9dd0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 61 74 74 72  );..    if (attr
9de0: 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
9df0: 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a 09  _ATTRIBUTES) {..
9e00: 2f 2a 0a 09 20 2a 20 46 69 6c 65 20 6d 69 67 68  /*.. * File migh
9e10: 74 20 6e 6f 74 20 65 78 69 73 74 2e 0a 09 20 2a  t not exist... *
9e20: 2f 0a 0a 09 44 57 4f 52 44 20 6c 61 73 74 65 72  /...DWORD laster
9e30: 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
9e40: 6f 72 28 29 3b 0a 09 69 66 20 28 6c 61 73 74 65  or();..if (laste
9e50: 72 72 6f 72 20 21 3d 20 45 52 52 4f 52 5f 53 48  rror != ERROR_SH
9e60: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
9e70: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 69 6e 43   {..    Tcl_WinC
9e80: 6f 6e 76 65 72 74 45 72 72 6f 72 28 6c 61 73 74  onvertError(last
9e90: 65 72 72 6f 72 29 3b 0a 09 20 20 20 20 72 65 74  error);..    ret
9ea0: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d  urn -1;..}.    }
9eb0: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d  ..    if (mode =
9ec0: 3d 20 46 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a 09 20  = F_OK) {../*.. 
9ed0: 2a 20 46 69 6c 65 20 65 78 69 73 74 73 2c 20 6e  * File exists, n
9ee0: 6f 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 63  othing else to c
9ef0: 68 65 63 6b 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74  heck... */...ret
9f00: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
9f10: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 69    /*.     * If i
9f20: 74 27 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74  t's not a direct
9f30: 6f 72 79 20 28 61 73 73 75 6d 65 20 66 69 6c 65  ory (assume file
9f40: 29 2c 20 64 6f 20 73 65 76 65 72 61 6c 20 66 61  ), do several fa
9f50: 73 74 20 63 68 65 63 6b 73 3a 0a 20 20 20 20 20  st checks:.     
9f60: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 28 61 74  */..    if (!(at
9f70: 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
9f80: 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 29 20  UTE_DIRECTORY)) 
9f90: 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65  {../*.. * If the
9fa0: 20 61 74 74 72 69 62 75 74 65 73 20 73 61 79 20   attributes say 
9fb0: 74 68 69 73 20 69 73 20 6e 6f 74 20 77 72 69 74  this is not writ
9fc0: 61 62 6c 65 20 61 74 20 61 6c 6c 2e 20 20 54 68  able at all.  Th
9fd0: 65 20 66 69 6c 65 20 69 73 20 61 0a 09 20 2a 20  e file is a.. * 
9fe0: 72 65 67 75 6c 61 72 20 66 69 6c 65 20 28 69 2e  regular file (i.
9ff0: 65 2e 2c 20 6e 6f 74 20 61 20 64 69 72 65 63 74  e., not a direct
a000: 6f 72 79 29 2c 20 74 68 65 6e 20 74 68 65 20 66  ory), then the f
a010: 69 6c 65 20 69 73 20 6e 6f 74 0a 09 20 2a 20 77  ile is not.. * w
a020: 72 69 74 61 62 6c 65 2c 20 66 75 6c 6c 20 73 74  ritable, full st
a030: 6f 70 2e 20 20 46 6f 72 20 64 69 72 65 63 74 6f  op.  For directo
a040: 72 69 65 73 2c 20 74 68 65 20 72 65 61 64 2d 6f  ries, the read-o
a050: 6e 6c 79 20 62 69 74 20 69 73 0a 09 20 2a 20 28  nly bit is.. * (
a060: 6d 6f 73 74 6c 79 29 20 69 67 6e 6f 72 65 64 20  mostly) ignored 
a070: 62 79 20 57 69 6e 64 6f 77 73 2c 20 73 6f 20 77  by Windows, so w
a080: 65 20 63 61 6e 27 74 20 61 73 63 65 72 74 61 69  e can't ascertai
a090: 6e 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74  n anything about
a0a0: 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79 20 61  .. * directory a
a0b0: 63 63 65 73 73 20 66 72 6f 6d 20 74 68 65 20 61  ccess from the a
a0c0: 74 74 72 69 62 20 64 61 74 61 2e 20 20 48 6f 77  ttrib data.  How
a0d0: 65 76 65 72 2c 20 69 66 20 77 65 20 68 61 76 65  ever, if we have
a0e0: 20 74 68 65 0a 09 20 2a 20 61 64 76 61 6e 63 65   the.. * advance
a0f0: 64 20 27 67 65 74 46 69 6c 65 53 65 63 75 72 69  d 'getFileSecuri
a100: 74 79 50 72 6f 63 27 2c 20 74 68 65 6e 20 6d 6f  tyProc', then mo
a110: 72 65 20 72 6f 62 75 73 74 20 41 43 4c 20 63 68  re robust ACL ch
a120: 65 63 6b 73 20 77 69 6c 6c 20 62 65 0a 09 20 2a  ecks will be.. *
a130: 20 64 6f 6e 65 20 62 65 6c 6f 77 2e 0a 09 20 2a   done below... *
a140: 2f 0a 0a 09 69 66 20 28 28 6d 6f 64 65 20 26 20  /...if ((mode & 
a150: 57 5f 4f 4b 29 20 26 26 20 28 61 74 74 72 20 26  W_OK) && (attr &
a160: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
a170: 52 45 41 44 4f 4e 4c 59 29 29 20 7b 0a 09 20 20  READONLY)) {..  
a180: 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45    Tcl_SetErrno(E
a190: 41 43 43 45 53 29 3b 0a 09 20 20 20 20 72 65 74  ACCES);..    ret
a1a0: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a  urn -1;..}.../*.
a1b0: 09 20 2a 20 49 66 20 64 6f 65 73 6e 27 74 20 68  . * If doesn't h
a1c0: 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ave the correct 
a1d0: 65 78 74 65 6e 73 69 6f 6e 2c 20 69 74 20 63 61  extension, it ca
a1e0: 6e 27 74 20 62 65 20 65 78 65 63 75 74 61 62 6c  n't be executabl
a1f0: 65 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 6d 6f  e.. */...if ((mo
a200: 64 65 20 26 20 58 5f 4f 4b 29 20 26 26 20 21 4e  de & X_OK) && !N
a210: 61 74 69 76 65 49 73 45 78 65 63 28 6e 61 74 69  ativeIsExec(nati
a220: 76 65 50 61 74 68 29 29 20 7b 0a 09 20 20 20 20  vePath)) {..    
a230: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 41 43  Tcl_SetErrno(EAC
a240: 43 45 53 29 3b 0a 09 20 20 20 20 72 65 74 75 72  CES);..    retur
a250: 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  n -1;..}.../*.. 
a260: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 66  * Special case f
a270: 6f 72 20 72 65 61 64 2f 77 72 69 74 65 2f 65 78  or read/write/ex
a280: 65 63 75 74 61 62 6c 65 20 63 68 65 63 6b 20 6f  ecutable check o
a290: 6e 20 66 69 6c 65 0a 09 20 2a 2f 0a 0a 09 69 66  n file.. */...if
a2a0: 20 28 28 6d 6f 64 65 20 26 20 28 52 5f 4f 4b 7c   ((mode & (R_OK|
a2b0: 57 5f 4f 4b 7c 58 5f 4f 4b 29 29 20 26 26 20 21  W_OK|X_OK)) && !
a2c0: 28 6d 6f 64 65 20 26 20 7e 28 52 5f 4f 4b 7c 57  (mode & ~(R_OK|W
a2d0: 5f 4f 4b 7c 58 5f 4f 4b 29 29 29 20 7b 0a 09 20  _OK|X_OK))) {.. 
a2e0: 20 20 20 44 57 4f 52 44 20 6d 61 73 6b 20 3d 20     DWORD mask = 
a2f0: 30 3b 0a 09 20 20 20 20 48 41 4e 44 4c 45 20 68  0;..    HANDLE h
a300: 46 69 6c 65 3b 0a 0a 09 20 20 20 20 69 66 20 28  File;...    if (
a310: 6d 6f 64 65 20 26 20 52 5f 4f 4b 29 20 7b 0a 09  mode & R_OK) {..
a320: 09 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43  .mask |= GENERIC
a330: 5f 52 45 41 44 3b 0a 09 20 20 20 20 7d 0a 09 20  _READ;..    }.. 
a340: 20 20 20 69 66 20 28 6d 6f 64 65 20 26 20 57 5f     if (mode & W_
a350: 4f 4b 29 20 7b 0a 09 09 6d 61 73 6b 20 7c 3d 20  OK) {...mask |= 
a360: 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 09  GENERIC_WRITE;..
a370: 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 6d      }..    if (m
a380: 6f 64 65 20 26 20 58 5f 4f 4b 29 20 7b 0a 09 09  ode & X_OK) {...
a390: 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43 5f  mask |= GENERIC_
a3a0: 45 58 45 43 55 54 45 3b 0a 09 20 20 20 20 7d 0a  EXECUTE;..    }.
a3b0: 0a 09 20 20 20 20 68 46 69 6c 65 20 3d 20 43 72  ..    hFile = Cr
a3c0: 65 61 74 65 46 69 6c 65 57 28 6e 61 74 69 76 65  eateFileW(native
a3d0: 50 61 74 68 2c 20 6d 61 73 6b 2c 0a 09 09 20 20  Path, mask,...  
a3e0: 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41    FILE_SHARE_REA
a3f0: 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
a400: 52 49 54 45 20 7c 20 46 49 4c 45 5f 53 48 41 52  RITE | FILE_SHAR
a410: 45 5f 44 45 4c 45 54 45 2c 0a 09 09 20 20 20 20  E_DELETE,...    
a420: 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 54  NULL, OPEN_EXIST
a430: 49 4e 47 2c 20 46 49 4c 45 5f 46 4c 41 47 5f 4e  ING, FILE_FLAG_N
a440: 4f 5f 42 55 46 46 45 52 49 4e 47 2c 20 4e 55 4c  O_BUFFERING, NUL
a450: 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 68 46 69  L);..    if (hFi
a460: 6c 65 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41  le != INVALID_HA
a470: 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 09  NDLE_VALUE) {...
a480: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 46 69 6c  CloseHandle(hFil
a490: 65 29 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a  e);...return 0;.
a4a0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a  .    }...    /*.
a4b0: 09 20 20 20 20 20 2a 20 46 61 73 74 20 65 78 69  .     * Fast exi
a4c0: 74 20 69 66 20 61 63 63 65 73 73 20 77 61 73 20  t if access was 
a4d0: 64 65 6e 69 65 64 0a 09 20 20 20 20 20 2a 2f 0a  denied..     */.
a4e0: 0a 09 20 20 20 20 69 66 20 28 47 65 74 4c 61 73  ..    if (GetLas
a4f0: 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f  tError() == ERRO
a500: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29  R_ACCESS_DENIED)
a510: 20 7b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6e   {...Tcl_SetErrn
a520: 6f 28 45 41 43 43 45 53 29 3b 0a 09 09 72 65 74  o(EACCES);...ret
a530: 75 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  urn -1;..    }..
a540: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 63 61  }.../*.. * We ca
a550: 6e 6e 6f 74 20 76 65 72 69 66 79 20 74 68 65 20  nnot verify the 
a560: 61 63 63 65 73 73 20 66 61 73 74 2c 20 63 68 65  access fast, che
a570: 63 6b 20 69 74 20 62 65 6c 6f 77 20 75 73 69 6e  ck it below usin
a580: 67 20 73 65 63 75 72 69 74 79 0a 09 20 2a 20 69  g security.. * i
a590: 6e 66 6f 2e 0a 09 20 2a 2f 0a 20 20 20 20 7d 0a  nfo... */.    }.
a5a0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49  .    /*.     * I
a5b0: 74 20 6c 6f 6f 6b 73 20 61 73 20 69 66 20 74 68  t looks as if th
a5c0: 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 72  e permissions ar
a5d0: 65 20 6f 6b 2c 20 62 75 74 20 69 66 20 77 65 20  e ok, but if we 
a5e0: 61 72 65 20 6f 6e 20 4e 54 2c 20 32 30 30 30 20  are on NT, 2000 
a5f0: 6f 72 20 58 50 2c 0a 20 20 20 20 20 2a 20 77 65  or XP,.     * we
a600: 20 68 61 76 65 20 61 20 6d 6f 72 65 20 63 6f 6d   have a more com
a610: 70 6c 65 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  plex permissions
a620: 20 73 74 72 75 63 74 75 72 65 20 73 6f 20 77 65   structure so we
a630: 20 74 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68   try to check th
a640: 61 74 2e 0a 20 20 20 20 20 2a 20 54 68 65 20 63  at..     * The c
a650: 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 72 65 6d  ode below is rem
a660: 61 72 6b 61 62 6c 79 20 63 6f 6d 70 6c 65 78 20  arkably complex 
a670: 66 6f 72 20 73 75 63 68 20 61 20 73 69 6d 70 6c  for such a simpl
a680: 65 20 74 68 69 6e 67 20 61 73 20 66 69 6e 64 69  e thing as findi
a690: 6e 67 0a 20 20 20 20 20 2a 20 77 68 61 74 20 70  ng.     * what p
a6a0: 65 72 6d 69 73 73 69 6f 6e 73 20 74 68 65 20 4f  ermissions the O
a6b0: 53 20 68 61 73 20 73 65 74 20 66 6f 72 20 61 20  S has set for a 
a6c0: 66 69 6c 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  file..     */.. 
a6d0: 20 20 20 7b 0a 09 53 45 43 55 52 49 54 59 5f 44     {..SECURITY_D
a6e0: 45 53 43 52 49 50 54 4f 52 20 2a 73 64 50 74 72  ESCRIPTOR *sdPtr
a6f0: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
a700: 65 64 20 6c 6f 6e 67 20 73 69 7a 65 3b 0a 09 50  ed long size;..P
a710: 53 49 44 20 70 53 69 64 20 3d 20 30 3b 0a 09 42  SID pSid = 0;..B
a720: 4f 4f 4c 20 53 69 64 44 65 66 61 75 6c 74 65 64  OOL SidDefaulted
a730: 3b 0a 09 53 49 44 5f 49 44 45 4e 54 49 46 49 45  ;..SID_IDENTIFIE
a740: 52 5f 41 55 54 48 4f 52 49 54 59 20 73 61 6d 62  R_AUTHORITY samb
a750: 61 5f 75 6e 6d 61 70 70 65 64 20 3d 20 7b 7b 30  a_unmapped = {{0
a760: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 32 32  , 0, 0, 0, 0, 22
a770: 7d 7d 3b 0a 09 47 45 4e 45 52 49 43 5f 4d 41 50  }};..GENERIC_MAP
a780: 50 49 4e 47 20 67 65 6e 4d 61 70 3b 0a 09 48 41  PING genMap;..HA
a790: 4e 44 4c 45 20 68 54 6f 6b 65 6e 20 3d 20 4e 55  NDLE hToken = NU
a7a0: 4c 4c 3b 0a 09 44 57 4f 52 44 20 64 65 73 69 72  LL;..DWORD desir
a7b0: 65 64 41 63 63 65 73 73 20 3d 20 30 2c 20 67 72  edAccess = 0, gr
a7c0: 61 6e 74 65 64 41 63 63 65 73 73 20 3d 20 30 3b  antedAccess = 0;
a7d0: 0a 09 42 4f 4f 4c 20 61 63 63 65 73 73 59 65 73  ..BOOL accessYes
a7e0: 4e 6f 20 3d 20 46 41 4c 53 45 3b 0a 09 50 52 49  No = FALSE;..PRI
a7f0: 56 49 4c 45 47 45 5f 53 45 54 20 70 72 69 76 53  VILEGE_SET privS
a800: 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 69 76 53  et;..DWORD privS
a810: 65 74 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  etSize = sizeof(
a820: 50 52 49 56 49 4c 45 47 45 5f 53 45 54 29 3b 0a  PRIVILEGE_SET);.
a830: 09 69 6e 74 20 65 72 72 6f 72 3b 0a 0a 09 2f 2a  .int error;.../*
a840: 0a 09 20 2a 20 46 69 72 73 74 20 66 69 6e 64 20  .. * First find 
a850: 6f 75 74 20 68 6f 77 20 62 69 67 20 74 68 65 20  out how big the 
a860: 62 75 66 66 65 72 20 6e 65 65 64 73 20 74 6f 20  buffer needs to 
a870: 62 65 2e 0a 09 20 2a 2f 0a 0a 09 73 69 7a 65 20  be... */...size 
a880: 3d 20 30 3b 0a 09 47 65 74 46 69 6c 65 53 65 63  = 0;..GetFileSec
a890: 75 72 69 74 79 57 28 6e 61 74 69 76 65 50 61 74  urityW(nativePat
a8a0: 68 2c 0a 09 09 4f 57 4e 45 52 5f 53 45 43 55 52  h,...OWNER_SECUR
a8b0: 49 54 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20  ITY_INFORMATION 
a8c0: 7c 20 47 52 4f 55 50 5f 53 45 43 55 52 49 54 59  | GROUP_SECURITY
a8d0: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c  _INFORMATION...|
a8e0: 20 44 41 43 4c 5f 53 45 43 55 52 49 54 59 5f 49   DACL_SECURITY_I
a8f0: 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42  NFORMATION | LAB
a900: 45 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f  EL_SECURITY_INFO
a910: 52 4d 41 54 49 4f 4e 2c 0a 09 09 30 2c 20 30 2c  RMATION,...0, 0,
a920: 20 26 73 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 09 20   &size);.../*.. 
a930: 2a 20 53 68 6f 75 6c 64 20 68 61 76 65 20 66 61  * Should have fa
a940: 69 6c 65 64 20 77 69 74 68 20 45 52 52 4f 52 5f  iled with ERROR_
a950: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
a960: 46 45 52 0a 09 20 2a 2f 0a 0a 09 65 72 72 6f 72  FER.. */...error
a970: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
a980: 29 3b 0a 09 69 66 20 28 65 72 72 6f 72 20 21 3d  );..if (error !=
a990: 20 45 52 52 4f 52 5f 49 4e 53 55 46 46 49 43 49   ERROR_INSUFFICI
a9a0: 45 4e 54 5f 42 55 46 46 45 52 29 20 7b 0a 09 20  ENT_BUFFER) {.. 
a9b0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 6f     /*..     * Mo
a9c0: 73 74 20 6c 69 6b 65 6c 79 20 63 61 73 65 20 69  st likely case i
a9d0: 73 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  s ERROR_ACCESS_D
a9e0: 45 4e 49 45 44 2c 20 77 68 69 63 68 20 77 65 20  ENIED, which we 
a9f0: 77 69 6c 6c 20 63 6f 6e 76 65 72 74 0a 09 20 20  will convert..  
aa00: 20 20 20 2a 20 74 6f 20 45 41 43 43 45 53 20 2d     * to EACCES -
aa10: 20 6a 75 73 74 20 77 68 61 74 20 77 65 20 77 61   just what we wa
aa20: 6e 74 21 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  nt!..     */... 
aa30: 20 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72     Tcl_WinConver
aa40: 74 45 72 72 6f 72 28 28 44 57 4f 52 44 29 20 65  tError((DWORD) e
aa50: 72 72 6f 72 29 3b 0a 09 20 20 20 20 72 65 74 75  rror);..    retu
aa60: 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  rn -1;..}.../*..
aa70: 20 2a 20 4e 6f 77 20 73 69 7a 65 20 63 6f 6e 74   * Now size cont
aa80: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
aa90: 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 2e 0a   buffer needed..
aaa0: 09 20 2a 2f 0a 0a 09 73 64 50 74 72 20 3d 20 28  . */...sdPtr = (
aab0: 53 45 43 55 52 49 54 59 5f 44 45 53 43 52 49 50  SECURITY_DESCRIP
aac0: 54 4f 52 20 2a 29 20 48 65 61 70 41 6c 6c 6f 63  TOR *) HeapAlloc
aad0: 28 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28  (GetProcessHeap(
aae0: 29 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 0a 09 69  ), 0, size);...i
aaf0: 66 20 28 73 64 50 74 72 20 3d 3d 20 4e 55 4c 4c  f (sdPtr == NULL
ab00: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 61 63  ) {..    goto ac
ab10: 63 65 73 73 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09  cessError;..}...
ab20: 2f 2a 0a 09 20 2a 20 43 61 6c 6c 20 47 65 74 46  /*.. * Call GetF
ab30: 69 6c 65 53 65 63 75 72 69 74 79 57 28 29 20 66  ileSecurityW() f
ab40: 6f 72 20 72 65 61 6c 2e 0a 09 20 2a 2f 0a 0a 09  or real... */...
ab50: 69 66 20 28 21 47 65 74 46 69 6c 65 53 65 63 75  if (!GetFileSecu
ab60: 72 69 74 79 57 28 6e 61 74 69 76 65 50 61 74 68  rityW(nativePath
ab70: 2c 0a 09 09 4f 57 4e 45 52 5f 53 45 43 55 52 49  ,...OWNER_SECURI
ab80: 54 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c  TY_INFORMATION |
ab90: 20 47 52 4f 55 50 5f 53 45 43 55 52 49 54 59 5f   GROUP_SECURITY_
aba0: 49 4e 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c 20  INFORMATION...| 
abb0: 44 41 43 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e  DACL_SECURITY_IN
abc0: 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 45  FORMATION | LABE
abd0: 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52  L_SECURITY_INFOR
abe0: 4d 41 54 49 4f 4e 2c 0a 09 09 73 64 50 74 72 2c  MATION,...sdPtr,
abf0: 20 73 69 7a 65 2c 20 26 73 69 7a 65 29 29 20 7b   size, &size)) {
ac00: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
ac10: 20 45 72 72 6f 72 20 67 65 74 74 69 6e 67 20 6f   Error getting o
ac20: 77 6e 65 72 20 53 44 0a 09 20 20 20 20 20 2a 2f  wner SD..     */
ac30: 0a 0a 09 20 20 20 20 67 6f 74 6f 20 61 63 63 65  ...    goto acce
ac40: 73 73 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a  ssError;..}.../*
ac50: 0a 09 20 2a 20 41 73 20 6f 66 20 53 61 6d 62 61  .. * As of Samba
ac60: 20 33 2e 30 2e 32 33 20 28 31 30 2d 4a 75 6c 2d   3.0.23 (10-Jul-
ac70: 32 30 30 36 29 2c 20 75 6e 6d 61 70 70 65 64 20  2006), unmapped 
ac80: 75 73 65 72 73 20 61 6e 64 20 67 72 6f 75 70 73  users and groups
ac90: 20 61 72 65 0a 09 20 2a 20 61 73 73 69 67 6e 65   are.. * assigne
aca0: 64 20 74 6f 20 53 49 44 20 64 6f 6d 61 69 6e 73  d to SID domains
acb0: 20 53 2d 31 2d 32 32 2d 31 20 61 6e 64 20 53 2d   S-1-22-1 and S-
acc0: 31 2d 32 32 2d 32 2c 20 77 68 65 72 65 20 22 32  1-22-2, where "2
acd0: 32 22 20 69 73 20 74 68 65 0a 09 20 2a 20 74 6f  2" is the.. * to
ace0: 70 2d 6c 65 76 65 6c 20 61 75 74 68 6f 72 69 74  p-level authorit
acf0: 79 2e 09 20 49 66 20 74 68 65 20 66 69 6c 65 20  y.. If the file 
ad00: 6f 77 6e 65 72 20 61 6e 64 20 67 72 6f 75 70 20  owner and group 
ad10: 69 73 20 75 6e 6d 61 70 70 65 64 20 74 68 65 6e  is unmapped then
ad20: 0a 09 20 2a 20 74 68 65 20 41 43 4c 20 61 63 63  .. * the ACL acc
ad30: 65 73 73 20 63 68 65 63 6b 20 62 65 6c 6f 77 20  ess check below 
ad40: 77 69 6c 6c 20 6f 6e 6c 79 20 74 65 73 74 20 61  will only test a
ad50: 67 61 69 6e 73 74 20 77 6f 72 6c 64 20 61 63 63  gainst world acc
ad60: 65 73 73 2c 0a 09 20 2a 20 77 68 69 63 68 20 69  ess,.. * which i
ad70: 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 6d  s likely to be m
ad80: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
ad90: 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20  than the actual 
ada0: 61 63 63 65 73 73 0a 09 20 2a 20 72 65 73 74 72  access.. * restr
adb0: 69 63 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20  ictions.  Since 
adc0: 74 68 65 20 41 43 4c 20 74 65 73 74 73 20 61 72  the ACL tests ar
add0: 65 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 77 72  e more likely wr
ade0: 6f 6e 67 20 74 68 61 6e 0a 09 20 2a 20 72 69 67  ong than.. * rig
adf0: 68 74 2c 20 73 6b 69 70 20 74 68 65 6d 2e 20 20  ht, skip them.  
ae00: 4d 6f 72 65 6f 76 65 72 2c 20 74 68 65 20 75 6e  Moreover, the un
ae10: 69 78 20 6f 77 6e 65 72 20 61 63 63 65 73 73 20  ix owner access 
ae20: 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 72 65 0a  permissions are.
ae30: 09 20 2a 20 75 73 75 61 6c 6c 79 20 6d 61 70 70  . * usually mapp
ae40: 65 64 20 74 6f 20 74 68 65 20 57 69 6e 64 6f 77  ed to the Window
ae50: 73 20 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f  s attributes, so
ae60: 20 69 66 20 74 68 65 20 75 73 65 72 20 69 73 20   if the user is 
ae70: 74 68 65 0a 09 20 2a 20 66 69 6c 65 20 6f 77 6e  the.. * file own
ae80: 65 72 20 74 68 65 6e 20 74 68 65 20 61 74 74 72  er then the attr
ae90: 69 62 20 63 68 65 63 6b 73 20 61 62 6f 76 65 20  ib checks above 
aea0: 61 72 65 20 63 6f 72 72 65 63 74 20 28 61 73 20  are correct (as 
aeb0: 66 61 72 20 61 73 20 74 68 65 79 0a 09 20 2a 20  far as they.. * 
aec0: 67 6f 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 28 21  go)... */...if(!
aed0: 47 65 74 53 65 63 75 72 69 74 79 44 65 73 63 72  GetSecurityDescr
aee0: 69 70 74 6f 72 4f 77 6e 65 72 28 73 64 50 74 72  iptorOwner(sdPtr
aef0: 2c 26 70 53 69 64 2c 26 53 69 64 44 65 66 61 75  ,&pSid,&SidDefau
af00: 6c 74 65 64 29 20 7c 7c 0a 09 20 20 20 6d 65 6d  lted) ||..   mem
af10: 63 6d 70 28 47 65 74 53 69 64 49 64 65 6e 74 69  cmp(GetSidIdenti
af20: 66 69 65 72 41 75 74 68 6f 72 69 74 79 28 70 53  fierAuthority(pS
af30: 69 64 29 2c 26 73 61 6d 62 61 5f 75 6e 6d 61 70  id),&samba_unmap
af40: 70 65 64 2c 0a 09 09 20 20 73 69 7a 65 6f 66 28  ped,...  sizeof(
af50: 53 49 44 5f 49 44 45 4e 54 49 46 49 45 52 5f 41  SID_IDENTIFIER_A
af60: 55 54 48 4f 52 49 54 59 29 29 3d 3d 30 29 20 7b  UTHORITY))==0) {
af70: 0a 09 20 20 20 20 48 65 61 70 46 72 65 65 28 47  ..    HeapFree(G
af80: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c  etProcessHeap(),
af90: 20 30 2c 20 73 64 50 74 72 29 3b 0a 09 20 20 20   0, sdPtr);..   
afa0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 41 74   return 0; /* At
afb0: 74 72 69 62 20 74 65 73 74 73 20 73 61 79 20 61  trib tests say a
afc0: 63 63 65 73 73 20 61 6c 6c 6f 77 65 64 2e 20 2a  ccess allowed. *
afd0: 2f 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65  /..}.../*.. * Pe
afe0: 72 66 6f 72 6d 20 73 65 63 75 72 69 74 79 20 69  rform security i
aff0: 6d 70 65 72 73 6f 6e 61 74 69 6f 6e 20 6f 66 20  mpersonation of 
b000: 74 68 65 20 75 73 65 72 20 61 6e 64 20 6f 70 65  the user and ope
b010: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
b020: 09 20 2a 20 74 68 72 65 61 64 20 74 6f 6b 65 6e  . * thread token
b030: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 49 6d  ... */...if (!Im
b040: 70 65 72 73 6f 6e 61 74 65 53 65 6c 66 28 53 65  personateSelf(Se
b050: 63 75 72 69 74 79 49 6d 70 65 72 73 6f 6e 61 74  curityImpersonat
b060: 69 6f 6e 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a  ion)) {..    /*.
b070: 09 20 20 20 20 20 2a 20 55 6e 61 62 6c 65 20 74  .     * Unable t
b080: 6f 20 70 65 72 66 6f 72 6d 20 73 65 63 75 72 69  o perform securi
b090: 74 79 20 69 6d 70 65 72 73 6f 6e 61 74 69 6f 6e  ty impersonation
b0a0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
b0b0: 20 67 6f 74 6f 20 61 63 63 65 73 73 45 72 72 6f   goto accessErro
b0c0: 72 3b 0a 09 7d 0a 09 69 66 20 28 21 4f 70 65 6e  r;..}..if (!Open
b0d0: 54 68 72 65 61 64 54 6f 6b 65 6e 28 47 65 74 43  ThreadToken(GetC
b0e0: 75 72 72 65 6e 74 54 68 72 65 61 64 28 29 2c 0a  urrentThread(),.
b0f0: 09 09 54 4f 4b 45 4e 5f 44 55 50 4c 49 43 41 54  ..TOKEN_DUPLICAT
b100: 45 20 7c 20 54 4f 4b 45 4e 5f 51 55 45 52 59 2c  E | TOKEN_QUERY,
b110: 20 46 41 4c 53 45 2c 20 26 68 54 6f 6b 65 6e 29   FALSE, &hToken)
b120: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  ) {..    /*..   
b130: 20 20 2a 20 55 6e 61 62 6c 65 20 74 6f 20 67 65    * Unable to ge
b140: 74 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  t current thread
b150: 27 73 20 74 6f 6b 65 6e 2e 0a 09 20 20 20 20 20  's token...     
b160: 2a 2f 0a 0a 09 20 20 20 20 67 6f 74 6f 20 61 63  */...    goto ac
b170: 63 65 73 73 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09  cessError;..}...
b180: 52 65 76 65 72 74 54 6f 53 65 6c 66 28 29 3b 0a  RevertToSelf();.
b190: 0a 09 2f 2a 0a 09 20 2a 20 53 65 74 75 70 20 64  ../*.. * Setup d
b1a0: 65 73 69 72 65 64 41 63 63 65 73 73 20 61 63 63  esiredAccess acc
b1b0: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 61 63  ording to the ac
b1c0: 63 65 73 73 20 70 72 69 76 69 6c 65 67 65 73 20  cess privileges 
b1d0: 77 65 20 61 72 65 0a 09 20 2a 20 63 68 65 63 6b  we are.. * check
b1e0: 69 6e 67 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  ing... */...if (
b1f0: 6d 6f 64 65 20 26 20 52 5f 4f 4b 29 20 7b 0a 09  mode & R_OK) {..
b200: 20 20 20 20 64 65 73 69 72 65 64 41 63 63 65 73      desiredAcces
b210: 73 20 7c 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49  s |= FILE_GENERI
b220: 43 5f 52 45 41 44 3b 0a 09 7d 0a 09 69 66 20 28  C_READ;..}..if (
b230: 6d 6f 64 65 20 26 20 57 5f 4f 4b 29 20 7b 0a 09  mode & W_OK) {..
b240: 20 20 20 20 64 65 73 69 72 65 64 41 63 63 65 73      desiredAcces
b250: 73 20 7c 3d 20 46 49 4c 45 5f 47 45 4e 45 52 49  s |= FILE_GENERI
b260: 43 5f 57 52 49 54 45 3b 0a 09 7d 0a 09 69 66 20  C_WRITE;..}..if 
b270: 28 6d 6f 64 65 20 26 20 58 5f 4f 4b 29 20 7b 0a  (mode & X_OK) {.
b280: 09 20 20 20 20 64 65 73 69 72 65 64 41 63 63 65  .    desiredAcce
b290: 73 73 20 7c 3d 20 46 49 4c 45 5f 47 45 4e 45 52  ss |= FILE_GENER
b2a0: 49 43 5f 45 58 45 43 55 54 45 3b 0a 09 7d 0a 0a  IC_EXECUTE;..}..
b2b0: 09 6d 65 6d 73 65 74 28 26 67 65 6e 4d 61 70 2c  .memset(&genMap,
b2c0: 20 30 78 30 2c 20 73 69 7a 65 6f 66 28 47 45 4e   0x0, sizeof(GEN
b2d0: 45 52 49 43 5f 4d 41 50 50 49 4e 47 29 29 3b 0a  ERIC_MAPPING));.
b2e0: 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72 69 63 52  .genMap.GenericR
b2f0: 65 61 64 20 3d 20 46 49 4c 45 5f 47 45 4e 45 52  ead = FILE_GENER
b300: 49 43 5f 52 45 41 44 3b 0a 09 67 65 6e 4d 61 70  IC_READ;..genMap
b310: 2e 47 65 6e 65 72 69 63 57 72 69 74 65 20 3d 20  .GenericWrite = 
b320: 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 57 52 49  FILE_GENERIC_WRI
b330: 54 45 3b 0a 09 67 65 6e 4d 61 70 2e 47 65 6e 65  TE;..genMap.Gene
b340: 72 69 63 45 78 65 63 75 74 65 20 3d 20 46 49 4c  ricExecute = FIL
b350: 45 5f 47 45 4e 45 52 49 43 5f 45 58 45 43 55 54  E_GENERIC_EXECUT
b360: 45 3b 0a 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72  E;..genMap.Gener
b370: 69 63 41 6c 6c 20 3d 20 46 49 4c 45 5f 41 4c 4c  icAll = FILE_ALL
b380: 5f 41 43 43 45 53 53 3b 0a 0a 09 2f 2a 0a 09 20  _ACCESS;.../*.. 
b390: 2a 20 50 65 72 66 6f 72 6d 20 61 63 63 65 73 73  * Perform access
b3a0: 20 63 68 65 63 6b 20 75 73 69 6e 67 20 74 68 65   check using the
b3b0: 20 74 6f 6b 65 6e 2e 0a 09 20 2a 2f 0a 0a 09 69   token... */...i
b3c0: 66 20 28 21 41 63 63 65 73 73 43 68 65 63 6b 28  f (!AccessCheck(
b3d0: 73 64 50 74 72 2c 20 68 54 6f 6b 65 6e 2c 20 64  sdPtr, hToken, d
b3e0: 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 09 09  esiredAccess,...
b3f0: 26 67 65 6e 4d 61 70 2c 20 26 70 72 69 76 53 65  &genMap, &privSe
b400: 74 2c 20 26 70 72 69 76 53 65 74 53 69 7a 65 2c  t, &privSetSize,
b410: 20 26 67 72 61 6e 74 65 64 41 63 63 65 73 73 2c   &grantedAccess,
b420: 0a 09 09 26 61 63 63 65 73 73 59 65 73 4e 6f 29  ...&accessYesNo)
b430: 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  ) {..    /*..   
b440: 20 20 2a 20 55 6e 61 62 6c 65 20 74 6f 20 70 65    * Unable to pe
b450: 72 66 6f 72 6d 20 61 63 63 65 73 73 20 63 68 65  rform access che
b460: 63 6b 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 61  ck...     */...a
b470: 63 63 65 73 73 45 72 72 6f 72 3a 0a 09 20 20 20  ccessError:..   
b480: 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45   Tcl_WinConvertE
b490: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f  rror(GetLastErro
b4a0: 72 28 29 29 3b 0a 09 20 20 20 20 69 66 20 28 73  r());..    if (s
b4b0: 64 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  dPtr != NULL) {.
b4c0: 09 09 48 65 61 70 46 72 65 65 28 47 65 74 50 72  ..HeapFree(GetPr
b4d0: 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20  ocessHeap(), 0, 
b4e0: 73 64 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09  sdPtr);..    }..
b4f0: 20 20 20 20 69 66 20 28 68 54 6f 6b 65 6e 20 21      if (hToken !
b500: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 6c 6f 73  = NULL) {...Clos
b510: 65 48 61 6e 64 6c 65 28 68 54 6f 6b 65 6e 29 3b  eHandle(hToken);
b520: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74  ..    }..    ret
b530: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a  urn -1;..}.../*.
b540: 09 20 2a 20 43 6c 65 61 6e 20 75 70 2e 0a 09 20  . * Clean up... 
b550: 2a 2f 0a 0a 09 48 65 61 70 46 72 65 65 28 47 65  */...HeapFree(Ge
b560: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20  tProcessHeap(), 
b570: 30 2c 20 73 64 50 74 72 29 3b 0a 09 43 6c 6f 73  0, sdPtr);..Clos
b580: 65 48 61 6e 64 6c 65 28 68 54 6f 6b 65 6e 29 3b  eHandle(hToken);
b590: 0a 09 69 66 20 28 21 61 63 63 65 73 73 59 65 73  ..if (!accessYes
b5a0: 4e 6f 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53  No) {..    Tcl_S
b5b0: 65 74 45 72 72 6e 6f 28 45 41 43 43 45 53 29 3b  etErrno(EACCES);
b5c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
b5d0: 0a 09 7d 0a 0a 20 20 20 20 7d 0a 20 20 20 20 72  ..}..    }.    r
b5e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a  eturn 0;.}.../*.
b5f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
b600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e  --------. *. * N
b640: 61 74 69 76 65 49 73 45 78 65 63 20 2d 2d 0a 20  ativeIsExec --. 
b650: 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e 65 73 20  *. *.Determines 
b660: 69 66 20 61 20 70 61 74 68 20 69 73 20 65 78 65  if a path is exe
b670: 63 75 74 61 62 6c 65 2e 20 4f 6e 20 77 69 6e 64  cutable. On wind
b680: 6f 77 73 20 74 68 69 73 20 69 73 20 73 69 6d 70  ows this is simp
b690: 6c 79 20 64 65 66 69 6e 65 64 0a 20 2a 09 62 79  ly defined. *.by
b6a0: 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61 74   whether the pat
b6b0: 68 20 65 6e 64 73 20 69 6e 20 61 20 73 74 61 6e  h ends in a stan
b6c0: 64 61 72 64 20 65 78 65 63 75 74 61 62 6c 65 20  dard executable 
b6d0: 65 78 74 65 6e 73 69 6f 6e 2e 0a 20 2a 0a 20 2a  extension.. *. *
b6e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 31 20 3d   Results:. *.1 =
b6f0: 20 65 78 65 63 75 74 61 62 6c 65 2c 20 30 20 3d   executable, 0 =
b700: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d   not.. *. *-----
b710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b750: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
b760: 74 0a 4e 61 74 69 76 65 49 73 45 78 65 63 28 0a  t.NativeIsExec(.
b770: 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20      const WCHAR 
b780: 2a 70 61 74 68 29 0a 7b 0a 20 20 20 20 69 6e 74  *path).{.    int
b790: 20 6c 65 6e 20 3d 20 77 63 73 6c 65 6e 28 70 61   len = wcslen(pa
b7a0: 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 28 6c 65  th);..    if (le
b7b0: 6e 20 3c 20 35 29 20 7b 0a 09 72 65 74 75 72 6e  n < 5) {..return
b7c0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
b7d0: 66 20 28 70 61 74 68 5b 6c 65 6e 2d 34 5d 20 21  f (path[len-4] !
b7e0: 3d 20 27 2e 27 29 20 7b 0a 09 72 65 74 75 72 6e  = '.') {..return
b7f0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   0;.    }..    p
b800: 61 74 68 20 2b 3d 20 6c 65 6e 2d 33 3b 0a 20 20  ath += len-3;.  
b810: 20 20 69 66 20 28 28 5f 77 63 73 69 63 6d 70 28    if ((_wcsicmp(
b820: 70 61 74 68 2c 20 4c 22 65 78 65 22 29 20 3d 3d  path, L"exe") ==
b830: 20 30 29 0a 09 20 20 20 20 7c 7c 20 28 5f 77 63   0)..    || (_wc
b840: 73 69 63 6d 70 28 70 61 74 68 2c 20 4c 22 63 6f  sicmp(path, L"co
b850: 6d 22 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 7c  m") == 0)..    |
b860: 7c 20 28 5f 77 63 73 69 63 6d 70 28 70 61 74 68  | (_wcsicmp(path
b870: 2c 20 4c 22 63 6d 64 22 29 20 3d 3d 20 30 29 0a  , L"cmd") == 0).
b880: 09 20 20 20 20 7c 7c 20 28 5f 77 63 73 69 63 6d  .    || (_wcsicm
b890: 70 28 70 61 74 68 2c 20 4c 22 62 61 74 22 29 20  p(path, L"bat") 
b8a0: 3d 3d 20 30 29 29 20 7b 0a 09 72 65 74 75 72 6e  == 0)) {..return
b8b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
b8c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 0;.}.../*. 
b8d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
b8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b910: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
b920: 6c 70 4f 62 6a 43 68 64 69 72 20 2d 2d 0a 20 2a  lpObjChdir --. *
b930: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
b940: 6e 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 6c  n replaces the l
b950: 69 62 72 61 72 79 20 76 65 72 73 69 6f 6e 20 6f  ibrary version o
b960: 66 20 63 68 64 69 72 28 29 2e 0a 20 2a 0a 20 2a  f chdir().. *. *
b970: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53 65 65   Results:. *.See
b980: 20 63 68 64 69 72 28 29 20 64 6f 63 75 6d 65 6e   chdir() documen
b990: 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69  tation.. *. * Si
b9a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
b9b0: 65 65 20 63 68 64 69 72 28 29 20 64 6f 63 75 6d  ee chdir() docum
b9c0: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d  entation.. *. *-
b9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba10: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
ba20: 63 6c 70 4f 62 6a 43 68 64 69 72 28 0a 20 20 20  clpObjChdir(.   
ba30: 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74   Tcl_Obj *pathPt
ba40: 72 29 09 2f 2a 20 50 61 74 68 20 74 6f 20 6e 65  r)./* Path to ne
ba50: 77 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  w working direct
ba60: 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  ory. */.{.    in
ba70: 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 63 6f  t result;.    co
ba80: 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76  nst WCHAR *nativ
ba90: 65 50 61 74 68 3b 0a 0a 20 20 20 20 6e 61 74 69  ePath;..    nati
baa0: 76 65 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20  vePath = (const 
bab0: 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 65  WCHAR *)Tcl_FSGe
bac0: 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68  tNativePath(path
bad0: 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 21  Ptr);..    if (!
bae0: 6e 61 74 69 76 65 50 61 74 68 29 20 7b 0a 09 72  nativePath) {..r
baf0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
bb00: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 53 65 74      result = Set
bb10: 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79  CurrentDirectory
bb20: 57 28 6e 61 74 69 76 65 50 61 74 68 29 3b 0a 0a  W(nativePath);..
bb30: 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d      if (result =
bb40: 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 57 69 6e 43  = 0) {..Tcl_WinC
bb50: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c  onvertError(GetL
bb60: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72 65  astError());..re
bb70: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
bb80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c     return 0;.}..
bb90: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
bbe0: 20 2a 20 54 63 6c 70 47 65 74 43 77 64 20 2d 2d   * TclpGetCwd --
bbf0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
bc00: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68  tion replaces th
bc10: 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 6f  e library versio
bc20: 6e 20 6f 66 20 67 65 74 63 77 64 28 29 2e 20 28  n of getcwd(). (
bc30: 4f 62 73 6f 6c 65 74 65 0a 20 2a 09 66 75 6e 63  Obsolete. *.func
bc40: 74 69 6f 6e 2c 20 6f 6e 6c 79 20 72 65 74 61 69  tion, only retai
bc50: 6e 65 64 20 66 6f 72 20 6f 6c 64 20 65 78 74 65  ned for old exte
bc60: 6e 73 69 6f 6e 73 20 77 68 69 63 68 20 6d 61 79  nsions which may
bc70: 20 63 61 6c 6c 20 69 74 0a 20 2a 09 64 69 72 65   call it. *.dire
bc80: 63 74 6c 79 29 2e 0a 20 2a 0a 20 2a 20 52 65 73  ctly).. *. * Res
bc90: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 73  ults:. *.The res
bca0: 75 6c 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ult is a pointer
bcb0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 73 70 65   to a string spe
bcc0: 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72 72  cifying the curr
bcd0: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2c 0a 20  ent directory,. 
bce0: 2a 09 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  *.or NULL if the
bcf0: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f   current directo
bd00: 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ry could not be 
bd10: 64 65 74 65 72 6d 69 6e 65 64 2e 20 49 66 20 4e  determined. If N
bd20: 55 4c 4c 20 69 73 0a 20 2a 09 72 65 74 75 72 6e  ULL is. *.return
bd30: 65 64 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ed, an error mes
bd40: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
bd50: 74 68 65 20 69 6e 74 65 72 70 27 73 20 72 65 73  the interp's res
bd60: 75 6c 74 2e 20 53 74 6f 72 61 67 65 20 66 6f 72  ult. Storage for
bd70: 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74 20 73  . *.the result s
bd80: 74 72 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  tring is allocat
bd90: 65 64 20 69 6e 20 62 75 66 66 65 72 50 74 72 3b  ed in bufferPtr;
bda0: 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
bdb0: 20 63 61 6c 6c 0a 20 2a 09 54 63 6c 5f 44 53 74   call. *.Tcl_DSt
bdc0: 72 69 6e 67 46 72 65 65 28 29 20 77 68 65 6e 20  ringFree() when 
bdd0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
bde0: 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a   longer needed..
bdf0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
be00: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
be10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 6f  --------. */..co
be60: 6e 73 74 20 63 68 61 72 20 2a 0a 54 63 6c 70 47  nst char *.TclpG
be70: 65 74 43 77 64 28 0a 20 20 20 20 54 63 6c 5f 49  etCwd(.    Tcl_I
be80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
be90: 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  /* If non-NULL, 
bea0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 72  used for error r
beb0: 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  eporting. */.   
bec0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 62 75   Tcl_DString *bu
bed0: 66 66 65 72 50 74 72 29 09 2f 2a 20 55 6e 69 6e  fferPtr)./* Unin
bee0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 66 72 65  itialized or fre
bef0: 65 20 44 53 74 72 69 6e 67 20 66 69 6c 6c 65 64  e DString filled
bf00: 20 77 69 74 68 0a 09 09 09 09 20 2a 20 6e 61 6d   with..... * nam
bf10: 65 20 6f 66 20 63 75 72 72 65 6e 74 20 64 69 72  e of current dir
bf20: 65 63 74 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 20  ectory. */.{.   
bf30: 20 57 43 48 41 52 20 62 75 66 66 65 72 5b 4d 41   WCHAR buffer[MA
bf40: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 63 68 61  X_PATH];.    cha
bf50: 72 20 2a 70 3b 0a 20 20 20 20 57 43 48 41 52 20  r *p;.    WCHAR 
bf60: 2a 6e 61 74 69 76 65 3b 0a 0a 20 20 20 20 69 66  *native;..    if
bf70: 20 28 47 65 74 43 75 72 72 65 6e 74 44 69 72 65   (GetCurrentDire
bf80: 63 74 6f 72 79 57 28 4d 41 58 5f 50 41 54 48 2c  ctoryW(MAX_PATH,
bf90: 20 62 75 66 66 65 72 29 20 3d 3d 20 30 29 20 7b   buffer) == 0) {
bfa0: 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74  ..Tcl_WinConvert
bfb0: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72  Error(GetLastErr
bfc0: 6f 72 28 29 29 3b 0a 09 69 66 20 28 69 6e 74 65  or());..if (inte
bfd0: 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  rp != NULL) {.. 
bfe0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
bff0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
c000: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20  ObjPrintf(...   
c010: 20 22 65 72 72 6f 72 20 67 65 74 74 69 6e 67 20   "error getting 
c020: 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
c030: 79 20 6e 61 6d 65 3a 20 25 73 22 2c 0a 09 09 20  y name: %s",... 
c040: 20 20 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f     Tcl_PosixErro
c050: 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09 7d 0a  r(interp)));..}.
c060: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
c070: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
c080: 20 2a 20 57 61 74 63 68 20 66 6f 72 20 74 68 65   * Watch for the
c090: 20 77 65 69 72 64 20 57 69 6e 64 6f 77 73 20 63   weird Windows c
c0a0: 3a 5c 5c 55 4e 43 20 73 79 6e 74 61 78 2e 0a 20  :\\UNC syntax.. 
c0b0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6e 61 74 69      */..    nati
c0c0: 76 65 20 3d 20 28 57 43 48 41 52 20 2a 29 20 62  ve = (WCHAR *) b
c0d0: 75 66 66 65 72 3b 0a 20 20 20 20 69 66 20 28 28  uffer;.    if ((
c0e0: 6e 61 74 69 76 65 5b 30 5d 20 21 3d 20 27 5c 30  native[0] != '\0
c0f0: 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b 31 5d  ') && (native[1]
c100: 20 3d 3d 20 27 3a 27 29 0a 09 20 20 20 20 26 26   == ':')..    &&
c110: 20 28 6e 61 74 69 76 65 5b 32 5d 20 3d 3d 20 27   (native[2] == '
c120: 5c 5c 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b  \\') && (native[
c130: 33 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09  3] == '\\')) {..
c140: 6e 61 74 69 76 65 20 2b 3d 20 32 3b 0a 20 20 20  native += 2;.   
c150: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69   }.    Tcl_DStri
c160: 6e 67 49 6e 69 74 28 62 75 66 66 65 72 50 74 72  ngInit(bufferPtr
c170: 29 3b 0a 20 20 20 20 54 63 6c 5f 57 43 68 61 72  );.    Tcl_WChar
c180: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 6e 61 74  ToUtfDString(nat
c190: 69 76 65 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e  ive, TCL_INDEX_N
c1a0: 4f 4e 45 2c 20 62 75 66 66 65 72 50 74 72 29 3b  ONE, bufferPtr);
c1b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
c1c0: 43 6f 6e 76 65 72 74 20 74 6f 20 66 6f 72 77 61  Convert to forwa
c1d0: 72 64 20 73 6c 61 73 68 65 73 20 66 6f 72 20 65  rd slashes for e
c1e0: 61 73 69 65 72 20 75 73 65 20 69 6e 20 73 63 72  asier use in scr
c1f0: 69 70 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ipts..     */.. 
c200: 20 20 20 66 6f 72 20 28 70 20 3d 20 54 63 6c 5f     for (p = Tcl_
c210: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 62 75 66  DStringValue(buf
c220: 66 65 72 50 74 72 29 3b 20 2a 70 20 21 3d 20 27  ferPtr); *p != '
c230: 5c 30 27 3b 20 70 2b 2b 29 20 7b 0a 09 69 66 20  \0'; p++) {..if 
c240: 28 2a 70 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09  (*p == '\\') {..
c250: 20 20 20 20 2a 70 20 3d 20 27 2f 27 3b 0a 09 7d      *p = '/';..}
c260: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
c270: 6e 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  n Tcl_DStringVal
c280: 75 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a 7d  ue(bufferPtr);.}
c290: 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 53 74  ...int.TclpObjSt
c2a0: 61 74 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  at(.    Tcl_Obj 
c2b0: 2a 70 61 74 68 50 74 72 2c 09 09 2f 2a 20 50 61  *pathPtr,../* Pa
c2c0: 74 68 20 6f 66 20 66 69 6c 65 20 74 6f 20 73 74  th of file to st
c2d0: 61 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53  at. */.    Tcl_S
c2e0: 74 61 74 42 75 66 20 2a 73 74 61 74 50 74 72 29  tatBuf *statPtr)
c2f0: 09 2f 2a 20 46 69 6c 6c 65 64 20 77 69 74 68 20  ./* Filled with 
c300: 72 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 20  results of stat 
c310: 63 61 6c 6c 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f  call. */.{.    /
c320: 2a 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20  *.     * Ensure 
c330: 63 6f 72 72 65 63 74 20 66 69 6c 65 20 73 69 7a  correct file siz
c340: 65 73 20 62 79 20 66 6f 72 63 69 6e 67 20 74 68  es by forcing th
c350: 65 20 4f 53 20 74 6f 20 77 72 69 74 65 20 61 6e  e OS to write an
c360: 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61 0a 20  y pending data. 
c370: 20 20 20 20 2a 20 74 6f 20 64 69 73 6b 2e 20 54      * to disk. T
c380: 68 69 73 20 69 73 20 64 6f 6e 65 20 6f 6e 6c 79  his is done only
c390: 20 66 6f 72 20 63 68 61 6e 6e 65 6c 73 20 77 68   for channels wh
c3a0: 69 63 68 20 61 72 65 20 64 69 72 74 79 2c 20 69  ich are dirty, i
c3b0: 2e 65 2e 20 68 61 76 65 20 62 65 65 6e 0a 20 20  .e. have been.  
c3c0: 20 20 20 2a 20 77 72 69 74 74 65 6e 20 74 6f 20     * written to 
c3d0: 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 66  since the last f
c3e0: 6c 75 73 68 20 68 65 72 65 2e 0a 20 20 20 20 20  lush here..     
c3f0: 2a 2f 0a 0a 20 20 20 20 54 63 6c 57 69 6e 46 6c  */..    TclWinFl
c400: 75 73 68 44 69 72 74 79 43 68 61 6e 6e 65 6c 73  ushDirtyChannels
c410: 28 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  ();..    return 
c420: 4e 61 74 69 76 65 53 74 61 74 28 28 63 6f 6e 73  NativeStat((cons
c430: 74 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53  t WCHAR *)Tcl_FS
c440: 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61  GetNativePath(pa
c450: 74 68 50 74 72 29 2c 20 73 74 61 74 50 74 72 2c  thPtr), statPtr,
c460: 20 30 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d   0);.}.../*. *--
c470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76  ----. *. * Nativ
c4c0: 65 53 74 61 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54  eStat --. *. *.T
c4d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
c4e0: 6c 61 63 65 73 20 74 68 65 20 6c 69 62 72 61 72  laces the librar
c4f0: 79 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 61  y version of sta
c500: 74 28 29 2c 20 66 69 78 69 6e 67 20 74 68 65 0a  t(), fixing the.
c510: 20 2a 09 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 67   *.following bug
c520: 73 3a 0a 20 2a 0a 20 2a 09 31 2e 20 73 74 61 74  s:. *. *.1. stat
c530: 28 22 63 3a 22 29 20 72 65 74 75 72 6e 73 20 61  ("c:") returns a
c540: 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 32 2e 20 42  n error.. *.2. B
c550: 6f 72 6c 61 6e 64 20 73 74 61 74 28 29 20 72 65  orland stat() re
c560: 74 75 72 6e 20 74 69 6d 65 20 69 6e 20 47 4d 54  turn time in GMT
c570: 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 6f 63 61   instead of loca
c580: 6c 74 69 6d 65 2e 0a 20 2a 09 33 2e 20 73 74 61  ltime.. *.3. sta
c590: 74 28 22 5c 5c 73 65 72 76 65 72 5c 6d 6f 75 6e  t("\\server\moun
c5a0: 74 22 29 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  t") would return
c5b0: 20 65 72 72 6f 72 2e 0a 20 2a 09 34 2e 20 41 63   error.. *.4. Ac
c5c0: 63 65 70 74 73 20 73 6c 61 73 68 65 73 20 6f 72  cepts slashes or
c5d0: 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0a 20 2a   backslashes.. *
c5e0: 09 35 2e 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .5. st_dev and s
c5f0: 74 5f 72 64 65 76 20 77 65 72 65 20 77 72 6f 6e  t_rdev were wron
c600: 67 20 66 6f 72 20 55 4e 43 20 70 61 74 68 73 2e  g for UNC paths.
c610: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
c620: 20 2a 09 53 65 65 20 73 74 61 74 20 64 6f 63 75   *.See stat docu
c630: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  mentation.. *. *
c640: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
c650: 2a 09 53 65 65 20 73 74 61 74 20 64 6f 63 75 6d  *.See stat docum
c660: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d  entation.. *. *-
c670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
c6c0: 63 20 69 6e 74 0a 4e 61 74 69 76 65 53 74 61 74  c int.NativeStat
c6d0: 28 0a 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41  (.    const WCHA
c6e0: 52 20 2a 6e 61 74 69 76 65 50 61 74 68 2c 09 2f  R *nativePath,./
c6f0: 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 74  * Path of file t
c700: 6f 20 73 74 61 74 20 2a 2f 0a 20 20 20 20 54 63  o stat */.    Tc
c710: 6c 5f 53 74 61 74 42 75 66 20 2a 73 74 61 74 50  l_StatBuf *statP
c720: 74 72 2c 09 2f 2a 20 46 69 6c 6c 65 64 20 77 69  tr,./* Filled wi
c730: 74 68 20 72 65 73 75 6c 74 73 20 6f 66 20 73 74  th results of st
c740: 61 74 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20  at call. */.    
c750: 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 29 09  int checkLinks).
c760: 09 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c  ./* If non-zero,
c770: 20 62 65 68 61 76 65 20 6c 69 6b 65 20 27 6c 73   behave like 'ls
c780: 74 61 74 27 20 2a 2f 0a 7b 0a 20 20 20 20 44 57  tat' */.{.    DW
c790: 4f 52 44 20 61 74 74 72 3b 0a 20 20 20 20 69 6e  ORD attr;.    in
c7a0: 74 20 64 65 76 2c 20 6e 6c 69 6e 6b 20 3d 20 31  t dev, nlink = 1
c7b0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 73  ;.    unsigned s
c7c0: 68 6f 72 74 20 6d 6f 64 65 3b 0a 20 20 20 20 75  hort mode;.    u
c7d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6f 64  nsigned int inod
c7e0: 65 20 3d 20 30 3b 0a 20 20 20 20 48 41 4e 44 4c  e = 0;.    HANDL
c7f0: 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b 0a 20 20  E fileHandle;.  
c800: 20 20 44 57 4f 52 44 20 66 69 6c 65 54 79 70 65    DWORD fileType
c810: 20 3d 20 46 49 4c 45 5f 54 59 50 45 5f 55 4e 4b   = FILE_TYPE_UNK
c820: 4e 4f 57 4e 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NOWN;..    /*.  
c830: 20 20 20 2a 20 49 66 20 77 65 20 63 61 6e 20 75     * If we can u
c840: 73 65 20 27 63 72 65 61 74 65 46 69 6c 65 27 20  se 'createFile' 
c850: 6f 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 77 65  on this, then we
c860: 20 63 61 6e 20 75 73 65 20 74 68 65 20 72 65 73   can use the res
c870: 75 6c 74 69 6e 67 0a 20 20 20 20 20 2a 20 66 69  ulting.     * fi
c880: 6c 65 48 61 6e 64 6c 65 20 74 6f 20 72 65 61 64  leHandle to read
c890: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
c8a0: 6e 20 28 6e 6c 69 6e 6b 2c 20 69 6e 6f 29 20 74  n (nlink, ino) t
c8b0: 68 61 6e 20 77 65 20 63 61 6e 20 67 65 74 20 66  han we can get f
c8c0: 72 6f 6d 0a 20 20 20 20 20 2a 20 6f 74 68 65 72  rom.     * other
c8d0: 20 61 74 74 72 69 62 75 74 65 73 20 72 65 61 64   attributes read
c8e0: 69 6e 67 20 41 50 49 73 2e 20 49 66 20 6e 6f 74  ing APIs. If not
c8f0: 2c 20 74 68 65 6e 20 77 65 20 74 72 79 20 74 6f  , then we try to
c900: 20 66 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 74 68   fall back on th
c910: 65 0a 20 20 20 20 20 2a 20 27 67 65 74 46 69 6c  e.     * 'getFil
c920: 65 41 74 74 72 69 62 75 74 65 73 45 78 50 72 6f  eAttributesExPro
c930: 63 27 2c 20 61 6e 64 20 69 66 20 74 68 61 74 20  c', and if that 
c940: 69 73 6e 27 74 20 61 76 61 69 6c 61 62 6c 65 2c  isn't available,
c950: 20 74 68 65 6e 20 6f 6e 20 65 76 65 6e 0a 20 20   then on even.  
c960: 20 20 20 2a 20 73 69 6d 70 6c 65 72 20 72 6f 75     * simpler rou
c970: 74 69 6e 65 73 2e 0a 20 20 20 20 20 2a 0a 20 20  tines..     *.  
c980: 20 20 20 2a 20 53 70 65 63 69 61 6c 20 63 6f 6e     * Special con
c990: 73 69 64 65 72 61 74 69 6f 6e 20 6d 75 73 74 20  sideration must 
c9a0: 62 65 20 67 69 76 65 6e 20 74 6f 20 57 69 6e 64  be given to Wind
c9b0: 6f 77 73 20 68 61 72 64 2d 63 6f 64 65 64 20 6e  ows hard-coded n
c9c0: 61 6d 65 73 20 6c 69 6b 65 0a 20 20 20 20 20 2a  ames like.     *
c9d0: 20 43 4f 4e 2c 20 4e 55 4c 4c 2c 20 43 4f 4d 31   CON, NULL, COM1
c9e0: 2c 20 4c 50 54 31 20 65 74 63 2e 20 46 6f 72 20  , LPT1 etc. For 
c9f0: 74 68 65 73 65 2c 20 77 65 20 73 74 69 6c 6c 20  these, we still 
ca00: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 65 0a 20  need to do the. 
ca10: 20 20 20 20 2a 20 43 72 65 61 74 65 46 69 6c 65      * CreateFile
ca20: 20 61 73 20 73 6f 6d 65 20 6d 61 79 20 6e 6f 74   as some may not
ca30: 20 65 78 69 73 74 20 28 65 2e 67 2e 20 74 68 65   exist (e.g. the
ca40: 72 65 20 69 73 20 6e 6f 20 43 4f 4e 20 69 6e 20  re is no CON in 
ca50: 77 69 73 68 20 62 79 0a 20 20 20 20 20 2a 20 64  wish by.     * d
ca60: 65 66 61 75 6c 74 29 2e 20 48 6f 77 65 76 65 72  efault). However
ca70: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
ca80: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
ca90: 6f 6e 42 79 48 61 6e 64 6c 65 20 77 69 6c 6c 0a  onByHandle will.
caa0: 20 20 20 20 20 2a 20 66 61 69 6c 2e 20 57 65 20       * fail. We 
cab0: 64 6f 20 61 20 57 69 6e 49 73 52 65 73 65 72 76  do a WinIsReserv
cac0: 65 64 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ed to see if it 
cad0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  is one of the sp
cae0: 65 63 69 61 6c 20 6e 61 6d 65 73 2c 0a 20 20 20  ecial names,.   
caf0: 20 20 2a 20 61 6e 64 20 69 66 20 73 75 63 63 65    * and if succe
cb00: 73 73 66 75 6c 2c 20 6d 6f 63 6b 20 75 70 20 61  ssful, mock up a
cb10: 20 42 59 5f 48 41 4e 44 4c 45 5f 46 49 4c 45 5f   BY_HANDLE_FILE_
cb20: 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 73 74 72 75  INFORMATION stru
cb30: 63 74 75 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a  cture..     */..
cb40: 20 20 20 20 66 69 6c 65 48 61 6e 64 6c 65 20 3d      fileHandle =
cb50: 20 43 72 65 61 74 65 46 69 6c 65 57 28 6e 61 74   CreateFileW(nat
cb60: 69 76 65 50 61 74 68 2c 20 47 45 4e 45 52 49 43  ivePath, GENERIC
cb70: 5f 52 45 41 44 2c 0a 09 20 20 20 20 46 49 4c 45  _READ,..    FILE
cb80: 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
cb90: 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 20 7c  LE_SHARE_WRITE |
cba0: 20 46 49 4c 45 5f 53 48 41 52 45 5f 44 45 4c 45   FILE_SHARE_DELE
cbb0: 54 45 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 4f  TE,..    NULL, O
cbc0: 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 20  PEN_EXISTING,.. 
cbd0: 20 20 20 46 49 4c 45 5f 46 4c 41 47 5f 42 41 43     FILE_FLAG_BAC
cbe0: 4b 55 50 5f 53 45 4d 41 4e 54 49 43 53 20 7c 20  KUP_SEMANTICS | 
cbf0: 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52  FILE_FLAG_OPEN_R
cc00: 45 50 41 52 53 45 5f 50 4f 49 4e 54 2c 20 4e 55  EPARSE_POINT, NU
cc10: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 66 69  LL);..    if (fi
cc20: 6c 65 48 61 6e 64 6c 65 20 21 3d 20 49 4e 56 41  leHandle != INVA
cc30: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
cc40: 29 20 7b 0a 09 42 59 5f 48 41 4e 44 4c 45 5f 46  ) {..BY_HANDLE_F
cc50: 49 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20  ILE_INFORMATION 
cc60: 64 61 74 61 3b 0a 0a 09 69 66 20 28 47 65 74 46  data;...if (GetF
cc70: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
cc80: 48 61 6e 64 6c 65 28 66 69 6c 65 48 61 6e 64 6c  Handle(fileHandl
cc90: 65 2c 26 64 61 74 61 29 20 21 3d 20 54 52 55 45  e,&data) != TRUE
cca0: 29 20 7b 0a 09 20 20 20 20 66 69 6c 65 54 79 70  ) {..    fileTyp
ccb0: 65 20 3d 20 47 65 74 46 69 6c 65 54 79 70 65 28  e = GetFileType(
ccc0: 66 69 6c 65 48 61 6e 64 6c 65 29 3b 0a 09 20 20  fileHandle);..  
ccd0: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 66 69    CloseHandle(fi
cce0: 6c 65 48 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20  leHandle);..    
ccf0: 69 66 20 28 66 69 6c 65 54 79 70 65 20 21 3d 20  if (fileType != 
cd00: 46 49 4c 45 5f 54 59 50 45 5f 43 48 41 52 20 26  FILE_TYPE_CHAR &
cd10: 26 20 66 69 6c 65 54 79 70 65 20 21 3d 20 46 49  & fileType != FI
cd20: 4c 45 5f 54 59 50 45 5f 44 49 53 4b 29 20 7b 0a  LE_TYPE_DISK) {.
cd30: 09 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45  ..Tcl_SetErrno(E
cd40: 4e 4f 45 4e 54 29 3b 0a 09 09 72 65 74 75 72 6e  NOENT);...return
cd50: 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20   -1;..    }...  
cd60: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 6f 63    /*..     * Moc
cd70: 6b 20 75 70 20 74 68 65 20 65 78 70 65 63 74 65  k up the expecte
cd80: 64 20 73 74 72 75 63 74 75 72 65 0a 09 20 20 20  d structure..   
cd90: 20 20 2a 2f 0a 0a 09 20 20 20 20 6d 65 6d 73 65    */...    memse
cda0: 74 28 26 64 61 74 61 2c 20 30 2c 20 73 69 7a 65  t(&data, 0, size
cdb0: 6f 66 28 64 61 74 61 29 29 3b 0a 09 20 20 20 20  of(data));..    
cdc0: 73 74 61 74 50 74 72 2d 3e 73 74 5f 61 74 69 6d  statPtr->st_atim
cdd0: 65 20 3d 20 30 3b 0a 09 20 20 20 20 73 74 61 74  e = 0;..    stat
cde0: 50 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d 20  Ptr->st_mtime = 
cdf0: 30 3b 0a 09 20 20 20 20 73 74 61 74 50 74 72 2d  0;..    statPtr-
ce00: 3e 73 74 5f 63 74 69 6d 65 20 3d 20 30 3b 0a 09  >st_ctime = 0;..
ce10: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 43 6c  } else {..    Cl
ce20: 6f 73 65 48 61 6e 64 6c 65 28 66 69 6c 65 48 61  oseHandle(fileHa
ce30: 6e 64 6c 65 29 3b 0a 09 20 20 20 20 73 74 61 74  ndle);..    stat
ce40: 50 74 72 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20  Ptr->st_atime = 
ce50: 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 4c  ToCTime(data.ftL
ce60: 61 73 74 41 63 63 65 73 73 54 69 6d 65 29 3b 0a  astAccessTime);.
ce70: 09 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74  .    statPtr->st
ce80: 5f 6d 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d 65  _mtime = ToCTime
ce90: 28 64 61 74 61 2e 66 74 4c 61 73 74 57 72 69 74  (data.ftLastWrit
cea0: 65 54 69 6d 65 29 3b 0a 09 20 20 20 20 73 74 61  eTime);..    sta
ceb0: 74 50 74 72 2d 3e 73 74 5f 63 74 69 6d 65 20 3d  tPtr->st_ctime =
cec0: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74   ToCTime(data.ft
ced0: 43 72 65 61 74 69 6f 6e 54 69 6d 65 29 3b 0a 09  CreationTime);..
cee0: 7d 0a 09 61 74 74 72 20 3d 20 64 61 74 61 2e 64  }..attr = data.d
cef0: 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
cf00: 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 73 69  ..statPtr->st_si
cf10: 7a 65 20 3d 20 28 28 6c 6f 6e 67 20 6c 6f 6e 67  ze = ((long long
cf20: 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  ) data.nFileSize
cf30: 4c 6f 77 29 20 7c 0a 09 09 28 28 28 6c 6f 6e 67  Low) |...(((long
cf40: 20 6c 6f 6e 67 29 20 64 61 74 61 2e 6e 46 69 6c   long) data.nFil
cf50: 65 53 69 7a 65 48 69 67 68 29 20 3c 3c 20 33 32  eSizeHigh) << 32
cf60: 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4f 6e 20 55  );.../*.. * On U
cf70: 6e 69 78 2c 20 66 6f 72 20 64 69 72 65 63 74 6f  nix, for directo
cf80: 72 69 65 73 2c 20 6e 6c 69 6e 6b 20 61 70 70 61  ries, nlink appa
cf90: 72 65 6e 74 6c 79 20 64 65 70 65 6e 64 73 20 6f  rently depends o
cfa0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
cfb0: 09 20 2a 20 66 69 6c 65 73 20 69 6e 20 74 68 65  . * files in the
cfc0: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 57 65 20   directory.  We 
cfd0: 63 6f 75 6c 64 20 63 61 6c 63 75 6c 61 74 65 20  could calculate 
cfe0: 74 68 61 74 2c 20 62 75 74 20 69 74 20 77 6f 75  that, but it wou
cff0: 6c 64 20 62 65 20 61 0a 09 20 2a 20 62 69 74 20  ld be a.. * bit 
d000: 6f 66 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  of a performance
d010: 20 70 65 6e 61 6c 74 79 2c 20 49 20 74 68 69 6e   penalty, I thin
d020: 6b 2e 20 48 65 6e 63 65 20 77 65 20 6a 75 73 74  k. Hence we just
d030: 20 75 73 65 20 77 68 61 74 0a 09 20 2a 20 57 69   use what.. * Wi
d040: 6e 64 6f 77 73 20 67 69 76 65 73 20 75 73 2c 20  ndows gives us, 
d050: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
d060: 65 20 61 73 20 55 6e 69 78 20 66 6f 72 20 66 69  e as Unix for fi
d070: 6c 65 73 2c 20 61 74 20 6c 65 61 73 74 2e 0a 09  les, at least...
d080: 20 2a 2f 0a 0a 09 6e 6c 69 6e 6b 20 3d 20 64 61   */...nlink = da
d090: 74 61 2e 6e 4e 75 6d 62 65 72 4f 66 4c 69 6e 6b  ta.nNumberOfLink
d0a0: 73 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 55 6e 66 6f  s;.../*.. * Unfo
d0b0: 72 74 75 6e 61 74 65 6c 79 20 6f 75 72 20 73 74  rtunately our st
d0c0: 61 74 20 64 65 66 69 6e 69 74 69 6f 6e 27 73 20  at definition's 
d0d0: 69 6e 6f 64 65 20 66 69 65 6c 64 20 28 75 6e 73  inode field (uns
d0e0: 69 67 6e 65 64 20 73 68 6f 72 74 29 0a 09 20 2a  igned short).. *
d0f0: 20 77 69 6c 6c 20 74 68 72 6f 77 20 61 77 61 79   will throw away
d100: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 70 72 65   most of the pre
d110: 63 69 73 69 6f 6e 20 77 65 20 68 61 76 65 20 68  cision we have h
d120: 65 72 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ere, which means
d130: 20 77 65 0a 09 20 2a 20 63 61 6e 27 74 20 72 65   we.. * can't re
d140: 6c 79 20 6f 6e 20 69 6e 6f 64 65 20 61 73 20 61  ly on inode as a
d150: 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69   unique identifi
d160: 65 72 20 6f 66 20 61 20 66 69 6c 65 2e 20 57 65  er of a file. We
d170: 27 64 20 72 65 61 6c 6c 79 0a 09 20 2a 20 6c 69  'd really.. * li
d180: 6b 65 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  ke to do somethi
d190: 6e 67 20 6c 69 6b 65 20 68 6f 77 20 77 65 20 68  ng like how we h
d1a0: 61 6e 64 6c 65 20 27 73 74 5f 73 69 7a 65 27 2e  andle 'st_size'.
d1b0: 0a 09 20 2a 2f 0a 0a 09 69 6e 6f 64 65 20 3d 20  .. */...inode = 
d1c0: 64 61 74 61 2e 6e 46 69 6c 65 49 6e 64 65 78 48  data.nFileIndexH
d1d0: 69 67 68 20 7c 20 64 61 74 61 2e 6e 46 69 6c 65  igh | data.nFile
d1e0: 49 6e 64 65 78 4c 6f 77 3b 0a 20 20 20 20 7d 20  IndexLow;.    } 
d1f0: 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 46  else {../*.. * F
d200: 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 74 68 65 20  all back on the 
d210: 6c 65 73 73 20 63 61 70 61 62 6c 65 20 72 6f 75  less capable rou
d220: 74 69 6e 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  tines. This mean
d230: 73 20 6e 6f 20 6e 6c 69 6e 6b 20 6f 72 20 69 6e  s no nlink or in
d240: 6f 2e 0a 09 20 2a 2f 0a 0a 09 57 49 4e 33 32 5f  o... */...WIN32_
d250: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
d260: 41 54 41 20 64 61 74 61 3b 0a 0a 09 69 66 20 28  ATA data;...if (
d270: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
d280: 73 45 78 57 28 6e 61 74 69 76 65 50 61 74 68 2c  sExW(nativePath,
d290: 0a 09 09 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  ...GetFileExInfo
d2a0: 53 74 61 6e 64 61 72 64 2c 20 26 64 61 74 61 29  Standard, &data)
d2b0: 20 21 3d 20 54 52 55 45 29 20 7b 0a 09 20 20 20   != TRUE) {..   
d2c0: 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 3b 0a 09   HANDLE hFind;..
d2d0: 20 20 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44      WIN32_FIND_D
d2e0: 41 54 41 57 20 66 66 64 3b 0a 09 20 20 20 20 44  ATAW ffd;..    D
d2f0: 57 4f 52 44 20 6c 61 73 74 65 72 72 6f 72 20 3d  WORD lasterror =
d300: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
d310: 0a 0a 09 20 20 20 20 69 66 20 28 6c 61 73 74 65  ...    if (laste
d320: 72 72 6f 72 20 21 3d 20 45 52 52 4f 52 5f 53 48  rror != ERROR_SH
d330: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
d340: 20 7b 0a 09 09 54 63 6c 5f 57 69 6e 43 6f 6e 76   {...Tcl_WinConv
d350: 65 72 74 45 72 72 6f 72 28 6c 61 73 74 65 72 72  ertError(lasterr
d360: 6f 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31  or);...return -1
d370: 3b 0a 09 09 7d 0a 09 20 20 20 20 68 46 69 6e 64  ;...}..    hFind
d380: 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65   = FindFirstFile
d390: 57 28 6e 61 74 69 76 65 50 61 74 68 2c 20 26 66  W(nativePath, &f
d3a0: 66 64 29 3b 0a 09 20 20 20 20 69 66 20 28 68 46  fd);..    if (hF
d3b0: 69 6e 64 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 48  ind == INVALID_H
d3c0: 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09  ANDLE_VALUE) {..
d3d0: 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45  .Tcl_WinConvertE
d3e0: 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f  rror(GetLastErro
d3f0: 72 28 29 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d  r());...return -
d400: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6d  1;..    }..    m
d410: 65 6d 63 70 79 28 26 64 61 74 61 2c 20 26 66 66  emcpy(&data, &ff
d420: 64 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  d, sizeof(data))
d430: 3b 0a 09 20 20 20 20 46 69 6e 64 43 6c 6f 73 65  ;..    FindClose
d440: 28 68 46 69 6e 64 29 3b 0a 09 7d 0a 0a 09 61 74  (hFind);..}...at
d450: 74 72 20 3d 20 64 61 74 61 2e 64 77 46 69 6c 65  tr = data.dwFile
d460: 41 74 74 72 69 62 75 74 65 73 3b 0a 0a 09 73 74  Attributes;...st
d470: 61 74 50 74 72 2d 3e 73 74 5f 73 69 7a 65 20 3d  atPtr->st_size =
d480: 20 28 28 6c 6f 6e 67 20 6c 6f 6e 67 29 20 64 61   ((long long) da
d490: 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 29  ta.nFileSizeLow)
d4a0: 20 7c 0a 09 09 28 28 28 6c 6f 6e 67 20 6c 6f 6e   |...(((long lon
d4b0: 67 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 7a  g) data.nFileSiz
d4c0: 65 48 69 67 68 29 20 3c 3c 20 33 32 29 3b 0a 09  eHigh) << 32);..
d4d0: 73 74 61 74 50 74 72 2d 3e 73 74 5f 61 74 69 6d  statPtr->st_atim
d4e0: 65 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 61  e = ToCTime(data
d4f0: 2e 66 74 4c 61 73 74 41 63 63 65 73 73 54 69 6d  .ftLastAccessTim
d500: 65 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 74  e);..statPtr->st
d510: 5f 6d 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d 65  _mtime = ToCTime
d520: 28 64 61 74 61 2e 66 74 4c 61 73 74 57 72 69 74  (data.ftLastWrit
d530: 65 54 69 6d 65 29 3b 0a 09 73 74 61 74 50 74 72  eTime);..statPtr
d540: 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20 54 6f 43  ->st_ctime = ToC
d550: 54 69 6d 65 28 64 61 74 61 2e 66 74 43 72 65 61  Time(data.ftCrea
d560: 74 69 6f 6e 54 69 6d 65 29 3b 0a 20 20 20 20 7d  tionTime);.    }
d570: 0a 0a 20 20 20 20 64 65 76 20 3d 20 4e 61 74 69  ..    dev = Nati
d580: 76 65 44 65 76 28 6e 61 74 69 76 65 50 61 74 68  veDev(nativePath
d590: 29 3b 0a 20 20 20 20 6d 6f 64 65 20 3d 20 4e 61  );.    mode = Na
d5a0: 74 69 76 65 53 74 61 74 4d 6f 64 65 28 61 74 74  tiveStatMode(att
d5b0: 72 2c 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 20 4e  r, checkLinks, N
d5c0: 61 74 69 76 65 49 73 45 78 65 63 28 6e 61 74 69  ativeIsExec(nati
d5d0: 76 65 50 61 74 68 29 29 3b 0a 20 20 20 20 69 66  vePath));.    if
d5e0: 20 28 66 69 6c 65 54 79 70 65 20 3d 3d 20 46 49   (fileType == FI
d5f0: 4c 45 5f 54 59 50 45 5f 43 48 41 52 29 20 7b 0a  LE_TYPE_CHAR) {.
d600: 09 6d 6f 64 65 20 26 3d 20 7e 53 5f 49 46 4d 54  .mode &= ~S_IFMT
d610: 3b 0a 09 6d 6f 64 65 20 7c 3d 20 53 5f 49 46 43  ;..mode |= S_IFC
d620: 48 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  HR;.    } else i
d630: 66 20 28 66 69 6c 65 54 79 70 65 20 3d 3d 20 46  f (fileType == F
d640: 49 4c 45 5f 54 59 50 45 5f 44 49 53 4b 29 20 7b  ILE_TYPE_DISK) {
d650: 0a 09 6d 6f 64 65 20 26 3d 20 7e 53 5f 49 46 4d  ..mode &= ~S_IFM
d660: 54 3b 0a 09 6d 6f 64 65 20 7c 3d 20 53 5f 49 46  T;..mode |= S_IF
d670: 42 4c 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  BLK;.    }..    
d680: 73 74 61 74 50 74 72 2d 3e 73 74 5f 64 65 76 09  statPtr->st_dev.
d690: 3d 20 28 64 65 76 5f 74 29 20 64 65 76 3b 0a 20  = (dev_t) dev;. 
d6a0: 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 69     statPtr->st_i
d6b0: 6e 6f 09 3d 20 69 6e 6f 64 65 3b 0a 20 20 20 20  no.= inode;.    
d6c0: 73 74 61 74 50 74 72 2d 3e 73 74 5f 6d 6f 64 65  statPtr->st_mode
d6d0: 09 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 73 74 61  .= mode;.    sta
d6e0: 74 50 74 72 2d 3e 73 74 5f 6e 6c 69 6e 6b 09 3d  tPtr->st_nlink.=
d6f0: 20 6e 6c 69 6e 6b 3b 0a 20 20 20 20 73 74 61 74   nlink;.    stat
d700: 50 74 72 2d 3e 73 74 5f 75 69 64 09 3d 20 30 3b  Ptr->st_uid.= 0;
d710: 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74  .    statPtr->st
d720: 5f 67 69 64 09 3d 20 30 3b 0a 20 20 20 20 73 74  _gid.= 0;.    st
d730: 61 74 50 74 72 2d 3e 73 74 5f 72 64 65 76 09 3d  atPtr->st_rdev.=
d740: 20 28 64 65 76 5f 74 29 20 64 65 76 3b 0a 20 20   (dev_t) dev;.  
d750: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
d760: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
d770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
d7b0: 2a 20 4e 61 74 69 76 65 44 65 76 20 2d 2d 0a 20  * NativeDev --. 
d7c0: 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65 20 6a  *. *.Calculate j
d7d0: 75 73 74 20 74 68 65 20 27 73 74 5f 64 65 76 27  ust the 'st_dev'
d7e0: 20 66 69 65 6c 64 20 6f 66 20 61 20 27 73 74 61   field of a 'sta
d7f0: 74 27 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a  t' structure.. *
d800: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
d850: 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65  tatic int.Native
d860: 44 65 76 28 0a 20 20 20 20 63 6f 6e 73 74 20 57  Dev(.    const W
d870: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68  CHAR *nativePath
d880: 29 09 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 6f  )./* Full path o
d890: 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74 20 2a  f file to stat *
d8a0: 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 64 65 76 3b  /.{.    int dev;
d8b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d8c0: 20 64 73 3b 0a 20 20 20 20 57 43 48 41 52 20 6e   ds;.    WCHAR n
d8d0: 61 74 69 76 65 46 75 6c 6c 50 61 74 68 5b 4d 41  ativeFullPath[MA
d8e0: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 57 43 48  X_PATH];.    WCH
d8f0: 41 52 20 2a 6e 61 74 69 76 65 50 61 72 74 3b 0a  AR *nativePart;.
d900: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d910: 66 75 6c 6c 50 61 74 68 3b 0a 0a 20 20 20 20 47  fullPath;..    G
d920: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
d930: 6e 61 74 69 76 65 50 61 74 68 2c 20 4d 41 58 5f  nativePath, MAX_
d940: 50 41 54 48 2c 20 6e 61 74 69 76 65 46 75 6c 6c  PATH, nativeFull
d950: 50 61 74 68 2c 20 26 6e 61 74 69 76 65 50 61 72  Path, &nativePar
d960: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  t);.    Tcl_DStr
d970: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20  ingInit(&ds);.  
d980: 20 20 66 75 6c 6c 50 61 74 68 20 3d 20 54 63 6c    fullPath = Tcl
d990: 5f 57 43 68 61 72 54 6f 55 74 66 44 53 74 72 69  _WCharToUtfDStri
d9a0: 6e 67 28 6e 61 74 69 76 65 46 75 6c 6c 50 61 74  ng(nativeFullPat
d9b0: 68 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e  h, TCL_INDEX_NON
d9c0: 45 2c 20 26 64 73 29 3b 0a 0a 20 20 20 20 69 66  E, &ds);..    if
d9d0: 20 28 28 66 75 6c 6c 50 61 74 68 5b 30 5d 20 3d   ((fullPath[0] =
d9e0: 3d 20 27 5c 5c 27 29 20 26 26 20 28 66 75 6c 6c  = '\\') && (full
d9f0: 50 61 74 68 5b 31 5d 20 3d 3d 20 27 5c 5c 27 29  Path[1] == '\\')
da00: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ) {..const char 
da10: 2a 70 3b 0a 09 44 57 4f 52 44 20 64 77 3b 0a 09  *p;..DWORD dw;..
da20: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74  const WCHAR *nat
da30: 69 76 65 56 6f 6c 3b 0a 09 54 63 6c 5f 44 53 74  iveVol;..Tcl_DSt
da40: 72 69 6e 67 20 76 6f 6c 53 74 72 69 6e 67 3b 0a  ring volString;.
da50: 0a 09 70 20 3d 20 73 74 72 63 68 72 28 66 75 6c  ..p = strchr(ful
da60: 6c 50 61 74 68 20 2b 20 32 2c 20 27 5c 5c 27 29  lPath + 2, '\\')
da70: 3b 0a 09 70 20 3d 20 73 74 72 63 68 72 28 70 20  ;..p = strchr(p 
da80: 2b 20 31 2c 20 27 5c 5c 27 29 3b 0a 09 69 66 20  + 1, '\\');..if 
da90: 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  (p == NULL) {.. 
daa0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 41 64     /*..     * Ad
dab0: 64 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 62 61  d terminating ba
dac0: 63 6b 73 6c 61 73 68 20 74 6f 20 66 75 6c 6c 70  ckslash to fullp
dad0: 61 74 68 20 6f 72 20 47 65 74 56 6f 6c 75 6d 65  ath or GetVolume
dae0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 57 28 29 0a 09  InformationW()..
daf0: 20 20 20 20 20 2a 20 77 6f 6e 27 74 20 77 6f 72       * won't wor
db00: 6b 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  k...     */...  
db10: 20 20 66 75 6c 6c 50 61 74 68 20 3d 20 54 63 6c    fullPath = Tcl
db20: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 4c 69 74  DStringAppendLit
db30: 65 72 61 6c 28 26 64 73 2c 20 22 5c 5c 22 29 3b  eral(&ds, "\\");
db40: 0a 09 20 20 20 20 70 20 3d 20 66 75 6c 6c 50 61  ..    p = fullPa
db50: 74 68 20 2b 20 54 63 6c 5f 44 53 74 72 69 6e 67  th + Tcl_DString
db60: 4c 65 6e 67 74 68 28 26 64 73 29 3b 0a 09 7d 20  Length(&ds);..} 
db70: 65 6c 73 65 20 7b 0a 09 20 20 20 20 70 2b 2b 3b  else {..    p++;
db80: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
db90: 49 6e 69 74 28 26 76 6f 6c 53 74 72 69 6e 67 29  Init(&volString)
dba0: 3b 0a 09 6e 61 74 69 76 65 56 6f 6c 20 3d 20 54  ;..nativeVol = T
dbb0: 63 6c 5f 55 74 66 54 6f 57 43 68 61 72 44 53 74  cl_UtfToWCharDSt
dbc0: 72 69 6e 67 28 66 75 6c 6c 50 61 74 68 2c 20 70  ring(fullPath, p
dbd0: 20 2d 20 66 75 6c 6c 50 61 74 68 2c 20 26 76 6f   - fullPath, &vo
dbe0: 6c 53 74 72 69 6e 67 29 3b 0a 09 64 77 20 3d 20  lString);..dw = 
dbf0: 28 44 57 4f 52 44 29 20 2d 31 3b 0a 09 47 65 74  (DWORD) -1;..Get
dc00: 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 6f  VolumeInformatio
dc10: 6e 57 28 6e 61 74 69 76 65 56 6f 6c 2c 20 4e 55  nW(nativeVol, NU
dc20: 4c 4c 2c 20 30 2c 20 26 64 77 2c 20 4e 55 4c 4c  LL, 0, &dw, NULL
dc30: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 29  , NULL, NULL, 0)
dc40: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 47 65 74 46 75  ;.../*.. * GetFu
dc50: 6c 6c 50 61 74 68 4e 61 6d 65 57 28 29 20 74 75  llPathNameW() tu
dc60: 72 6e 73 20 73 70 65 63 69 61 6c 20 64 65 76 69  rns special devi
dc70: 63 65 73 20 6c 69 6b 65 20 22 4e 55 4c 22 20 69  ces like "NUL" i
dc80: 6e 74 6f 20 22 5c 5c 2e 5c 4e 55 4c 22 2c 0a 09  nto "\\.\NUL",..
dc90: 20 2a 20 62 75 74 20 47 65 74 56 6f 6c 75 6d 65   * but GetVolume
dca0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 57 28 29 20 72  InformationW() r
dcb0: 65 74 75 72 6e 73 20 66 61 69 6c 75 72 65 20 66  eturns failure f
dcc0: 6f 72 20 22 5c 5c 2e 5c 4e 55 4c 22 2e 20 54 68  or "\\.\NUL". Th
dcd0: 69 73 20 77 69 6c 6c 0a 09 20 2a 20 63 61 75 73  is will.. * caus
dce0: 65 20 22 4e 55 4c 22 20 74 6f 20 67 65 74 20 61  e "NUL" to get a
dcf0: 20 64 72 69 76 65 20 6e 75 6d 62 65 72 20 6f 66   drive number of
dd00: 20 2d 31 2c 20 77 68 69 63 68 20 6d 61 6b 65 73   -1, which makes
dd10: 20 61 62 6f 75 74 20 61 73 20 6d 75 63 68 0a 09   about as much..
dd20: 20 2a 20 73 65 6e 73 65 20 61 73 20 61 6e 79 74   * sense as anyt
dd30: 68 69 6e 67 20 73 69 6e 63 65 20 74 68 65 20 73  hing since the s
dd40: 70 65 63 69 61 6c 20 64 65 76 69 63 65 73 20 64  pecial devices d
dd50: 6f 6e 27 74 20 6c 69 76 65 20 6f 6e 20 61 6e 79  on't live on any
dd60: 0a 09 20 2a 20 64 72 69 76 65 2e 0a 09 20 2a 2f  .. * drive... */
dd70: 0a 0a 09 64 65 76 20 3d 20 64 77 3b 0a 09 54 63  ...dev = dw;..Tc
dd80: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 76  l_DStringFree(&v
dd90: 6f 6c 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 7d  olString);.    }
dda0: 20 65 6c 73 65 20 69 66 20 28 28 66 75 6c 6c 50   else if ((fullP
ddb0: 61 74 68 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20  ath[0] != '\0') 
ddc0: 26 26 20 28 66 75 6c 6c 50 61 74 68 5b 31 5d 20  && (fullPath[1] 
ddd0: 3d 3d 20 27 3a 27 29 29 20 7b 0a 09 64 65 76 20  == ':')) {..dev 
dde0: 3d 20 54 63 6c 5f 55 6e 69 43 68 61 72 54 6f 4c  = Tcl_UniCharToL
ddf0: 6f 77 65 72 28 66 75 6c 6c 50 61 74 68 5b 30 5d  ower(fullPath[0]
de00: 29 20 2d 20 27 61 27 3b 0a 20 20 20 20 7d 20 65  ) - 'a';.    } e
de10: 6c 73 65 20 7b 0a 09 64 65 76 20 3d 20 2d 31 3b  lse {..dev = -1;
de20: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
de30: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
de40: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 64 65 76  ..    return dev
de50: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dea0: 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 53 74  -. *. * NativeSt
deb0: 61 74 4d 6f 64 65 20 2d 2d 0a 20 2a 0a 20 2a 09  atMode --. *. *.
dec0: 43 61 6c 63 75 6c 61 74 65 20 6a 75 73 74 20 74  Calculate just t
ded0: 68 65 20 27 73 74 5f 6d 6f 64 65 27 20 66 69 65  he 'st_mode' fie
dee0: 6c 64 20 6f 66 20 61 20 27 73 74 61 74 27 20 73  ld of a 'stat' s
def0: 74 72 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 09  tructure.. *. *.
df00: 49 6e 20 6d 61 6e 79 20 70 6c 61 63 65 73 20 77  In many places w
df10: 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 68 65  e don't need the
df20: 20 66 75 6c 6c 20 73 74 61 74 20 73 74 72 75 63   full stat struc
df30: 74 75 72 65 2c 20 61 6e 64 20 69 74 27 73 20 6d  ture, and it's m
df40: 75 63 68 0a 20 2a 09 66 61 73 74 65 72 20 6a 75  uch. *.faster ju
df50: 73 74 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  st to calculate 
df60: 74 68 65 73 65 20 70 69 65 63 65 73 2c 20 69 66  these pieces, if
df70: 20 74 68 61 74 27 73 20 61 6c 6c 20 77 65 20 6e   that's all we n
df80: 65 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  eed.. *. *------
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfd0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 75 6e 73  . */..static uns
dfe0: 69 67 6e 65 64 20 73 68 6f 72 74 0a 4e 61 74 69  igned short.Nati
dff0: 76 65 53 74 61 74 4d 6f 64 65 28 0a 20 20 20 20  veStatMode(.    
e000: 44 57 4f 52 44 20 61 74 74 72 2c 0a 20 20 20 20  DWORD attr,.    
e010: 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a  int checkLinks,.
e020: 20 20 20 20 69 6e 74 20 69 73 45 78 65 63 29 0a      int isExec).
e030: 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a  {.    int mode;.
e040: 0a 20 20 20 20 69 66 20 28 63 68 65 63 6b 4c 69  .    if (checkLi
e050: 6e 6b 73 20 26 26 20 28 61 74 74 72 20 26 20 46  nks && (attr & F
e060: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
e070: 50 41 52 53 45 5f 50 4f 49 4e 54 29 29 20 7b 0a  PARSE_POINT)) {.
e080: 09 2f 2a 0a 09 20 2a 20 49 74 20 69 73 20 61 20  ./*.. * It is a 
e090: 6c 69 6e 6b 2e 0a 09 20 2a 2f 0a 0a 09 6d 6f 64  link... */...mod
e0a0: 65 20 3d 20 53 5f 49 46 4c 4e 4b 3b 0a 20 20 20  e = S_IFLNK;.   
e0b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 6f 64 65 20   } else {..mode 
e0c0: 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41  = (attr & FILE_A
e0d0: 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
e0e0: 52 59 29 20 3f 20 53 5f 49 46 44 49 52 7c 53 5f  RY) ? S_IFDIR|S_
e0f0: 49 45 58 45 43 20 3a 20 53 5f 49 46 52 45 47 3b  IEXEC : S_IFREG;
e100: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 6f 64 65 20  .    }.    mode 
e110: 7c 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f  |= (attr & FILE_
e120: 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
e130: 4c 59 29 20 3f 20 53 5f 49 52 45 41 44 20 3a 20  LY) ? S_IREAD : 
e140: 53 5f 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45  S_IREAD|S_IWRITE
e150: 3b 0a 20 20 20 20 69 66 20 28 69 73 45 78 65 63  ;.    if (isExec
e160: 29 20 7b 0a 09 6d 6f 64 65 20 7c 3d 20 53 5f 49  ) {..mode |= S_I
e170: 45 58 45 43 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  EXEC;.    }..   
e180: 20 2f 2a 0a 20 20 20 20 20 2a 20 50 72 6f 70 61   /*.     * Propa
e190: 67 61 74 65 20 74 68 65 20 53 5f 49 52 45 41 44  gate the S_IREAD
e1a0: 2c 20 53 5f 49 57 52 49 54 45 2c 20 53 5f 49 45  , S_IWRITE, S_IE
e1b0: 58 45 43 20 62 69 74 73 20 74 6f 20 74 68 65 20  XEC bits to the 
e1c0: 67 72 6f 75 70 20 61 6e 64 20 6f 74 68 65 72 0a  group and other.
e1d0: 20 20 20 20 20 2a 20 70 6f 73 69 74 69 6f 6e 73       * positions
e1e0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d  ..     */..    m
e1f0: 6f 64 65 20 7c 3d 20 28 6d 6f 64 65 20 26 20 28  ode |= (mode & (
e200: 53 5f 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45  S_IREAD|S_IWRITE
e210: 7c 53 5f 49 45 58 45 43 29 29 20 3e 3e 20 33 3b  |S_IEXEC)) >> 3;
e220: 0a 20 20 20 20 6d 6f 64 65 20 7c 3d 20 28 6d 6f  .    mode |= (mo
e230: 64 65 20 26 20 28 53 5f 49 52 45 41 44 7c 53 5f  de & (S_IREAD|S_
e240: 49 57 52 49 54 45 7c 53 5f 49 45 58 45 43 29 29  IWRITE|S_IEXEC))
e250: 20 3e 3e 20 36 3b 0a 20 20 20 20 72 65 74 75 72   >> 6;.    retur
e260: 6e 20 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  n (unsigned shor
e270: 74 29 20 6d 6f 64 65 3b 0a 7d 0a 0c 0a 2f 2a 0a  t) mode;.}.../*.
e280: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
e290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
e2d0: 20 54 6f 43 54 69 6d 65 20 2d 2d 0a 20 2a 0a 20   ToCTime --. *. 
e2e0: 2a 09 43 6f 6e 76 65 72 74 73 20 61 20 57 69 6e  *.Converts a Win
e2f0: 64 6f 77 73 20 46 49 4c 45 54 49 4d 45 20 74 6f  dows FILETIME to
e300: 20 61 20 5f 5f 74 69 6d 65 36 34 5f 74 20 69 6e   a __time64_t in
e310: 20 55 54 43 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   UTC.. *. * Resu
e320: 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20  lts:. *.Returns 
e330: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 73 65 63  the count of sec
e340: 6f 6e 64 73 20 66 72 6f 6d 20 74 68 65 20 50 6f  onds from the Po
e350: 73 69 78 20 65 70 6f 63 68 2e 0a 20 2a 0a 20 2a  six epoch.. *. *
e360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
e3b0: 61 74 69 63 20 5f 5f 74 69 6d 65 36 34 5f 74 0a  atic __time64_t.
e3c0: 54 6f 43 54 69 6d 65 28 0a 20 20 20 20 46 49 4c  ToCTime(.    FIL
e3d0: 45 54 49 4d 45 20 66 69 6c 65 54 69 6d 65 29 09  ETIME fileTime).
e3e0: 09 2f 2a 20 55 54 43 20 74 69 6d 65 20 2a 2f 0a  ./* UTC time */.
e3f0: 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
e400: 47 45 52 20 63 6f 6e 76 65 72 74 65 64 54 69 6d  GER convertedTim
e410: 65 3b 0a 0a 20 20 20 20 63 6f 6e 76 65 72 74 65  e;..    converte
e420: 64 54 69 6d 65 2e 4c 6f 77 50 61 72 74 20 3d 20  dTime.LowPart = 
e430: 66 69 6c 65 54 69 6d 65 2e 64 77 4c 6f 77 44 61  fileTime.dwLowDa
e440: 74 65 54 69 6d 65 3b 0a 20 20 20 20 63 6f 6e 76  teTime;.    conv
e450: 65 72 74 65 64 54 69 6d 65 2e 48 69 67 68 50 61  ertedTime.HighPa
e460: 72 74 20 3d 20 28 4c 4f 4e 47 29 20 66 69 6c 65  rt = (LONG) file
e470: 54 69 6d 65 2e 64 77 48 69 67 68 44 61 74 65 54  Time.dwHighDateT
e480: 69 6d 65 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  ime;..    return
e490: 20 28 5f 5f 74 69 6d 65 36 34 5f 74 29 20 28 28   (__time64_t) ((
e4a0: 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e 51 75  convertedTime.Qu
e4b0: 61 64 50 61 72 74 20 2d 0a 09 20 20 20 20 28 6c  adPart -..    (l
e4c0: 6f 6e 67 20 6c 6f 6e 67 29 20 50 4f 53 49 58 5f  ong long) POSIX_
e4d0: 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45 54 49 4d  EPOCH_AS_FILETIM
e4e0: 45 29 20 2f 20 28 6c 6f 6e 67 20 6c 6f 6e 67 29  E) / (long long)
e4f0: 20 31 30 30 30 30 30 30 30 29 3b 0a 7d 0a 0c 0a   10000000);.}...
e500: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
e510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
e550: 0a 20 2a 20 46 72 6f 6d 43 54 69 6d 65 20 2d 2d  . * FromCTime --
e560: 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 73 20  . *. *.Converts 
e570: 61 20 5f 5f 74 69 6d 65 36 34 5f 74 20 74 6f 20  a __time64_t to 
e580: 61 20 57 69 6e 64 6f 77 73 20 46 49 4c 45 54 49  a Windows FILETI
e590: 4d 45 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ME. *. * Results
e5a0: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65  :. *.Returns the
e5b0: 20 63 6f 75 6e 74 20 6f 66 20 31 30 30 2d 6e 73   count of 100-ns
e5c0: 20 74 69 63 6b 73 20 73 65 63 6f 6e 64 73 20 66   ticks seconds f
e5d0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
e5e0: 65 70 6f 63 68 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  epoch.. *. *----
e5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e630: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
e640: 20 76 6f 69 64 0a 46 72 6f 6d 43 54 69 6d 65 28   void.FromCTime(
e650: 0a 20 20 20 20 5f 5f 74 69 6d 65 36 34 5f 74 20  .    __time64_t 
e660: 70 6f 73 69 78 54 69 6d 65 2c 0a 20 20 20 20 46  posixTime,.    F
e670: 49 4c 45 54 49 4d 45 20 2a 66 69 6c 65 54 69 6d  ILETIME *fileTim
e680: 65 29 09 09 2f 2a 20 55 54 43 20 54 69 6d 65 20  e)../* UTC Time 
e690: 2a 2f 0a 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  */.{.    LARGE_I
e6a0: 4e 54 45 47 45 52 20 63 6f 6e 76 65 72 74 65 64  NTEGER converted
e6b0: 54 69 6d 65 3b 0a 0a 20 20 20 20 63 6f 6e 76 65  Time;..    conve
e6c0: 72 74 65 64 54 69 6d 65 2e 51 75 61 64 50 61 72  rtedTime.QuadPar
e6d0: 74 20 3d 20 28 28 4c 4f 4e 47 4c 4f 4e 47 29 20  t = ((LONGLONG) 
e6e0: 70 6f 73 69 78 54 69 6d 65 29 20 2a 20 31 30 30  posixTime) * 100
e6f0: 30 30 30 30 30 0a 09 20 20 20 20 2b 20 50 4f 53  00000..    + POS
e700: 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45  IX_EPOCH_AS_FILE
e710: 54 49 4d 45 3b 0a 20 20 20 20 66 69 6c 65 54 69  TIME;.    fileTi
e720: 6d 65 2d 3e 64 77 4c 6f 77 44 61 74 65 54 69 6d  me->dwLowDateTim
e730: 65 20 3d 20 63 6f 6e 76 65 72 74 65 64 54 69 6d  e = convertedTim
e740: 65 2e 4c 6f 77 50 61 72 74 3b 0a 20 20 20 20 66  e.LowPart;.    f
e750: 69 6c 65 54 69 6d 65 2d 3e 64 77 48 69 67 68 44  ileTime->dwHighD
e760: 61 74 65 54 69 6d 65 20 3d 20 63 6f 6e 76 65 72  ateTime = conver
e770: 74 65 64 54 69 6d 65 2e 48 69 67 68 50 61 72 74  tedTime.HighPart
e780: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
e790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e7d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
e7e0: 70 47 65 74 4e 61 74 69 76 65 43 77 64 20 2d 2d  pGetNativeCwd --
e7f0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
e800: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68  tion replaces th
e810: 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 6f  e library versio
e820: 6e 20 6f 66 20 67 65 74 63 77 64 28 29 2e 0a 20  n of getcwd().. 
e830: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
e840: 09 54 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f  .The input and o
e850: 75 74 70 75 74 20 61 72 65 20 66 69 6c 65 73 79  utput are filesy
e860: 73 74 65 6d 20 70 61 74 68 73 20 69 6e 20 6e 61  stem paths in na
e870: 74 69 76 65 20 66 6f 72 6d 2e 20 54 68 65 20 72  tive form. The r
e880: 65 73 75 6c 74 0a 20 2a 09 69 73 20 65 69 74 68  esult. *.is eith
e890: 65 72 20 74 68 65 20 67 69 76 65 6e 20 63 6c 69  er the given cli
e8a0: 65 6e 74 44 61 74 61 2c 20 69 66 20 74 68 65 20  entData, if the 
e8b0: 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
e8c0: 79 20 68 61 73 6e 27 74 0a 20 2a 09 63 68 61 6e  y hasn't. *.chan
e8d0: 67 65 64 2c 20 6f 72 20 61 20 6e 65 77 20 63 6c  ged, or a new cl
e8e0: 69 65 6e 74 44 61 74 61 20 28 6f 77 6e 65 64 20  ientData (owned 
e8f0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 29 2c 20  by our caller), 
e900: 67 69 76 69 6e 67 20 74 68 65 20 6e 65 77 0a 20  giving the new. 
e910: 2a 09 6e 61 74 69 76 65 20 70 61 74 68 2c 20 6f  *.native path, o
e920: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 63 75  r NULL if the cu
e930: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  rrent directory 
e940: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 64 65 74  could not be det
e950: 65 72 6d 69 6e 65 64 2e 0a 20 2a 09 49 66 20 4e  ermined.. *.If N
e960: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ULL is returned,
e970: 20 74 68 65 20 63 61 6c 6c 65 72 20 63 61 6e 20   the caller can 
e980: 65 78 61 6d 69 6e 65 20 74 68 65 20 73 74 61 6e  examine the stan
e990: 64 61 72 64 20 50 6f 73 69 78 20 65 72 72 6f 72  dard Posix error
e9a0: 0a 20 2a 09 63 6f 64 65 73 20 74 6f 20 64 65 74  . *.codes to det
e9b0: 65 72 6d 69 6e 65 20 74 68 65 20 63 61 75 73 65  ermine the cause
e9c0: 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e   of the problem.
e9d0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
e9e0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
e9f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
ea00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76  ---------. */..v
ea40: 6f 69 64 20 2a 0a 54 63 6c 70 47 65 74 4e 61 74  oid *.TclpGetNat
ea50: 69 76 65 43 77 64 28 0a 20 20 20 20 76 6f 69 64  iveCwd(.    void
ea60: 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a   *clientData).{.
ea70: 20 20 20 20 57 43 48 41 52 20 62 75 66 66 65 72      WCHAR buffer
ea80: 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 0a 20 20 20  [MAX_PATH];..   
ea90: 20 69 66 20 28 47 65 74 43 75 72 72 65 6e 74 44   if (GetCurrentD
eaa0: 69 72 65 63 74 6f 72 79 57 28 4d 41 58 5f 50 41  irectoryW(MAX_PA
eab0: 54 48 2c 20 62 75 66 66 65 72 29 20 3d 3d 20 30  TH, buffer) == 0
eac0: 29 20 7b 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76  ) {..Tcl_WinConv
ead0: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
eae0: 45 72 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72  Error());..retur
eaf0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
eb00: 20 20 20 69 66 20 28 63 6c 69 65 6e 74 44 61 74     if (clientDat
eb10: 61 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  a != NULL) {..if
eb20: 20 28 77 63 73 63 6d 70 28 28 63 6f 6e 73 74 20   (wcscmp((const 
eb30: 57 43 48 41 52 20 2a 29 20 63 6c 69 65 6e 74 44  WCHAR *) clientD
eb40: 61 74 61 2c 20 62 75 66 66 65 72 29 20 3d 3d 20  ata, buffer) == 
eb50: 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  0) {..    return
eb60: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 7d 0a   clientData;..}.
eb70: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
eb80: 6e 20 54 63 6c 4e 61 74 69 76 65 44 75 70 49 6e  n TclNativeDupIn
eb90: 74 65 72 6e 61 6c 52 65 70 28 62 75 66 66 65 72  ternalRep(buffer
eba0: 29 3b 0a 7d 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f  );.}...int.TclpO
ebb0: 62 6a 41 63 63 65 73 73 28 0a 20 20 20 20 54 63  bjAccess(.    Tc
ebc0: 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a  l_Obj *pathPtr,.
ebd0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 29 0a 7b 0a      int mode).{.
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74 69 76      return Nativ
ebf0: 65 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 57  eAccess((const W
ec00: 43 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 65 74  CHAR *)Tcl_FSGet
ec10: 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50  NativePath(pathP
ec20: 74 72 29 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0c 0a  tr), mode);.}...
ec30: 69 6e 74 0a 54 63 6c 70 4f 62 6a 4c 73 74 61 74  int.TclpObjLstat
ec40: 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  (.    Tcl_Obj *p
ec50: 61 74 68 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f  athPtr,.    Tcl_
ec60: 53 74 61 74 42 75 66 20 2a 73 74 61 74 50 74 72  StatBuf *statPtr
ec70: 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  ).{.    /*.     
ec80: 2a 20 45 6e 73 75 72 65 20 63 6f 72 72 65 63 74  * Ensure correct
ec90: 20 66 69 6c 65 20 73 69 7a 65 73 20 62 79 20 66   file sizes by f
eca0: 6f 72 63 69 6e 67 20 74 68 65 20 4f 53 20 74 6f  orcing the OS to
ecb0: 20 77 72 69 74 65 20 61 6e 79 20 70 65 6e 64 69   write any pendi
ecc0: 6e 67 20 64 61 74 61 0a 20 20 20 20 20 2a 20 74  ng data.     * t
ecd0: 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
ece0: 64 6f 6e 65 20 6f 6e 6c 79 20 66 6f 72 20 63 68  done only for ch
ecf0: 61 6e 6e 65 6c 73 20 77 68 69 63 68 20 61 72 65  annels which are
ed00: 20 64 69 72 74 79 2c 20 69 2e 65 2e 20 68 61 76   dirty, i.e. hav
ed10: 65 20 62 65 65 6e 0a 20 20 20 20 20 2a 20 77 72  e been.     * wr
ed20: 69 74 74 65 6e 20 74 6f 20 73 69 6e 63 65 20 74  itten to since t
ed30: 68 65 20 6c 61 73 74 20 66 6c 75 73 68 20 68 65  he last flush he
ed40: 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  re..     */..   
ed50: 20 54 63 6c 57 69 6e 46 6c 75 73 68 44 69 72 74   TclWinFlushDirt
ed60: 79 43 68 61 6e 6e 65 6c 73 28 29 3b 0a 0a 20 20  yChannels();..  
ed70: 20 20 72 65 74 75 72 6e 20 4e 61 74 69 76 65 53    return NativeS
ed80: 74 61 74 28 28 63 6f 6e 73 74 20 57 43 48 41 52  tat((const WCHAR
ed90: 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e 61 74 69   *)Tcl_FSGetNati
eda0: 76 65 50 61 74 68 28 70 61 74 68 50 74 72 29 2c  vePath(pathPtr),
edb0: 20 73 74 61 74 50 74 72 2c 20 31 29 3b 0a 7d 0a   statPtr, 1);.}.
edc0: 0c 0a 23 69 66 64 65 66 20 53 5f 49 46 4c 4e 4b  ..#ifdef S_IFLNK
edd0: 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 70 4f  .Tcl_Obj *.TclpO
ede0: 62 6a 4c 69 6e 6b 28 0a 20 20 20 20 54 63 6c 5f  bjLink(.    Tcl_
edf0: 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20  Obj *pathPtr,.  
ee00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 6f 50 74 72    Tcl_Obj *toPtr
ee10: 2c 0a 20 20 20 20 69 6e 74 20 6c 69 6e 6b 41 63  ,.    int linkAc
ee20: 74 69 6f 6e 29 0a 7b 0a 20 20 20 20 69 66 20 28  tion).{.    if (
ee30: 74 6f 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  toPtr != NULL) {
ee40: 0a 09 69 6e 74 20 72 65 73 3b 0a 09 63 6f 6e 73  ..int res;..cons
ee50: 74 20 57 43 48 41 52 20 2a 4c 69 6e 6b 54 61 72  t WCHAR *LinkTar
ee60: 67 65 74 3b 0a 09 63 6f 6e 73 74 20 57 43 48 41  get;..const WCHA
ee70: 52 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 20 3d 20  R *LinkSource = 
ee80: 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 54  (const WCHAR *)T
ee90: 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61  cl_FSGetNativePa
eea0: 74 68 28 70 61 74 68 50 74 72 29 3b 0a 09 54 63  th(pathPtr);..Tc
eeb0: 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 61 6c 69 7a 65  l_Obj *normalize
eec0: 64 54 6f 50 74 72 20 3d 20 54 63 6c 5f 46 53 47  dToPtr = Tcl_FSG
eed0: 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 61 74 68  etNormalizedPath
eee0: 28 4e 55 4c 4c 2c 20 74 6f 50 74 72 29 3b 0a 0a  (NULL, toPtr);..
eef0: 09 69 66 20 28 6e 6f 72 6d 61 6c 69 7a 65 64 54  .if (normalizedT
ef00: 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  oPtr == NULL) {.
ef10: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
ef20: 3b 0a 09 7d 0a 0a 09 4c 69 6e 6b 54 61 72 67 65  ;..}...LinkTarge
ef30: 74 20 3d 20 28 63 6f 6e 73 74 20 57 43 48 41 52  t = (const WCHAR
ef40: 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e 61 74 69   *)Tcl_FSGetNati
ef50: 76 65 50 61 74 68 28 6e 6f 72 6d 61 6c 69 7a 65  vePath(normalize
ef60: 64 54 6f 50 74 72 29 3b 0a 0a 09 69 66 20 28 4c  dToPtr);...if (L
ef70: 69 6e 6b 53 6f 75 72 63 65 20 3d 3d 20 4e 55 4c  inkSource == NUL
ef80: 4c 20 7c 7c 20 4c 69 6e 6b 54 61 72 67 65 74 20  L || LinkTarget 
ef90: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
efa0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
efb0: 09 72 65 73 20 3d 20 57 69 6e 4c 69 6e 6b 28 4c  .res = WinLink(L
efc0: 69 6e 6b 53 6f 75 72 63 65 2c 20 4c 69 6e 6b 54  inkSource, LinkT
efd0: 61 72 67 65 74 2c 20 6c 69 6e 6b 41 63 74 69 6f  arget, linkActio
efe0: 6e 29 3b 0a 09 69 66 20 28 72 65 73 20 3d 3d 20  n);..if (res == 
eff0: 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  0) {..    return
f000: 20 74 6f 50 74 72 3b 0a 09 7d 20 65 6c 73 65 20   toPtr;..} else 
f010: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  {..    return NU
f020: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
f030: 65 20 7b 0a 09 63 6f 6e 73 74 20 57 43 48 41 52  e {..const WCHAR
f040: 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 20 3d 20 28   *LinkSource = (
f050: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 54 63  const WCHAR *)Tc
f060: 6c 5f 46 53 47 65 74 4e 61 74 69 76 65 50 61 74  l_FSGetNativePat
f070: 68 28 70 61 74 68 50 74 72 29 3b 0a 0a 09 69 66  h(pathPtr);...if
f080: 20 28 4c 69 6e 6b 53 6f 75 72 63 65 20 3d 3d 20   (LinkSource == 
f090: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74  NULL) {..    ret
f0a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 72 65  urn NULL;..}..re
f0b0: 74 75 72 6e 20 57 69 6e 52 65 61 64 4c 69 6e 6b  turn WinReadLink
f0c0: 28 4c 69 6e 6b 53 6f 75 72 63 65 29 3b 0a 20 20  (LinkSource);.  
f0d0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
f0e0: 53 5f 49 46 4c 4e 4b 20 2a 2f 0a 0c 0a 2f 2a 0a  S_IFLNK */.../*.
f0f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
f100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
f140: 0a 20 2a 20 54 63 6c 70 46 69 6c 65 73 79 73 74  . * TclpFilesyst
f150: 65 6d 50 61 74 68 54 79 70 65 20 2d 2d 0a 20 2a  emPathType --. *
f160: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
f170: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
f180: 20 6e 61 74 69 76 65 20 66 69 6c 65 73 79 73 74   native filesyst
f190: 65 6d 20 73 75 70 70 6f 72 74 2c 20 61 6e 64 20  em support, and 
f1a0: 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20 70  returns. *.the p
f1b0: 61 74 68 20 74 79 70 65 20 6f 66 20 74 68 65 20  ath type of the 
f1c0: 67 69 76 65 6e 20 70 61 74 68 2e 20 52 65 74 75  given path. Retu
f1d0: 72 6e 73 20 4e 54 46 53 20 6f 72 20 46 41 54 20  rns NTFS or FAT 
f1e0: 6f 72 20 77 68 61 74 65 76 65 72 20 69 73 0a 20  or whatever is. 
f1f0: 2a 09 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  *.returned by th
f200: 65 20 27 76 6f 6c 75 6d 65 20 69 6e 66 6f 72 6d  e 'volume inform
f210: 61 74 69 6f 6e 27 20 70 72 6f 63 2e 0a 20 2a 0a  ation' proc.. *.
f220: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
f230: 55 4c 4c 20 61 74 20 70 72 65 73 65 6e 74 2e 0a  ULL at present..
f240: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
f250: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
f260: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
f2b0: 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c  /..Tcl_Obj *.Tcl
f2c0: 70 46 69 6c 65 73 79 73 74 65 6d 50 61 74 68 54  pFilesystemPathT
f2d0: 79 70 65 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ype(.    Tcl_Obj
f2e0: 20 2a 70 61 74 68 50 74 72 29 0a 7b 0a 23 64 65   *pathPtr).{.#de
f2f0: 66 69 6e 65 20 56 4f 4c 5f 42 55 46 5f 53 49 5a  fine VOL_BUF_SIZ
f300: 45 20 33 32 0a 20 20 20 20 69 6e 74 20 66 6f 75  E 32.    int fou
f310: 6e 64 3b 0a 20 20 20 20 57 43 48 41 52 20 76 6f  nd;.    WCHAR vo
f320: 6c 54 79 70 65 5b 56 4f 4c 5f 42 55 46 5f 53 49  lType[VOL_BUF_SI
f330: 5a 45 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 66  ZE];.    char *f
f340: 69 72 73 74 53 65 70 61 72 61 74 6f 72 3b 0a 20  irstSeparator;. 
f350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
f360: 61 74 68 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ath;.    Tcl_Obj
f370: 20 2a 6e 6f 72 6d 50 61 74 68 20 3d 20 54 63 6c   *normPath = Tcl
f380: 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64  _FSGetNormalized
f390: 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 74 68 50  Path(NULL, pathP
f3a0: 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 6e 6f  tr);..    if (no
f3b0: 72 6d 50 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20  rmPath == NULL) 
f3c0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  {..return NULL;.
f3d0: 20 20 20 20 7d 0a 20 20 20 20 70 61 74 68 20 3d      }.    path =
f3e0: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6e 6f   TclGetString(no
f3f0: 72 6d 50 61 74 68 29 3b 0a 20 20 20 20 69 66 20  rmPath);.    if 
f400: 28 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (path == NULL) {
f410: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
f420: 20 20 20 7d 0a 0a 20 20 20 20 66 69 72 73 74 53     }..    firstS
f430: 65 70 61 72 61 74 6f 72 20 3d 20 73 74 72 63 68  eparator = strch
f440: 72 28 28 63 68 61 72 20 2a 29 70 61 74 68 2c 20  r((char *)path, 
f450: 27 2f 27 29 3b 0a 20 20 20 20 69 66 20 28 66 69  '/');.    if (fi
f460: 72 73 74 53 65 70 61 72 61 74 6f 72 20 3d 3d 20  rstSeparator == 
f470: 4e 55 4c 4c 29 20 7b 0a 09 66 6f 75 6e 64 20 3d  NULL) {..found =
f480: 20 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d   GetVolumeInform
f490: 61 74 69 6f 6e 57 28 28 63 6f 6e 73 74 20 57 43  ationW((const WC
f4a0: 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e  HAR *)Tcl_FSGetN
f4b0: 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74  ativePath(pathPt
f4c0: 72 29 2c 0a 09 09 4e 55 4c 4c 2c 20 30 2c 20 4e  r),...NULL, 0, N
f4d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ULL, NULL, NULL,
f4e0: 20 76 6f 6c 54 79 70 65 2c 20 56 4f 4c 5f 42 55   volType, VOL_BU
f4f0: 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 20 65  F_SIZE);.    } e
f500: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
f510: 64 72 69 76 65 4e 61 6d 65 20 3d 20 54 63 6c 5f  driveName = Tcl_
f520: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 61 74  NewStringObj(pat
f530: 68 2c 20 66 69 72 73 74 53 65 70 61 72 61 74 6f  h, firstSeparato
f540: 72 20 2d 20 70 61 74 68 2b 31 29 3b 0a 0a 09 54  r - path+1);...T
f550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
f560: 64 72 69 76 65 4e 61 6d 65 29 3b 0a 09 66 6f 75  driveName);..fou
f570: 6e 64 20 3d 20 47 65 74 56 6f 6c 75 6d 65 49 6e  nd = GetVolumeIn
f580: 66 6f 72 6d 61 74 69 6f 6e 57 28 28 63 6f 6e 73  formationW((cons
f590: 74 20 57 43 48 41 52 20 2a 29 54 63 6c 5f 46 53  t WCHAR *)Tcl_FS
f5a0: 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 64 72  GetNativePath(dr
f5b0: 69 76 65 4e 61 6d 65 29 2c 0a 09 09 4e 55 4c 4c  iveName),...NULL
f5c0: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  , 0, NULL, NULL,
f5d0: 20 4e 55 4c 4c 2c 20 76 6f 6c 54 79 70 65 2c 20   NULL, volType, 
f5e0: 56 4f 4c 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 09  VOL_BUF_SIZE);..
f5f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
f600: 28 64 72 69 76 65 4e 61 6d 65 29 3b 0a 20 20 20  (driveName);.   
f610: 20 7d 0a 0a 20 20 20 20 69 66 20 28 66 6f 75 6e   }..    if (foun
f620: 64 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72  d == 0) {..retur
f630: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 65 6c  n NULL;.    } el
f640: 73 65 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  se {..Tcl_DStrin
f650: 67 20 64 73 3b 0a 0a 09 54 63 6c 5f 44 53 74 72  g ds;...Tcl_DStr
f660: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 54  ingInit(&ds);..T
f670: 63 6c 5f 57 43 68 61 72 54 6f 55 74 66 44 53 74  cl_WCharToUtfDSt
f680: 72 69 6e 67 28 76 6f 6c 54 79 70 65 2c 20 54 43  ring(volType, TC
f690: 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c 20 26 64  L_INDEX_NONE, &d
f6a0: 73 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f  s);..return Tcl_
f6b0: 44 53 74 72 69 6e 67 54 6f 4f 62 6a 28 26 64 73  DStringToObj(&ds
f6c0: 29 3b 0a 20 20 20 20 7d 0a 23 75 6e 64 65 66 20  );.    }.#undef 
f6d0: 56 4f 4c 5f 42 55 46 5f 53 49 5a 45 0a 7d 0a 0c  VOL_BUF_SIZE.}..
f6e0: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 64 65 66 69  ./*. * This defi
f6f0: 6e 65 20 63 61 6e 20 62 65 20 74 75 72 6e 65 64  ne can be turned
f700: 20 6f 6e 20 74 6f 20 65 78 70 65 72 69 6d 65 6e   on to experimen
f710: 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  t with a differe
f720: 6e 74 20 77 61 79 20 6f 66 0a 20 2a 20 6e 6f 72  nt way of. * nor
f730: 6d 61 6c 69 7a 69 6e 67 20 70 61 74 68 73 20 28  malizing paths (
f740: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
f750: 74 20 57 69 6e 64 6f 77 73 20 41 50 49 29 2e 20  t Windows API). 
f760: 55 6e 66 6f 72 74 75 6e 61 74 65 6c 79 20 74 68  Unfortunately th
f770: 65 20 6e 65 77 0a 20 2a 20 70 61 74 68 20 73 65  e new. * path se
f780: 65 6d 73 20 74 6f 20 74 61 6b 65 20 61 6c 6d 6f  ems to take almo
f790: 73 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  st exactly the s
f7a0: 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ame amount of ti
f7b0: 6d 65 20 61 73 20 74 68 65 20 6f 6c 64 20 70 61  me as the old pa
f7c0: 74 68 21 0a 20 2a 20 54 68 65 20 70 72 69 6d 61  th!. * The prima
f7d0: 72 79 20 74 69 6d 65 20 74 61 6b 65 6e 20 62 79  ry time taken by
f7e0: 20 6e 6f 72 6d 61 6c 69 7a 61 74 69 6f 6e 20 69   normalization i
f7f0: 73 20 69 6e 0a 20 2a 20 47 65 74 46 69 6c 65 41  s in. * GetFileA
f800: 74 74 72 69 62 75 74 65 73 45 78 2f 46 69 6e 64  ttributesEx/Find
f810: 46 69 72 73 74 46 69 6c 65 20 6f 72 20 47 65 74  FirstFile or Get
f820: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
f830: 2f 47 65 74 4c 6f 6e 67 50 61 74 68 4e 61 6d 65  /GetLongPathName
f840: 2e 0a 20 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 20  .. * Conversion 
f850: 74 6f 2f 66 72 6f 6d 20 6e 61 74 69 76 65 20 69  to/from native i
f860: 73 20 6e 6f 74 20 61 20 73 69 67 6e 69 66 69 63  s not a signific
f870: 61 6e 74 20 66 61 63 74 6f 72 20 61 74 20 61 6c  ant factor at al
f880: 6c 2e 0a 20 2a 0a 20 2a 20 41 6c 73 6f 2c 20 73  l.. *. * Also, s
f890: 69 6e 63 65 20 77 65 20 68 61 76 65 20 74 6f 20  ince we have to 
f8a0: 63 68 65 63 6b 20 66 6f 72 20 73 79 6d 62 6f 6c  check for symbol
f8b0: 69 63 20 6c 69 6e 6b 73 20 28 72 65 70 61 72 73  ic links (repars
f8c0: 65 20 70 6f 69 6e 74 73 29 20 74 68 65 6e 20 77  e points) then w
f8d0: 65 0a 20 2a 20 68 61 76 65 20 74 6f 20 63 61 6c  e. * have to cal
f8e0: 6c 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  l GetFileAttribu
f8f0: 74 65 73 20 6f 6e 20 65 61 63 68 20 70 61 74 68  tes on each path
f900: 20 73 65 67 6d 65 6e 74 20 61 6e 79 77 61 79 2c   segment anyway,
f910: 20 73 6f 20 74 68 65 72 65 27 73 20 6e 6f 0a 20   so there's no. 
f920: 2a 20 62 65 6e 65 66 69 74 20 74 6f 20 64 6f 69  * benefit to doi
f930: 6e 67 20 61 6e 79 74 68 69 6e 67 20 63 6c 65 76  ng anything clev
f940: 65 72 20 74 68 65 72 65 2e 0a 20 2a 2f 0a 0a 2f  er there.. */../
f950: 2a 20 23 64 65 66 69 6e 65 20 54 63 6c 4e 4f 52  * #define TclNOR
f960: 4d 5f 4c 4f 4e 47 5f 50 41 54 48 20 2a 2f 0a 0c  M_LONG_PATH */..
f970: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
f980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 62 6a 4e  -. *. * TclpObjN
f9d0: 6f 72 6d 61 6c 69 7a 65 50 61 74 68 20 2d 2d 0a  ormalizePath --.
f9e0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
f9f0: 69 6f 6e 20 73 63 61 6e 73 20 74 68 72 6f 75 67  ion scans throug
fa00: 68 20 61 20 70 61 74 68 20 73 70 65 63 69 66 69  h a path specifi
fa10: 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 70 6c 61  cation and repla
fa20: 63 65 73 20 69 74 2c 20 69 6e 0a 20 2a 09 70 6c  ces it, in. *.pl
fa30: 61 63 65 2c 20 77 69 74 68 20 61 20 6e 6f 72 6d  ace, with a norm
fa40: 61 6c 69 7a 65 64 20 76 65 72 73 69 6f 6e 2e 20  alized version. 
fa50: 54 68 69 73 20 6d 65 61 6e 73 20 75 73 69 6e 67  This means using
fa60: 20 74 68 65 20 27 6c 6f 6e 67 6e 61 6d 65 27 2c   the 'longname',
fa70: 20 61 6e 64 0a 20 2a 09 65 78 70 61 6e 64 69 6e   and. *.expandin
fa80: 67 20 61 6e 79 20 73 79 6d 62 6f 6c 69 63 20 6c  g any symbolic l
fa90: 69 6e 6b 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  inks contained w
faa0: 69 74 68 69 6e 20 74 68 65 20 70 61 74 68 2e 0a  ithin the path..
fab0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
fac0: 2a 09 54 68 65 20 6e 65 77 20 27 6e 65 78 74 43  *.The new 'nextC
fad0: 68 65 63 6b 70 6f 69 6e 74 27 20 76 61 6c 75 65  heckpoint' value
fae0: 2c 20 67 69 76 69 6e 67 20 61 73 20 66 61 72 20  , giving as far 
faf0: 61 73 20 77 65 20 63 6f 75 6c 64 20 75 6e 64 65  as we could unde
fb00: 72 73 74 61 6e 64 0a 20 2a 09 69 6e 20 74 68 65  rstand. *.in the
fb10: 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 53 69 64   path.. *. * Sid
fb20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
fb30: 65 20 70 61 74 68 50 74 72 20 73 74 72 69 6e 67  e pathPtr string
fb40: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 63 6f 6e  , which must con
fb50: 74 61 69 6e 20 61 20 76 61 6c 69 64 20 70 61 74  tain a valid pat
fb60: 68 2c 20 69 73 20 70 6f 73 73 69 62 6c 79 0a 20  h, is possibly. 
fb70: 2a 09 6d 6f 64 69 66 69 65 64 20 69 6e 20 70 6c  *.modified in pl
fb80: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
fb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fba0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
fbe0: 63 6c 70 4f 62 6a 4e 6f 72 6d 61 6c 69 7a 65 50  clpObjNormalizeP
fbf0: 61 74 68 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  ath(.    TCL_UNU
fc00: 53 45 44 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  SED(Tcl_Interp *
fc10: 29 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  ),.    Tcl_Obj *
fc20: 70 61 74 68 50 74 72 2c 09 20 20 20 20 20 20 20  pathPtr,.       
fc30: 20 2f 2a 20 41 6e 20 75 6e 73 68 61 72 65 64 20   /* An unshared 
fc40: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e  object containin
fc50: 67 20 74 68 65 20 70 61 74 68 20 74 6f 0a 09 09  g the path to...
fc60: 09 09 20 2a 20 6e 6f 72 6d 61 6c 69 7a 65 20 2a  .. * normalize *
fc70: 2f 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43 68  /.    int nextCh
fc80: 65 63 6b 70 6f 69 6e 74 29 09 20 20 20 20 20 20  eckpoint).      
fc90: 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 73    /* offset to s
fca0: 74 61 72 74 20 61 74 20 69 6e 20 70 61 74 68 50  tart at in pathP
fcb0: 74 72 20 2a 2f 0a 7b 0a 20 20 20 20 63 68 61 72  tr */.{.    char
fcc0: 20 2a 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45   *lastValidPathE
fcd0: 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  nd = NULL;.    T
fce0: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 4e 6f 72  cl_DString dsNor
fcf0: 6d 3b 09 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c  m;../* This will
fd00: 20 68 6f 6c 64 20 74 68 65 20 6e 6f 72 6d 61 6c   hold the normal
fd10: 69 7a 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a  ized string. */.
fd20: 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 2c 20      char *path, 
fd30: 2a 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50  *currentPathEndP
fd40: 6f 73 69 74 69 6f 6e 3b 0a 20 20 20 20 54 63 6c  osition;.    Tcl
fd50: 5f 4f 62 6a 20 2a 74 65 6d 70 20 3d 20 4e 55 4c  _Obj *temp = NUL
fd60: 4c 3b 0a 20 20 20 20 69 6e 74 20 69 73 44 72 69  L;.    int isDri
fd70: 76 65 20 3d 20 31 3b 0a 20 20 20 20 54 63 6c 5f  ve = 1;.    Tcl_
fd80: 44 53 74 72 69 6e 67 20 64 73 3b 09 09 2f 2a 20  DString ds;../* 
fd90: 53 6f 6d 65 20 77 6f 72 6b 73 70 61 63 65 2e 20  Some workspace. 
fda0: 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  */..    Tcl_DStr
fdb0: 69 6e 67 49 6e 69 74 28 26 64 73 4e 6f 72 6d 29  ingInit(&dsNorm)
fdc0: 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c  ;.    path = Tcl
fdd0: 47 65 74 53 74 72 69 6e 67 28 70 61 74 68 50 74  GetString(pathPt
fde0: 72 29 3b 0a 0a 20 20 20 20 63 75 72 72 65 6e 74  r);..    current
fdf0: 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20  PathEndPosition 
fe00: 3d 20 70 61 74 68 20 2b 20 6e 65 78 74 43 68 65  = path + nextChe
fe10: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 69 66 20  ckpoint;.    if 
fe20: 28 2a 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64  (*currentPathEnd
fe30: 50 6f 73 69 74 69 6f 6e 20 3d 3d 20 27 2f 27 29  Position == '/')
fe40: 20 7b 0a 09 63 75 72 72 65 6e 74 50 61 74 68 45   {..currentPathE
fe50: 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 20 20  ndPosition++;.  
fe60: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 20 28 31    }.    while (1
fe70: 29 20 7b 0a 09 63 68 61 72 20 63 75 72 20 3d 20  ) {..char cur = 
fe80: 2a 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50  *currentPathEndP
fe90: 6f 73 69 74 69 6f 6e 3b 0a 0a 09 69 66 20 28 28  osition;...if ((
fea0: 63 75 72 3d 3d 27 2f 27 20 7c 7c 20 63 75 72 3d  cur=='/' || cur=
feb0: 3d 30 29 20 26 26 20 28 70 61 74 68 20 21 3d 20  =0) && (path != 
fec0: 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f  currentPathEndPo
fed0: 73 69 74 69 6f 6e 29 29 20 7b 0a 09 20 20 20 20  sition)) {..    
fee0: 2f 2a 0a 09 20 20 20 20 20 2a 20 52 65 61 63 68  /*..     * Reach
fef0: 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  ed directory sep
ff00: 61 72 61 74 6f 72 2c 20 6f 72 20 65 6e 64 20 6f  arator, or end o
ff10: 66 20 73 74 72 69 6e 67 2e 0a 09 20 20 20 20 20  f string...     
ff20: 2a 2f 0a 0a 09 20 20 20 20 57 49 4e 33 32 5f 46  */...    WIN32_F
ff30: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
ff40: 54 41 20 64 61 74 61 3b 0a 09 20 20 20 20 63 6f  TA data;..    co
ff50: 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69 76  nst WCHAR *nativ
ff60: 65 50 61 74 68 3b 0a 0a 09 20 20 20 20 54 63 6c  ePath;...    Tcl
ff70: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
ff80: 29 3b 0a 09 20 20 20 20 6e 61 74 69 76 65 50 61  );..    nativePa
ff90: 74 68 20 3d 20 54 63 6c 5f 55 74 66 54 6f 57 43  th = Tcl_UtfToWC
ffa0: 68 61 72 44 53 74 72 69 6e 67 28 70 61 74 68 2c  harDString(path,
ffb0: 0a 09 09 20 20 20 20 63 75 72 72 65 6e 74 50 61  ...    currentPa
ffc0: 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 2d 20  thEndPosition - 
ffd0: 70 61 74 68 2c 20 26 64 73 29 3b 0a 0a 09 20 20  path, &ds);...  
ffe0: 20 20 69 66 20 28 47 65 74 46 69 6c 65 41 74 74    if (GetFileAtt
fff0: 72 69 62 75 74 65 73 45 78 57 28 6e 61 74 69 76  ributesExW(nativ
10000 65 50 61 74 68 2c 0a 09 09 20 20 20 20 47 65 74  ePath,...    Get
10010 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
10020 72 64 2c 20 26 64 61 74 61 29 20 21 3d 20 54 52  rd, &data) != TR
10030 55 45 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20  UE) {.../*... * 
10040 46 69 6c 65 20 64 6f 65 73 6e 27 74 20 65 78 69  File doesn't exi
10050 73 74 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20  st.... */....if 
10060 28 69 73 44 72 69 76 65 29 20 7b 0a 09 09 20 20  (isDrive) {...  
10070 20 20 73 69 7a 65 5f 74 20 6c 65 6e 20 3d 20 57    size_t len = W
10080 69 6e 49 73 52 65 73 65 72 76 65 64 28 70 61 74  inIsReserved(pat
10090 68 29 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 6c  h);....    if (l
100a0 65 6e 20 3e 20 30 29 20 7b 0a 09 09 09 2f 2a 0a  en > 0) {..../*.
100b0 09 09 09 20 2a 20 41 63 74 75 61 6c 6c 79 20 69  ... * Actually i
100c0 74 20 64 6f 65 73 20 65 78 69 73 74 20 2d 20 43  t does exist - C
100d0 4f 4d 31 2c 20 65 74 63 2e 0a 09 09 09 20 2a 2f  OM1, etc..... */
100e0 0a 0a 09 09 09 73 69 7a 65 5f 74 20 69 3b 0a 0a  .....size_t i;..
100f0 09 09 09 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c  ...for (i=0 ; i<
10100 6c 65 6e 20 3b 20 69 2b 2b 29 20 7b 0a 09 09 09  len ; i++) {....
10110 20 20 20 20 57 43 48 41 52 20 77 63 20 3d 20 28      WCHAR wc = (
10120 28 57 43 48 41 52 20 2a 29 6e 61 74 69 76 65 50  (WCHAR *)nativeP
10130 61 74 68 29 5b 69 5d 3b 0a 0a 09 09 09 20 20 20  ath)[i];.....   
10140 20 69 66 20 28 77 63 20 3e 3d 20 27 61 27 29 20   if (wc >= 'a') 
10150 7b 0a 09 09 09 09 77 63 20 2d 3d 20 28 27 61 27  {.....wc -= ('a'
10160 20 2d 20 27 41 27 29 3b 0a 09 09 09 09 28 28 57   - 'A');.....((W
10170 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 61  CHAR *) nativePa
10180 74 68 29 5b 69 5d 20 3d 20 77 63 3b 0a 09 09 09  th)[i] = wc;....
10190 20 20 20 20 7d 0a 09 09 09 7d 0a 09 09 09 54 63      }....}....Tc
101a0 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
101b0 26 64 73 4e 6f 72 6d 2c 0a 09 09 09 09 28 63 6f  &dsNorm,.....(co
101c0 6e 73 74 20 63 68 61 72 20 2a 29 6e 61 74 69 76  nst char *)nativ
101d0 65 50 61 74 68 2c 0a 09 09 09 09 73 69 7a 65 6f  ePath,.....sizeo
101e0 66 28 57 43 48 41 52 29 20 2a 20 6c 65 6e 29 3b  f(WCHAR) * len);
101f0 0a 09 09 09 6c 61 73 74 56 61 6c 69 64 50 61 74  ....lastValidPat
10200 68 45 6e 64 20 3d 20 63 75 72 72 65 6e 74 50 61  hEnd = currentPa
10210 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 09  thEndPosition;..
10220 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
10230 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d  nextCheckpoint =
10240 3d 20 30 29 20 7b 0a 09 09 09 2f 2a 0a 09 09 09  = 0) {..../*....
10250 20 2a 20 50 61 74 68 20 73 74 61 72 74 73 20 77   * Path starts w
10260 69 74 68 20 61 20 64 72 69 76 65 20 64 65 73 69  ith a drive desi
10270 67 6e 61 74 69 6f 6e 20 74 68 61 74 27 73 20 6e  gnation that's n
10280 6f 74 0a 09 09 09 20 2a 20 61 63 74 75 61 6c 6c  ot.... * actuall
10290 79 20 6f 6e 20 74 68 65 20 73 79 73 74 65 6d 2e  y on the system.
102a0 20 57 65 20 73 74 69 6c 6c 20 6d 75 73 74 20 6e   We still must n
102b0 6f 72 6d 61 6c 69 7a 65 20 75 70 0a 09 09 09 20  ormalize up.... 
102c0 2a 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  * past the first
102d0 20 73 65 70 61 72 61 74 6f 72 2e 20 5b 42 75 67   separator. [Bug
102e0 20 33 36 30 33 34 33 34 5d 0a 09 09 09 20 2a 2f   3603434].... */
102f0 0a 0a 09 09 09 63 75 72 72 65 6e 74 50 61 74 68  .....currentPath
10300 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 09  EndPosition++;..
10310 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 54 63 6c  .    }...}...Tcl
10320 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10330 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
10340 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20   }...    /*..   
10350 20 20 2a 20 46 69 6c 65 20 27 6e 61 74 69 76 65    * File 'native
10360 50 61 74 68 27 20 64 6f 65 73 20 65 78 69 73 74  Path' does exist
10370 20 69 66 20 77 65 20 67 65 74 20 68 65 72 65 2e   if we get here.
10380 20 57 65 20 6e 6f 77 20 77 61 6e 74 20 74 6f 0a   We now want to.
10390 09 20 20 20 20 20 2a 20 63 68 65 63 6b 20 69 66  .     * check if
103a0 20 69 74 20 69 73 20 61 20 73 79 6d 6c 69 6e 6b   it is a symlink
103b0 20 61 6e 64 20 6f 74 68 65 72 77 69 73 65 20 63   and otherwise c
103c0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
103d0 0a 09 20 20 20 20 20 2a 20 72 65 73 74 20 6f 66  ..     * rest of
103e0 20 74 68 65 20 70 61 74 68 2e 0a 09 20 20 20 20   the path...    
103f0 20 2a 2f 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20   */...    /*..  
10400 20 20 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 73     * Check for s
10410 79 6d 6c 69 6e 6b 73 2c 20 65 78 63 65 70 74 20  ymlinks, except 
10420 61 74 20 6c 61 73 74 20 63 6f 6d 70 6f 6e 65 6e  at last componen
10430 74 20 6f 66 20 70 61 74 68 20 28 77 65 20 64 6f  t of path (we do
10440 6e 27 74 0a 09 20 20 20 20 20 2a 20 66 6f 6c 6c  n't..     * foll
10450 6f 77 20 66 69 6e 61 6c 20 73 79 6d 6c 69 6e 6b  ow final symlink
10460 73 29 2e 20 41 6c 73 6f 20 61 20 64 72 69 76 65  s). Also a drive
10470 20 28 43 3a 2f 29 20 66 6f 72 20 65 78 61 6d 70   (C:/) for examp
10480 6c 65 2c 20 6d 61 79 0a 09 20 20 20 20 20 2a 20  le, may..     * 
10490 73 6f 6d 65 74 69 6d 65 73 20 68 61 76 65 20 74  sometimes have t
104a0 68 65 20 72 65 70 61 72 73 65 20 66 6c 61 67 20  he reparse flag 
104b0 73 65 74 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  set for some rea
104c0 73 6f 6e 20 49 20 64 6f 6e 27 74 0a 09 20 20 20  son I don't..   
104d0 20 20 2a 20 75 6e 64 65 72 73 74 61 6e 64 2e 20    * understand. 
104e0 57 65 20 74 68 65 72 65 66 6f 72 65 20 64 6f 6e  We therefore don
104f0 27 74 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  't perform this 
10500 63 68 65 63 6b 20 66 6f 72 20 64 72 69 76 65 73  check for drives
10510 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
10520 20 69 66 20 28 63 75 72 20 21 3d 20 30 20 26 26   if (cur != 0 &&
10530 20 21 69 73 44 72 69 76 65 20 26 26 0a 09 09 20   !isDrive &&... 
10540 20 20 20 64 61 74 61 2e 64 77 46 69 6c 65 41 74     data.dwFileAt
10550 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
10560 41 54 54 52 49 42 55 54 45 5f 52 45 50 41 52 53  ATTRIBUTE_REPARS
10570 45 5f 50 4f 49 4e 54 29 7b 0a 09 09 54 63 6c 5f  E_POINT){...Tcl_
10580 4f 62 6a 20 2a 74 6f 20 3d 20 57 69 6e 52 65 61  Obj *to = WinRea
10590 64 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 6e  dLinkDirectory(n
105a0 61 74 69 76 65 50 61 74 68 29 3b 0a 0a 09 09 69  ativePath);....i
105b0 66 20 28 74 6f 20 21 3d 20 4e 55 4c 4c 29 20 7b  f (to != NULL) {
105c0 0a 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 20 20  ...    /*...    
105d0 20 2a 20 52 65 61 64 20 74 68 65 20 72 65 70 61   * Read the repa
105e0 72 73 65 20 70 6f 69 6e 74 20 6f 6b 2e 20 4e 6f  rse point ok. No
105f0 77 2c 20 72 65 70 61 72 73 65 20 70 6f 69 6e 74  w, reparse point
10600 73 20 6e 65 65 64 20 6e 6f 74 0a 09 09 20 20 20  s need not...   
10610 20 20 2a 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65    * be normalize
10620 64 2c 20 6f 74 68 65 72 77 69 73 65 20 77 65 20  d, otherwise we 
10630 63 6f 75 6c 64 20 75 73 65 3a 0a 09 09 20 20 20  could use:...   
10640 20 20 2a 0a 09 09 20 20 20 20 20 2a 20 54 63 6c    *...     * Tcl
10650 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10660 6a 28 74 6f 2c 20 26 70 61 74 68 4c 65 6e 29 3b  j(to, &pathLen);
10670 0a 09 09 20 20 20 20 20 2a 20 6e 65 78 74 43 68  ...     * nextCh
10680 65 63 6b 70 6f 69 6e 74 20 3d 20 70 61 74 68 4c  eckpoint = pathL
10690 65 6e 3b 0a 09 09 20 20 20 20 20 2a 0a 09 09 20  en;...     *... 
106a0 20 20 20 20 2a 20 53 6f 2c 20 69 6e 73 74 65 61      * So, instea
106b0 64 20 77 65 20 68 61 76 65 20 74 6f 20 73 74 61  d we have to sta
106c0 72 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  rt from the begi
106d0 6e 6e 69 6e 67 2e 0a 09 09 20 20 20 20 20 2a 2f  nning....     */
106e0 0a 0a 09 09 20 20 20 20 6e 65 78 74 43 68 65 63  ....    nextChec
106f0 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 09 09 20 20  kpoint = 0;...  
10700 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
10710 6a 28 74 6f 2c 20 63 75 72 72 65 6e 74 50 61 74  j(to, currentPat
10720 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2c 20 54 43  hEndPosition, TC
10730 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 3b 0a 0a  L_INDEX_NONE);..
10740 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 20 20 20  ..    /*...     
10750 2a 20 43 6f 6e 76 65 72 74 20 6c 69 6e 6b 20 74  * Convert link t
10760 6f 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 65  o forward slashe
10770 73 2e 0a 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09  s....     */....
10780 20 20 20 20 66 6f 72 20 28 70 61 74 68 20 3d 20      for (path = 
10790 54 63 6c 47 65 74 53 74 72 69 6e 67 28 74 6f 29  TclGetString(to)
107a0 3b 20 2a 70 61 74 68 20 21 3d 20 30 3b 20 70 61  ; *path != 0; pa
107b0 74 68 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 2a  th++) {....if (*
107c0 70 61 74 68 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a  path == '\\') {.
107d0 09 09 09 20 20 20 20 2a 70 61 74 68 20 3d 20 27  ...    *path = '
107e0 2f 27 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d  /';....}...    }
107f0 0a 09 09 20 20 20 20 70 61 74 68 20 3d 20 54 63  ...    path = Tc
10800 6c 47 65 74 53 74 72 69 6e 67 28 74 6f 29 3b 0a  lGetString(to);.
10810 09 09 20 20 20 20 63 75 72 72 65 6e 74 50 61 74  ..    currentPat
10820 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 20 70  hEndPosition = p
10830 61 74 68 20 2b 20 6e 65 78 74 43 68 65 63 6b 70  ath + nextCheckp
10840 6f 69 6e 74 3b 0a 09 09 20 20 20 20 69 66 20 28  oint;...    if (
10850 74 65 6d 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  temp != NULL) {.
10860 09 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  ...Tcl_DecrRefCo
10870 75 6e 74 28 74 65 6d 70 29 3b 0a 09 09 20 20 20  unt(temp);...   
10880 20 7d 0a 09 09 20 20 20 20 74 65 6d 70 20 3d 20   }...    temp = 
10890 74 6f 3b 0a 0a 09 09 20 20 20 20 2f 2a 0a 09 09  to;....    /*...
108a0 20 20 20 20 20 2a 20 52 65 73 65 74 20 76 61 72       * Reset var
108b0 69 61 62 6c 65 73 20 73 6f 20 77 65 20 63 61 6e  iables so we can
108c0 20 72 65 73 74 61 72 74 20 6e 6f 72 6d 61 6c 69   restart normali
108d0 7a 61 74 69 6f 6e 2e 0a 09 09 20 20 20 20 20 2a  zation....     *
108e0 2f 0a 0a 09 09 20 20 20 20 69 73 44 72 69 76 65  /....    isDrive
108f0 20 3d 20 31 3b 0a 09 09 20 20 20 20 54 63 6c 5f   = 1;...    Tcl_
10900 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 4e  DStringFree(&dsN
10910 6f 72 6d 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f  orm);...    Tcl_
10920 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
10930 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;...    continue
10940 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69  ;...}..    }..#i
10950 66 6e 64 65 66 20 54 63 6c 4e 4f 52 4d 5f 4c 4f  fndef TclNORM_LO
10960 4e 47 5f 50 41 54 48 0a 09 20 20 20 20 2f 2a 0a  NG_PATH..    /*.
10970 09 20 20 20 20 20 2a 20 4e 6f 77 20 77 65 20 63  .     * Now we c
10980 6f 6e 76 65 72 74 20 74 68 65 20 74 61 69 6c 20  onvert the tail 
10990 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  of the current p
109a0 61 74 68 20 74 6f 20 69 74 73 20 27 6c 6f 6e 67  ath to its 'long
109b0 20 66 6f 72 6d 27 2c 0a 09 20 20 20 20 20 2a 20   form',..     * 
109c0 61 6e 64 20 61 70 70 65 6e 64 20 69 74 20 74 6f  and append it to
109d0 20 27 64 73 4e 6f 72 6d 27 20 77 68 69 63 68 20   'dsNorm' which 
109e0 68 6f 6c 64 73 20 74 68 65 20 63 75 72 72 65 6e  holds the curren
109f0 74 20 6e 6f 72 6d 61 6c 69 7a 65 64 0a 09 20 20  t normalized..  
10a00 20 20 20 2a 20 70 61 74 68 0a 09 20 20 20 20 20     * path..     
10a10 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 69 73 44  */...    if (isD
10a20 72 69 76 65 29 20 7b 0a 09 09 57 43 48 41 52 20  rive) {...WCHAR 
10a30 64 72 69 76 65 20 3d 20 28 28 57 43 48 41 52 20  drive = ((WCHAR 
10a40 2a 29 20 6e 61 74 69 76 65 50 61 74 68 29 5b 30  *) nativePath)[0
10a50 5d 3b 0a 0a 09 09 69 66 20 28 64 72 69 76 65 20  ];....if (drive 
10a60 3e 3d 20 27 61 27 29 20 7b 0a 09 09 20 20 20 20  >= 'a') {...    
10a70 64 72 69 76 65 20 2d 3d 20 28 27 61 27 20 2d 20  drive -= ('a' - 
10a80 27 41 27 29 3b 0a 09 09 20 20 20 20 28 28 57 43  'A');...    ((WC
10a90 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 61 74  HAR *) nativePat
10aa0 68 29 5b 30 5d 20 3d 20 64 72 69 76 65 3b 0a 09  h)[0] = drive;..
10ab0 09 7d 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67  .}...Tcl_DString
10ac0 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20  Append(&dsNorm, 
10ad0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 6e 61  (const char *)na
10ae0 74 69 76 65 50 61 74 68 2c 0a 09 09 09 54 63 6c  tivePath,....Tcl
10af0 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26  _DStringLength(&
10b00 64 73 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73  ds));..    } els
10b10 65 20 7b 0a 09 09 63 68 61 72 20 2a 63 68 65 63  e {...char *chec
10b20 6b 44 6f 74 73 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  kDots = NULL;...
10b30 09 69 66 20 28 6c 61 73 74 56 61 6c 69 64 50 61  .if (lastValidPa
10b40 74 68 45 6e 64 5b 31 5d 20 3d 3d 20 27 2e 27 29  thEnd[1] == '.')
10b50 20 7b 0a 09 09 20 20 20 20 63 68 65 63 6b 44 6f   {...    checkDo
10b60 74 73 20 3d 20 6c 61 73 74 56 61 6c 69 64 50 61  ts = lastValidPa
10b70 74 68 45 6e 64 20 2b 20 31 3b 0a 09 09 20 20 20  thEnd + 1;...   
10b80 20 77 68 69 6c 65 20 28 63 68 65 63 6b 44 6f 74   while (checkDot
10b90 73 20 3c 20 63 75 72 72 65 6e 74 50 61 74 68 45  s < currentPathE
10ba0 6e 64 50 6f 73 69 74 69 6f 6e 29 20 7b 0a 09 09  ndPosition) {...
10bb0 09 69 66 20 28 2a 63 68 65 63 6b 44 6f 74 73 20  .if (*checkDots 
10bc0 21 3d 20 27 2e 27 29 20 7b 0a 09 09 09 20 20 20  != '.') {....   
10bd0 20 63 68 65 63 6b 44 6f 74 73 20 3d 20 4e 55 4c   checkDots = NUL
10be0 4c 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  L;....    break;
10bf0 0a 09 09 09 7d 0a 09 09 09 63 68 65 63 6b 44 6f  ....}....checkDo
10c00 74 73 2b 2b 3b 0a 09 09 20 20 20 20 7d 0a 09 09  ts++;...    }...
10c10 7d 0a 09 09 69 66 20 28 63 68 65 63 6b 44 6f 74  }...if (checkDot
10c20 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20  s != NULL) {... 
10c30 20 20 20 69 6e 74 20 64 6f 74 4c 65 6e 20 3d 20     int dotLen = 
10c40 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f  currentPathEndPo
10c50 73 69 74 69 6f 6e 2d 6c 61 73 74 56 61 6c 69 64  sition-lastValid
10c60 50 61 74 68 45 6e 64 3b 0a 0a 09 09 20 20 20 20  PathEnd;....    
10c70 2f 2a 0a 09 09 20 20 20 20 20 2a 20 50 61 74 68  /*...     * Path
10c80 20 69 73 20 6a 75 73 74 20 64 6f 74 73 2e 20 57   is just dots. W
10c90 65 20 73 68 6f 75 6c 64 6e 27 74 20 72 65 61 6c  e shouldn't real
10ca0 6c 79 20 65 76 65 72 20 73 65 65 20 61 20 70 61  ly ever see a pa
10cb0 74 68 0a 09 09 20 20 20 20 20 2a 20 6c 69 6b 65  th...     * like
10cc0 20 74 68 61 74 2e 20 48 6f 77 65 76 65 72 2c 20   that. However, 
10cd0 74 6f 20 62 65 20 6e 69 63 65 20 77 65 20 61 74  to be nice we at
10ce0 20 6c 65 61 73 74 20 64 6f 6e 27 74 20 6d 61 6e   least don't man
10cf0 67 6c 65 0a 09 09 20 20 20 20 20 2a 20 74 68 65  gle...     * the
10d00 20 70 61 74 68 20 2d 20 77 65 20 6a 75 73 74 20   path - we just 
10d10 61 64 64 20 74 68 65 20 64 6f 74 73 20 61 73 20  add the dots as 
10d20 61 20 70 61 74 68 20 73 65 67 6d 65 6e 74 20 61  a path segment a
10d30 6e 64 0a 09 09 20 20 20 20 20 2a 20 63 6f 6e 74  nd...     * cont
10d40 69 6e 75 65 2e 0a 09 09 20 20 20 20 20 2a 2f 0a  inue....     */.
10d50 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ...    Tcl_DStri
10d60 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d  ngAppend(&dsNorm
10d70 2c 20 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  , ((const char *
10d80 29 6e 61 74 69 76 65 50 61 74 68 29 0a 09 09 09  )nativePath)....
10d90 20 20 20 20 2b 20 54 63 6c 5f 44 53 74 72 69 6e      + Tcl_DStrin
10da0 67 4c 65 6e 67 74 68 28 26 64 73 29 0a 09 09 09  gLength(&ds)....
10db0 20 20 20 20 2d 20 28 64 6f 74 4c 65 6e 20 2a 20      - (dotLen * 
10dc0 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 2c 0a  sizeof(WCHAR)),.
10dd0 09 09 09 20 20 20 20 64 6f 74 4c 65 6e 20 2a 20  ...    dotLen * 
10de0 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a  sizeof(WCHAR));.
10df0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
10e00 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 4e 6f 72   /*...     * Nor
10e10 6d 61 6c 20 70 61 74 68 2e 0a 09 09 20 20 20 20  mal path....    
10e20 20 2a 2f 0a 0a 09 09 20 20 20 20 57 49 4e 33 32   */....    WIN32
10e30 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 44 61 74  _FIND_DATAW fDat
10e40 61 3b 0a 09 09 20 20 20 20 48 41 4e 44 4c 45 20  a;...    HANDLE 
10e50 68 61 6e 64 6c 65 3b 0a 0a 09 09 20 20 20 20 68  handle;....    h
10e60 61 6e 64 6c 65 20 3d 20 46 69 6e 64 46 69 72 73  andle = FindFirs
10e70 74 46 69 6c 65 57 28 28 57 43 48 41 52 20 2a 29  tFileW((WCHAR *)
10e80 20 6e 61 74 69 76 65 50 61 74 68 2c 20 26 66 44   nativePath, &fD
10e90 61 74 61 29 3b 0a 09 09 20 20 20 20 69 66 20 28  ata);...    if (
10ea0 68 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c 49  handle == INVALI
10eb0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
10ec0 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 54 68  {..../*.... * Th
10ed0 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68  is is usually th
10ee0 65 20 27 2f 27 20 69 6e 20 27 63 3a 2f 27 20 61  e '/' in 'c:/' a
10ef0 74 20 65 6e 64 20 6f 66 20 73 74 72 69 6e 67 2e  t end of string.
10f00 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 54 63 6c 5f  .... */.....Tcl_
10f10 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
10f20 73 4e 6f 72 6d 2c 20 28 63 6f 6e 73 74 20 63 68  sNorm, (const ch
10f30 61 72 20 2a 29 20 4c 22 2f 22 2c 0a 09 09 09 09  ar *) L"/",.....
10f40 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a  sizeof(WCHAR));.
10f50 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
10f60 09 09 57 43 48 41 52 20 2a 6e 61 74 69 76 65 4e  ..WCHAR *nativeN
10f70 61 6d 65 3b 0a 0a 09 09 09 69 66 20 28 66 44 61  ame;.....if (fDa
10f80 74 61 2e 63 46 69 6c 65 4e 61 6d 65 5b 30 5d 20  ta.cFileName[0] 
10f90 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 20 20  != '\0') {....  
10fa0 20 20 6e 61 74 69 76 65 4e 61 6d 65 20 3d 20 66    nativeName = f
10fb0 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65 3b 0a  Data.cFileName;.
10fc0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 20  ...} else {.... 
10fd0 20 20 20 6e 61 74 69 76 65 4e 61 6d 65 20 3d 20     nativeName = 
10fe0 66 44 61 74 61 2e 63 41 6c 74 65 72 6e 61 74 65  fData.cAlternate
10ff0 46 69 6c 65 4e 61 6d 65 3b 0a 09 09 09 7d 0a 09  FileName;....}..
11000 09 09 46 69 6e 64 43 6c 6f 73 65 28 68 61 6e 64  ..FindClose(hand
11010 6c 65 29 3b 0a 09 09 09 54 63 6c 5f 44 53 74 72  le);....Tcl_DStr
11020 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72  ingAppend(&dsNor
11030 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  m, (const char *
11040 29 20 4c 22 2f 22 2c 0a 09 09 09 09 73 69 7a 65  ) L"/",.....size
11050 6f 66 28 57 43 48 41 52 29 29 3b 0a 09 09 09 54  of(WCHAR));....T
11060 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
11070 28 26 64 73 4e 6f 72 6d 2c 0a 09 09 09 09 28 63  (&dsNorm,.....(c
11080 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 61 74  onst char *) nat
11090 69 76 65 4e 61 6d 65 2c 0a 09 09 09 09 77 63 73  iveName,.....wcs
110a0 6c 65 6e 28 6e 61 74 69 76 65 4e 61 6d 65 29 2a  len(nativeName)*
110b0 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a  sizeof(WCHAR));.
110c0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
110d0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 54 63   }.#endif /* !Tc
110e0 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 54 48 20  lNORM_LONG_PATH 
110f0 2a 2f 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  */..    Tcl_DStr
11100 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
11110 20 20 20 6c 61 73 74 56 61 6c 69 64 50 61 74 68     lastValidPath
11120 45 6e 64 20 3d 20 63 75 72 72 65 6e 74 50 61 74  End = currentPat
11130 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 09 20  hEndPosition;.. 
11140 20 20 20 69 66 20 28 63 75 72 20 3d 3d 20 30 29     if (cur == 0)
11150 20 7b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20   {...break;..   
11160 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20   }...    /*..   
11170 20 20 2a 20 49 66 20 77 65 20 67 65 74 20 68 65    * If we get he
11180 72 65 2c 20 77 65 27 76 65 20 67 6f 74 20 70 61  re, we've got pa
11190 73 74 20 6f 6e 65 20 64 69 72 65 63 74 6f 72 79  st one directory
111a0 20 64 65 6c 69 6d 69 74 65 72 2c 20 73 6f 20 77   delimiter, so w
111b0 65 0a 09 20 20 20 20 20 2a 20 6b 6e 6f 77 20 69  e..     * know i
111c0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  t is no longer a
111d0 20 64 72 69 76 65 2e 0a 09 20 20 20 20 20 2a 2f   drive...     */
111e0 0a 0a 09 20 20 20 20 69 73 44 72 69 76 65 20 3d  ...    isDrive =
111f0 20 30 3b 0a 09 7d 0a 09 63 75 72 72 65 6e 74 50   0;..}..currentP
11200 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b  athEndPosition++
11210 3b 0a 0a 23 69 66 64 65 66 20 54 63 6c 4e 4f 52  ;..#ifdef TclNOR
11220 4d 5f 4c 4f 4e 47 5f 50 41 54 48 0a 09 2f 2a 0a  M_LONG_PATH../*.
11230 09 20 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  . * Convert the 
11240 65 6e 74 69 72 65 20 6b 6e 6f 77 6e 20 70 61 74  entire known pat
11250 68 20 74 6f 20 6c 6f 6e 67 20 66 6f 72 6d 2e 0a  h to long form..
11260 09 20 2a 2f 0a 0a 09 57 43 48 41 52 20 77 70 61  . */...WCHAR wpa
11270 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 09 63  th[MAX_PATH];..c
11280 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74 69  onst WCHAR *nati
11290 76 65 50 61 74 68 3b 0a 09 44 57 4f 52 44 20 77  vePath;..DWORD w
112a0 70 61 74 68 6c 65 6e 3b 0a 0a 09 54 63 6c 5f 44  pathlen;...Tcl_D
112b0 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
112c0 0a 09 6e 61 74 69 76 65 50 61 74 68 20 3d 0a 09  ..nativePath =..
112d0 09 54 63 6c 5f 55 74 66 54 6f 57 43 68 61 72 44  .Tcl_UtfToWCharD
112e0 53 74 72 69 6e 67 28 70 61 74 68 2c 20 6c 61 73  String(path, las
112f0 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20 2d 20  tValidPathEnd - 
11300 70 61 74 68 2c 20 26 64 73 29 3b 0a 09 77 70 61  path, &ds);..wpa
11310 74 68 6c 65 6e 20 3d 20 47 65 74 4c 6f 6e 67 50  thlen = GetLongP
11320 61 74 68 4e 61 6d 65 50 72 6f 63 28 6e 61 74 69  athNameProc(nati
11330 76 65 50 61 74 68 2c 0a 09 09 28 57 43 48 41 52  vePath,...(WCHAR
11340 20 2a 29 20 77 70 61 74 68 2c 20 4d 41 58 5f 50   *) wpath, MAX_P
11350 41 54 48 29 3b 0a 09 2f 2a 0a 09 20 2a 20 57 65  ATH);../*.. * We
11360 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 74 68   have to make th
11370 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 75  e drive letter u
11380 70 70 65 72 63 61 73 65 2e 0a 09 20 2a 2f 0a 0a  ppercase... */..
11390 09 69 66 20 28 77 70 61 74 68 5b 30 5d 20 3e 3d  .if (wpath[0] >=
113a0 20 27 61 27 29 20 7b 0a 09 20 20 20 20 77 70 61   'a') {..    wpa
113b0 74 68 5b 30 5d 20 2d 3d 20 28 27 61 27 20 2d 20  th[0] -= ('a' - 
113c0 27 41 27 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53  'A');..}..Tcl_DS
113d0 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e  tringAppend(&dsN
113e0 6f 72 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  orm, (const char
113f0 20 2a 29 20 77 70 61 74 68 2c 0a 09 09 77 70 61   *) wpath,...wpa
11400 74 68 6c 65 6e 20 2a 20 73 69 7a 65 6f 66 28 57  thlen * sizeof(W
11410 43 48 41 52 29 29 3b 0a 09 54 63 6c 5f 44 53 74  CHAR));..Tcl_DSt
11420 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 23  ringFree(&ds);.#
11430 65 6e 64 69 66 20 2f 2a 20 54 63 6c 4e 4f 52 4d  endif /* TclNORM
11440 5f 4c 4f 4e 47 5f 50 41 54 48 20 2a 2f 0a 20 20  _LONG_PATH */.  
11450 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
11460 20 2a 20 43 6f 6d 6d 6f 6e 20 63 6f 64 65 20 70   * Common code p
11470 61 74 68 20 66 6f 72 20 61 6c 6c 20 57 69 6e 64  ath for all Wind
11480 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20  ows platforms.. 
11490 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6e 65 78 74      */..    next
114a0 43 68 65 63 6b 70 6f 69 6e 74 20 3d 20 63 75 72  Checkpoint = cur
114b0 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74  rentPathEndPosit
114c0 69 6f 6e 20 2d 20 70 61 74 68 3b 0a 20 20 20 20  ion - path;.    
114d0 69 66 20 28 6c 61 73 74 56 61 6c 69 64 50 61 74  if (lastValidPat
114e0 68 45 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  hEnd != NULL) {.
114f0 09 2f 2a 0a 09 20 2a 20 43 6f 6e 63 61 74 65 6e  ./*.. * Concaten
11500 61 74 65 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a  ate the normaliz
11510 65 64 20 73 74 72 69 6e 67 20 69 6e 20 64 73 4e  ed string in dsN
11520 6f 72 6d 20 77 69 74 68 20 74 68 65 20 74 61 69  orm with the tai
11530 6c 20 6f 66 20 74 68 65 0a 09 20 2a 20 70 61 74  l of the.. * pat
11540 68 20 77 68 69 63 68 20 77 65 20 64 69 64 6e 27  h which we didn'
11550 74 20 72 65 63 6f 67 6e 69 73 65 2e 20 54 68 65  t recognise. The
11560 20 73 74 72 69 6e 67 20 69 6e 20 64 73 4e 6f 72   string in dsNor
11570 6d 20 69 73 20 69 6e 20 74 68 65 0a 09 20 2a 20  m is in the.. * 
11580 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
11590 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 63   so we have to c
115a0 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 55 74 66  onvert it to Utf
115b0 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 53 74  ... */...Tcl_DSt
115c0 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09  ringInit(&ds);..
115d0 54 63 6c 5f 57 43 68 61 72 54 6f 55 74 66 44 53  Tcl_WCharToUtfDS
115e0 74 72 69 6e 67 28 28 63 6f 6e 73 74 20 57 43 48  tring((const WCH
115f0 41 52 20 2a 29 20 54 63 6c 5f 44 53 74 72 69 6e  AR *) Tcl_DStrin
11600 67 56 61 6c 75 65 28 26 64 73 4e 6f 72 6d 29 2c  gValue(&dsNorm),
11610 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65  ...Tcl_DStringLe
11620 6e 67 74 68 28 26 64 73 4e 6f 72 6d 29 3e 3e 31  ngth(&dsNorm)>>1
11630 2c 20 26 64 73 29 3b 0a 09 6e 65 78 74 43 68 65  , &ds);..nextChe
11640 63 6b 70 6f 69 6e 74 20 3d 20 54 63 6c 5f 44 53  ckpoint = Tcl_DS
11650 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29  tringLength(&ds)
11660 3b 0a 09 69 66 20 28 2a 6c 61 73 74 56 61 6c 69  ;..if (*lastVali
11670 64 50 61 74 68 45 6e 64 20 21 3d 20 30 29 20 7b  dPathEnd != 0) {
11680 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
11690 20 4e 6f 74 20 74 68 65 20 65 6e 64 20 6f 66 20   Not the end of 
116a0 74 68 65 20 73 74 72 69 6e 67 2e 0a 09 20 20 20  the string...   
116b0 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 4f    */...    Tcl_O
116c0 62 6a 20 2a 74 6d 70 50 61 74 68 50 74 72 3b 0a  bj *tmpPathPtr;.
116d0 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
116e0 6e 3b 0a 0a 09 20 20 20 20 74 6d 70 50 61 74 68  n;...    tmpPath
116f0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Ptr = Tcl_NewStr
11700 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69  ingObj(Tcl_DStri
11710 6e 67 56 61 6c 75 65 28 26 64 73 29 2c 0a 09 09  ngValue(&ds),...
11720 20 20 20 20 6e 65 78 74 43 68 65 63 6b 70 6f 69      nextCheckpoi
11730 6e 74 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  nt);..    Tcl_Ap
11740 70 65 6e 64 54 6f 4f 62 6a 28 74 6d 70 50 61 74  pendToObj(tmpPat
11750 68 50 74 72 2c 20 6c 61 73 74 56 61 6c 69 64 50  hPtr, lastValidP
11760 61 74 68 45 6e 64 2c 20 54 43 4c 5f 49 4e 44 45  athEnd, TCL_INDE
11770 58 5f 4e 4f 4e 45 29 3b 0a 09 20 20 20 20 70 61  X_NONE);..    pa
11780 74 68 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e  th = TclGetStrin
11790 67 46 72 6f 6d 4f 62 6a 28 74 6d 70 50 61 74 68  gFromObj(tmpPath
117a0 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  Ptr, &len);..   
117b0 20 54 63 6c 5f 53 65 74 53 74 72 69 6e 67 4f 62   Tcl_SetStringOb
117c0 6a 28 70 61 74 68 50 74 72 2c 20 70 61 74 68 2c  j(pathPtr, path,
117d0 20 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f   len);..    Tcl_
117e0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 6d 70  DecrRefCount(tmp
117f0 50 61 74 68 50 74 72 29 3b 0a 09 7d 20 65 6c 73  PathPtr);..} els
11800 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  e {..    /*..   
11810 20 20 2a 20 45 6e 64 20 6f 66 20 73 74 72 69 6e    * End of strin
11820 67 20 77 61 73 20 72 65 61 63 68 65 64 20 61 62  g was reached ab
11830 6f 76 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  ove...     */...
11840 20 20 20 20 54 63 6c 5f 53 65 74 53 74 72 69 6e      Tcl_SetStrin
11850 67 4f 62 6a 28 70 61 74 68 50 74 72 2c 20 54 63  gObj(pathPtr, Tc
11860 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
11870 64 73 29 2c 20 6e 65 78 74 43 68 65 63 6b 70 6f  ds), nextCheckpo
11880 69 6e 74 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53  int);..}..Tcl_DS
11890 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
118a0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53      }.    Tcl_DS
118b0 74 72 69 6e 67 46 72 65 65 28 26 64 73 4e 6f 72  tringFree(&dsNor
118c0 6d 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  m);..    /*.    
118d0 20 2a 20 54 68 69 73 20 6d 75 73 74 20 62 65 20   * This must be 
118e0 64 6f 6e 65 20 61 66 74 65 72 20 77 65 20 61 72  done after we ar
118f0 65 20 74 6f 74 61 6c 6c 79 20 66 69 6e 69 73 68  e totally finish
11900 65 64 20 77 69 74 68 20 27 70 61 74 68 27 20 61  ed with 'path' a
11910 73 20 77 65 20 61 72 65 0a 20 20 20 20 20 2a 20  s we are.     * 
11920 73 68 61 72 69 6e 67 20 74 68 65 20 73 61 6d 65  sharing the same
11930 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 72 69   underlying stri
11940 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ng..     */..   
11950 20 69 66 20 28 74 65 6d 70 20 21 3d 20 4e 55 4c   if (temp != NUL
11960 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  L) {..Tcl_DecrRe
11970 66 43 6f 75 6e 74 28 74 65 6d 70 29 3b 0a 20 20  fCount(temp);.  
11980 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
11990 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a  nextCheckpoint;.
119a0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
119b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119f0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 57 69  ----. *. * TclWi
11a00 6e 56 6f 6c 75 6d 65 52 65 6c 61 74 69 76 65 4e  nVolumeRelativeN
11a10 6f 72 6d 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20  ormalize --. *. 
11a20 2a 09 4f 6e 6c 79 20 57 69 6e 64 6f 77 73 20 68  *.Only Windows h
11a30 61 73 20 76 6f 6c 75 6d 65 2d 72 65 6c 61 74 69  as volume-relati
11a40 76 65 20 70 61 74 68 73 2e 20 54 68 65 73 65 20  ve paths. These 
11a50 70 61 74 68 73 20 61 72 65 20 72 61 74 68 65 72  paths are rather
11a60 20 72 61 72 65 2c 0a 20 2a 09 62 75 74 20 69 74   rare,. *.but it
11a70 20 69 73 20 6e 69 63 65 20 69 66 20 54 63 6c 20   is nice if Tcl 
11a80 63 61 6e 20 68 61 6e 64 6c 65 20 74 68 65 6d 2e  can handle them.
11a90 20 49 74 20 69 73 20 6d 75 63 68 20 62 65 74 74   It is much bett
11aa0 65 72 20 69 66 20 77 65 20 63 61 6e 0a 20 2a 09  er if we can. *.
11ab0 68 61 6e 64 6c 65 20 74 68 65 6d 20 68 65 72 65  handle them here
11ac0 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 69 6e  , rather than in
11ad0 20 74 68 65 20 6e 61 74 69 76 65 20 66 73 20 63   the native fs c
11ae0 6f 64 65 2c 20 62 65 63 61 75 73 65 20 77 65 20  ode, because we 
11af0 72 65 61 6c 6c 79 0a 20 2a 09 6e 65 65 64 20 74  really. *.need t
11b00 6f 20 68 61 76 65 20 61 20 72 65 61 6c 20 61 62  o have a real ab
11b10 73 6f 6c 75 74 65 20 70 61 74 68 20 6a 75 73 74  solute path just
11b20 20 62 65 6c 6f 77 2e 0a 20 2a 0a 20 2a 09 57 65   below.. *. *.We
11b30 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 69 73   do not let this
11b40 20 62 6c 6f 63 6b 20 63 6f 6d 70 69 6c 65 20 6f   block compile o
11b50 6e 20 6e 6f 6e 2d 57 69 6e 64 6f 77 73 20 70 6c  n non-Windows pl
11b60 61 74 66 6f 72 6d 73 20 62 65 63 61 75 73 65 20  atforms because 
11b70 74 68 65 0a 20 2a 09 74 65 73 74 20 73 75 69 74  the. *.test suit
11b80 65 27 73 20 6d 61 6e 75 61 6c 20 66 6f 72 63 69  e's manual forci
11b90 6e 67 20 6f 66 20 74 63 6c 50 6c 61 74 66 6f 72  ng of tclPlatfor
11ba0 6d 20 63 61 6e 20 6f 74 68 65 72 77 69 73 65 20  m can otherwise 
11bb0 63 61 75 73 65 20 74 68 69 73 0a 20 2a 09 63 6f  cause this. *.co
11bc0 64 65 20 70 61 74 68 20 74 6f 20 62 65 20 65 78  de path to be ex
11bd0 65 63 75 74 65 64 2c 20 63 61 75 73 69 6e 67 20  ecuted, causing 
11be0 76 61 72 69 6f 75 73 20 65 72 72 6f 72 73 20 62  various errors b
11bf0 65 63 61 75 73 65 0a 20 2a 09 76 6f 6c 75 6d 65  ecause. *.volume
11c00 2d 72 65 6c 61 74 69 76 65 20 70 61 74 68 73 20  -relative paths 
11c10 72 65 61 6c 6c 79 20 64 6f 20 6e 6f 74 20 65 78  really do not ex
11c20 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ist.. *. * Resul
11c30 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 6e  ts:. *.A valid n
11c40 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 2e 0a  ormalized path..
11c50 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
11c60 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
11c70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
11c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
11cc0 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c  /..Tcl_Obj *.Tcl
11cd0 57 69 6e 56 6f 6c 75 6d 65 52 65 6c 61 74 69 76  WinVolumeRelativ
11ce0 65 4e 6f 72 6d 61 6c 69 7a 65 28 0a 20 20 20 20  eNormalize(.    
11cf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11d00 72 70 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  rp,.    const ch
11d10 61 72 20 2a 70 61 74 68 2c 0a 20 20 20 20 54 63  ar *path,.    Tc
11d20 6c 5f 4f 62 6a 20 2a 2a 75 73 65 54 68 69 73 43  l_Obj **useThisC
11d30 77 64 50 74 72 29 0a 7b 0a 20 20 20 20 54 63 6c  wdPtr).{.    Tcl
11d40 5f 4f 62 6a 20 2a 61 62 73 6f 6c 75 74 65 50 61  _Obj *absolutePa
11d50 74 68 2c 20 2a 75 73 65 54 68 69 73 43 77 64 3b  th, *useThisCwd;
11d60 0a 0a 20 20 20 20 75 73 65 54 68 69 73 43 77 64  ..    useThisCwd
11d70 20 3d 20 54 63 6c 5f 46 53 47 65 74 43 77 64 28   = Tcl_FSGetCwd(
11d80 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 66 20  interp);.    if 
11d90 28 75 73 65 54 68 69 73 43 77 64 20 3d 3d 20 4e  (useThisCwd == N
11da0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
11db0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
11dc0 69 66 20 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27  if (path[0] == '
11dd0 2f 27 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 50 61  /') {../*.. * Pa
11de0 74 68 20 6f 66 20 66 6f 72 6d 20 2f 66 6f 6f 2f  th of form /foo/
11df0 62 61 72 20 77 68 69 63 68 20 69 73 20 61 20 70  bar which is a p
11e00 61 74 68 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  ath in the root 
11e10 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
11e20 0a 09 20 2a 20 63 75 72 72 65 6e 74 20 76 6f 6c  .. * current vol
11e30 75 6d 65 2e 0a 09 20 2a 2f 0a 0a 09 63 6f 6e 73  ume... */...cons
11e40 74 20 63 68 61 72 20 2a 64 72 69 76 65 20 3d 20  t char *drive = 
11e50 54 63 6c 47 65 74 53 74 72 69 6e 67 28 75 73 65  TclGetString(use
11e60 54 68 69 73 43 77 64 29 3b 0a 0a 09 61 62 73 6f  ThisCwd);...abso
11e70 6c 75 74 65 50 61 74 68 20 3d 20 54 63 6c 5f 4e  lutePath = Tcl_N
11e80 65 77 53 74 72 69 6e 67 4f 62 6a 28 64 72 69 76  ewStringObj(driv
11e90 65 2c 32 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e  e,2);..Tcl_Appen
11ea0 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 65 50  dToObj(absoluteP
11eb0 61 74 68 2c 20 70 61 74 68 2c 20 54 43 4c 5f 49  ath, path, TCL_I
11ec0 4e 44 45 58 5f 4e 4f 4e 45 29 3b 0a 09 54 63 6c  NDEX_NONE);..Tcl
11ed0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 62  _IncrRefCount(ab
11ee0 73 6f 6c 75 74 65 50 61 74 68 29 3b 0a 0a 09 2f  solutePath);.../
11ef0 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20 61 20  *.. * We have a 
11f00 72 65 66 43 6f 75 6e 74 20 6f 6e 20 74 68 65 20  refCount on the 
11f10 63 77 64 2e 0a 09 20 2a 2f 0a 20 20 20 20 7d 20  cwd... */.    } 
11f20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 50  else {../*.. * P
11f30 61 74 68 20 6f 66 20 66 6f 72 6d 20 43 3a 66 6f  ath of form C:fo
11f40 6f 2f 62 61 72 2c 20 62 75 74 20 74 68 69 73 20  o/bar, but this 
11f50 6f 6e 6c 79 20 6d 61 6b 65 73 20 73 65 6e 73 65  only makes sense
11f60 20 69 66 20 74 68 65 20 63 77 64 20 69 73 0a 09   if the cwd is..
11f70 20 2a 20 61 6c 73 6f 20 6f 6e 20 64 72 69 76 65   * also on drive
11f80 20 43 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 53   C... */...Tcl_S
11f90 69 7a 65 20 63 77 64 4c 65 6e 3b 0a 09 63 6f 6e  ize cwdLen;..con
11fa0 73 74 20 63 68 61 72 20 2a 64 72 69 76 65 20 3d  st char *drive =
11fb0 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f   TclGetStringFro
11fc0 6d 4f 62 6a 28 75 73 65 54 68 69 73 43 77 64 2c  mObj(useThisCwd,
11fd0 20 26 63 77 64 4c 65 6e 29 3b 0a 09 63 68 61 72   &cwdLen);..char
11fe0 20 64 72 69 76 65 5f 63 75 72 20 3d 20 70 61 74   drive_cur = pat
11ff0 68 5b 30 5d 3b 0a 0a 09 69 66 20 28 64 72 69 76  h[0];...if (driv
12000 65 5f 63 75 72 20 3e 3d 20 27 61 27 29 20 7b 0a  e_cur >= 'a') {.
12010 09 20 20 20 20 64 72 69 76 65 5f 63 75 72 20 2d  .    drive_cur -
12020 3d 20 28 27 61 27 20 2d 20 27 41 27 29 3b 0a 09  = ('a' - 'A');..
12030 7d 0a 09 69 66 20 28 64 72 69 76 65 5b 30 5d 20  }..if (drive[0] 
12040 3d 3d 20 64 72 69 76 65 5f 63 75 72 29 20 7b 0a  == drive_cur) {.
12050 09 20 20 20 20 61 62 73 6f 6c 75 74 65 50 61 74  .    absolutePat
12060 68 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  h = Tcl_Duplicat
12070 65 4f 62 6a 28 75 73 65 54 68 69 73 43 77 64 29  eObj(useThisCwd)
12080 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  ;...    /*..    
12090 20 2a 20 57 65 20 68 61 76 65 20 61 20 72 65 66   * We have a ref
120a0 43 6f 75 6e 74 20 6f 6e 20 74 68 65 20 63 77 64  Count on the cwd
120b0 2c 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  , which we will 
120c0 72 65 6c 65 61 73 65 20 6c 61 74 65 72 2e 0a 09  release later...
120d0 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
120e0 20 28 64 72 69 76 65 5b 63 77 64 4c 65 6e 2d 31   (drive[cwdLen-1
120f0 5d 20 21 3d 20 27 2f 27 20 26 26 20 28 70 61 74  ] != '/' && (pat
12100 68 5b 32 5d 20 21 3d 20 27 5c 30 27 29 29 20 7b  h[2] != '\0')) {
12110 0a 09 09 2f 2a 0a 09 09 20 2a 20 4f 6e 6c 79 20  .../*... * Only 
12120 61 64 64 20 61 20 74 72 61 69 6c 69 6e 67 20 27  add a trailing '
12130 2f 27 20 69 66 20 6e 65 65 64 65 64 2c 20 77 68  /' if needed, wh
12140 69 63 68 20 69 73 20 69 66 20 74 68 65 72 65 20  ich is if there 
12150 69 73 6e 27 74 0a 09 09 20 2a 20 6f 6e 65 20 61  isn't... * one a
12160 6c 72 65 61 64 79 2c 20 61 6e 64 20 69 66 20 77  lready, and if w
12170 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 62  e are going to b
12180 65 20 61 64 64 69 6e 67 20 73 6f 6d 65 20 6d 6f  e adding some mo
12190 72 65 0a 09 09 20 2a 20 63 68 61 72 61 63 74 65  re... * characte
121a0 72 73 2e 0a 09 09 20 2a 2f 0a 0a 09 09 54 63 6c  rs.... */....Tcl
121b0 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73  _AppendToObj(abs
121c0 6f 6c 75 74 65 50 61 74 68 2c 20 22 2f 22 2c 20  olutePath, "/", 
121d0 31 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  1);..    }..} el
121e0 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65  se {..    Tcl_De
121f0 63 72 52 65 66 43 6f 75 6e 74 28 75 73 65 54 68  crRefCount(useTh
12200 69 73 43 77 64 29 3b 0a 09 20 20 20 20 75 73 65  isCwd);..    use
12210 54 68 69 73 43 77 64 20 3d 20 4e 55 4c 4c 3b 0a  ThisCwd = NULL;.
12220 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
12230 20 54 68 65 20 70 61 74 68 20 69 73 20 6e 6f 74   The path is not
12240 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
12250 64 72 69 76 65 2c 20 62 75 74 20 69 73 20 76 6f  drive, but is vo
12260 6c 75 6d 65 2d 72 65 6c 61 74 69 76 65 2e 0a 09  lume-relative...
12270 20 20 20 20 20 2a 20 54 68 65 20 77 61 79 20 54       * The way T
12280 63 6c 20 38 2e 33 20 68 61 6e 64 6c 65 73 20 74  cl 8.3 handles t
12290 68 69 73 20 69 73 20 74 68 61 74 20 69 74 20 74  his is that it t
122a0 72 65 61 74 73 20 73 75 63 68 20 61 20 70 61 74  reats such a pat
122b0 68 20 61 73 0a 09 20 20 20 20 20 2a 20 72 65 6c  h as..     * rel
122c0 61 74 69 76 65 20 74 6f 20 74 68 65 20 72 6f 6f  ative to the roo
122d0 74 20 6f 66 20 74 68 65 20 64 72 69 76 65 2e 20  t of the drive. 
122e0 57 65 20 74 68 65 72 65 66 6f 72 65 20 62 65 68  We therefore beh
122f0 61 76 65 20 74 68 65 20 73 61 6d 65 0a 09 20 20  ave the same..  
12300 20 20 20 2a 20 68 65 72 65 2e 20 54 68 69 73 20     * here. This 
12310 62 65 68 61 76 69 6f 75 72 20 69 73 2c 20 68 6f  behaviour is, ho
12320 77 65 76 65 72 2c 20 64 69 66 66 65 72 65 6e 74  wever, different
12330 20 74 6f 20 74 68 61 74 20 6f 66 20 74 68 65 0a   to that of the.
12340 09 20 20 20 20 20 2a 20 77 69 6e 64 6f 77 73 20  .     * windows 
12350 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 20 49 66  command-line. If
12360 20 77 65 20 77 61 6e 74 20 74 6f 20 66 69 78 20   we want to fix 
12370 74 68 69 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  this at some poi
12380 6e 74 20 69 6e 0a 09 20 20 20 20 20 2a 20 74 68  nt in..     * th
12390 65 20 66 75 74 75 72 65 20 28 61 74 20 74 68 65  e future (at the
123a0 20 65 78 70 65 6e 73 65 20 6f 66 20 61 20 62 65   expense of a be
123b0 68 61 76 69 6f 75 72 20 63 68 61 6e 67 65 20 74  haviour change t
123c0 6f 20 54 63 6c 29 2c 20 77 65 0a 09 20 20 20 20  o Tcl), we..    
123d0 20 2a 20 63 6f 75 6c 64 20 75 73 65 20 74 68 65   * could use the
123e0 20 27 5f 64 67 65 74 64 63 77 64 27 20 57 69 6e   '_dgetdcwd' Win
123f0 33 32 20 41 50 49 20 74 6f 20 67 65 74 20 74 68  32 API to get th
12400 65 20 64 72 69 76 65 27 73 20 63 77 64 2e 0a 09  e drive's cwd...
12410 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 61 62       */...    ab
12420 73 6f 6c 75 74 65 50 61 74 68 20 3d 20 54 63 6c  solutePath = Tcl
12430 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 61  _NewStringObj(pa
12440 74 68 2c 20 32 29 3b 0a 09 20 20 20 20 54 63 6c  th, 2);..    Tcl
12450 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73  _AppendToObj(abs
12460 6f 6c 75 74 65 50 61 74 68 2c 20 22 2f 22 2c 20  olutePath, "/", 
12470 31 29 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72  1);..}..Tcl_Incr
12480 52 65 66 43 6f 75 6e 74 28 61 62 73 6f 6c 75 74  RefCount(absolut
12490 65 50 61 74 68 29 3b 0a 09 54 63 6c 5f 41 70 70  ePath);..Tcl_App
124a0 65 6e 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74  endToObj(absolut
124b0 65 50 61 74 68 2c 20 70 61 74 68 2b 32 2c 20 54  ePath, path+2, T
124c0 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 3b 0a  CL_INDEX_NONE);.
124d0 20 20 20 20 7d 0a 20 20 20 20 2a 75 73 65 54 68      }.    *useTh
124e0 69 73 43 77 64 50 74 72 20 3d 20 75 73 65 54 68  isCwdPtr = useTh
124f0 69 73 43 77 64 3b 0a 20 20 20 20 72 65 74 75 72  isCwd;.    retur
12500 6e 20 61 62 73 6f 6c 75 74 65 50 61 74 68 3b 0a  n absolutePath;.
12510 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
12520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12560 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 4e  ----. *. * TclpN
12570 61 74 69 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65  ativeToNormalize
12580 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65  d --. *. *.Conve
12590 72 74 20 6e 61 74 69 76 65 20 66 6f 72 6d 61 74  rt native format
125a0 20 74 6f 20 61 20 6e 6f 72 6d 61 6c 69 7a 65 64   to a normalized
125b0 20 70 61 74 68 20 6f 62 6a 65 63 74 2c 20 77 69   path object, wi
125c0 74 68 20 72 65 66 43 6f 75 6e 74 20 6f 66 0a 20  th refCount of. 
125d0 2a 09 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 09 43 75  *.zero.. *. *.Cu
125e0 72 72 65 6e 74 6c 79 20 61 73 73 75 6d 65 73 20  rrently assumes 
125f0 61 6c 6c 20 6e 61 74 69 76 65 20 70 61 74 68 73  all native paths
12600 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 6e 6f   are actually no
12610 72 6d 61 6c 69 7a 65 64 20 61 6c 72 65 61 64 79  rmalized already
12620 2c 20 73 6f 0a 20 2a 09 69 66 20 74 68 65 20 70  , so. *.if the p
12630 61 74 68 20 67 69 76 65 6e 20 69 73 20 6e 6f 74  ath given is not
12640 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 74 68 69 73   normalized this
12650 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 6a   will actually j
12660 75 73 74 20 63 6f 6e 76 65 72 74 20 74 6f 0a 20  ust convert to. 
12670 2a 09 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  *.a valid string
12680 20 70 61 74 68 2c 20 62 75 74 20 6e 6f 74 20 6e   path, but not n
12690 65 63 65 73 73 61 72 69 6c 79 20 61 20 6e 6f 72  ecessarily a nor
126a0 6d 61 6c 69 7a 65 64 20 6f 6e 65 2e 0a 20 2a 0a  malized one.. *.
126b0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
126c0 20 76 61 6c 69 64 20 6e 6f 72 6d 61 6c 69 7a 65   valid normalize
126d0 64 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 53 69  d path.. *. * Si
126e0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
126f0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12740 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f  -----. */..Tcl_O
12750 62 6a 20 2a 0a 54 63 6c 70 4e 61 74 69 76 65 54  bj *.TclpNativeT
12760 6f 4e 6f 72 6d 61 6c 69 7a 65 64 28 0a 20 20 20  oNormalized(.   
12770 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
12780 61 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74  a).{.    Tcl_DSt
12790 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c  ring ds;.    Tcl
127a0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
127b0 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 20 20    size_t len;.  
127c0 20 20 63 68 61 72 20 2a 63 6f 70 79 2c 20 2a 70    char *copy, *p
127d0 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
127e0 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20  ngInit(&ds);.   
127f0 20 54 63 6c 5f 57 43 68 61 72 54 6f 55 74 66 44   Tcl_WCharToUtfD
12800 53 74 72 69 6e 67 28 28 63 6f 6e 73 74 20 57 43  String((const WC
12810 48 41 52 20 2a 29 20 63 6c 69 65 6e 74 44 61 74  HAR *) clientDat
12820 61 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e  a, TCL_INDEX_NON
12830 45 2c 20 26 64 73 29 3b 0a 20 20 20 20 63 6f 70  E, &ds);.    cop
12840 79 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  y = Tcl_DStringV
12850 61 6c 75 65 28 26 64 73 29 3b 0a 20 20 20 20 6c  alue(&ds);.    l
12860 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67  en = Tcl_DString
12870 4c 65 6e 67 74 68 28 26 64 73 29 3b 0a 0a 20 20  Length(&ds);..  
12880 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 65 72 74    /*.     * Cert
12890 61 69 6e 20 6e 61 74 69 76 65 20 70 61 74 68 20  ain native path 
128a0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20  representations 
128b0 6f 6e 20 57 69 6e 64 6f 77 73 20 68 61 76 65 20  on Windows have 
128c0 74 68 69 73 20 73 70 65 63 69 61 6c 20 70 72 65  this special pre
128d0 66 69 78 0a 20 20 20 20 20 2a 20 74 6f 20 69 6e  fix.     * to in
128e0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79  dicate that they
128f0 20 61 72 65 20 74 6f 20 62 65 20 74 72 65 61 74   are to be treat
12900 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 46 6f  ed specially. Fo
12910 72 20 65 78 61 6d 70 6c 65 0a 20 20 20 20 20 2a  r example.     *
12920 20 65 78 74 72 65 6d 65 6c 79 20 6c 6f 6e 67 20   extremely long 
12930 70 61 74 68 73 2c 20 6f 72 20 73 79 6d 6c 69 6e  paths, or symlin
12940 6b 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ks..     */..   
12950 20 69 66 20 28 2a 63 6f 70 79 20 3d 3d 20 27 5c   if (*copy == '\
12960 5c 27 29 20 7b 0a 09 69 66 20 28 30 20 3d 3d 20  \') {..if (0 == 
12970 73 74 72 6e 63 6d 70 28 63 6f 70 79 2c 22 5c 5c  strncmp(copy,"\\
12980 3f 3f 5c 5c 22 2c 34 29 29 20 7b 0a 09 20 20 20  ??\\",4)) {..   
12990 20 63 6f 70 79 20 2b 3d 20 34 3b 0a 09 20 20 20   copy += 4;..   
129a0 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d 20 65 6c   len -= 4;..} el
129b0 73 65 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  se if (0 == strn
129c0 63 6d 70 28 63 6f 70 79 2c 22 5c 5c 5c 5c 3f 5c  cmp(copy,"\\\\?\
129d0 5c 22 2c 34 29 29 20 7b 0a 09 20 20 20 20 63 6f  \",4)) {..    co
129e0 70 79 20 2b 3d 20 34 3b 0a 09 20 20 20 20 6c 65  py += 4;..    le
129f0 6e 20 2d 3d 20 34 3b 0a 09 7d 0a 20 20 20 20 7d  n -= 4;..}.    }
12a00 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
12a10 45 6e 73 75 72 65 20 77 65 20 61 72 65 20 75 73  Ensure we are us
12a20 69 6e 67 20 66 6f 72 77 61 72 64 20 73 6c 61 73  ing forward slas
12a30 68 65 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 2a  hes only..     *
12a40 2f 0a 0a 20 20 20 20 66 6f 72 20 28 70 20 3d 20  /..    for (p = 
12a50 63 6f 70 79 3b 20 2a 70 20 21 3d 20 27 5c 30 27  copy; *p != '\0'
12a60 3b 20 70 2b 2b 29 20 7b 0a 09 69 66 20 28 2a 70  ; p++) {..if (*p
12a70 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 20   == '\\') {..   
12a80 20 2a 70 20 3d 20 27 2f 27 3b 0a 09 7d 0a 20 20   *p = '/';..}.  
12a90 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
12aa0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
12ab0 62 6a 28 63 6f 70 79 2c 6c 65 6e 29 3b 0a 20 20  bj(copy,len);.  
12ac0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
12ad0 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 72 65 74  e(&ds);..    ret
12ae0 75 72 6e 20 6f 62 6a 50 74 72 3b 0a 7d 0a 0c 0a  urn objPtr;.}...
12af0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b40 0a 20 2a 0a 20 2a 20 54 63 6c 4e 61 74 69 76 65  . *. * TclNative
12b50 43 72 65 61 74 65 4e 61 74 69 76 65 52 65 70 20  CreateNativeRep 
12b60 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20  --. *. *.Create 
12b70 61 20 6e 61 74 69 76 65 20 72 65 70 72 65 73 65  a native represe
12b80 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ntation for the 
12b90 67 69 76 65 6e 20 70 61 74 68 2e 0a 20 2a 0a 20  given path.. *. 
12ba0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
12bb0 65 20 6e 61 74 69 76 65 50 61 74 68 20 72 65 70  e nativePath rep
12bc0 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a  resentation.. *.
12bd0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12be0 0a 20 2a 09 4d 65 6d 6f 72 79 20 77 69 6c 6c 20  . *.Memory will 
12bf0 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68  be allocated. Th
12c00 65 20 70 61 74 68 20 6d 69 67 68 74 20 62 65 20  e path might be 
12c10 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0a 20 2a 0a 20  normalized.. *. 
12c20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
12c70 0a 0a 76 6f 69 64 20 2a 0a 54 63 6c 4e 61 74 69  ..void *.TclNati
12c80 76 65 43 72 65 61 74 65 4e 61 74 69 76 65 52 65  veCreateNativeRe
12c90 70 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p(.    Tcl_Obj *
12ca0 70 61 74 68 50 74 72 29 0a 7b 0a 20 20 20 20 57  pathPtr).{.    W
12cb0 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68  CHAR *nativePath
12cc0 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Ptr = NULL;.    
12cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 3b  const char *str;
12ce0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 61  .    Tcl_Obj *va
12cf0 6c 69 64 50 61 74 68 50 74 72 3b 0a 20 20 20 20  lidPathPtr;.    
12d00 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20  Tcl_Size len;.  
12d10 20 20 57 43 48 41 52 20 2a 77 70 3b 0a 0a 20 20    WCHAR *wp;..  
12d20 20 20 69 66 20 28 54 63 6c 46 53 43 77 64 49 73    if (TclFSCwdIs
12d30 4e 61 74 69 76 65 28 29 29 20 7b 0a 09 2f 2a 0a  Native()) {../*.
12d40 09 20 2a 20 54 68 65 20 63 77 64 20 69 73 20 6e  . * The cwd is n
12d50 61 74 69 76 65 2c 20 77 68 69 63 68 20 6d 65 61  ative, which mea
12d60 6e 73 20 77 65 20 63 61 6e 20 75 73 65 20 74 68  ns we can use th
12d70 65 20 74 72 61 6e 73 6c 61 74 65 64 20 70 61 74  e translated pat
12d80 68 0a 09 20 2a 20 77 69 74 68 6f 75 74 20 77 6f  h.. * without wo
12d90 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6e 6f 72  rrying about nor
12da0 6d 61 6c 69 7a 61 74 69 6f 6e 20 28 74 68 69 73  malization (this
12db0 20 77 69 6c 6c 20 61 6c 73 6f 20 75 73 75 61 6c   will also usual
12dc0 6c 79 20 62 65 0a 09 20 2a 20 73 68 6f 72 74 65  ly be.. * shorte
12dd0 72 20 73 6f 20 74 68 65 20 75 74 66 2d 74 6f 2d  r so the utf-to-
12de0 65 78 74 65 72 6e 61 6c 20 63 6f 6e 76 65 72 73  external convers
12df0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65  ion will be some
12e00 77 68 61 74 20 66 61 73 74 65 72 29 2e 0a 09 20  what faster)... 
12e10 2a 2f 0a 0a 09 76 61 6c 69 64 50 61 74 68 50 74  */...validPathPt
12e20 72 20 3d 20 54 63 6c 5f 46 53 47 65 74 54 72 61  r = Tcl_FSGetTra
12e30 6e 73 6c 61 74 65 64 50 61 74 68 28 4e 55 4c 4c  nslatedPath(NULL
12e40 2c 20 70 61 74 68 50 74 72 29 3b 0a 09 69 66 20  , pathPtr);..if 
12e50 28 76 61 6c 69 64 50 61 74 68 50 74 72 20 3d 3d  (validPathPtr ==
12e60 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
12e70 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  turn NULL;..}...
12e80 2f 2a 0a 09 20 2a 20 72 65 66 43 6f 75 6e 74 20  /*.. * refCount 
12e90 6f 66 20 76 61 6c 69 64 50 61 74 68 50 74 72 20  of validPathPtr 
12ea0 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 63 72  was already incr
12eb0 65 6d 65 6e 74 65 64 20 69 6e 0a 09 20 2a 20 54  emented in.. * T
12ec0 63 6c 5f 46 53 47 65 74 54 72 61 6e 73 6c 61 74  cl_FSGetTranslat
12ed0 65 64 50 61 74 68 0a 09 20 2a 2f 0a 20 20 20 20  edPath.. */.    
12ee0 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a  } else {../*.. *
12ef0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
12f00 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 69  ormalized path i
12f10 73 20 73 65 74 2e 0a 09 20 2a 2f 0a 0a 09 76 61  s set... */...va
12f20 6c 69 64 50 61 74 68 50 74 72 20 3d 20 54 63 6c  lidPathPtr = Tcl
12f30 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64  _FSGetNormalized
12f40 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 74 68 50  Path(NULL, pathP
12f50 74 72 29 3b 0a 09 69 66 20 28 76 61 6c 69 64 50  tr);..if (validP
12f60 61 74 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  athPtr == NULL) 
12f70 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  {..    return NU
12f80 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  LL;..}.../*.. * 
12f90 76 61 6c 69 64 50 61 74 68 50 74 72 20 72 65 74  validPathPtr ret
12fa0 75 72 6e 65 64 20 66 72 6f 6d 20 54 63 6c 5f 46  urned from Tcl_F
12fb0 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 61  SGetNormalizedPa
12fc0 74 68 20 69 73 20 6f 77 6e 65 64 20 62 79 20 54  th is owned by T
12fd0 63 6c 2c 0a 09 20 2a 20 73 6f 20 69 6e 63 72 20  cl,.. * so incr 
12fe0 72 65 66 43 6f 75 6e 74 20 68 65 72 65 0a 09 20  refCount here.. 
12ff0 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66  */...Tcl_IncrRef
13000 43 6f 75 6e 74 28 76 61 6c 69 64 50 61 74 68 50  Count(validPathP
13010 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
13020 73 74 72 20 3d 20 54 63 6c 47 65 74 53 74 72 69  str = TclGetStri
13030 6e 67 46 72 6f 6d 4f 62 6a 28 76 61 6c 69 64 50  ngFromObj(validP
13040 61 74 68 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 0a  athPtr, &len);..
13050 20 20 20 20 69 66 20 28 73 74 72 6c 65 6e 28 73      if (strlen(s
13060 74 72 29 20 21 3d 20 28 73 69 7a 65 5f 74 29 6c  tr) != (size_t)l
13070 65 6e 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74  en) {../*.. * St
13080 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ring contains NU
13090 4c 2d 62 79 74 65 73 2e 20 54 68 69 73 20 69 73  L-bytes. This is
130a0 20 69 6e 76 61 6c 69 64 2e 0a 09 20 2a 2f 0a 0a   invalid... */..
130b0 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20  .goto done;.    
130c0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
130d0 20 46 6f 72 20 61 20 72 65 73 65 72 76 65 64 20   For a reserved 
130e0 64 65 76 69 63 65 2c 20 73 74 72 69 70 20 61 20  device, strip a 
130f0 70 6f 73 73 69 62 6c 65 20 70 6f 73 74 66 69 78  possible postfix
13100 20 27 3a 27 0a 20 20 20 20 20 2a 2f 0a 0a 20 20   ':'.     */..  
13110 20 20 6c 65 6e 20 3d 20 57 69 6e 49 73 52 65 73    len = WinIsRes
13120 65 72 76 65 64 28 73 74 72 29 3b 0a 20 20 20 20  erved(str);.    
13130 69 66 20 28 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  if (len == 0) {.
13140 09 2f 2a 0a 09 20 2a 20 4c 65 74 20 4d 75 6c 74  ./*.. * Let Mult
13150 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20  iByteToWideChar 
13160 63 68 65 63 6b 20 66 6f 72 20 6f 74 68 65 72 20  check for other 
13170 69 6e 76 61 6c 69 64 20 73 65 71 75 65 6e 63 65  invalid sequence
13180 73 2c 20 6c 69 6b 65 0a 09 20 2a 20 30 78 43 30  s, like.. * 0xC0
13190 20 30 78 38 30 20 28 3d 3d 20 6f 76 65 72 6c 6f   0x80 (== overlo
131a0 6e 67 20 4e 55 4c 29 2e 20 53 65 65 20 62 75 67  ng NUL). See bug
131b0 20 5b 33 31 31 38 34 38 39 5d 3a 20 4e 55 4c 20   [3118489]: NUL 
131c0 69 6e 20 66 69 6c 65 6e 61 6d 65 73 0a 09 20 2a  in filenames.. *
131d0 2f 0a 0a 09 6c 65 6e 20 3d 20 4d 75 6c 74 69 42  /...len = MultiB
131e0 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
131f0 5f 55 54 46 38 2c 20 4d 42 5f 45 52 52 5f 49 4e  _UTF8, MB_ERR_IN
13200 56 41 4c 49 44 5f 43 48 41 52 53 2c 20 73 74 72  VALID_CHARS, str
13210 2c 20 2d 31 2c 20 30 2c 20 30 29 3b 0a 09 69 66  , -1, 0, 0);..if
13220 20 28 6c 65 6e 3d 3d 30 29 20 7b 0a 09 20 20 20   (len==0) {..   
13230 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 20   goto done;..}. 
13240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
13250 20 20 2a 20 4f 76 65 72 61 6c 6c 6f 63 61 74 65    * Overallocate
13260 20 36 20 63 68 61 72 73 2c 20 6d 61 6b 69 6e 67   6 chars, making
13270 20 73 6f 6d 65 20 72 6f 6f 6d 20 66 6f 72 20 65   some room for e
13280 78 74 65 6e 64 65 64 20 70 61 74 68 73 0a 20 20  xtended paths.  
13290 20 20 20 2a 2f 0a 0a 20 20 20 20 77 70 20 3d 20     */..    wp = 
132a0 6e 61 74 69 76 65 50 61 74 68 50 74 72 20 3d 20  nativePathPtr = 
132b0 28 57 43 48 41 52 20 2a 29 54 63 6c 5f 41 6c 6c  (WCHAR *)Tcl_All
132c0 6f 63 28 28 6c 65 6e 20 2b 20 36 29 20 2a 20 73  oc((len + 6) * s
132d0 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 20  izeof(WCHAR));. 
132e0 20 20 20 69 66 20 28 6e 61 74 69 76 65 50 61 74     if (nativePat
132f0 68 50 74 72 3d 3d 30 29 20 7b 0a 09 67 6f 74 6f  hPtr==0) {..goto
13300 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20   done;.    }.   
13310 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
13320 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 4d 42  Char(CP_UTF8, MB
13330 5f 45 52 52 5f 49 4e 56 41 4c 49 44 5f 43 48 41  _ERR_INVALID_CHA
13340 52 53 2c 20 73 74 72 2c 20 2d 31 2c 20 6e 61 74  RS, str, -1, nat
13350 69 76 65 50 61 74 68 50 74 72 2c 0a 09 20 20 20  ivePathPtr,..   
13360 20 6c 65 6e 20 2b 20 32 29 3b 0a 20 20 20 20 6e   len + 2);.    n
13370 61 74 69 76 65 50 61 74 68 50 74 72 5b 6c 65 6e  ativePathPtr[len
13380 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ] = 0;..    /*. 
13390 20 20 20 20 2a 20 49 66 20 70 61 74 68 20 73 74      * If path st
133a0 61 72 74 73 20 77 69 74 68 20 22 2f 2f 3f 2f 22  arts with "//?/"
133b0 20 6f 72 20 22 5c 5c 3f 5c 22 20 28 65 78 74 65   or "\\?\" (exte
133c0 6e 64 65 64 20 70 61 74 68 29 2c 20 74 72 61 6e  nded path), tran
133d0 73 6c 61 74 65 20 61 6e 79 0a 20 20 20 20 20 2a  slate any.     *
133e0 20 73 6c 61 73 68 65 73 20 74 6f 20 62 61 63 6b   slashes to back
133f0 73 6c 61 73 68 65 73 20 62 75 74 20 6c 65 61 76  slashes but leav
13400 65 20 74 68 65 20 27 3f 27 20 69 6e 74 61 63 74  e the '?' intact
13410 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
13420 20 28 28 73 74 72 5b 30 5d 20 3d 3d 20 27 5c 5c   ((str[0] == '\\
13430 27 20 7c 7c 20 73 74 72 5b 30 5d 20 3d 3d 20 27  ' || str[0] == '
13440 2f 27 29 20 26 26 20 28 73 74 72 5b 31 5d 20 3d  /') && (str[1] =
13450 3d 20 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 31 5d  = '\\' || str[1]
13460 20 3d 3d 20 27 2f 27 29 0a 09 20 20 20 20 26 26   == '/')..    &&
13470 20 73 74 72 5b 32 5d 20 3d 3d 20 27 3f 27 20 26   str[2] == '?' &
13480 26 20 28 73 74 72 5b 33 5d 20 3d 3d 20 27 5c 5c  & (str[3] == '\\
13490 27 20 7c 7c 20 73 74 72 5b 33 5d 20 3d 3d 20 27  ' || str[3] == '
134a0 2f 27 29 29 20 7b 0a 09 77 70 5b 30 5d 20 3d 20  /')) {..wp[0] = 
134b0 77 70 5b 31 5d 20 3d 20 77 70 5b 33 5d 20 3d 20  wp[1] = wp[3] = 
134c0 27 5c 5c 27 3b 0a 09 73 74 72 20 2b 3d 20 34 3b  '\\';..str += 4;
134d0 0a 09 77 70 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  ..wp += 4;.    }
134e0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
134f0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  If there is no "
13500 5c 5c 3f 5c 22 20 70 72 65 66 69 78 20 62 75 74  \\?\" prefix but
13510 20 74 68 65 72 65 20 69 73 20 61 20 64 72 69 76   there is a driv
13520 65 20 6f 72 20 55 4e 43 20 70 61 74 68 20 70 72  e or UNC path pr
13530 65 66 69 78 0a 20 20 20 20 20 2a 20 61 6e 64 20  efix.     * and 
13540 74 68 65 20 70 61 74 68 20 69 73 20 6c 61 72 67  the path is larg
13550 65 72 20 74 68 61 6e 20 4d 41 58 5f 50 41 54 48  er than MAX_PATH
13560 20 63 68 61 72 73 2c 20 6e 6f 20 57 69 6e 33 32   chars, no Win32
13570 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 63 61   API function ca
13580 6e 0a 20 20 20 20 20 2a 20 68 61 6e 64 6c 65 20  n.     * handle 
13590 74 68 61 74 20 75 6e 6c 65 73 73 20 69 74 20 69  that unless it i
135a0 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
135b0 74 68 65 20 65 78 74 65 6e 64 65 64 20 70 61 74  the extended pat
135c0 68 20 70 72 65 66 69 78 2e 20 53 65 65 3a 0a 20  h prefix. See:. 
135d0 20 20 20 20 2a 20 3c 68 74 74 70 73 3a 2f 2f 64      * <https://d
135e0 6f 63 73 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ocs.microsoft.co
135f0 6d 2f 65 6e 2d 75 73 2f 77 69 6e 64 6f 77 73 2f  m/en-us/windows/
13600 77 69 6e 33 32 2f 66 69 6c 65 69 6f 2f 6e 61 6d  win32/fileio/nam
13610 69 6e 67 2d 61 2d 66 69 6c 65 23 6d 61 78 70 61  ing-a-file#maxpa
13620 74 68 3e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  th>.     */..   
13630 20 69 66 20 28 28 28 73 74 72 5b 30 5d 20 3e 3d   if (((str[0] >=
13640 20 27 41 27 20 26 26 20 73 74 72 5b 30 5d 20 3c   'A' && str[0] <
13650 3d 20 27 5a 27 29 20 7c 7c 20 28 73 74 72 5b 30  = 'Z') || (str[0
13660 5d 20 3e 3d 20 27 61 27 20 26 26 20 73 74 72 5b  ] >= 'a' && str[
13670 30 5d 20 3c 3d 20 27 7a 27 29 29 0a 09 20 20 20  0] <= 'z'))..   
13680 20 26 26 20 73 74 72 5b 31 5d 20 3d 3d 20 27 3a   && str[1] == ':
13690 27 29 20 7b 0a 09 69 66 20 28 77 70 20 3d 3d 20  ') {..if (wp == 
136a0 6e 61 74 69 76 65 50 61 74 68 50 74 72 20 26 26  nativePathPtr &&
136b0 20 6c 65 6e 20 3e 20 4d 41 58 5f 50 41 54 48 0a   len > MAX_PATH.
136c0 09 09 26 26 20 28 73 74 72 5b 32 5d 20 3d 3d 20  ..&& (str[2] == 
136d0 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 32 5d 20 3d  '\\' || str[2] =
136e0 3d 20 27 2f 27 29 29 20 7b 0a 09 20 20 20 20 6d  = '/')) {..    m
136f0 65 6d 6d 6f 76 65 28 77 70 20 2b 20 34 2c 20 77  emmove(wp + 4, w
13700 70 2c 20 6c 65 6e 20 2a 20 73 69 7a 65 6f 66 28  p, len * sizeof(
13710 57 43 48 41 52 29 29 3b 0a 09 20 20 20 20 6d 65  WCHAR));..    me
13720 6d 63 70 79 28 77 70 2c 20 4c 22 5c 5c 5c 5c 3f  mcpy(wp, L"\\\\?
13730 5c 5c 22 2c 20 34 20 2a 20 73 69 7a 65 6f 66 28  \\", 4 * sizeof(
13740 57 43 48 41 52 29 29 3b 0a 09 20 20 20 20 77 70  WCHAR));..    wp
13750 20 2b 3d 20 34 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09   += 4;..}.../*..
13760 20 2a 20 49 66 20 28 72 65 6d 61 69 6e 64 65 72   * If (remainder
13770 20 6f 66 29 20 70 61 74 68 20 73 74 61 72 74 73   of) path starts
13780 20 77 69 74 68 20 22 3c 64 72 69 76 65 3e 3a 22   with "<drive>:"
13790 2c 20 6c 65 61 76 65 20 74 68 65 20 27 3a 27 0a  , leave the ':'.
137a0 09 20 2a 20 69 6e 74 61 63 74 2e 0a 09 20 2a 2f  . * intact... */
137b0 0a 0a 09 77 70 20 2b 3d 20 32 3b 0a 20 20 20 20  ...wp += 2;.    
137c0 7d 20 65 6c 73 65 20 69 66 20 28 77 70 20 3d 3d  } else if (wp ==
137d0 20 6e 61 74 69 76 65 50 61 74 68 50 74 72 20 26   nativePathPtr &
137e0 26 20 6c 65 6e 20 3e 20 4d 41 58 5f 50 41 54 48  & len > MAX_PATH
137f0 0a 09 20 20 20 20 26 26 20 28 73 74 72 5b 30 5d  ..    && (str[0]
13800 20 3d 3d 20 27 5c 5c 27 20 7c 7c 20 73 74 72 5b   == '\\' || str[
13810 30 5d 20 3d 3d 20 27 2f 27 29 0a 09 20 20 20 20  0] == '/')..    
13820 26 26 20 28 73 74 72 5b 31 5d 20 3d 3d 20 27 5c  && (str[1] == '\
13830 5c 27 20 7c 7c 20 73 74 72 5b 31 5d 20 3d 3d 20  \' || str[1] == 
13840 27 2f 27 29 20 26 26 20 73 74 72 5b 32 5d 20 21  '/') && str[2] !
13850 3d 20 27 3f 27 29 20 7b 0a 09 6d 65 6d 6d 6f 76  = '?') {..memmov
13860 65 28 77 70 20 2b 20 36 2c 20 77 70 2c 20 6c 65  e(wp + 6, wp, le
13870 6e 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52  n * sizeof(WCHAR
13880 29 29 3b 0a 09 6d 65 6d 63 70 79 28 77 70 2c 20  ));..memcpy(wp, 
13890 4c 22 5c 5c 5c 5c 3f 5c 5c 55 4e 43 22 2c 20 37  L"\\\\?\\UNC", 7
138a0 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
138b0 29 3b 0a 09 77 70 20 2b 3d 20 37 3b 0a 20 20 20  );..wp += 7;.   
138c0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
138d0 2a 20 49 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  * In the remaind
138e0 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
138f0 74 72 61 6e 73 6c 61 74 65 20 69 6e 76 61 6c 69  translate invali
13900 64 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 0a  d characters to.
13910 20 20 20 20 20 2a 20 63 68 61 72 61 63 74 65 72       * character
13920 73 20 69 6e 20 74 68 65 20 55 6e 69 63 6f 64 65  s in the Unicode
13930 20 70 72 69 76 61 74 65 20 75 73 65 20 61 72 65   private use are
13940 61 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  a..     */..    
13950 77 68 69 6c 65 20 28 2a 77 70 20 21 3d 20 27 5c  while (*wp != '\
13960 30 27 29 20 7b 0a 09 69 66 20 28 28 2a 77 70 20  0') {..if ((*wp 
13970 3c 20 27 20 27 29 20 7c 7c 20 77 63 73 63 68 72  < ' ') || wcschr
13980 28 4c 22 5c 22 2a 3a 3c 3e 3f 7c 22 2c 20 2a 77  (L"\"*:<>?|", *w
13990 70 29 29 20 7b 0a 09 20 20 20 20 2a 77 70 20 7c  p)) {..    *wp |
139a0 3d 20 30 78 46 30 30 30 3b 0a 09 7d 20 65 6c 73  = 0xF000;..} els
139b0 65 20 69 66 20 28 2a 77 70 20 3d 3d 20 27 2f 27  e if (*wp == '/'
139c0 29 20 7b 0a 09 20 20 20 20 2a 77 70 20 3d 20 27  ) {..    *wp = '
139d0 5c 5c 27 3b 0a 09 7d 0a 09 2b 2b 77 70 3b 0a 20  \\';..}..++wp;. 
139e0 20 20 20 7d 0a 0a 20 20 64 6f 6e 65 3a 0a 20 20     }..  done:.  
139f0 20 20 54 63 6c 44 65 63 72 52 65 66 43 6f 75 6e    TclDecrRefCoun
13a00 74 28 76 61 6c 69 64 50 61 74 68 50 74 72 29 3b  t(validPathPtr);
13a10 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 61 74 69  .    return nati
13a20 76 65 50 61 74 68 50 74 72 3b 0a 7d 0a 0c 0a 2f  vePathPtr;.}.../
13a30 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13a80 20 2a 0a 20 2a 20 54 63 6c 4e 61 74 69 76 65 44   *. * TclNativeD
13a90 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 20 2d 2d  upInternalRep --
13aa0 0a 20 2a 0a 20 2a 09 44 75 70 6c 69 63 61 74 65  . *. *.Duplicate
13ab0 20 74 68 65 20 6e 61 74 69 76 65 20 72 65 70 72   the native repr
13ac0 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20  esentation.. *. 
13ad0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
13ae0 65 20 63 6f 70 69 65 64 20 6e 61 74 69 76 65 20  e copied native 
13af0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20  representation, 
13b00 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  or NULL if it is
13b10 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13b20 0a 20 2a 09 63 6f 70 79 20 74 68 65 20 72 65 70  . *.copy the rep
13b30 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a  resentation.. *.
13b40 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13b50 0a 20 2a 09 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63  . *.Memory alloc
13b60 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f  ation for the co
13b70 70 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  py.. *. *-------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bc0 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 20 2a  ----. */..void *
13bd0 0a 54 63 6c 4e 61 74 69 76 65 44 75 70 49 6e 74  .TclNativeDupInt
13be0 65 72 6e 61 6c 52 65 70 28 0a 20 20 20 20 76 6f  ernalRep(.    vo
13bf0 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 0a  id *clientData).
13c00 7b 0a 20 20 20 20 63 68 61 72 20 2a 63 6f 70 79  {.    char *copy
13c10 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ;.    size_t len
13c20 3b 0a 0a 20 20 20 20 69 66 20 28 63 6c 69 65 6e  ;..    if (clien
13c30 74 44 61 74 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tData == NULL) {
13c40 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
13c50 20 20 20 7d 0a 0a 20 20 20 20 6c 65 6e 20 3d 20     }..    len = 
13c60 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
13c70 28 77 63 73 6c 65 6e 28 28 63 6f 6e 73 74 20 57  (wcslen((const W
13c80 43 48 41 52 20 2a 29 20 63 6c 69 65 6e 74 44 61  CHAR *) clientDa
13c90 74 61 29 20 2b 20 31 29 3b 0a 0a 20 20 20 20 63  ta) + 1);..    c
13ca0 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 54 63  opy = (char *)Tc
13cb0 6c 5f 41 6c 6c 6f 63 28 6c 65 6e 29 3b 0a 20 20  l_Alloc(len);.  
13cc0 20 20 6d 65 6d 63 70 79 28 63 6f 70 79 2c 20 63    memcpy(copy, c
13cd0 6c 69 65 6e 74 44 61 74 61 2c 20 6c 65 6e 29 3b  lientData, len);
13ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 70 79  .    return copy
13cf0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d40 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
13d50 70 55 74 69 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09  pUtime --. *. *.
13d60 53 65 74 20 74 68 65 20 6d 6f 64 69 66 69 63 61  Set the modifica
13d70 74 69 6f 6e 20 64 61 74 65 20 66 6f 72 20 61 20  tion date for a 
13d80 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  file.. *. * Resu
13d90 6c 74 73 3a 0a 20 2a 09 30 20 6f 6e 20 73 75 63  lts:. *.0 on suc
13da0 63 65 73 73 2c 20 2d 31 20 6f 6e 20 65 72 72 6f  cess, -1 on erro
13db0 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  r.. *. * Side ef
13dc0 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 65  fects:. *.Sets e
13dd0 72 72 6e 6f 20 74 6f 20 61 20 72 65 70 72 65 73  rrno to a repres
13de0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 79 20  entation of any 
13df0 57 69 6e 64 6f 77 73 20 70 72 6f 62 6c 65 6d 20  Windows problem 
13e00 74 68 61 74 27 73 20 6f 62 73 65 72 76 65 64 0a  that's observed.
13e10 20 2a 09 69 6e 20 74 68 65 20 70 72 6f 63 65 73   *.in the proces
13e20 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
13e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e70 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
13e80 70 55 74 69 6d 65 28 0a 20 20 20 20 54 63 6c 5f  pUtime(.    Tcl_
13e90 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 09 09 2f  Obj *pathPtr,../
13ea0 2a 20 46 69 6c 65 20 74 6f 20 6d 6f 64 69 66 79  * File to modify
13eb0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 75   */.    struct u
13ec0 74 69 6d 62 75 66 20 2a 74 76 61 6c 29 09 2f 2a  timbuf *tval)./*
13ed0 20 4e 65 77 20 6d 6f 64 69 66 69 63 61 74 69 6f   New modificatio
13ee0 6e 20 64 61 74 65 20 73 74 72 75 63 74 75 72 65  n date structure
13ef0 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 72 65   */.{.    int re
13f00 73 20 3d 20 30 3b 0a 20 20 20 20 48 41 4e 44 4c  s = 0;.    HANDL
13f10 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b 0a 20 20  E fileHandle;.  
13f20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e    const WCHAR *n
13f30 61 74 69 76 65 3b 0a 20 20 20 20 44 57 4f 52 44  ative;.    DWORD
13f40 20 61 74 74 72 20 3d 20 30 3b 0a 20 20 20 20 44   attr = 0;.    D
13f50 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c  WORD flags = FIL
13f60 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
13f70 41 4c 3b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45  AL;.    FILETIME
13f80 20 6c 61 73 74 41 63 63 65 73 73 54 69 6d 65 2c   lastAccessTime,
13f90 20 6c 61 73 74 4d 6f 64 54 69 6d 65 3b 0a 0a 20   lastModTime;.. 
13fa0 20 20 20 46 72 6f 6d 43 54 69 6d 65 28 74 76 61     FromCTime(tva
13fb0 6c 2d 3e 61 63 74 69 6d 65 2c 20 26 6c 61 73 74  l->actime, &last
13fc0 41 63 63 65 73 73 54 69 6d 65 29 3b 0a 20 20 20  AccessTime);.   
13fd0 20 46 72 6f 6d 43 54 69 6d 65 28 74 76 61 6c 2d   FromCTime(tval-
13fe0 3e 6d 6f 64 74 69 6d 65 2c 20 26 6c 61 73 74 4d  >modtime, &lastM
13ff0 6f 64 54 69 6d 65 29 3b 0a 0a 20 20 20 20 6e 61  odTime);..    na
14000 74 69 76 65 20 3d 20 28 63 6f 6e 73 74 20 57 43  tive = (const WC
14010 48 41 52 20 2a 29 54 63 6c 5f 46 53 47 65 74 4e  HAR *)Tcl_FSGetN
14020 61 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74  ativePath(pathPt
14030 72 29 3b 0a 0a 20 20 20 20 61 74 74 72 20 3d 20  r);..    attr = 
14040 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
14050 73 57 28 6e 61 74 69 76 65 29 3b 0a 0a 20 20 20  sW(native);..   
14060 20 69 66 20 28 61 74 74 72 20 21 3d 20 49 4e 56   if (attr != INV
14070 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
14080 55 54 45 53 20 26 26 20 61 74 74 72 20 26 20 46  UTES && attr & F
14090 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
140a0 52 45 43 54 4f 52 59 29 20 7b 0a 09 66 6c 61 67  RECTORY) {..flag
140b0 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 42 41  s = FILE_FLAG_BA
140c0 43 4b 55 50 5f 53 45 4d 41 4e 54 49 43 53 3b 0a  CKUP_SEMANTICS;.
140d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
140e0 20 20 20 2a 20 57 65 20 75 73 65 20 74 68 65 20     * We use the 
140f0 6e 61 74 69 76 65 20 41 50 49 73 20 28 6e 6f 74  native APIs (not
14100 20 27 75 74 69 6d 65 27 29 20 62 65 63 61 75 73   'utime') becaus
14110 65 20 74 68 65 72 65 20 61 72 65 20 73 6f 6d 65  e there are some
14120 20 64 61 79 6c 69 67 68 74 0a 20 20 20 20 20 2a   daylight.     *
14130 20 73 61 76 69 6e 67 73 20 63 6f 6d 70 6c 69 63   savings complic
14140 61 74 69 6f 6e 73 20 74 68 61 74 20 75 74 69 6d  ations that utim
14150 65 20 67 65 74 73 20 77 72 6f 6e 67 2e 0a 20 20  e gets wrong..  
14160 20 20 20 2a 2f 0a 0a 20 20 20 20 66 69 6c 65 48     */..    fileH
14170 61 6e 64 6c 65 20 3d 20 43 72 65 61 74 65 46 69  andle = CreateFi
14180 6c 65 57 28 6e 61 74 69 76 65 2c 20 46 49 4c 45  leW(native, FILE
14190 5f 57 52 49 54 45 5f 41 54 54 52 49 42 55 54 45  _WRITE_ATTRIBUTE
141a0 53 2c 20 30 2c 20 4e 55 4c 4c 2c 0a 09 20 20 20  S, 0, NULL,..   
141b0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 20   OPEN_EXISTING, 
141c0 66 6c 61 67 73 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  flags, NULL);.. 
141d0 20 20 20 69 66 20 28 66 69 6c 65 48 61 6e 64 6c     if (fileHandl
141e0 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  e == INVALID_HAN
141f0 44 4c 45 5f 56 41 4c 55 45 20 7c 7c 0a 09 20 20  DLE_VALUE ||..  
14200 20 20 21 53 65 74 46 69 6c 65 54 69 6d 65 28 66    !SetFileTime(f
14210 69 6c 65 48 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  ileHandle, NULL,
14220 20 26 6c 61 73 74 41 63 63 65 73 73 54 69 6d 65   &lastAccessTime
14230 2c 20 26 6c 61 73 74 4d 6f 64 54 69 6d 65 29 29  , &lastModTime))
14240 20 7b 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65   {..Tcl_WinConve
14250 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
14260 72 72 6f 72 28 29 29 3b 0a 09 72 65 73 20 3d 20  rror());..res = 
14270 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
14280 20 28 66 69 6c 65 48 61 6e 64 6c 65 20 21 3d 20   (fileHandle != 
14290 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
142a0 41 4c 55 45 29 20 7b 0a 09 43 6c 6f 73 65 48 61  ALUE) {..CloseHa
142b0 6e 64 6c 65 28 66 69 6c 65 48 61 6e 64 6c 65 29  ndle(fileHandle)
142c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
142d0 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
142e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
14330 20 2a 20 54 63 6c 57 69 6e 46 69 6c 65 4f 77 6e   * TclWinFileOwn
14340 65 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75  ed --. *. *.Retu
14350 72 6e 73 20 31 20 69 66 20 74 68 65 20 73 70 65  rns 1 if the spe
14360 63 69 66 69 65 64 20 66 69 6c 65 20 65 78 69 73  cified file exis
14370 74 73 20 61 6e 64 20 69 73 20 6f 77 6e 65 64 20  ts and is owned 
14380 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  by the current. 
14390 2a 20 20 20 20 20 20 75 73 65 72 20 61 6e 64 20  *      user and 
143a0 30 20 6f 74 68 65 72 77 69 73 65 2e 20 4c 69 6b  0 otherwise. Lik
143b0 65 20 74 68 65 20 55 6e 69 78 20 63 61 73 65 2c  e the Unix case,
143c0 20 74 68 65 20 63 68 65 63 6b 20 69 73 20 6d 61   the check is ma
143d0 64 65 20 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  de using. *     
143e0 20 74 68 65 20 72 65 61 6c 20 70 72 6f 63 65 73   the real proces
143f0 73 20 53 49 44 2c 20 6e 6f 74 20 74 68 65 20 65  s SID, not the e
14400 66 66 65 63 74 69 76 65 20 28 69 6d 70 65 72 73  ffective (impers
14410 6f 6e 61 74 69 6f 6e 29 20 6f 6e 65 2e 0a 20 2a  onation) one.. *
14420 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14470 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 57 69 6e 46 69  */..int.TclWinFi
14480 6c 65 4f 77 6e 65 64 28 0a 20 20 20 20 54 63 6c  leOwned(.    Tcl
14490 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 09 09  _Obj *pathPtr)..
144a0 2f 2a 20 46 69 6c 65 20 77 68 6f 73 65 20 6f 77  /* File whose ow
144b0 6e 65 72 73 68 69 70 20 69 73 20 74 6f 20 62 65  nership is to be
144c0 20 63 68 65 63 6b 65 64 20 2a 2f 0a 7b 0a 20 20   checked */.{.  
144d0 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e    const WCHAR *n
144e0 61 74 69 76 65 3b 0a 20 20 20 20 50 53 49 44 20  ative;.    PSID 
144f0 6f 77 6e 65 72 53 69 64 20 3d 20 4e 55 4c 4c 3b  ownerSid = NULL;
14500 0a 20 20 20 20 50 53 45 43 55 52 49 54 59 5f 44  .    PSECURITY_D
14510 45 53 43 52 49 50 54 4f 52 20 73 65 63 64 20 3d  ESCRIPTOR secd =
14520 20 4e 55 4c 4c 3b 0a 20 20 20 20 48 41 4e 44 4c   NULL;.    HANDL
14530 45 20 74 6f 6b 65 6e 3b 0a 20 20 20 20 4c 50 42  E token;.    LPB
14540 59 54 45 20 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a  YTE buf = NULL;.
14550 20 20 20 20 44 57 4f 52 44 20 62 75 66 73 7a 3b      DWORD bufsz;
14560 0a 20 20 20 20 69 6e 74 20 6f 77 6e 65 64 20 3d  .    int owned =
14570 20 30 3b 0a 0a 20 20 20 20 6e 61 74 69 76 65 20   0;..    native 
14580 3d 20 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a  = (const WCHAR *
14590 29 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65  )Tcl_FSGetNative
145a0 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a 0a  Path(pathPtr);..
145b0 20 20 20 20 69 66 20 28 47 65 74 4e 61 6d 65 64      if (GetNamed
145c0 53 65 63 75 72 69 74 79 49 6e 66 6f 57 28 28 4c  SecurityInfoW((L
145d0 50 57 53 54 52 29 20 6e 61 74 69 76 65 2c 20 53  PWSTR) native, S
145e0 45 5f 46 49 4c 45 5f 4f 42 4a 45 43 54 2c 0a 09  E_FILE_OBJECT,..
145f0 20 20 20 20 4f 57 4e 45 52 5f 53 45 43 55 52 49      OWNER_SECURI
14600 54 59 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 2c 20  TY_INFORMATION, 
14610 26 6f 77 6e 65 72 53 69 64 2c 20 4e 55 4c 4c 2c  &ownerSid, NULL,
14620 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 0a 09 20 20   NULL, NULL,..  
14630 20 20 26 73 65 63 64 29 20 21 3d 20 45 52 52 4f    &secd) != ERRO
14640 52 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 2f 2a  R_SUCCESS) {../*
14650 0a 09 20 2a 20 45 69 74 68 65 72 20 6e 6f 74 20  .. * Either not 
14660 61 20 66 69 6c 65 2c 20 6f 72 20 77 65 20 64 6f  a file, or we do
14670 20 6e 6f 74 20 68 61 76 65 20 61 63 63 65 73 73   not have access
14680 20 74 6f 20 69 74 20 69 6e 20 77 68 69 63 68 20   to it in which 
14690 63 61 73 65 20 77 65 0a 09 20 2a 20 61 72 65 20  case we.. * are 
146a0 69 6e 20 61 6c 6c 20 6c 69 6b 65 6c 69 68 6f 6f  in all likelihoo
146b0 64 20 6e 6f 74 20 74 68 65 20 6f 77 6e 65 72 2e  d not the owner.
146c0 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 30  .. */...return 0
146d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
146e0 20 20 20 20 20 2a 20 47 65 74 74 69 6e 67 20 74       * Getting t
146f0 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
14700 73 73 20 53 49 44 20 69 73 20 61 20 6d 75 6c 74  ss SID is a mult
14710 69 2d 73 74 65 70 20 70 72 6f 63 65 73 73 2e 20  i-step process. 
14720 20 57 65 20 6d 61 6b 65 20 74 68 65 0a 20 20 20   We make the.   
14730 20 20 2a 20 61 73 73 75 6d 70 74 69 6f 6e 20 74    * assumption t
14740 68 61 74 20 69 66 20 61 20 63 61 6c 6c 20 66 61  hat if a call fa
14750 69 6c 73 2c 20 74 68 69 73 20 70 72 6f 63 65 73  ils, this proces
14760 73 20 69 73 20 73 6f 20 75 6e 64 65 72 70 72 69  s is so underpri
14770 76 69 6c 65 67 65 64 20 69 74 0a 20 20 20 20 20  vileged it.     
14780 2a 20 63 6f 75 6c 64 20 6e 6f 74 20 70 6f 73 73  * could not poss
14790 69 62 6c 79 20 6f 77 6e 20 61 6e 79 74 68 69 6e  ibly own anythin
147a0 67 2e 20 4e 6f 72 6d 61 6c 6c 79 20 61 20 70 72  g. Normally a pr
147b0 6f 63 65 73 73 20 63 61 6e 20 2a 61 6c 77 61 79  ocess can *alway
147c0 73 2a 20 6c 6f 6f 6b 0a 20 20 20 20 20 2a 20 75  s* look.     * u
147d0 70 20 69 74 73 20 6f 77 6e 20 74 6f 6b 65 6e 2e  p its own token.
147e0 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
147f0 20 28 4f 70 65 6e 50 72 6f 63 65 73 73 54 6f 6b   (OpenProcessTok
14800 65 6e 28 47 65 74 43 75 72 72 65 6e 74 50 72 6f  en(GetCurrentPro
14810 63 65 73 73 28 29 2c 20 54 4f 4b 45 4e 5f 51 55  cess(), TOKEN_QU
14820 45 52 59 2c 20 26 74 6f 6b 65 6e 29 29 20 7b 0a  ERY, &token)) {.
14830 09 2f 2a 0a 09 20 2a 20 46 69 6e 64 20 6f 75 74  ./*.. * Find out
14840 20 68 6f 77 20 62 69 67 20 74 68 65 20 62 75 66   how big the buf
14850 66 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 2e  fer needs to be.
14860 0a 09 20 2a 2f 0a 0a 09 62 75 66 73 7a 20 3d 20  .. */...bufsz = 
14870 30 3b 0a 09 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  0;..GetTokenInfo
14880 72 6d 61 74 69 6f 6e 28 74 6f 6b 65 6e 2c 20 54  rmation(token, T
14890 6f 6b 65 6e 55 73 65 72 2c 20 4e 55 4c 4c 2c 20  okenUser, NULL, 
148a0 30 2c 20 26 62 75 66 73 7a 29 3b 0a 09 69 66 20  0, &bufsz);..if 
148b0 28 62 75 66 73 7a 29 20 7b 0a 09 20 20 20 20 62  (bufsz) {..    b
148c0 75 66 20 3d 20 28 4c 50 42 59 54 45 29 54 63 6c  uf = (LPBYTE)Tcl
148d0 5f 41 6c 6c 6f 63 28 62 75 66 73 7a 29 3b 0a 09  _Alloc(bufsz);..
148e0 20 20 20 20 69 66 20 28 47 65 74 54 6f 6b 65 6e      if (GetToken
148f0 49 6e 66 6f 72 6d 61 74 69 6f 6e 28 74 6f 6b 65  Information(toke
14900 6e 2c 20 54 6f 6b 65 6e 55 73 65 72 2c 20 62 75  n, TokenUser, bu
14910 66 2c 20 62 75 66 73 7a 2c 20 26 62 75 66 73 7a  f, bufsz, &bufsz
14920 29 29 20 7b 0a 09 09 6f 77 6e 65 64 20 3d 20 45  )) {...owned = E
14930 71 75 61 6c 53 69 64 28 6f 77 6e 65 72 53 69 64  qualSid(ownerSid
14940 2c 20 28 28 50 54 4f 4b 45 4e 5f 55 53 45 52 29  , ((PTOKEN_USER)
14950 20 62 75 66 29 2d 3e 55 73 65 72 2e 53 69 64 29   buf)->User.Sid)
14960 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 43 6c 6f  ;..    }..}..Clo
14970 73 65 48 61 6e 64 6c 65 28 74 6f 6b 65 6e 29 3b  seHandle(token);
14980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
14990 20 20 20 20 2a 20 46 72 65 65 20 61 6c 6c 6f 63      * Free alloc
149a0 61 74 69 6f 6e 73 20 61 6e 64 20 62 65 20 64 6f  ations and be do
149b0 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ne..     */..   
149c0 20 69 66 20 28 73 65 63 64 29 20 7b 0a 09 4c 6f   if (secd) {..Lo
149d0 63 61 6c 46 72 65 65 28 73 65 63 64 29 3b 20 20  calFree(secd);  
149e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73            /* Als
149f0 6f 20 66 72 65 65 73 20 6f 77 6e 65 72 53 69 64  o frees ownerSid
14a00 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
14a10 20 28 62 75 66 29 20 7b 0a 09 54 63 6c 5f 46 72   (buf) {..Tcl_Fr
14a20 65 65 28 62 75 66 29 3b 0a 20 20 20 20 7d 0a 0a  ee(buf);.    }..
14a30 20 20 20 20 72 65 74 75 72 6e 20 28 6f 77 6e 65      return (owne
14a40 64 20 21 3d 20 30 29 3b 20 20 20 20 20 20 20 20  d != 0);        
14a50 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 6f 6e 2d 30  /* Convert non-0
14a60 20 74 6f 20 31 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a   to 1 */.}.../*.
14a70 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c   * Local Variabl
14a80 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 0a 20  es:. * mode: c. 
14a90 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 65 74  * c-basic-offset
14aa0 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75  : 4. * fill-colu
14ab0 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a 0a 20  mn: 78. * End:. 
14ac0 2a 2f 0a                                         */.