Tcl Source Code

Hex Artifact Content
Login

Artifact e226303aef54a130766ac21b55db308ec84d3bf75cc32f478cefb34c67c0a0ff:


0000: 2f 2a 0a 20 2a 20 74 63 6c 57 69 6e 46 69 6c 65  /*. * tclWinFile
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  .c --. *. *.This
0020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0030: 65 6d 70 6f 72 61 72 79 20 77 72 61 70 70 65 72  emporary wrapper
0040: 73 20 61 72 6f 75 6e 64 20 55 4e 49 58 20 66 69  s around UNIX fi
0050: 6c 65 20 68 61 6e 64 6c 69 6e 67 0a 20 2a 09 66  le handling. *.f
0060: 75 6e 63 74 69 6f 6e 73 2e 20 54 68 65 73 65 20  unctions. These 
0070: 77 72 61 70 70 65 72 73 20 6d 61 70 20 74 68 65  wrappers map the
0080: 20 55 4e 49 58 20 66 75 6e 63 74 69 6f 6e 73 20   UNIX functions 
0090: 74 6f 20 57 69 6e 33 32 20 48 41 4e 44 4c 45 2d  to Win32 HANDLE-
00a0: 73 74 79 6c 65 0a 20 2a 09 66 69 6c 65 73 2c 20  style. *.files, 
00b0: 77 68 69 63 68 20 63 61 6e 20 62 65 20 6d 61 6e  which can be man
00c0: 69 70 75 6c 61 74 65 64 20 74 68 72 6f 75 67 68  ipulated through
00d0: 20 74 68 65 20 57 69 6e 33 32 20 63 6f 6e 73 6f   the Win32 conso
00e0: 6c 65 20 72 65 64 69 72 65 63 74 69 6f 6e 0a 20  le redirection. 
00f0: 2a 09 69 6e 74 65 72 66 61 63 65 73 2e 0a 20 2a  *.interfaces.. *
0100: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63  . * Copyright (c
0110: 29 20 31 39 39 35 2d 31 39 39 38 20 53 75 6e 20  ) 1995-1998 Sun 
0120: 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e  Microsystems, In
0130: 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65  c.. *. * See the
0140: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74   file "license.t
0150: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d  erms" for inform
0160: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61  ation on usage a
0170: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f  nd redistributio
0180: 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 69 6c  n of. * this fil
0190: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53  e, and for a DIS
01a0: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57  CLAIMER OF ALL W
01b0: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f 0a 0a  ARRANTIES.. */..
01c0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 57 69 6e  #include "tclWin
01d0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
01e0: 22 74 63 6c 46 69 6c 65 53 79 73 74 65 6d 2e 68  "tclFileSystem.h
01f0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 69  ".#include <wini
0200: 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  octl.h>.#include
0210: 20 3c 73 68 6c 6f 62 6a 2e 68 3e 0a 23 69 6e 63   <shlobj.h>.#inc
0220: 6c 75 64 65 20 3c 6c 6d 61 63 63 65 73 73 2e 68  lude <lmaccess.h
0230: 3e 09 09 2f 2a 20 46 6f 72 20 54 63 6c 70 47 65  >../* For TclpGe
0240: 74 55 73 65 72 48 6f 6d 65 28 29 2e 20 2a 2f 0a  tUserHome(). */.
0250: 23 69 6e 63 6c 75 64 65 20 3c 75 73 65 72 65 6e  #include <useren
0260: 76 2e 68 3e 09 09 2f 2a 20 46 6f 72 20 54 63 6c  v.h>../* For Tcl
0270: 70 47 65 74 55 73 65 72 48 6f 6d 65 28 29 2e 20  pGetUserHome(). 
0280: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6e 75  */../*. * The nu
0290: 6d 62 65 72 20 6f 66 20 31 30 30 2d 6e 73 20 69  mber of 100-ns i
02a0: 6e 74 65 72 76 61 6c 73 20 62 65 74 77 65 65 6e  ntervals between
02b0: 20 74 68 65 20 57 69 6e 64 6f 77 73 20 73 79 73   the Windows sys
02c0: 74 65 6d 20 65 70 6f 63 68 20 28 31 36 30 31 2d  tem epoch (1601-
02d0: 30 31 2d 30 31 0a 20 2a 20 6f 6e 20 74 68 65 20  01-01. * on the 
02e0: 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
02f0: 69 61 6e 20 63 61 6c 65 6e 64 61 72 29 20 61 6e  ian calendar) an
0300: 64 20 74 68 65 20 50 6f 73 69 78 20 65 70 6f 63  d the Posix epoc
0310: 68 20 28 31 39 37 30 2d 30 31 2d 30 31 29 2e 0a  h (1970-01-01)..
0320: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 50 4f 53   */..#define POS
0330: 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46 49 4c 45  IX_EPOCH_AS_FILE
0340: 54 49 4d 45 09 5c 0a 09 28 28 54 63 6c 5f 57 69  TIME.\..((Tcl_Wi
0350: 64 65 49 6e 74 29 20 31 31 36 34 34 34 37 33 36  deInt) 116444736
0360: 20 2a 20 28 54 63 6c 5f 57 69 64 65 49 6e 74 29   * (Tcl_WideInt)
0370: 20 31 30 30 30 30 30 30 30 30 30 29 0a 0a 2f 2a   1000000000)../*
0380: 0a 20 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  . * Declarations
0390: 20 66 6f 72 20 27 6c 69 6e 6b 27 20 72 65 6c 61   for 'link' rela
03a0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ted information.
03b0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
03c0: 6e 20 73 68 6f 75 6c 64 20 63 6f 6d 65 0a 20 2a  n should come. *
03d0: 20 77 69 74 68 20 56 43 2b 2b 20 36 2e 30 2c 20   with VC++ 6.0, 
03e0: 62 75 74 20 69 73 20 6e 6f 74 20 69 6e 20 73 6f  but is not in so
03f0: 6d 65 20 6f 6c 64 65 72 20 53 44 4b 73 2e 20 49  me older SDKs. I
0400: 6e 20 61 6e 79 20 63 61 73 65 20 69 74 20 69 73  n any case it is
0410: 20 6e 6f 74 20 77 65 6c 6c 0a 20 2a 20 64 6f 63   not well. * doc
0420: 75 6d 65 6e 74 65 64 2e 0a 20 2a 2f 0a 0a 23 69  umented.. */..#i
0430: 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45  fndef IO_REPARSE
0440: 5f 54 41 47 5f 52 45 53 45 52 56 45 44 5f 4f 4e  _TAG_RESERVED_ON
0450: 45 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52  E.#  define IO_R
0460: 45 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52  EPARSE_TAG_RESER
0470: 56 45 44 5f 4f 4e 45 09 30 78 30 30 30 30 30 30  VED_ONE.0x000000
0480: 30 30 31 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  001.#endif.#ifnd
0490: 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41  ef IO_REPARSE_TA
04a0: 47 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45  G_RESERVED_RANGE
04b0: 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45  .#  define IO_RE
04c0: 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56  PARSE_TAG_RESERV
04d0: 45 44 5f 52 41 4e 47 45 09 30 78 30 30 30 30 30  ED_RANGE.0x00000
04e0: 30 30 30 31 0a 23 65 6e 64 69 66 0a 23 69 66 6e  0001.#endif.#ifn
04f0: 64 65 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54  def IO_REPARSE_T
0500: 41 47 5f 56 41 4c 49 44 5f 56 41 4c 55 45 53 0a  AG_VALID_VALUES.
0510: 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50  #  define IO_REP
0520: 41 52 53 45 5f 54 41 47 5f 56 41 4c 49 44 5f 56  ARSE_TAG_VALID_V
0530: 41 4c 55 45 53 09 30 78 30 45 30 30 30 46 46 46  ALUES.0x0E000FFF
0540: 46 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  F.#endif.#ifndef
0550: 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f   IO_REPARSE_TAG_
0560: 48 53 4d 0a 23 20 20 64 65 66 69 6e 65 20 49 4f  HSM.#  define IO
0570: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 48 53 4d  _REPARSE_TAG_HSM
0580: 09 09 30 78 30 43 30 30 30 30 30 30 34 0a 23 65  ..0x0C0000004.#e
0590: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f 5f  ndif.#ifndef IO_
05a0: 52 45 50 41 52 53 45 5f 54 41 47 5f 4e 53 53 0a  REPARSE_TAG_NSS.
05b0: 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50  #  define IO_REP
05c0: 41 52 53 45 5f 54 41 47 5f 4e 53 53 09 09 30 78  ARSE_TAG_NSS..0x
05d0: 30 38 30 30 30 30 30 30 35 0a 23 65 6e 64 69 66  080000005.#endif
05e0: 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41  .#ifndef IO_REPA
05f0: 52 53 45 5f 54 41 47 5f 4e 53 53 52 45 43 4f 56  RSE_TAG_NSSRECOV
0600: 45 52 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f  ER.#  define IO_
0610: 52 45 50 41 52 53 45 5f 54 41 47 5f 4e 53 53 52  REPARSE_TAG_NSSR
0620: 45 43 4f 56 45 52 09 30 78 30 38 30 30 30 30 30  ECOVER.0x0800000
0630: 30 36 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  06.#endif.#ifnde
0640: 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47  f IO_REPARSE_TAG
0650: 5f 53 49 53 0a 23 20 20 64 65 66 69 6e 65 20 49  _SIS.#  define I
0660: 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 53 49  O_REPARSE_TAG_SI
0670: 53 09 09 30 78 30 38 30 30 30 30 30 30 37 0a 23  S..0x080000007.#
0680: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 49 4f  endif.#ifndef IO
0690: 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 44 46 53  _REPARSE_TAG_DFS
06a0: 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45  .#  define IO_RE
06b0: 50 41 52 53 45 5f 54 41 47 5f 44 46 53 09 09 30  PARSE_TAG_DFS..0
06c0: 78 30 38 30 30 30 30 30 30 38 0a 23 65 6e 64 69  x080000008.#endi
06d0: 66 0a 0a 23 69 66 6e 64 65 66 20 49 4f 5f 52 45  f..#ifndef IO_RE
06e0: 50 41 52 53 45 5f 54 41 47 5f 52 45 53 45 52 56  PARSE_TAG_RESERV
06f0: 45 44 5f 5a 45 52 4f 0a 23 20 20 64 65 66 69 6e  ED_ZERO.#  defin
0700: 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47  e IO_REPARSE_TAG
0710: 5f 52 45 53 45 52 56 45 44 5f 5a 45 52 4f 09 30  _RESERVED_ZERO.0
0720: 78 30 30 30 30 30 30 30 30 0a 23 65 6e 64 69 66  x00000000.#endif
0730: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c  .#ifndef FILE_FL
0740: 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f  AG_OPEN_REPARSE_
0750: 50 4f 49 4e 54 0a 23 20 20 64 65 66 69 6e 65 20  POINT.#  define 
0760: 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e 5f 52  FILE_FLAG_OPEN_R
0770: 45 50 41 52 53 45 5f 50 4f 49 4e 54 09 30 78 30  EPARSE_POINT.0x0
0780: 30 32 30 30 30 30 30 0a 23 65 6e 64 69 66 0a 23  0200000.#endif.#
0790: 69 66 6e 64 65 66 20 49 4f 5f 52 45 50 41 52 53  ifndef IO_REPARS
07a0: 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e  E_TAG_MOUNT_POIN
07b0: 54 0a 23 20 20 64 65 66 69 6e 65 20 49 4f 5f 52  T.#  define IO_R
07c0: 45 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54  EPARSE_TAG_MOUNT
07d0: 5f 50 4f 49 4e 54 09 30 78 41 30 30 30 30 30 30  _POINT.0xA000000
07e0: 33 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  3.#endif.#ifndef
07f0: 20 49 73 52 65 70 61 72 73 65 54 61 67 56 61 6c   IsReparseTagVal
0800: 69 64 0a 23 20 20 64 65 66 69 6e 65 20 49 73 52  id.#  define IsR
0810: 65 70 61 72 73 65 54 61 67 56 61 6c 69 64 28 78  eparseTagValid(x
0820: 29 20 5c 0a 20 20 20 20 28 21 28 28 78 29 26 7e  ) \.    (!((x)&~
0830: 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47 5f 56  IO_REPARSE_TAG_V
0840: 41 4c 49 44 5f 56 41 4c 55 45 53 29 26 26 28 28  ALID_VALUES)&&((
0850: 78 29 3e 49 4f 5f 52 45 50 41 52 53 45 5f 54 41  x)>IO_REPARSE_TA
0860: 47 5f 52 45 53 45 52 56 45 44 5f 52 41 4e 47 45  G_RESERVED_RANGE
0870: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  )).#endif.#ifnde
0880: 66 20 49 4f 5f 52 45 50 41 52 53 45 5f 54 41 47  f IO_REPARSE_TAG
0890: 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49 4e 4b 0a 23  _SYMBOLIC_LINK.#
08a0: 20 20 64 65 66 69 6e 65 20 49 4f 5f 52 45 50 41    define IO_REPA
08b0: 52 53 45 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43  RSE_TAG_SYMBOLIC
08c0: 5f 4c 49 4e 4b 09 49 4f 5f 52 45 50 41 52 53 45  _LINK.IO_REPARSE
08d0: 5f 54 41 47 5f 52 45 53 45 52 56 45 44 5f 5a 45  _TAG_RESERVED_ZE
08e0: 52 4f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  RO.#endif.#ifnde
08f0: 66 20 46 49 4c 45 5f 53 50 45 43 49 41 4c 5f 41  f FILE_SPECIAL_A
0900: 43 43 45 53 53 0a 23 20 20 64 65 66 69 6e 65 20  CCESS.#  define 
0910: 46 49 4c 45 5f 53 50 45 43 49 41 4c 5f 41 43 43  FILE_SPECIAL_ACC
0920: 45 53 53 09 09 28 46 49 4c 45 5f 41 4e 59 5f 41  ESS..(FILE_ANY_A
0930: 43 43 45 53 53 29 0a 23 65 6e 64 69 66 0a 23 69  CCESS).#endif.#i
0940: 66 6e 64 65 66 20 46 53 43 54 4c 5f 53 45 54 5f  fndef FSCTL_SET_
0950: 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 0a 23 20  REPARSE_POINT.# 
0960: 20 64 65 66 69 6e 65 20 46 53 43 54 4c 5f 53 45   define FSCTL_SE
0970: 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 20  T_REPARSE_POINT 
0980: 5c 0a 20 20 20 20 43 54 4c 5f 43 4f 44 45 28 46  \.    CTL_CODE(F
0990: 49 4c 45 5f 44 45 56 49 43 45 5f 46 49 4c 45 5f  ILE_DEVICE_FILE_
09a0: 53 59 53 54 45 4d 2c 20 34 31 2c 20 4d 45 54 48  SYSTEM, 41, METH
09b0: 4f 44 5f 42 55 46 46 45 52 45 44 2c 20 46 49 4c  OD_BUFFERED, FIL
09c0: 45 5f 53 50 45 43 49 41 4c 5f 41 43 43 45 53 53  E_SPECIAL_ACCESS
09d0: 29 0a 23 20 20 64 65 66 69 6e 65 20 46 53 43 54  ).#  define FSCT
09e0: 4c 5f 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f  L_GET_REPARSE_PO
09f0: 49 4e 54 20 5c 0a 20 20 20 20 43 54 4c 5f 43 4f  INT \.    CTL_CO
0a00: 44 45 28 46 49 4c 45 5f 44 45 56 49 43 45 5f 46  DE(FILE_DEVICE_F
0a10: 49 4c 45 5f 53 59 53 54 45 4d 2c 20 34 32 2c 20  ILE_SYSTEM, 42, 
0a20: 4d 45 54 48 4f 44 5f 42 55 46 46 45 52 45 44 2c  METHOD_BUFFERED,
0a30: 20 46 49 4c 45 5f 41 4e 59 5f 41 43 43 45 53 53   FILE_ANY_ACCESS
0a40: 29 0a 23 20 20 64 65 66 69 6e 65 20 46 53 43 54  ).#  define FSCT
0a50: 4c 5f 44 45 4c 45 54 45 5f 52 45 50 41 52 53 45  L_DELETE_REPARSE
0a60: 5f 50 4f 49 4e 54 20 5c 0a 20 20 20 20 43 54 4c  _POINT \.    CTL
0a70: 5f 43 4f 44 45 28 46 49 4c 45 5f 44 45 56 49 43  _CODE(FILE_DEVIC
0a80: 45 5f 46 49 4c 45 5f 53 59 53 54 45 4d 2c 20 34  E_FILE_SYSTEM, 4
0a90: 33 2c 20 4d 45 54 48 4f 44 5f 42 55 46 46 45 52  3, METHOD_BUFFER
0aa0: 45 44 2c 20 46 49 4c 45 5f 53 50 45 43 49 41 4c  ED, FILE_SPECIAL
0ab0: 5f 41 43 43 45 53 53 29 0a 23 65 6e 64 69 66 0a  _ACCESS).#endif.
0ac0: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
0ad0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a  FILE_ATTRIBUTES.
0ae0: 23 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f  #define INVALID_
0af0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 09  FILE_ATTRIBUTES.
0b00: 09 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e  .((DWORD)-1).#en
0b10: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 4d 61 78 69 6d  dif../*. * Maxim
0b20: 75 6d 20 72 65 70 61 72 73 65 20 62 75 66 66 65  um reparse buffe
0b30: 72 20 69 6e 66 6f 20 73 69 7a 65 2e 20 54 68 65  r info size. The
0b40: 20 6d 61 78 20 75 73 65 72 20 64 65 66 69 6e 65   max user define
0b50: 64 20 72 65 70 61 72 73 65 20 64 61 74 61 20 69  d reparse data i
0b60: 73 0a 20 2a 20 31 36 4b 42 2c 20 70 6c 75 73 20  s. * 16KB, plus 
0b70: 74 68 65 72 65 27 73 20 61 20 68 65 61 64 65 72  there's a header
0b80: 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4d  .. */..#define M
0b90: 41 58 5f 52 45 50 41 52 53 45 5f 53 49 5a 45 09  AX_REPARSE_SIZE.
0ba0: 09 31 37 30 30 30 0a 0a 2f 2a 0a 20 2a 20 55 6e  .17000../*. * Un
0bb0: 64 6f 63 75 6d 65 6e 74 65 64 20 52 45 50 41 52  documented REPAR
0bc0: 53 45 5f 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45  SE_MOUNTPOINT_HE
0bd0: 41 44 45 52 5f 53 49 5a 45 20 73 74 72 75 63 74  ADER_SIZE struct
0be0: 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  ure definition. 
0bf0: 54 68 69 73 20 69 73 0a 20 2a 20 66 6f 75 6e 64  This is. * found
0c00: 20 69 6e 20 77 69 6e 6e 74 2e 68 2e 0a 20 2a 0a   in winnt.h.. *.
0c10: 20 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 63 61   * IMPORTANT: ca
0c20: 75 74 69 6f 6e 20 77 68 65 6e 20 75 73 69 6e 67  ution when using
0c30: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2c   this structure,
0c40: 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61   since the actua
0c50: 6c 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a 20  l structures. * 
0c60: 75 73 65 64 20 77 69 6c 6c 20 77 61 6e 74 20 74  used will want t
0c70: 6f 20 73 74 6f 72 65 20 61 20 66 75 6c 6c 20 70  o store a full p
0c80: 61 74 68 20 69 6e 20 74 68 65 20 27 50 61 74 68  ath in the 'Path
0c90: 42 75 66 66 65 72 27 20 66 69 65 6c 64 2c 20 62  Buffer' field, b
0ca0: 75 74 20 74 68 65 72 65 0a 20 2a 20 69 73 6e 27  ut there. * isn'
0cb0: 74 20 72 6f 6f 6d 20 28 74 68 65 72 65 27 73 20  t room (there's 
0cc0: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 57 43  only a single WC
0cd0: 48 41 52 21 29 2e 20 54 68 65 72 65 66 6f 72 65  HAR!). Therefore
0ce0: 20 6f 6e 65 20 6d 75 73 74 20 61 72 74 69 66 69   one must artifi
0cf0: 63 69 61 6c 6c 79 0a 20 2a 20 63 72 65 61 74 65  cially. * create
0d00: 20 61 20 6c 61 72 67 65 72 20 73 70 61 63 65 20   a larger space 
0d10: 6f 66 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  of memory and th
0d20: 65 6e 20 63 61 73 74 20 69 74 20 74 6f 20 74 68  en cast it to th
0d30: 69 73 20 74 79 70 65 2e 20 57 65 20 75 73 65 20  is type. We use 
0d40: 74 68 65 0a 20 2a 20 27 44 55 4d 4d 59 5f 52 45  the. * 'DUMMY_RE
0d50: 50 41 52 53 45 5f 42 55 46 46 45 52 27 20 73 74  PARSE_BUFFER' st
0d60: 72 75 63 74 20 6a 75 73 74 20 62 65 6c 6f 77 20  ruct just below 
0d70: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 69  to deal with thi
0d80: 73 20 70 72 6f 62 6c 65 6d 2e 0a 20 2a 2f 0a 0a  s problem.. */..
0d90: 23 64 65 66 69 6e 65 20 52 45 50 41 52 53 45 5f  #define REPARSE_
0da0: 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45  MOUNTPOINT_HEADE
0db0: 52 5f 53 49 5a 45 09 20 38 0a 23 69 66 6e 64 65  R_SIZE. 8.#ifnde
0dc0: 66 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42  f REPARSE_DATA_B
0dd0: 55 46 46 45 52 5f 48 45 41 44 45 52 5f 53 49 5a  UFFER_HEADER_SIZ
0de0: 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  E.typedef struct
0df0: 20 5f 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42   _REPARSE_DATA_B
0e00: 55 46 46 45 52 20 7b 0a 20 20 20 20 44 57 4f 52  UFFER {.    DWOR
0e10: 44 20 52 65 70 61 72 73 65 54 61 67 3b 0a 20 20  D ReparseTag;.  
0e20: 20 20 57 4f 52 44 20 52 65 70 61 72 73 65 44 61    WORD ReparseDa
0e30: 74 61 4c 65 6e 67 74 68 3b 0a 20 20 20 20 57 4f  taLength;.    WO
0e40: 52 44 20 52 65 73 65 72 76 65 64 3b 0a 20 20 20  RD Reserved;.   
0e50: 20 75 6e 69 6f 6e 20 7b 0a 09 73 74 72 75 63 74   union {..struct
0e60: 20 7b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 62   {..    WORD Sub
0e70: 73 74 69 74 75 74 65 4e 61 6d 65 4f 66 66 73 65  stituteNameOffse
0e80: 74 3b 0a 09 20 20 20 20 57 4f 52 44 20 53 75 62  t;..    WORD Sub
0e90: 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74  stituteNameLengt
0ea0: 68 3b 0a 09 20 20 20 20 57 4f 52 44 20 50 72 69  h;..    WORD Pri
0eb0: 6e 74 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20  ntNameOffset;.. 
0ec0: 20 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d     WORD PrintNam
0ed0: 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 55 4c  eLength;..    UL
0ee0: 4f 4e 47 20 46 6c 61 67 73 3b 0a 09 20 20 20 20  ONG Flags;..    
0ef0: 57 43 48 41 52 20 50 61 74 68 42 75 66 66 65 72  WCHAR PathBuffer
0f00: 5b 31 5d 3b 0a 09 7d 20 53 79 6d 62 6f 6c 69 63  [1];..} Symbolic
0f10: 4c 69 6e 6b 52 65 70 61 72 73 65 42 75 66 66 65  LinkReparseBuffe
0f20: 72 3b 0a 09 73 74 72 75 63 74 20 7b 0a 09 20 20  r;..struct {..  
0f30: 20 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74    WORD Substitut
0f40: 65 4e 61 6d 65 4f 66 66 73 65 74 3b 0a 09 20 20  eNameOffset;..  
0f50: 20 20 57 4f 52 44 20 53 75 62 73 74 69 74 75 74    WORD Substitut
0f60: 65 4e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20  eNameLength;..  
0f70: 20 20 57 4f 52 44 20 50 72 69 6e 74 4e 61 6d 65    WORD PrintName
0f80: 4f 66 66 73 65 74 3b 0a 09 20 20 20 20 57 4f 52  Offset;..    WOR
0f90: 44 20 50 72 69 6e 74 4e 61 6d 65 4c 65 6e 67 74  D PrintNameLengt
0fa0: 68 3b 0a 09 20 20 20 20 57 43 48 41 52 20 50 61  h;..    WCHAR Pa
0fb0: 74 68 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20  thBuffer[1];..} 
0fc0: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73  MountPointRepars
0fd0: 65 42 75 66 66 65 72 3b 0a 09 73 74 72 75 63 74  eBuffer;..struct
0fe0: 20 7b 0a 09 20 20 20 20 42 59 54 45 20 44 61 74   {..    BYTE Dat
0ff0: 61 42 75 66 66 65 72 5b 31 5d 3b 0a 09 7d 20 47  aBuffer[1];..} G
1000: 65 6e 65 72 69 63 52 65 70 61 72 73 65 42 75 66  enericReparseBuf
1010: 66 65 72 3b 0a 20 20 20 20 7d 3b 0a 7d 20 52 45  fer;.    };.} RE
1020: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45  PARSE_DATA_BUFFE
1030: 52 3b 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64  R;.#endif..typed
1040: 65 66 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ef struct {.    
1050: 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46  REPARSE_DATA_BUF
1060: 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20 57  FER dummy;.    W
1070: 43 48 41 52 20 64 75 6d 6d 79 42 75 66 5b 4d 41  CHAR dummyBuf[MA
1080: 58 5f 50 41 54 48 20 2a 20 33 5d 3b 0a 7d 20 44  X_PATH * 3];.} D
1090: 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46  UMMY_REPARSE_BUF
10a0: 46 45 52 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  FER;..#if define
10b0: 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 28  d(_MSC_VER) && (
10c0: 5f 4d 53 43 5f 56 45 52 20 3c 3d 20 31 31 30 30  _MSC_VER <= 1100
10d0: 29 0a 23 75 6e 64 65 66 09 48 41 56 45 5f 4e 4f  ).#undef.HAVE_NO
10e0: 5f 46 49 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 64  _FINDEX_ENUMS.#d
10f0: 65 66 69 6e 65 20 48 41 56 45 5f 4e 4f 5f 46 49  efine HAVE_NO_FI
1100: 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 65 6c 69 66  NDEX_ENUMS.#elif
1110: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1120: 5f 57 49 4e 4e 54 29 20 7c 7c 20 28 5f 57 49 4e  _WINNT) || (_WIN
1130: 33 32 5f 57 49 4e 4e 54 20 3c 20 30 78 30 34 30  32_WINNT < 0x040
1140: 30 29 0a 23 75 6e 64 65 66 09 48 41 56 45 5f 4e  0).#undef.HAVE_N
1150: 4f 5f 46 49 4e 44 45 58 5f 45 4e 55 4d 53 0a 23  O_FINDEX_ENUMS.#
1160: 64 65 66 69 6e 65 20 48 41 56 45 5f 4e 4f 5f 46  define HAVE_NO_F
1170: 49 4e 44 45 58 5f 45 4e 55 4d 53 0a 23 65 6e 64  INDEX_ENUMS.#end
1180: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
1190: 4e 4f 5f 46 49 4e 44 45 58 5f 45 4e 55 4d 53 0a  NO_FINDEX_ENUMS.
11a0: 2f 2a 20 54 68 65 73 65 20 74 77 6f 20 61 72 65  /* These two are
11b0: 6e 27 74 20 69 6e 20 56 43 2b 2b 20 35 2e 32 20  n't in VC++ 5.2 
11c0: 68 65 61 64 65 72 73 20 2a 2f 0a 74 79 70 65 64  headers */.typed
11d0: 65 66 20 65 6e 75 6d 20 5f 46 49 4e 44 45 58 5f  ef enum _FINDEX_
11e0: 49 4e 46 4f 5f 4c 45 56 45 4c 53 20 7b 0a 20 20  INFO_LEVELS {.  
11f0: 20 20 46 69 6e 64 45 78 49 6e 66 6f 53 74 61 6e    FindExInfoStan
1200: 64 61 72 64 2c 0a 20 20 20 20 46 69 6e 64 45 78  dard,.    FindEx
1210: 49 6e 66 6f 4d 61 78 49 6e 66 6f 4c 65 76 65 6c  InfoMaxInfoLevel
1220: 0a 7d 20 46 49 4e 44 45 58 5f 49 4e 46 4f 5f 4c  .} FINDEX_INFO_L
1230: 45 56 45 4c 53 3b 0a 74 79 70 65 64 65 66 20 65  EVELS;.typedef e
1240: 6e 75 6d 20 5f 46 49 4e 44 45 58 5f 53 45 41 52  num _FINDEX_SEAR
1250: 43 48 5f 4f 50 53 20 7b 0a 20 20 20 20 46 69 6e  CH_OPS {.    Fin
1260: 64 45 78 53 65 61 72 63 68 4e 61 6d 65 4d 61 74  dExSearchNameMat
1270: 63 68 2c 0a 20 20 20 20 46 69 6e 64 45 78 53 65  ch,.    FindExSe
1280: 61 72 63 68 4c 69 6d 69 74 54 6f 44 69 72 65 63  archLimitToDirec
1290: 74 6f 72 69 65 73 2c 0a 20 20 20 20 46 69 6e 64  tories,.    Find
12a0: 45 78 53 65 61 72 63 68 4c 69 6d 69 74 54 6f 44  ExSearchLimitToD
12b0: 65 76 69 63 65 73 2c 0a 20 20 20 20 46 69 6e 64  evices,.    Find
12c0: 45 78 53 65 61 72 63 68 4d 61 78 53 65 61 72 63  ExSearchMaxSearc
12d0: 68 4f 70 0a 7d 20 46 49 4e 44 45 58 5f 53 45 41  hOp.} FINDEX_SEA
12e0: 52 43 48 5f 4f 50 53 3b 0a 23 65 6e 64 69 66 20  RCH_OPS;.#endif 
12f0: 2f 2a 20 48 41 56 45 5f 4e 4f 5f 46 49 4e 44 45  /* HAVE_NO_FINDE
1300: 58 5f 45 4e 55 4d 53 20 2a 2f 0a 0a 2f 2a 0a 20  X_ENUMS */../*. 
1310: 2a 20 4f 74 68 65 72 20 74 79 70 65 64 65 66 73  * Other typedefs
1320: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
1330: 73 20 63 6f 64 65 2e 0a 20 2a 2f 0a 0a 73 74 61  s code.. */..sta
1340: 74 69 63 20 74 69 6d 65 5f 74 09 09 54 6f 43 54  tic time_t..ToCT
1350: 69 6d 65 28 46 49 4c 45 54 49 4d 45 20 66 69 6c  ime(FILETIME fil
1360: 65 54 69 6d 65 29 3b 0a 73 74 61 74 69 63 20 76  eTime);.static v
1370: 6f 69 64 09 09 46 72 6f 6d 43 54 69 6d 65 28 74  oid..FromCTime(t
1380: 69 6d 65 5f 74 20 70 6f 73 69 78 54 69 6d 65 2c  ime_t posixTime,
1390: 20 46 49 4c 45 54 49 4d 45 20 2a 66 69 6c 65 54   FILETIME *fileT
13a0: 69 6d 65 29 3b 0a 0a 74 79 70 65 64 65 66 20 4e  ime);..typedef N
13b0: 45 54 5f 41 50 49 5f 53 54 41 54 55 53 20 4e 45  ET_API_STATUS NE
13c0: 54 5f 41 50 49 5f 46 55 4e 43 54 49 4f 4e 20 4e  T_API_FUNCTION N
13d0: 45 54 55 53 45 52 47 45 54 49 4e 46 4f 50 52 4f  ETUSERGETINFOPRO
13e0: 43 28 0a 09 4c 50 57 53 54 52 20 73 65 72 76 65  C(..LPWSTR serve
13f0: 72 6e 61 6d 65 2c 20 4c 50 57 53 54 52 20 75 73  rname, LPWSTR us
1400: 65 72 6e 61 6d 65 2c 20 44 57 4f 52 44 20 6c 65  ername, DWORD le
1410: 76 65 6c 2c 20 4c 50 42 59 54 45 20 2a 62 75 66  vel, LPBYTE *buf
1420: 70 74 72 29 3b 0a 0a 74 79 70 65 64 65 66 20 4e  ptr);..typedef N
1430: 45 54 5f 41 50 49 5f 53 54 41 54 55 53 20 4e 45  ET_API_STATUS NE
1440: 54 5f 41 50 49 5f 46 55 4e 43 54 49 4f 4e 20 4e  T_API_FUNCTION N
1450: 45 54 41 50 49 42 55 46 46 45 52 46 52 45 45 50  ETAPIBUFFERFREEP
1460: 52 4f 43 28 4c 50 56 4f 49 44 20 42 75 66 66 65  ROC(LPVOID Buffe
1470: 72 29 3b 0a 0a 74 79 70 65 64 65 66 20 4e 45 54  r);..typedef NET
1480: 5f 41 50 49 5f 53 54 41 54 55 53 20 4e 45 54 5f  _API_STATUS NET_
1490: 41 50 49 5f 46 55 4e 43 54 49 4f 4e 20 4e 45 54  API_FUNCTION NET
14a0: 47 45 54 44 43 4e 41 4d 45 50 52 4f 43 28 0a 09  GETDCNAMEPROC(..
14b0: 4c 50 57 53 54 52 20 73 65 72 76 65 72 6e 61 6d  LPWSTR servernam
14c0: 65 2c 20 4c 50 57 53 54 52 20 64 6f 6d 61 69 6e  e, LPWSTR domain
14d0: 6e 61 6d 65 2c 20 4c 50 42 59 54 45 20 2a 62 75  name, LPBYTE *bu
14e0: 66 70 74 72 29 3b 0a 0a 74 79 70 65 64 65 66 20  fptr);..typedef 
14f0: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 47 45 54 50  BOOL WINAPI GETP
1500: 52 4f 46 49 4c 45 53 44 49 52 45 43 54 4f 52 59  ROFILESDIRECTORY
1510: 50 52 4f 43 28 0a 09 4c 50 57 53 54 52 20 20 6c  PROC(..LPWSTR  l
1520: 70 50 72 6f 66 69 6c 65 73 44 69 72 2c 20 4c 50  pProfilesDir, LP
1530: 44 57 4f 52 44 20 6c 70 63 63 68 53 69 7a 65 0a  DWORD lpcchSize.
1540: 29 3b 0a 0a 2f 2a 0a 20 2a 20 44 65 63 6c 61 72  );../*. * Declar
1550: 61 74 69 6f 6e 73 20 66 6f 72 20 6c 6f 63 61 6c  ations for local
1560: 20 66 75 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e   functions defin
1570: 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 3a  ed in this file:
1580: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
1590: 09 09 4e 61 74 69 76 65 41 63 63 65 73 73 28 63  ..NativeAccess(c
15a0: 6f 6e 73 74 20 54 43 48 41 52 20 2a 70 61 74 68  onst TCHAR *path
15b0: 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 73 74 61  , int mode);.sta
15c0: 74 69 63 20 69 6e 74 09 09 4e 61 74 69 76 65 44  tic int..NativeD
15d0: 65 76 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a  ev(const TCHAR *
15e0: 70 61 74 68 29 3b 0a 73 74 61 74 69 63 20 69 6e  path);.static in
15f0: 74 09 09 4e 61 74 69 76 65 53 74 61 74 28 63 6f  t..NativeStat(co
1600: 6e 73 74 20 54 43 48 41 52 20 2a 70 61 74 68 2c  nst TCHAR *path,
1610: 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74   Tcl_StatBuf *st
1620: 61 74 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e  atPtr,....    in
1630: 74 20 63 68 65 63 6b 4c 69 6e 6b 73 29 3b 0a 73  t checkLinks);.s
1640: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 73  tatic unsigned s
1650: 68 6f 72 74 09 4e 61 74 69 76 65 53 74 61 74 4d  hort.NativeStatM
1660: 6f 64 65 28 44 57 4f 52 44 20 61 74 74 72 2c 20  ode(DWORD attr, 
1670: 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b 73 2c 0a  int checkLinks,.
1680: 09 09 09 20 20 20 20 69 6e 74 20 69 73 45 78 65  ...    int isExe
1690: 63 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09  c);.static int..
16a0: 4e 61 74 69 76 65 49 73 45 78 65 63 28 63 6f 6e  NativeIsExec(con
16b0: 73 74 20 54 43 48 41 52 20 2a 70 61 74 68 29 3b  st TCHAR *path);
16c0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4e 61 74  .static int..Nat
16d0: 69 76 65 52 65 61 64 52 65 70 61 72 73 65 28 63  iveReadReparse(c
16e0: 6f 6e 73 74 20 54 43 48 41 52 20 2a 4c 69 6e 6b  onst TCHAR *Link
16f0: 44 69 72 65 63 74 6f 72 79 2c 0a 09 09 09 20 20  Directory,....  
1700: 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42    REPARSE_DATA_B
1710: 55 46 46 45 52 20 2a 62 75 66 66 65 72 2c 20 44  UFFER *buffer, D
1720: 57 4f 52 44 20 64 65 73 69 72 65 64 41 63 63 65  WORD desiredAcce
1730: 73 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  ss);.static int.
1740: 09 4e 61 74 69 76 65 57 72 69 74 65 52 65 70 61  .NativeWriteRepa
1750: 72 73 65 28 63 6f 6e 73 74 20 54 43 48 41 52 20  rse(const TCHAR 
1760: 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 2c 0a  *LinkDirectory,.
1770: 09 09 09 20 20 20 20 52 45 50 41 52 53 45 5f 44  ...    REPARSE_D
1780: 41 54 41 5f 42 55 46 46 45 52 20 2a 62 75 66 66  ATA_BUFFER *buff
1790: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  er);.static int.
17a0: 09 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70 65  .NativeMatchType
17b0: 28 69 6e 74 20 69 73 44 72 69 76 65 2c 20 44 57  (int isDrive, DW
17c0: 4f 52 44 20 61 74 74 72 2c 0a 09 09 09 20 20 20  ORD attr,....   
17d0: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61   const TCHAR *na
17e0: 74 69 76 65 4e 61 6d 65 2c 20 54 63 6c 5f 47 6c  tiveName, Tcl_Gl
17f0: 6f 62 54 79 70 65 44 61 74 61 20 2a 74 79 70 65  obTypeData *type
1800: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09  s);.static int..
1810: 57 69 6e 49 73 44 72 69 76 65 28 63 6f 6e 73 74  WinIsDrive(const
1820: 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74   char *name, int
1830: 20 6e 61 6d 65 4c 65 6e 29 3b 0a 73 74 61 74 69   nameLen);.stati
1840: 63 20 69 6e 74 09 09 57 69 6e 49 73 52 65 73 65  c int..WinIsRese
1850: 72 76 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20  rved(const char 
1860: 2a 70 61 74 68 29 3b 0a 73 74 61 74 69 63 20 54  *path);.static T
1870: 63 6c 5f 4f 62 6a 20 2a 09 57 69 6e 52 65 61 64  cl_Obj *.WinRead
1880: 4c 69 6e 6b 28 63 6f 6e 73 74 20 54 43 48 41 52  Link(const TCHAR
1890: 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 29 3b 0a 73   *LinkSource);.s
18a0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 09  tatic Tcl_Obj *.
18b0: 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72 65 63  WinReadLinkDirec
18c0: 74 6f 72 79 28 63 6f 6e 73 74 20 54 43 48 41 52  tory(const TCHAR
18d0: 20 2a 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 29   *LinkDirectory)
18e0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 57 69  ;.static int..Wi
18f0: 6e 4c 69 6e 6b 28 63 6f 6e 73 74 20 54 43 48 41  nLink(const TCHA
1900: 52 20 2a 4c 69 6e 6b 53 6f 75 72 63 65 2c 0a 09  R *LinkSource,..
1910: 09 09 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41  ..    const TCHA
1920: 52 20 2a 4c 69 6e 6b 54 61 72 67 65 74 2c 20 69  R *LinkTarget, i
1930: 6e 74 20 6c 69 6e 6b 41 63 74 69 6f 6e 29 3b 0a  nt linkAction);.
1940: 73 74 61 74 69 63 20 69 6e 74 09 09 57 69 6e 53  static int..WinS
1950: 79 6d 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 28  ymLinkDirectory(
1960: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 4c 69 6e  const TCHAR *Lin
1970: 6b 44 69 72 65 63 74 6f 72 79 2c 0a 09 09 09 20  kDirectory,.... 
1980: 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a     const TCHAR *
1990: 4c 69 6e 6b 54 61 72 67 65 74 29 3b 0a 0c 0a 2f  LinkTarget);.../
19a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 57  --------. *. * W
19f0: 69 6e 4c 69 6e 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  inLink --. *. *.
1a00: 4d 61 6b 65 20 61 20 6c 69 6e 6b 20 66 72 6f 6d  Make a link from
1a10: 20 73 6f 75 72 63 65 20 74 6f 20 74 61 72 67 65   source to targe
1a20: 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  t.. *. *--------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1a70: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 6e  ..static int.Win
1a80: 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74 20  Link(.    const 
1a90: 54 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72 63  TCHAR *linkSourc
1aa0: 65 50 61 74 68 2c 0a 20 20 20 20 63 6f 6e 73 74  ePath,.    const
1ab0: 20 54 43 48 41 52 20 2a 6c 69 6e 6b 54 61 72 67   TCHAR *linkTarg
1ac0: 65 74 50 61 74 68 2c 0a 20 20 20 20 69 6e 74 20  etPath,.    int 
1ad0: 6c 69 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 20  linkAction).{.  
1ae0: 20 20 57 43 48 41 52 20 74 65 6d 70 46 69 6c 65    WCHAR tempFile
1af0: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Name[MAX_PATH];.
1b00: 20 20 20 20 54 43 48 41 52 20 2a 74 65 6d 70 46      TCHAR *tempF
1b10: 69 6c 65 50 61 72 74 3b 0a 20 20 20 20 44 57 4f  ilePart;.    DWO
1b20: 52 44 20 61 74 74 72 3b 0a 0a 20 20 20 20 2f 2a  RD attr;..    /*
1b30: 0a 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20  .     * Get the 
1b40: 66 75 6c 6c 20 70 61 74 68 20 72 65 66 65 72 65  full path refere
1b50: 6e 63 65 64 20 62 79 20 74 68 65 20 74 61 72 67  nced by the targ
1b60: 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  et..     */..   
1b70: 20 69 66 20 28 21 28 2a 74 63 6c 57 69 6e 50 72   if (!(*tclWinPr
1b80: 6f 63 73 2d 3e 67 65 74 46 75 6c 6c 50 61 74 68  ocs->getFullPath
1b90: 4e 61 6d 65 50 72 6f 63 29 28 6c 69 6e 6b 54 61  NameProc)(linkTa
1ba0: 72 67 65 74 50 61 74 68 2c 20 4d 41 58 5f 50 41  rgetPath, MAX_PA
1bb0: 54 48 2c 0a 09 20 20 20 20 74 65 6d 70 46 69 6c  TH,..    tempFil
1bc0: 65 4e 61 6d 65 2c 20 26 74 65 6d 70 46 69 6c 65  eName, &tempFile
1bd0: 50 61 72 74 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a  Part)) {../*.. *
1be0: 20 49 6e 76 61 6c 69 64 20 66 69 6c 65 2e 0a 09   Invalid file...
1bf0: 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76   */...TclWinConv
1c00: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
1c10: 45 72 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72  Error());..retur
1c20: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
1c30: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
1c40: 73 75 72 65 20 73 6f 75 72 63 65 20 66 69 6c 65  sure source file
1c50: 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a   doesn't exist..
1c60: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 61 74 74       */..    att
1c70: 72 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63  r = (*tclWinProc
1c80: 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 69 62  s->getFileAttrib
1c90: 75 74 65 73 50 72 6f 63 29 28 6c 69 6e 6b 53 6f  utesProc)(linkSo
1ca0: 75 72 63 65 50 61 74 68 29 3b 0a 20 20 20 20 69  urcePath);.    i
1cb0: 66 20 28 61 74 74 72 20 21 3d 20 49 4e 56 41 4c  f (attr != INVAL
1cc0: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1cd0: 45 53 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72  ES) {..Tcl_SetEr
1ce0: 72 6e 6f 28 45 45 58 49 53 54 29 3b 0a 09 72 65  rno(EEXIST);..re
1cf0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1d00: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 47 65      /*.     * Ge
1d10: 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  t the full path 
1d20: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
1d30: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 2f 64 69  e source file/di
1d40: 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 2f  rectory..     */
1d50: 0a 0a 20 20 20 20 69 66 20 28 21 28 2a 74 63 6c  ..    if (!(*tcl
1d60: 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 46 75 6c  WinProcs->getFul
1d70: 6c 50 61 74 68 4e 61 6d 65 50 72 6f 63 29 28 6c  lPathNameProc)(l
1d80: 69 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 20 4d  inkSourcePath, M
1d90: 41 58 5f 50 41 54 48 2c 0a 09 20 20 20 20 74 65  AX_PATH,..    te
1da0: 6d 70 46 69 6c 65 4e 61 6d 65 2c 20 26 74 65 6d  mpFileName, &tem
1db0: 70 46 69 6c 65 50 61 72 74 29 29 20 7b 0a 09 2f  pFilePart)) {../
1dc0: 2a 0a 09 20 2a 20 49 6e 76 61 6c 69 64 20 66 69  *.. * Invalid fi
1dd0: 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69  le... */...TclWi
1de0: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65  nConvertError(Ge
1df0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09  tLastError());..
1e00: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1e10: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
1e20: 43 68 65 63 6b 20 74 68 65 20 74 61 72 67 65 74  Check the target
1e30: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 61  ..     */..    a
1e40: 74 74 72 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72  ttr = (*tclWinPr
1e50: 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72  ocs->getFileAttr
1e60: 69 62 75 74 65 73 50 72 6f 63 29 28 6c 69 6e 6b  ibutesProc)(link
1e70: 54 61 72 67 65 74 50 61 74 68 29 3b 0a 20 20 20  TargetPath);.   
1e80: 20 69 66 20 28 61 74 74 72 20 3d 3d 20 49 4e 56   if (attr == INV
1e90: 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1ea0: 55 54 45 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  UTES) {../*.. * 
1eb0: 54 68 65 20 74 61 72 67 65 74 20 64 6f 65 73 6e  The target doesn
1ec0: 27 74 20 65 78 69 73 74 2e 0a 09 20 2a 2f 0a 0a  't exist... */..
1ed0: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72  .TclWinConvertEr
1ee0: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72  ror(GetLastError
1ef0: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b  ());..return -1;
1f00: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
1f10: 28 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54  ((attr & FILE_AT
1f20: 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
1f30: 59 29 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09  Y) == 0) {../*..
1f40: 20 2a 20 49 74 20 69 73 20 61 20 66 69 6c 65 2e   * It is a file.
1f50: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 74 63 6c 57  .. */...if (tclW
1f60: 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 48  inProcs->createH
1f70: 61 72 64 4c 69 6e 6b 50 72 6f 63 20 3d 3d 20 4e  ardLinkProc == N
1f80: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
1f90: 53 65 74 45 72 72 6e 6f 28 45 4e 4f 54 44 49 52  SetErrno(ENOTDIR
1fa0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d  );..    return -
1fb0: 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 69 6e 6b  1;..}...if (link
1fc0: 41 63 74 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45  Action & TCL_CRE
1fd0: 41 54 45 5f 48 41 52 44 5f 4c 49 4e 4b 29 20 7b  ATE_HARD_LINK) {
1fe0: 0a 09 20 20 20 20 69 66 20 28 21 28 2a 74 63 6c  ..    if (!(*tcl
1ff0: 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65  WinProcs->create
2000: 48 61 72 64 4c 69 6e 6b 50 72 6f 63 29 28 6c 69  HardLinkProc)(li
2010: 6e 6b 53 6f 75 72 63 65 50 61 74 68 2c 0a 09 09  nkSourcePath,...
2020: 20 20 20 20 6c 69 6e 6b 54 61 72 67 65 74 50 61      linkTargetPa
2030: 74 68 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 09 54  th, NULL)) {...T
2040: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  clWinConvertErro
2050: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  r(GetLastError()
2060: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a  );...return -1;.
2070: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75  .    }..    retu
2080: 72 6e 20 30 3b 0a 0a 09 7d 20 65 6c 73 65 20 69  rn 0;...} else i
2090: 66 20 28 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20  f (linkAction & 
20a0: 54 43 4c 5f 43 52 45 41 54 45 5f 53 59 4d 42 4f  TCL_CREATE_SYMBO
20b0: 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 20 20 20  LIC_LINK) {..   
20c0: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 61 6e 27   /*..     * Can'
20d0: 74 20 73 79 6d 6c 69 6e 6b 20 66 69 6c 65 73 2e  t symlink files.
20e0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
20f0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f  Tcl_SetErrno(ENO
2100: 54 44 49 52 29 3b 0a 09 20 20 20 20 72 65 74 75  TDIR);..    retu
2110: 72 6e 20 2d 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  rn -1;..} else {
2120: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
2130: 6e 6f 28 45 4e 4f 44 45 56 29 3b 0a 09 20 20 20  no(ENODEV);..   
2140: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
2150: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a     } else {../*.
2160: 09 20 2a 20 57 65 27 76 65 20 67 6f 74 20 61 20  . * We've got a 
2170: 64 69 72 65 63 74 6f 72 79 2e 20 4e 6f 77 20 63  directory. Now c
2180: 68 65 63 6b 20 77 68 65 74 68 65 72 20 77 68 61  heck whether wha
2190: 74 20 77 65 27 72 65 20 74 72 79 69 6e 67 20 74  t we're trying t
21a0: 6f 20 64 6f 20 69 73 0a 09 20 2a 20 72 65 61 73  o do is.. * reas
21b0: 6f 6e 61 62 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 69  onable... */...i
21c0: 66 20 28 6c 69 6e 6b 41 63 74 69 6f 6e 20 26 20  f (linkAction & 
21d0: 54 43 4c 5f 43 52 45 41 54 45 5f 53 59 4d 42 4f  TCL_CREATE_SYMBO
21e0: 4c 49 43 5f 4c 49 4e 4b 29 20 7b 0a 09 20 20 20  LIC_LINK) {..   
21f0: 20 72 65 74 75 72 6e 20 57 69 6e 53 79 6d 4c 69   return WinSymLi
2200: 6e 6b 44 69 72 65 63 74 6f 72 79 28 6c 69 6e 6b  nkDirectory(link
2210: 53 6f 75 72 63 65 50 61 74 68 2c 20 6c 69 6e 6b  SourcePath, link
2220: 54 61 72 67 65 74 50 61 74 68 29 3b 0a 0a 09 7d  TargetPath);...}
2230: 20 65 6c 73 65 20 69 66 20 28 6c 69 6e 6b 41 63   else if (linkAc
2240: 74 69 6f 6e 20 26 20 54 43 4c 5f 43 52 45 41 54  tion & TCL_CREAT
2250: 45 5f 48 41 52 44 5f 4c 49 4e 4b 29 20 7b 0a 09  E_HARD_LINK) {..
2260: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43      /*..     * C
2270: 61 6e 27 74 20 68 61 72 64 20 6c 69 6e 6b 20 64  an't hard link d
2280: 69 72 65 63 74 6f 72 69 65 73 2e 0a 09 20 20 20  irectories...   
2290: 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 53    */...    Tcl_S
22a0: 65 74 45 72 72 6e 6f 28 45 49 53 44 49 52 29 3b  etErrno(EISDIR);
22b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
22c0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
22d0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f  Tcl_SetErrno(ENO
22e0: 44 45 56 29 3b 0a 09 20 20 20 20 72 65 74 75 72  DEV);..    retur
22f0: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d  n -1;..}.    }.}
2300: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2350: 20 2a 20 57 69 6e 52 65 61 64 4c 69 6e 6b 20 2d   * WinReadLink -
2360: 2d 0a 20 2a 0a 20 2a 09 57 68 61 74 20 64 6f 65  -. *. *.What doe
2370: 73 20 27 4c 69 6e 6b 53 6f 75 72 63 65 27 20 70  s 'LinkSource' p
2380: 6f 69 6e 74 20 74 6f 3f 0a 20 2a 0a 20 2a 2d 2d  oint to?. *. *--
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54  --. */..static T
23e0: 63 6c 5f 4f 62 6a 20 2a 0a 57 69 6e 52 65 61 64  cl_Obj *.WinRead
23f0: 4c 69 6e 6b 28 0a 20 20 20 20 63 6f 6e 73 74 20  Link(.    const 
2400: 54 43 48 41 52 20 2a 6c 69 6e 6b 53 6f 75 72 63  TCHAR *linkSourc
2410: 65 50 61 74 68 29 0a 7b 0a 20 20 20 20 57 43 48  ePath).{.    WCH
2420: 41 52 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65 5b  AR tempFileName[
2430: 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 54  MAX_PATH];.    T
2440: 43 48 41 52 20 2a 74 65 6d 70 46 69 6c 65 50 61  CHAR *tempFilePa
2450: 72 74 3b 0a 20 20 20 20 44 57 4f 52 44 20 61 74  rt;.    DWORD at
2460: 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  tr;..    /*.    
2470: 20 2a 20 47 65 74 20 74 68 65 20 66 75 6c 6c 20   * Get the full 
2480: 70 61 74 68 20 72 65 66 65 72 65 6e 63 65 64 20  path referenced 
2490: 62 79 20 74 68 65 20 74 61 72 67 65 74 2e 0a 20  by the target.. 
24a0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
24b0: 21 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e  !(*tclWinProcs->
24c0: 67 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 50  getFullPathNameP
24d0: 72 6f 63 29 28 6c 69 6e 6b 53 6f 75 72 63 65 50  roc)(linkSourceP
24e0: 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 2c 0a 09  ath, MAX_PATH,..
24f0: 20 20 20 20 74 65 6d 70 46 69 6c 65 4e 61 6d 65      tempFileName
2500: 2c 20 26 74 65 6d 70 46 69 6c 65 50 61 72 74 29  , &tempFilePart)
2510: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 6e 76 61  ) {../*.. * Inva
2520: 6c 69 64 20 66 69 6c 65 2e 0a 09 20 2a 2f 0a 0a  lid file... */..
2530: 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72  .TclWinConvertEr
2540: 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72  ror(GetLastError
2550: 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  ());..return NUL
2560: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
2570: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72  .     * Make sur
2580: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 64 6f  e source file do
2590: 65 73 20 65 78 69 73 74 2e 0a 20 20 20 20 20 2a  es exist..     *
25a0: 2f 0a 0a 20 20 20 20 61 74 74 72 20 3d 20 28 2a  /..    attr = (*
25b0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74  tclWinProcs->get
25c0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 50 72  FileAttributesPr
25d0: 6f 63 29 28 6c 69 6e 6b 53 6f 75 72 63 65 50 61  oc)(linkSourcePa
25e0: 74 68 29 3b 0a 20 20 20 20 69 66 20 28 61 74 74  th);.    if (att
25f0: 72 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  r == INVALID_FIL
2600: 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a  E_ATTRIBUTES) {.
2610: 09 2f 2a 0a 09 20 2a 20 54 68 65 20 73 6f 75 72  ./*.. * The sour
2620: 63 65 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  ce doesn't exist
2630: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43  ... */...TclWinC
2640: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c  onvertError(GetL
2650: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 72 65  astError());..re
2660: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20  turn NULL;..    
2670: 7d 20 65 6c 73 65 20 69 66 20 28 28 61 74 74 72  } else if ((attr
2680: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
2690: 45 5f 44 49 52 45 43 54 4f 52 59 29 20 3d 3d 20  E_DIRECTORY) == 
26a0: 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 74 20  0) {../*.. * It 
26b0: 69 73 20 61 20 66 69 6c 65 20 2d 20 74 68 69 73  is a file - this
26c0: 20 69 73 20 6e 6f 74 20 79 65 74 20 73 75 70 70   is not yet supp
26d0: 6f 72 74 65 64 2e 0a 09 20 2a 2f 0a 0a 09 54 63  orted... */...Tc
26e0: 6c 5f 53 65 74 45 72 72 6e 6f 28 45 4e 4f 54 44  l_SetErrno(ENOTD
26f0: 49 52 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  IR);..return NUL
2700: 4c 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  L;.    } else {.
2710: 09 72 65 74 75 72 6e 20 57 69 6e 52 65 61 64 4c  .return WinReadL
2720: 69 6e 6b 44 69 72 65 63 74 6f 72 79 28 6c 69 6e  inkDirectory(lin
2730: 6b 53 6f 75 72 63 65 50 61 74 68 29 3b 0a 20 20  kSourcePath);.  
2740: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 0a 20 2a 0a 20 2a 20 57 69 6e 53 79 6d 4c 69  -. *. * WinSymLi
27a0: 6e 6b 44 69 72 65 63 74 6f 72 79 20 2d 2d 0a 20  nkDirectory --. 
27b0: 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74 69 6e  *. *.This routin
27c0: 65 20 63 72 65 61 74 65 73 20 61 20 4e 54 46 53  e creates a NTFS
27d0: 20 6a 75 6e 63 74 69 6f 6e 2c 20 75 73 69 6e 67   junction, using
27e0: 20 74 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   the undocumente
27f0: 64 0a 20 2a 09 46 53 43 54 4c 5f 53 45 54 5f 52  d. *.FSCTL_SET_R
2800: 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 73 74 72  EPARSE_POINT str
2810: 75 63 74 75 72 65 20 57 69 6e 32 4b 20 75 73 65  ucture Win2K use
2820: 73 20 66 6f 72 20 6d 6f 75 6e 74 20 70 6f 69 6e  s for mount poin
2830: 74 73 20 61 6e 64 0a 20 2a 09 6a 75 6e 63 74 69  ts and. *.juncti
2840: 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d  ons.. *. *.Assum
2850: 70 74 69 6f 6e 20 74 68 61 74 20 6c 69 6e 6b 54  ption that linkT
2860: 61 72 67 65 74 50 61 74 68 20 69 73 20 61 20 76  argetPath is a v
2870: 61 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 20 64  alid, existing d
2880: 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 20  irectory.. *. * 
2890: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a 65 72 6f  Returns:. *.Zero
28a0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 20 2a 0a   on success.. *.
28b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
2900: 69 63 20 69 6e 74 0a 57 69 6e 53 79 6d 4c 69 6e  ic int.WinSymLin
2910: 6b 44 69 72 65 63 74 6f 72 79 28 0a 20 20 20 20  kDirectory(.    
2920: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e  const TCHAR *lin
2930: 6b 44 69 72 50 61 74 68 2c 0a 20 20 20 20 63 6f  kDirPath,.    co
2940: 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b 54  nst TCHAR *linkT
2950: 61 72 67 65 74 50 61 74 68 29 0a 7b 0a 20 20 20  argetPath).{.   
2960: 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42   DUMMY_REPARSE_B
2970: 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20  UFFER dummy;.   
2980: 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42 55   REPARSE_DATA_BU
2990: 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 75 66  FFER *reparseBuf
29a0: 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f 44  fer = (REPARSE_D
29b0: 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26 64  ATA_BUFFER *) &d
29c0: 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 6c 65  ummy;.    int le
29d0: 6e 3b 0a 20 20 20 20 57 43 48 41 52 20 6e 61 74  n;.    WCHAR nat
29e0: 69 76 65 54 61 72 67 65 74 5b 4d 41 58 5f 50 41  iveTarget[MAX_PA
29f0: 54 48 5d 3b 0a 20 20 20 20 57 43 48 41 52 20 2a  TH];.    WCHAR *
2a00: 6c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  loop;..    /*.  
2a10: 20 20 20 2a 20 4d 61 6b 65 20 74 68 65 20 6e 61     * Make the na
2a20: 74 69 76 65 20 74 61 72 67 65 74 20 6e 61 6d 65  tive target name
2a30: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d  ..     */..    m
2a40: 65 6d 63 70 79 28 6e 61 74 69 76 65 54 61 72 67  emcpy(nativeTarg
2a50: 65 74 2c 20 4c 22 5c 5c 3f 3f 5c 5c 22 2c 20 34  et, L"\\??\\", 4
2a60: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
2a70: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6e 61  );.    memcpy(na
2a80: 74 69 76 65 54 61 72 67 65 74 20 2b 20 34 2c 20  tiveTarget + 4, 
2a90: 6c 69 6e 6b 54 61 72 67 65 74 50 61 74 68 2c 0a  linkTargetPath,.
2aa0: 09 20 20 20 73 69 7a 65 6f 66 28 57 43 48 41 52  .   sizeof(WCHAR
2ab0: 29 20 2a 20 28 31 2b 77 63 73 6c 65 6e 28 28 57  ) * (1+wcslen((W
2ac0: 43 48 41 52 20 2a 29 20 6c 69 6e 6b 54 61 72 67  CHAR *) linkTarg
2ad0: 65 74 50 61 74 68 29 29 29 3b 0a 20 20 20 20 6c  etPath)));.    l
2ae0: 65 6e 20 3d 20 77 63 73 6c 65 6e 28 6e 61 74 69  en = wcslen(nati
2af0: 76 65 54 61 72 67 65 74 29 3b 0a 0a 20 20 20 20  veTarget);..    
2b00: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6d 75 73  /*.     * We mus
2b10: 74 20 68 61 76 65 20 62 61 63 6b 73 6c 61 73 68  t have backslash
2b20: 65 73 20 6f 6e 6c 79 2e 20 54 68 69 73 20 69 73  es only. This is
2b30: 20 56 45 52 59 20 49 4d 50 4f 52 54 41 4e 54 2e   VERY IMPORTANT.
2b40: 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79 0a   If we have any.
2b50: 20 20 20 20 20 2a 20 66 6f 72 77 61 72 64 20 73       * forward s
2b60: 6c 61 73 68 65 73 20 65 76 65 72 79 74 68 69 6e  lashes everythin
2b70: 67 20 61 70 70 65 61 72 73 20 74 6f 20 77 6f 72  g appears to wor
2b80: 6b 2c 20 62 75 74 20 74 68 65 20 72 65 73 75 6c  k, but the resul
2b90: 74 69 6e 67 20 73 79 6d 6c 69 6e 6b 0a 20 20 20  ting symlink.   
2ba0: 20 20 2a 20 69 73 20 75 73 65 6c 65 73 73 21 0a    * is useless!.
2bb0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72       */..    for
2bc0: 20 28 6c 6f 6f 70 20 3d 20 6e 61 74 69 76 65 54   (loop = nativeT
2bd0: 61 72 67 65 74 3b 20 2a 6c 6f 6f 70 20 21 3d 20  arget; *loop != 
2be0: 30 3b 20 6c 6f 6f 70 2b 2b 29 20 7b 0a 09 69 66  0; loop++) {..if
2bf0: 20 28 2a 6c 6f 6f 70 20 3d 3d 20 4c 27 2f 27 29   (*loop == L'/')
2c00: 20 7b 0a 09 20 20 20 20 2a 6c 6f 6f 70 20 3d 20   {..    *loop = 
2c10: 4c 27 5c 5c 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a  L'\\';..}.    }.
2c20: 20 20 20 20 69 66 20 28 28 6e 61 74 69 76 65 54      if ((nativeT
2c30: 61 72 67 65 74 5b 6c 65 6e 2d 31 5d 20 3d 3d 20  arget[len-1] == 
2c40: 4c 27 5c 5c 27 29 20 26 26 20 28 6e 61 74 69 76  L'\\') && (nativ
2c50: 65 54 61 72 67 65 74 5b 6c 65 6e 2d 32 5d 20 21  eTarget[len-2] !
2c60: 3d 20 4c 27 3a 27 29 29 20 7b 0a 09 6e 61 74 69  = L':')) {..nati
2c70: 76 65 54 61 72 67 65 74 5b 6c 65 6e 2d 31 5d 20  veTarget[len-1] 
2c80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2c90: 2f 2a 0a 20 20 20 20 20 2a 20 42 75 69 6c 64 20  /*.     * Build 
2ca0: 74 68 65 20 72 65 70 61 72 73 65 20 69 6e 66 6f  the reparse info
2cb0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d  ..     */..    m
2cc0: 65 6d 73 65 74 28 72 65 70 61 72 73 65 42 75 66  emset(reparseBuf
2cd0: 66 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44  fer, 0, sizeof(D
2ce0: 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46  UMMY_REPARSE_BUF
2cf0: 46 45 52 29 29 3b 0a 20 20 20 20 72 65 70 61 72  FER));.    repar
2d00: 73 65 42 75 66 66 65 72 2d 3e 52 65 70 61 72 73  seBuffer->Repars
2d10: 65 54 61 67 20 3d 20 49 4f 5f 52 45 50 41 52 53  eTag = IO_REPARS
2d20: 45 5f 54 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e  E_TAG_MOUNT_POIN
2d30: 54 3b 0a 20 20 20 20 72 65 70 61 72 73 65 42 75  T;.    reparseBu
2d40: 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74  ffer->MountPoint
2d50: 52 65 70 61 72 73 65 42 75 66 66 65 72 2e 53 75  ReparseBuffer.Su
2d60: 62 73 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67  bstituteNameLeng
2d70: 74 68 20 3d 0a 09 20 20 20 20 77 63 73 6c 65 6e  th =..    wcslen
2d80: 28 6e 61 74 69 76 65 54 61 72 67 65 74 29 20 2a  (nativeTarget) *
2d90: 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a   sizeof(WCHAR);.
2da0: 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65      reparseBuffe
2db0: 72 2d 3e 52 65 73 65 72 76 65 64 20 3d 20 30 3b  r->Reserved = 0;
2dc0: 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66  .    reparseBuff
2dd0: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65  er->MountPointRe
2de0: 70 61 72 73 65 42 75 66 66 65 72 2e 50 72 69 6e  parseBuffer.Prin
2df0: 74 4e 61 6d 65 4c 65 6e 67 74 68 20 3d 20 30 3b  tNameLength = 0;
2e00: 0a 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66  .    reparseBuff
2e10: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65  er->MountPointRe
2e20: 70 61 72 73 65 42 75 66 66 65 72 2e 50 72 69 6e  parseBuffer.Prin
2e30: 74 4e 61 6d 65 4f 66 66 73 65 74 20 3d 0a 09 20  tNameOffset =.. 
2e40: 20 20 20 72 65 70 61 72 73 65 42 75 66 66 65 72     reparseBuffer
2e50: 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61  ->MountPointRepa
2e60: 72 73 65 42 75 66 66 65 72 2e 53 75 62 73 74 69  rseBuffer.Substi
2e70: 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68 0a 09  tuteNameLength..
2e80: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 57 43 48      + sizeof(WCH
2e90: 41 52 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  AR);.    memcpy(
2ea0: 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d  reparseBuffer->M
2eb0: 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65  ountPointReparse
2ec0: 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 65  Buffer.PathBuffe
2ed0: 72 2c 20 6e 61 74 69 76 65 54 61 72 67 65 74 2c  r, nativeTarget,
2ee0: 0a 09 20 20 20 20 73 69 7a 65 6f 66 28 57 43 48  ..    sizeof(WCH
2ef0: 41 52 29 0a 09 20 20 20 20 2b 20 72 65 70 61 72  AR)..    + repar
2f00: 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50  seBuffer->MountP
2f10: 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65  ointReparseBuffe
2f20: 72 2e 53 75 62 73 74 69 74 75 74 65 4e 61 6d 65  r.SubstituteName
2f30: 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 72 65 70  Length);.    rep
2f40: 61 72 73 65 42 75 66 66 65 72 2d 3e 52 65 70 61  arseBuffer->Repa
2f50: 72 73 65 44 61 74 61 4c 65 6e 67 74 68 20 3d 0a  rseDataLength =.
2f60: 09 20 20 20 20 72 65 70 61 72 73 65 42 75 66 66  .    reparseBuff
2f70: 65 72 2d 3e 4d 6f 75 6e 74 50 6f 69 6e 74 52 65  er->MountPointRe
2f80: 70 61 72 73 65 42 75 66 66 65 72 2e 53 75 62 73  parseBuffer.Subs
2f90: 74 69 74 75 74 65 4e 61 6d 65 4c 65 6e 67 74 68  tituteNameLength
2fa0: 2b 31 32 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  +12;..    return
2fb0: 20 4e 61 74 69 76 65 57 72 69 74 65 52 65 70 61   NativeWriteRepa
2fc0: 72 73 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c  rse(linkDirPath,
2fd0: 20 72 65 70 61 72 73 65 42 75 66 66 65 72 29 3b   reparseBuffer);
2fe0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3030: 2a 0a 20 2a 20 54 63 6c 57 69 6e 53 79 6d 4c 69  *. * TclWinSymLi
3040: 6e 6b 43 6f 70 79 44 69 72 65 63 74 6f 72 79 20  nkCopyDirectory 
3050: 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 70 79 20 61 20  --. *. *.Copy a 
3060: 57 69 6e 64 6f 77 73 20 4e 54 46 53 20 6a 75 6e  Windows NTFS jun
3070: 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ction. This func
3080: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
3090: 74 20 4c 69 6e 6b 4f 72 69 67 69 6e 61 6c 0a 20  t LinkOriginal. 
30a0: 2a 09 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  *.exists and is 
30b0: 61 20 76 61 6c 69 64 20 6a 75 6e 63 74 69 6f 6e  a valid junction
30c0: 20 70 6f 69 6e 74 2c 20 61 6e 64 20 74 68 61 74   point, and that
30d0: 20 4c 69 6e 6b 43 6f 70 79 20 64 6f 65 73 20 6e   LinkCopy does n
30e0: 6f 74 0a 20 2a 09 65 78 69 73 74 2e 0a 20 2a 0a  ot. *.exist.. *.
30f0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a   * Returns:. *.Z
3100: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
3110: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69  ---------. */..i
3160: 6e 74 0a 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b  nt.TclWinSymLink
3170: 43 6f 70 79 44 69 72 65 63 74 6f 72 79 28 0a 20  CopyDirectory(. 
3180: 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a     const TCHAR *
3190: 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 09 2f 2a  linkOrigPath,./*
31a0: 20 45 78 69 73 74 69 6e 67 20 6a 75 6e 63 74 69   Existing juncti
31b0: 6f 6e 20 2d 20 72 65 70 61 72 73 65 20 70 6f 69  on - reparse poi
31c0: 6e 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  nt */.    const 
31d0: 54 43 48 41 52 20 2a 6c 69 6e 6b 43 6f 70 79 50  TCHAR *linkCopyP
31e0: 61 74 68 29 09 2f 2a 20 57 69 6c 6c 20 62 65 63  ath)./* Will bec
31f0: 6f 6d 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ome a duplicate 
3200: 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a 7b 0a 20 20  junction */.{.  
3210: 20 20 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f    DUMMY_REPARSE_
3220: 42 55 46 46 45 52 20 64 75 6d 6d 79 3b 0a 20 20  BUFFER dummy;.  
3230: 20 20 52 45 50 41 52 53 45 5f 44 41 54 41 5f 42    REPARSE_DATA_B
3240: 55 46 46 45 52 20 2a 72 65 70 61 72 73 65 42 75  UFFER *reparseBu
3250: 66 66 65 72 20 3d 20 28 52 45 50 41 52 53 45 5f  ffer = (REPARSE_
3260: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 29 20 26  DATA_BUFFER *) &
3270: 64 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 66 20 28  dummy;..    if (
3280: 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 72 73  NativeReadRepars
3290: 65 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c 20  e(linkOrigPath, 
32a0: 72 65 70 61 72 73 65 42 75 66 66 65 72 2c 20 47  reparseBuffer, G
32b0: 45 4e 45 52 49 43 5f 52 45 41 44 29 29 20 7b 0a  ENERIC_READ)) {.
32c0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20  .return -1;.    
32d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74  }.    return Nat
32e0: 69 76 65 57 72 69 74 65 52 65 70 61 72 73 65 28  iveWriteReparse(
32f0: 6c 69 6e 6b 43 6f 70 79 50 61 74 68 2c 20 72 65  linkCopyPath, re
3300: 70 61 72 73 65 42 75 66 66 65 72 29 3b 0a 7d 0a  parseBuffer);.}.
3310: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3360: 2a 20 54 63 6c 57 69 6e 53 79 6d 4c 69 6e 6b 44  * TclWinSymLinkD
3370: 65 6c 65 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44  elete --. *. *.D
3380: 65 6c 65 74 65 20 61 20 57 69 6e 64 6f 77 73 20  elete a Windows 
3390: 4e 54 46 53 20 6a 75 6e 63 74 69 6f 6e 2e 20 4f  NTFS junction. O
33a0: 6e 63 65 20 74 68 65 20 6a 75 6e 63 74 69 6f 6e  nce the junction
33b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 0a   information is.
33c0: 20 2a 09 64 65 6c 65 74 65 64 2c 20 74 68 65 20   *.deleted, the 
33d0: 66 69 6c 65 73 79 73 74 65 6d 20 6f 62 6a 65 63  filesystem objec
33e0: 74 20 62 65 63 6f 6d 65 73 20 61 6e 20 6f 72 64  t becomes an ord
33f0: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  inary directory.
3400: 20 55 6e 6c 65 73 73 0a 20 2a 09 27 6c 69 6e 6b   Unless. *.'link
3410: 4f 6e 6c 79 27 20 69 73 20 67 69 76 65 6e 2c 20  Only' is given, 
3420: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 69  that directory i
3430: 73 20 61 6c 73 6f 20 72 65 6d 6f 76 65 64 2e 0a  s also removed..
3440: 20 2a 0a 20 2a 09 41 73 73 75 6d 70 74 69 6f 6e   *. *.Assumption
3450: 20 74 68 61 74 20 4c 69 6e 6b 4f 72 69 67 69 6e   that LinkOrigin
3460: 61 6c 20 69 73 20 61 20 76 61 6c 69 64 2c 20 65  al is a valid, e
3470: 78 69 73 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e  xisting junction
3480: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a  .. *. * Returns:
3490: 0a 20 2a 09 5a 65 72 6f 20 6f 6e 20 73 75 63 63  . *.Zero on succ
34a0: 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ess.. *. *------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
34f0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 57 69 6e 53 79  */..int.TclWinSy
3500: 6d 4c 69 6e 6b 44 65 6c 65 74 65 28 0a 20 20 20  mLinkDelete(.   
3510: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69   const TCHAR *li
3520: 6e 6b 4f 72 69 67 50 61 74 68 2c 0a 20 20 20 20  nkOrigPath,.    
3530: 69 6e 74 20 6c 69 6e 6b 4f 6e 6c 79 29 0a 7b 0a  int linkOnly).{.
3540: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 74      /*.     * It
3550: 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c   is a symbolic l
3560: 69 6e 6b 20 2d 20 72 65 6d 6f 76 65 20 69 74 2e  ink - remove it.
3570: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 44 55  .     */..    DU
3580: 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55 46 46  MMY_REPARSE_BUFF
3590: 45 52 20 64 75 6d 6d 79 3b 0a 20 20 20 20 52 45  ER dummy;.    RE
35a0: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45  PARSE_DATA_BUFFE
35b0: 52 20 2a 72 65 70 61 72 73 65 42 75 66 66 65 72  R *reparseBuffer
35c0: 20 3d 20 28 52 45 50 41 52 53 45 5f 44 41 54 41   = (REPARSE_DATA
35d0: 5f 42 55 46 46 45 52 20 2a 29 20 26 64 75 6d 6d  _BUFFER *) &dumm
35e0: 79 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 46  y;.    HANDLE hF
35f0: 69 6c 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 72  ile;.    DWORD r
3600: 65 74 75 72 6e 65 64 4c 65 6e 67 74 68 3b 0a 0a  eturnedLength;..
3610: 20 20 20 20 6d 65 6d 73 65 74 28 72 65 70 61 72      memset(repar
3620: 73 65 42 75 66 66 65 72 2c 20 30 2c 20 73 69 7a  seBuffer, 0, siz
3630: 65 6f 66 28 44 55 4d 4d 59 5f 52 45 50 41 52 53  eof(DUMMY_REPARS
3640: 45 5f 42 55 46 46 45 52 29 29 3b 0a 20 20 20 20  E_BUFFER));.    
3650: 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 52  reparseBuffer->R
3660: 65 70 61 72 73 65 54 61 67 20 3d 20 49 4f 5f 52  eparseTag = IO_R
3670: 45 50 41 52 53 45 5f 54 41 47 5f 4d 4f 55 4e 54  EPARSE_TAG_MOUNT
3680: 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 68 46 69 6c  _POINT;.    hFil
3690: 65 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63  e = (*tclWinProc
36a0: 73 2d 3e 63 72 65 61 74 65 46 69 6c 65 50 72 6f  s->createFilePro
36b0: 63 29 28 6c 69 6e 6b 4f 72 69 67 50 61 74 68 2c  c)(linkOrigPath,
36c0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20   GENERIC_WRITE, 
36d0: 30 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 4f 50  0,..    NULL, OP
36e0: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 20 20  EN_EXISTING,..  
36f0: 20 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e    FILE_FLAG_OPEN
3700: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 7c 46  _REPARSE_POINT|F
3710: 49 4c 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f  ILE_FLAG_BACKUP_
3720: 53 45 4d 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29  SEMANTICS, NULL)
3730: 3b 0a 0a 20 20 20 20 69 66 20 28 68 46 69 6c 65  ;..    if (hFile
3740: 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44   != INVALID_HAND
3750: 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09 69 66 20  LE_VALUE) {..if 
3760: 28 21 44 65 76 69 63 65 49 6f 43 6f 6e 74 72 6f  (!DeviceIoContro
3770: 6c 28 68 46 69 6c 65 2c 20 46 53 43 54 4c 5f 44  l(hFile, FSCTL_D
3780: 45 4c 45 54 45 5f 52 45 50 41 52 53 45 5f 50 4f  ELETE_REPARSE_PO
3790: 49 4e 54 2c 20 72 65 70 61 72 73 65 42 75 66 66  INT, reparseBuff
37a0: 65 72 2c 0a 09 09 52 45 50 41 52 53 45 5f 4d 4f  er,...REPARSE_MO
37b0: 55 4e 54 50 4f 49 4e 54 5f 48 45 41 44 45 52 5f  UNTPOINT_HEADER_
37c0: 53 49 5a 45 2c 4e 55 4c 4c 2c 30 2c 26 72 65 74  SIZE,NULL,0,&ret
37d0: 75 72 6e 65 64 4c 65 6e 67 74 68 2c 4e 55 4c 4c  urnedLength,NULL
37e0: 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  )) {..    /*..  
37f0: 20 20 20 2a 20 45 72 72 6f 72 20 73 65 74 74 69     * Error setti
3800: 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e 0a 09 20 20  ng junction...  
3810: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 57     */...    TclW
3820: 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47  inConvertError(G
3830: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
3840: 09 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
3850: 28 68 46 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 65  (hFile);..} else
3860: 20 7b 0a 09 20 20 20 20 43 6c 6f 73 65 48 61 6e   {..    CloseHan
3870: 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 20 20 20  dle(hFile);..   
3880: 20 69 66 20 28 21 6c 69 6e 6b 4f 6e 6c 79 29 20   if (!linkOnly) 
3890: 7b 0a 09 09 28 2a 74 63 6c 57 69 6e 50 72 6f 63  {...(*tclWinProc
38a0: 73 2d 3e 72 65 6d 6f 76 65 44 69 72 65 63 74 6f  s->removeDirecto
38b0: 72 79 50 72 6f 63 29 28 6c 69 6e 6b 4f 72 69 67  ryProc)(linkOrig
38c0: 50 61 74 68 29 3b 0a 09 20 20 20 20 7d 0a 09 20  Path);..    }.. 
38d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a     return 0;..}.
38e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
38f0: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d   -1;.}.../*. *--
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 0a 20 2a 0a 20 2a 20 57 69 6e 52 65 61 64  --. *. * WinRead
3950: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 2d 2d  LinkDirectory --
3960: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74  . *. *.This rout
3970: 69 6e 65 20 72 65 61 64 73 20 61 20 4e 54 46 53  ine reads a NTFS
3980: 20 6a 75 6e 63 74 69 6f 6e 2c 20 75 73 69 6e 67   junction, using
3990: 20 74 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   the undocumente
39a0: 64 0a 20 2a 09 46 53 43 54 4c 5f 47 45 54 5f 52  d. *.FSCTL_GET_R
39b0: 45 50 41 52 53 45 5f 50 4f 49 4e 54 20 73 74 72  EPARSE_POINT str
39c0: 75 63 74 75 72 65 20 57 69 6e 32 4b 20 75 73 65  ucture Win2K use
39d0: 73 20 66 6f 72 20 6d 6f 75 6e 74 20 70 6f 69 6e  s for mount poin
39e0: 74 73 20 61 6e 64 0a 20 2a 09 6a 75 6e 63 74 69  ts and. *.juncti
39f0: 6f 6e 73 2e 0a 20 2a 0a 20 2a 09 41 73 73 75 6d  ons.. *. *.Assum
3a00: 70 74 69 6f 6e 20 74 68 61 74 20 4c 69 6e 6b 44  ption that LinkD
3a10: 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 76 61  irectory is a va
3a20: 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 20 64 69  lid, existing di
3a30: 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 20 52  rectory.. *. * R
3a40: 65 74 75 72 6e 73 3a 0a 20 2a 09 41 20 54 63 6c  eturns:. *.A Tcl
3a50: 5f 4f 62 6a 20 77 69 74 68 20 72 65 66 43 6f 75  _Obj with refCou
3a60: 6e 74 20 6f 66 20 31 20 28 69 2e 65 2e 20 6f 77  nt of 1 (i.e. ow
3a70: 6e 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ned by the calle
3a80: 72 29 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 0a 20  r), or NULL if. 
3a90: 2a 09 61 6e 79 74 68 69 6e 67 20 77 65 6e 74 20  *.anything went 
3aa0: 77 72 6f 6e 67 2e 0a 20 2a 0a 20 2a 09 49 6e 20  wrong.. *. *.In 
3ab0: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 73 68  the future we sh
3ac0: 6f 75 6c 64 20 65 6e 68 61 6e 63 65 20 74 68 69  ould enhance thi
3ad0: 73 20 74 6f 20 72 65 74 75 72 6e 20 61 20 70 61  s to return a pa
3ae0: 74 68 20 6f 62 6a 65 63 74 20 72 61 74 68 65 72  th object rather
3af0: 0a 20 2a 09 74 68 61 6e 20 61 20 73 74 72 69 6e  . *.than a strin
3b00: 67 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  g.. *. *--------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3b50: 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ..static Tcl_Obj
3b60: 20 2a 0a 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69   *.WinReadLinkDi
3b70: 72 65 63 74 6f 72 79 28 0a 20 20 20 20 63 6f 6e  rectory(.    con
3b80: 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b 44 69  st TCHAR *linkDi
3b90: 72 50 61 74 68 29 0a 7b 0a 20 20 20 20 69 6e 74  rPath).{.    int
3ba0: 20 61 74 74 72 2c 20 6c 65 6e 2c 20 6f 66 66 73   attr, len, offs
3bb0: 65 74 3b 0a 20 20 20 20 44 55 4d 4d 59 5f 52 45  et;.    DUMMY_RE
3bc0: 50 41 52 53 45 5f 42 55 46 46 45 52 20 64 75 6d  PARSE_BUFFER dum
3bd0: 6d 79 3b 0a 20 20 20 20 52 45 50 41 52 53 45 5f  my;.    REPARSE_
3be0: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 72 65 70  DATA_BUFFER *rep
3bf0: 61 72 73 65 42 75 66 66 65 72 20 3d 20 28 52 45  arseBuffer = (RE
3c00: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45  PARSE_DATA_BUFFE
3c10: 52 20 2a 29 20 26 64 75 6d 6d 79 3b 0a 20 20 20  R *) &dummy;.   
3c20: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 56 61 6c   Tcl_Obj *retVal
3c30: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
3c40: 67 20 64 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20  g ds;.    const 
3c50: 63 68 61 72 20 2a 63 6f 70 79 3b 0a 0a 20 20 20  char *copy;..   
3c60: 20 61 74 74 72 20 3d 20 28 2a 74 63 6c 57 69 6e   attr = (*tclWin
3c70: 50 72 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 74  Procs->getFileAt
3c80: 74 72 69 62 75 74 65 73 50 72 6f 63 29 28 6c 69  tributesProc)(li
3c90: 6e 6b 44 69 72 50 61 74 68 29 3b 0a 20 20 20 20  nkDirPath);.    
3ca0: 69 66 20 28 21 28 61 74 74 72 20 26 20 46 49 4c  if (!(attr & FIL
3cb0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 50 41  E_ATTRIBUTE_REPA
3cc0: 52 53 45 5f 50 4f 49 4e 54 29 29 20 7b 0a 09 67  RSE_POINT)) {..g
3cd0: 6f 74 6f 20 69 6e 76 61 6c 69 64 45 72 72 6f 72  oto invalidError
3ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
3cf0: 4e 61 74 69 76 65 52 65 61 64 52 65 70 61 72 73  NativeReadRepars
3d00: 65 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c 20 72  e(linkDirPath, r
3d10: 65 70 61 72 73 65 42 75 66 66 65 72 2c 20 30 29  eparseBuffer, 0)
3d20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
3d30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
3d40: 74 63 68 20 28 72 65 70 61 72 73 65 42 75 66 66  tch (reparseBuff
3d50: 65 72 2d 3e 52 65 70 61 72 73 65 54 61 67 29 20  er->ReparseTag) 
3d60: 7b 0a 20 20 20 20 63 61 73 65 20 30 78 38 30 30  {.    case 0x800
3d70: 30 30 30 30 30 7c 49 4f 5f 52 45 50 41 52 53 45  00000|IO_REPARSE
3d80: 5f 54 41 47 5f 53 59 4d 42 4f 4c 49 43 5f 4c 49  _TAG_SYMBOLIC_LI
3d90: 4e 4b 3a 0a 20 20 20 20 63 61 73 65 20 49 4f 5f  NK:.    case IO_
3da0: 52 45 50 41 52 53 45 5f 54 41 47 5f 53 59 4d 42  REPARSE_TAG_SYMB
3db0: 4f 4c 49 43 5f 4c 49 4e 4b 3a 0a 20 20 20 20 63  OLIC_LINK:.    c
3dc0: 61 73 65 20 49 4f 5f 52 45 50 41 52 53 45 5f 54  ase IO_REPARSE_T
3dd0: 41 47 5f 4d 4f 55 4e 54 5f 50 4f 49 4e 54 3a 0a  AG_MOUNT_POINT:.
3de0: 09 2f 2a 0a 09 20 2a 20 43 65 72 74 61 69 6e 20  ./*.. * Certain 
3df0: 6e 61 74 69 76 65 20 70 61 74 68 20 72 65 70 72  native path repr
3e00: 65 73 65 6e 74 61 74 69 6f 6e 73 20 6f 6e 20 57  esentations on W
3e10: 69 6e 64 6f 77 73 20 68 61 76 65 20 61 20 73 70  indows have a sp
3e20: 65 63 69 61 6c 0a 09 20 2a 20 70 72 65 66 69 78  ecial.. * prefix
3e30: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
3e40: 74 20 74 68 65 79 20 61 72 65 20 74 6f 20 62 65  t they are to be
3e50: 20 74 72 65 61 74 65 64 20 73 70 65 63 69 61 6c   treated special
3e60: 6c 79 2e 20 46 6f 72 0a 09 20 2a 20 65 78 61 6d  ly. For.. * exam
3e70: 70 6c 65 20 65 78 74 72 65 6d 65 6c 79 20 6c 6f  ple extremely lo
3e80: 6e 67 20 70 61 74 68 73 2c 20 6f 72 20 73 79 6d  ng paths, or sym
3e90: 6c 69 6e 6b 73 2c 20 6f 72 20 76 6f 6c 75 6d 65  links, or volume
3ea0: 73 20 6d 6f 75 6e 74 65 64 0a 09 20 2a 20 69 6e  s mounted.. * in
3eb0: 73 69 64 65 20 64 69 72 65 63 74 6f 72 69 65 73  side directories
3ec0: 2e 0a 09 20 2a 0a 09 20 2a 20 54 68 65 72 65 20  ... *.. * There 
3ed0: 69 73 20 61 6e 20 61 73 73 75 6d 70 74 69 6f 6e  is an assumption
3ee0: 20 69 6e 20 74 68 69 73 20 63 6f 64 65 20 74 68   in this code th
3ef0: 61 74 20 27 77 69 64 65 27 20 69 6e 74 65 72 66  at 'wide' interf
3f00: 61 63 65 73 20 61 72 65 0a 09 20 2a 20 62 65 69  aces are.. * bei
3f10: 6e 67 20 75 73 65 64 20 28 73 65 65 20 74 63 6c  ng used (see tcl
3f20: 57 69 6e 33 32 44 6c 6c 2e 63 29 2c 20 77 68 69  Win32Dll.c), whi
3f30: 63 68 20 69 73 20 74 72 75 65 20 66 6f 72 20 74  ch is true for t
3f40: 68 65 20 6f 6e 6c 79 20 73 79 73 74 65 6d 73 0a  he only systems.
3f50: 09 20 2a 20 77 68 69 63 68 20 73 75 70 70 6f 72  . * which suppor
3f60: 74 20 72 65 70 61 72 73 65 20 74 61 67 73 20 61  t reparse tags a
3f70: 74 20 70 72 65 73 65 6e 74 2e 20 49 66 20 74 68  t present. If th
3f80: 61 74 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  at changes in th
3f90: 65 0a 09 20 2a 20 66 75 74 75 72 65 2c 20 74 68  e.. * future, th
3fa0: 69 73 20 63 6f 64 65 20 77 69 6c 6c 20 68 61 76  is code will hav
3fb0: 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 6c 69  e to be generali
3fc0: 73 65 64 2e 0a 09 20 2a 2f 0a 0a 09 6f 66 66 73  sed... */...offs
3fd0: 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 70  et = 0;..if (rep
3fe0: 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e  arseBuffer->Moun
3ff0: 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66  tPointReparseBuf
4000: 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 5b 30  fer.PathBuffer[0
4010: 5d 20 3d 3d 20 4c 27 5c 5c 27 29 20 7b 0a 09 20  ] == L'\\') {.. 
4020: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43 68     /*..     * Ch
4030: 65 63 6b 20 77 68 65 74 68 65 72 20 74 68 69 73  eck whether this
4040: 20 69 73 20 61 20 6d 6f 75 6e 74 65 64 20 76 6f   is a mounted vo
4050: 6c 75 6d 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  lume...     */..
4060: 09 20 20 20 20 69 66 20 28 77 63 73 6e 63 6d 70  .    if (wcsncmp
4070: 28 72 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e  (reparseBuffer->
4080: 4d 6f 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73  MountPointRepars
4090: 65 42 75 66 66 65 72 2e 50 61 74 68 42 75 66 66  eBuffer.PathBuff
40a0: 65 72 2c 0a 09 09 20 20 20 20 4c 22 5c 5c 3f 3f  er,...    L"\\??
40b0: 5c 5c 56 6f 6c 75 6d 65 7b 22 2c 31 31 29 20 3d  \\Volume{",11) =
40c0: 3d 20 30 29 20 7b 0a 09 09 63 68 61 72 20 64 72  = 0) {...char dr
40d0: 69 76 65 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20  ive;..../*... * 
40e0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 20 63 6f  There is some co
40f0: 6e 66 75 73 69 6f 6e 20 62 65 74 77 65 65 6e 20  nfusion between 
4100: 5c 3f 3f 5c 20 61 6e 64 20 5c 5c 3f 5c 20 77 68  \??\ and \\?\ wh
4110: 69 63 68 20 77 65 20 68 61 76 65 0a 09 09 20 2a  ich we have... *
4120: 20 74 6f 20 66 69 78 20 68 65 72 65 2e 20 49 74   to fix here. It
4130: 20 64 6f 65 73 6e 27 74 20 73 65 65 6d 20 76 65   doesn't seem ve
4140: 72 79 20 77 65 6c 6c 20 64 6f 63 75 6d 65 6e 74  ry well document
4150: 65 64 2e 0a 09 09 20 2a 2f 0a 0a 09 09 72 65 70  ed.... */....rep
4160: 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e  arseBuffer->Moun
4170: 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66  tPointReparseBuf
4180: 66 65 72 2e 50 61 74 68 42 75 66 66 65 72 5b 31  fer.PathBuffer[1
4190: 5d 3d 4c 27 5c 5c 27 3b 0a 0a 09 09 2f 2a 0a 09  ]=L'\\';..../*..
41a0: 09 20 2a 20 43 68 65 63 6b 20 69 66 20 61 20 63  . * Check if a c
41b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 72 69  orresponding dri
41c0: 76 65 20 6c 65 74 74 65 72 20 65 78 69 73 74 73  ve letter exists
41d0: 2c 20 61 6e 64 20 75 73 65 20 74 68 61 74 0a 09  , and use that..
41e0: 09 20 2a 20 69 66 20 69 74 20 69 73 20 66 6f 75  . * if it is fou
41f0: 6e 64 0a 09 09 20 2a 2f 0a 0a 09 09 64 72 69 76  nd... */....driv
4200: 65 20 3d 20 54 63 6c 57 69 6e 44 72 69 76 65 4c  e = TclWinDriveL
4210: 65 74 74 65 72 46 6f 72 56 6f 6c 4d 6f 75 6e 74  etterForVolMount
4220: 50 6f 69 6e 74 28 0a 09 09 09 72 65 70 61 72 73  Point(....repars
4230: 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f  eBuffer->MountPo
4240: 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72  intReparseBuffer
4250: 2e 50 61 74 68 42 75 66 66 65 72 29 3b 0a 09 09  .PathBuffer);...
4260: 69 66 20 28 64 72 69 76 65 20 21 3d 20 2d 31 29  if (drive != -1)
4270: 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20 64 72   {...    char dr
4280: 69 76 65 53 70 65 63 5b 33 5d 20 3d 20 7b 0a 09  iveSpec[3] = {..
4290: 09 09 27 5c 30 27 2c 20 27 3a 27 2c 20 27 5c 30  ..'\0', ':', '\0
42a0: 27 0a 09 09 20 20 20 20 7d 3b 0a 0a 09 09 20 20  '...    };....  
42b0: 20 20 64 72 69 76 65 53 70 65 63 5b 30 5d 20 3d    driveSpec[0] =
42c0: 20 64 72 69 76 65 3b 0a 09 09 20 20 20 20 72 65   drive;...    re
42d0: 74 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  tVal = Tcl_NewSt
42e0: 72 69 6e 67 4f 62 6a 28 64 72 69 76 65 53 70 65  ringObj(driveSpe
42f0: 63 2c 32 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f  c,2);...    Tcl_
4300: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 72 65 74  IncrRefCount(ret
4310: 56 61 6c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  Val);...    retu
4320: 72 6e 20 72 65 74 56 61 6c 3b 0a 09 09 7d 0a 0a  rn retVal;...}..
4330: 09 09 2f 2a 0a 09 09 20 2a 20 54 68 69 73 20 69  ../*... * This i
4340: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 6d 6f 75  s actually a mou
4350: 6e 74 65 64 20 64 72 69 76 65 2c 20 77 68 69 63  nted drive, whic
4360: 68 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 73  h doesn't exists
4370: 20 61 73 20 61 0a 09 09 20 2a 20 44 4f 53 20 64   as a... * DOS d
4380: 72 69 76 65 20 6c 65 74 74 65 72 2e 20 54 68 69  rive letter. Thi
4390: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 74 68  s means the path
43a0: 20 69 73 6e 27 74 20 61 63 74 75 61 6c 6c 79 20   isn't actually 
43b0: 61 0a 09 09 20 2a 20 6c 69 6e 6b 2c 20 61 6c 74  a... * link, alt
43c0: 68 6f 75 67 68 20 77 65 20 70 61 72 74 69 61 6c  hough we partial
43d0: 6c 79 20 74 72 65 61 74 20 69 74 20 6c 69 6b 65  ly treat it like
43e0: 20 6f 6e 65 20 28 27 66 69 6c 65 20 74 79 70 65   one ('file type
43f0: 27 0a 09 09 20 2a 20 77 69 6c 6c 20 72 65 74 75  '... * will retu
4400: 72 6e 20 27 6c 69 6e 6b 27 29 2c 20 62 75 74 20  rn 'link'), but 
4410: 74 68 65 6e 20 74 68 65 20 6c 69 6e 6b 20 77 69  then the link wi
4420: 6c 6c 20 61 63 74 75 61 6c 6c 79 20 6a 75 73 74  ll actually just
4430: 0a 09 09 20 2a 20 62 65 20 74 72 65 61 74 65 64  ... * be treated
4440: 20 6c 69 6b 65 20 61 6e 20 6f 72 64 69 6e 61 72   like an ordinar
4450: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 49 20 64  y directory. I d
4460: 6f 6e 27 74 20 62 65 6c 69 65 76 65 20 61 6e 79  on't believe any
4470: 0a 09 09 20 2a 20 73 65 72 69 6f 75 73 20 69 6e  ... * serious in
4480: 63 6f 6e 73 69 73 74 65 6e 63 79 20 77 69 6c 6c  consistency will
4490: 20 61 72 69 73 65 20 66 72 6f 6d 20 74 68 69 73   arise from this
44a0: 2c 20 62 75 74 20 69 74 20 69 73 0a 09 09 20 2a  , but it is... *
44b0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 6f 20 62 65   something to be
44c0: 20 61 77 61 72 65 20 6f 66 2e 0a 09 09 20 2a 2f   aware of.... */
44d0: 0a 0a 09 09 67 6f 74 6f 20 69 6e 76 61 6c 69 64  ....goto invalid
44e0: 45 72 72 6f 72 3b 0a 09 20 20 20 20 7d 20 65 6c  Error;..    } el
44f0: 73 65 20 69 66 20 28 77 63 73 6e 63 6d 70 28 72  se if (wcsncmp(r
4500: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f  eparseBuffer->Mo
4510: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42  untPointReparseB
4520: 75 66 66 65 72 0a 09 09 20 20 20 20 2e 50 61 74  uffer...    .Pat
4530: 68 42 75 66 66 65 72 2c 20 4c 22 5c 5c 5c 5c 3f  hBuffer, L"\\\\?
4540: 5c 5c 22 2c 34 29 20 3d 3d 20 30 29 20 7b 0a 09  \\",4) == 0) {..
4550: 09 2f 2a 0a 09 09 20 2a 20 53 74 72 69 70 20 6f  ./*... * Strip o
4560: 66 66 20 74 68 65 20 70 72 65 66 69 78 2e 0a 09  ff the prefix...
4570: 09 20 2a 2f 0a 0a 09 09 6f 66 66 73 65 74 20 3d  . */....offset =
4580: 20 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20   4;..    } else 
4590: 69 66 20 28 77 63 73 6e 63 6d 70 28 72 65 70 61  if (wcsncmp(repa
45a0: 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74  rseBuffer->Mount
45b0: 50 6f 69 6e 74 52 65 70 61 72 73 65 42 75 66 66  PointReparseBuff
45c0: 65 72 0a 09 09 20 20 20 20 2e 50 61 74 68 42 75  er...    .PathBu
45d0: 66 66 65 72 2c 20 4c 22 5c 5c 3f 3f 5c 5c 22 2c  ffer, L"\\??\\",
45e0: 34 29 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 0a  4) == 0) {.../*.
45f0: 09 09 20 2a 20 53 74 72 69 70 20 6f 66 66 20 74  .. * Strip off t
4600: 68 65 20 70 72 65 66 69 78 2e 0a 09 09 20 2a 2f  he prefix.... */
4610: 0a 0a 09 09 6f 66 66 73 65 74 20 3d 20 34 3b 0a  ....offset = 4;.
4620: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 54 63 6c 5f  .    }..}...Tcl_
4630: 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28 63  WinTCharToUtf((c
4640: 6f 6e 73 74 20 63 68 61 72 20 2a 29 0a 09 09 72  onst char *)...r
4650: 65 70 61 72 73 65 42 75 66 66 65 72 2d 3e 4d 6f  eparseBuffer->Mo
4660: 75 6e 74 50 6f 69 6e 74 52 65 70 61 72 73 65 42  untPointReparseB
4670: 75 66 66 65 72 2e 50 61 74 68 42 75 66 66 65 72  uffer.PathBuffer
4680: 2c 0a 09 09 28 69 6e 74 29 20 72 65 70 61 72 73  ,...(int) repars
4690: 65 42 75 66 66 65 72 2d 3e 4d 6f 75 6e 74 50 6f  eBuffer->MountPo
46a0: 69 6e 74 52 65 70 61 72 73 65 42 75 66 66 65 72  intReparseBuffer
46b0: 0a 09 09 2e 53 75 62 73 74 69 74 75 74 65 4e 61  ....SubstituteNa
46c0: 6d 65 4c 65 6e 67 74 68 2c 20 26 64 73 29 3b 0a  meLength, &ds);.
46d0: 0a 09 63 6f 70 79 20 3d 20 54 63 6c 5f 44 53 74  ..copy = Tcl_DSt
46e0: 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29 2b 6f  ringValue(&ds)+o
46f0: 66 66 73 65 74 3b 0a 09 6c 65 6e 20 3d 20 54 63  ffset;..len = Tc
4700: 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
4710: 26 64 73 29 2d 6f 66 66 73 65 74 3b 0a 09 72 65  &ds)-offset;..re
4720: 74 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  tVal = Tcl_NewSt
4730: 72 69 6e 67 4f 62 6a 28 63 6f 70 79 2c 6c 65 6e  ringObj(copy,len
4740: 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43  );..Tcl_IncrRefC
4750: 6f 75 6e 74 28 72 65 74 56 61 6c 29 3b 0a 09 54  ount(retVal);..T
4760: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
4770: 64 73 29 3b 0a 09 72 65 74 75 72 6e 20 72 65 74  ds);..return ret
4780: 56 61 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 69 6e  Val;.    }..  in
4790: 76 61 6c 69 64 45 72 72 6f 72 3a 0a 20 20 20 20  validError:.    
47a0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e  Tcl_SetErrno(EIN
47b0: 56 41 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  VAL);.    return
47c0: 20 4e 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a   NULL;.}.../*. *
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76  ----. *. * Nativ
4820: 65 52 65 61 64 52 65 70 61 72 73 65 20 2d 2d 0a  eReadReparse --.
4830: 20 2a 0a 20 2a 09 52 65 61 64 20 74 68 65 20 6a   *. *.Read the j
4840: 75 6e 63 74 69 6f 6e 2f 72 65 70 61 72 73 65 20  unction/reparse 
4850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
4860: 20 61 20 67 69 76 65 6e 20 4e 54 46 53 20 64 69   a given NTFS di
4870: 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 09 41  rectory.. *. *.A
4880: 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 6c  ssumption that l
4890: 69 6e 6b 44 69 72 50 61 74 68 20 69 73 20 61 20  inkDirPath is a 
48a0: 76 61 6c 69 64 2c 20 65 78 69 73 74 69 6e 67 20  valid, existing 
48b0: 64 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a  directory.. *. *
48c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 5a 65 72   Returns:. *.Zer
48d0: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 20 2a  o on success.. *
48e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
4930: 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 52 65  tic int.NativeRe
4940: 61 64 52 65 70 61 72 73 65 28 0a 20 20 20 20 63  adReparse(.    c
4950: 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e 6b  onst TCHAR *link
4960: 44 69 72 50 61 74 68 2c 09 2f 2a 20 54 68 65 20  DirPath,./* The 
4970: 6a 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 61 64  junction to read
4980: 20 2a 2f 0a 20 20 20 20 52 45 50 41 52 53 45 5f   */.    REPARSE_
4990: 44 41 54 41 5f 42 55 46 46 45 52 20 2a 62 75 66  DATA_BUFFER *buf
49a0: 66 65 72 2c 2f 2a 20 50 6f 69 6e 74 65 72 20 74  fer,/* Pointer t
49b0: 6f 20 62 75 66 66 65 72 2e 20 43 61 6e 6e 6f 74  o buffer. Cannot
49c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   be NULL */.    
49d0: 44 57 4f 52 44 20 64 65 73 69 72 65 64 41 63 63  DWORD desiredAcc
49e0: 65 73 73 29 0a 7b 0a 20 20 20 20 48 41 4e 44 4c  ess).{.    HANDL
49f0: 45 20 68 46 69 6c 65 3b 0a 20 20 20 20 44 57 4f  E hFile;.    DWO
4a00: 52 44 20 72 65 74 75 72 6e 65 64 4c 65 6e 67 74  RD returnedLengt
4a10: 68 3b 0a 0a 20 20 20 20 68 46 69 6c 65 20 3d 20  h;..    hFile = 
4a20: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 63  (*tclWinProcs->c
4a30: 72 65 61 74 65 46 69 6c 65 50 72 6f 63 29 28 6c  reateFileProc)(l
4a40: 69 6e 6b 44 69 72 50 61 74 68 2c 20 64 65 73 69  inkDirPath, desi
4a50: 72 65 64 41 63 63 65 73 73 2c 20 46 49 4c 45 5f  redAccess, FILE_
4a60: 53 48 41 52 45 5f 52 45 41 44 2c 0a 09 20 20 20  SHARE_READ,..   
4a70: 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49 53   NULL, OPEN_EXIS
4a80: 54 49 4e 47 2c 0a 09 20 20 20 20 46 49 4c 45 5f  TING,..    FILE_
4a90: 46 4c 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53  FLAG_OPEN_REPARS
4aa0: 45 5f 50 4f 49 4e 54 7c 46 49 4c 45 5f 46 4c 41  E_POINT|FILE_FLA
4ab0: 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 49  G_BACKUP_SEMANTI
4ac0: 43 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  CS, NULL);..    
4ad0: 69 66 20 28 68 46 69 6c 65 20 3d 3d 20 49 4e 56  if (hFile == INV
4ae0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
4af0: 45 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72  E) {../*.. * Err
4b00: 6f 72 20 63 72 65 61 74 69 6e 67 20 64 69 72 65  or creating dire
4b10: 63 74 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 54 63  ctory... */...Tc
4b20: 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72  lWinConvertError
4b30: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
4b40: 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  ;..return -1;.  
4b50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
4b60: 20 2a 20 47 65 74 20 74 68 65 20 6c 69 6e 6b 2e   * Get the link.
4b70: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
4b80: 20 28 21 44 65 76 69 63 65 49 6f 43 6f 6e 74 72   (!DeviceIoContr
4b90: 6f 6c 28 68 46 69 6c 65 2c 20 46 53 43 54 4c 5f  ol(hFile, FSCTL_
4ba0: 47 45 54 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e  GET_REPARSE_POIN
4bb0: 54 2c 20 4e 55 4c 4c 2c 20 30 2c 20 62 75 66 66  T, NULL, 0, buff
4bc0: 65 72 2c 0a 09 20 20 20 20 73 69 7a 65 6f 66 28  er,..    sizeof(
4bd0: 44 55 4d 4d 59 5f 52 45 50 41 52 53 45 5f 42 55  DUMMY_REPARSE_BU
4be0: 46 46 45 52 29 2c 20 26 72 65 74 75 72 6e 65 64  FFER), &returned
4bf0: 4c 65 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20 7b  Length, NULL)) {
4c00: 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20 73  ../*.. * Error s
4c10: 65 74 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e 2e  etting junction.
4c20: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f  .. */...TclWinCo
4c30: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61  nvertError(GetLa
4c40: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c 6f  stError());..Clo
4c50: 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b  seHandle(hFile);
4c60: 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ..return -1;.   
4c70: 20 7d 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64   }.    CloseHand
4c80: 6c 65 28 68 46 69 6c 65 29 3b 0a 0a 20 20 20 20  le(hFile);..    
4c90: 69 66 20 28 21 49 73 52 65 70 61 72 73 65 54 61  if (!IsReparseTa
4ca0: 67 56 61 6c 69 64 28 62 75 66 66 65 72 2d 3e 52  gValid(buffer->R
4cb0: 65 70 61 72 73 65 54 61 67 29 29 20 7b 0a 09 54  eparseTag)) {..T
4cc0: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56  cl_SetErrno(EINV
4cd0: 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b  AL);..return -1;
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4cf0: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  n 0;.}.../*. *--
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69 76 65 57  --. *. * NativeW
4d50: 72 69 74 65 52 65 70 61 72 73 65 20 2d 2d 0a 20  riteReparse --. 
4d60: 2a 0a 20 2a 09 57 72 69 74 65 20 74 68 65 20 72  *. *.Write the r
4d70: 65 70 61 72 73 65 20 69 6e 66 6f 72 6d 61 74 69  eparse informati
4d80: 6f 6e 20 66 6f 72 20 61 20 67 69 76 65 6e 20 64  on for a given d
4d90: 69 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 09  irectory.. *. *.
4da0: 41 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20  Assumption that 
4db0: 4c 69 6e 6b 44 69 72 65 63 74 6f 72 79 20 64 6f  LinkDirectory do
4dc0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 2a  es not exist.. *
4dd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
4e20: 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 57 72  tic int.NativeWr
4e30: 69 74 65 52 65 70 61 72 73 65 28 0a 20 20 20 20  iteReparse(.    
4e40: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6c 69 6e  const TCHAR *lin
4e50: 6b 44 69 72 50 61 74 68 2c 0a 20 20 20 20 52 45  kDirPath,.    RE
4e60: 50 41 52 53 45 5f 44 41 54 41 5f 42 55 46 46 45  PARSE_DATA_BUFFE
4e70: 52 20 2a 62 75 66 66 65 72 29 0a 7b 0a 20 20 20  R *buffer).{.   
4e80: 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 20   HANDLE hFile;. 
4e90: 20 20 20 44 57 4f 52 44 20 72 65 74 75 72 6e 65     DWORD returne
4ea0: 64 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 2f 2a  dLength;..    /*
4eb0: 0a 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 74  .     * Create t
4ec0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2d 20 69  he directory - i
4ed0: 74 20 6d 75 73 74 20 6e 6f 74 20 61 6c 72 65 61  t must not alrea
4ee0: 64 79 20 65 78 69 73 74 2e 0a 20 20 20 20 20 2a  dy exist..     *
4ef0: 2f 0a 0a 20 20 20 20 69 66 20 28 28 2a 74 63 6c  /..    if ((*tcl
4f00: 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65  WinProcs->create
4f10: 44 69 72 65 63 74 6f 72 79 50 72 6f 63 29 28 6c  DirectoryProc)(l
4f20: 69 6e 6b 44 69 72 50 61 74 68 2c 20 4e 55 4c 4c  inkDirPath, NULL
4f30: 29 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a 09 20  ) == 0) {../*.. 
4f40: 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e 67  * Error creating
4f50: 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a 2f   directory... */
4f60: 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74  ...TclWinConvert
4f70: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72  Error(GetLastErr
4f80: 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20 2d  or());..return -
4f90: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 46 69  1;.    }.    hFi
4fa0: 6c 65 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f  le = (*tclWinPro
4fb0: 63 73 2d 3e 63 72 65 61 74 65 46 69 6c 65 50 72  cs->createFilePr
4fc0: 6f 63 29 28 6c 69 6e 6b 44 69 72 50 61 74 68 2c  oc)(linkDirPath,
4fd0: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20   GENERIC_WRITE, 
4fe0: 30 2c 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 4f 50  0,..    NULL, OP
4ff0: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 09 20 20  EN_EXISTING,..  
5000: 20 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50 45 4e    FILE_FLAG_OPEN
5010: 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 7c 46  _REPARSE_POINT|F
5020: 49 4c 45 5f 46 4c 41 47 5f 42 41 43 4b 55 50 5f  ILE_FLAG_BACKUP_
5030: 53 45 4d 41 4e 54 49 43 53 2c 20 4e 55 4c 4c 29  SEMANTICS, NULL)
5040: 3b 0a 20 20 20 20 69 66 20 28 68 46 69 6c 65 20  ;.    if (hFile 
5050: 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  == INVALID_HANDL
5060: 45 5f 56 41 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09  E_VALUE) {../*..
5070: 20 2a 20 45 72 72 6f 72 20 63 72 65 61 74 69 6e   * Error creatin
5080: 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 09 20 2a  g directory... *
5090: 2f 0a 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72  /...TclWinConver
50a0: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72  tError(GetLastEr
50b0: 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20  ror());..return 
50c0: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
50d0: 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 74 68 65  *.     * Set the
50e0: 20 6c 69 6e 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a   link..     */..
50f0: 20 20 20 20 69 66 20 28 21 44 65 76 69 63 65 49      if (!DeviceI
5100: 6f 43 6f 6e 74 72 6f 6c 28 68 46 69 6c 65 2c 20  oControl(hFile, 
5110: 46 53 43 54 4c 5f 53 45 54 5f 52 45 50 41 52 53  FSCTL_SET_REPARS
5120: 45 5f 50 4f 49 4e 54 2c 20 62 75 66 66 65 72 2c  E_POINT, buffer,
5130: 0a 09 20 20 20 20 28 44 57 4f 52 44 29 20 62 75  ..    (DWORD) bu
5140: 66 66 65 72 2d 3e 52 65 70 61 72 73 65 44 61 74  ffer->ReparseDat
5150: 61 4c 65 6e 67 74 68 20 2b 20 52 45 50 41 52 53  aLength + REPARS
5160: 45 5f 4d 4f 55 4e 54 50 4f 49 4e 54 5f 48 45 41  E_MOUNTPOINT_HEA
5170: 44 45 52 5f 53 49 5a 45 2c 0a 09 20 20 20 20 4e  DER_SIZE,..    N
5180: 55 4c 4c 2c 20 30 2c 20 26 72 65 74 75 72 6e 65  ULL, 0, &returne
5190: 64 4c 65 6e 67 74 68 2c 20 4e 55 4c 4c 29 29 20  dLength, NULL)) 
51a0: 7b 0a 09 2f 2a 0a 09 20 2a 20 45 72 72 6f 72 20  {../*.. * Error 
51b0: 73 65 74 74 69 6e 67 20 6a 75 6e 63 74 69 6f 6e  setting junction
51c0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 57 69 6e 43  ... */...TclWinC
51d0: 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c  onvertError(GetL
51e0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 43 6c  astError());..Cl
51f0: 6f 73 65 48 61 6e 64 6c 65 28 68 46 69 6c 65 29  oseHandle(hFile)
5200: 3b 0a 09 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73  ;..(*tclWinProcs
5210: 2d 3e 72 65 6d 6f 76 65 44 69 72 65 63 74 6f 72  ->removeDirector
5220: 79 50 72 6f 63 29 28 6c 69 6e 6b 44 69 72 50 61  yProc)(linkDirPa
5230: 74 68 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b  th);..return -1;
5240: 0a 20 20 20 20 7d 0a 20 20 20 20 43 6c 6f 73 65  .    }.    Close
5250: 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 0a  Handle(hFile);..
5260: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
5270: 20 73 75 63 63 65 65 64 65 64 2e 0a 20 20 20 20   succeeded..    
5280: 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20   */..    return 
5290: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0;.}.../*. *----
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
52f0: 6c 70 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  lpFindExecutable
5300: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
5310: 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75 74 65 73  unction computes
5320: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 70 61   the absolute pa
5330: 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  th name of the c
5340: 75 72 72 65 6e 74 0a 20 2a 09 61 70 70 6c 69 63  urrent. *.applic
5350: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ation.. *. * Res
5360: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
5370: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5380: 73 3a 0a 20 2a 09 54 68 65 20 63 6f 6d 70 75 74  s:. *.The comput
5390: 65 64 20 70 61 74 68 20 69 73 20 73 74 6f 72 65  ed path is store
53a0: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63  ---. */..void.Tc
5400: 6c 70 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  lpFindExecutable
5410: 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
5420: 20 2a 61 72 67 76 30 29 09 09 2f 2a 20 54 68 65   *argv0)../* The
5430: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 70   value of the ap
5440: 70 6c 69 63 61 74 69 6f 6e 27 73 20 61 72 67 76  plication's argv
5450: 5b 30 5d 0a 09 09 09 09 20 2a 20 28 6e 61 74 69  [0]..... * (nati
5460: 76 65 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 57 43  ve). */.{.    WC
5470: 48 41 52 20 77 4e 61 6d 65 5b 4d 41 58 5f 50 41  HAR wName[MAX_PA
5480: 54 48 5d 3b 0a 20 20 20 20 63 68 61 72 20 6e 61  TH];.    char na
5490: 6d 65 5b 4d 41 58 5f 50 41 54 48 20 2a 20 54 43  me[MAX_PATH * TC
54a0: 4c 5f 55 54 46 5f 4d 41 58 5d 3b 0a 0a 20 20 20  L_UTF_MAX];..   
54b0: 20 2f 2a 0a 20 20 20 20 20 2a 20 55 6e 64 65 72   /*.     * Under
54c0: 20 57 69 6e 64 6f 77 73 20 77 65 20 69 67 6e 6f   Windows we igno
54d0: 72 65 20 61 72 67 76 30 2c 20 61 6e 64 20 72 65  re argv0, and re
54e0: 74 75 72 6e 20 74 68 65 20 70 61 74 68 20 66 6f  turn the path fo
54f0: 72 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20  r the file used 
5500: 74 6f 0a 20 20 20 20 20 2a 20 63 72 65 61 74 65  to.     * create
5510: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
5520: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
5530: 47 65 74 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d  GetModuleFileNam
5540: 65 57 28 4e 55 4c 4c 2c 20 77 4e 61 6d 65 2c 20  eW(NULL, wName, 
5550: 4d 41 58 5f 50 41 54 48 29 20 3d 3d 20 30 29 20  MAX_PATH) == 0) 
5560: 7b 0a 09 47 65 74 4d 6f 64 75 6c 65 46 69 6c 65  {..GetModuleFile
5570: 4e 61 6d 65 41 28 4e 55 4c 4c 2c 20 6e 61 6d 65  NameA(NULL, name
5580: 2c 20 73 69 7a 65 6f 66 28 6e 61 6d 65 29 29 3b  , sizeof(name));
5590: 0a 0a 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72  .../*.. * Conver
55a0: 74 20 74 6f 20 57 43 48 41 52 20 74 6f 20 67 65  t to WCHAR to ge
55b0: 74 20 6f 75 74 20 6f 66 20 41 4e 53 49 20 63 6f  t out of ANSI co
55c0: 64 65 70 61 67 65 0a 09 20 2a 2f 0a 0a 09 4d 75  depage.. */...Mu
55d0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
55e0: 72 28 43 50 5f 41 43 50 2c 20 30 2c 20 6e 61 6d  r(CP_ACP, 0, nam
55f0: 65 2c 20 2d 31 2c 20 77 4e 61 6d 65 2c 20 4d 41  e, -1, wName, MA
5600: 58 5f 50 41 54 48 29 3b 0a 20 20 20 20 7d 0a 0a  X_PATH);.    }..
5610: 20 20 20 20 57 69 64 65 43 68 61 72 54 6f 4d 75      WideCharToMu
5620: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
5630: 20 30 2c 20 77 4e 61 6d 65 2c 20 2d 31 2c 20 6e   0, wName, -1, n
5640: 61 6d 65 2c 20 73 69 7a 65 6f 66 28 6e 61 6d 65  ame, sizeof(name
5650: 29 2c 20 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20  ), NULL,NULL);. 
5660: 20 20 20 54 63 6c 57 69 6e 4e 6f 42 61 63 6b 73     TclWinNoBacks
5670: 6c 61 73 68 28 6e 61 6d 65 29 3b 0a 20 20 20 20  lash(name);.    
5680: 54 63 6c 53 65 74 4f 62 6a 4e 61 6d 65 4f 66 45  TclSetObjNameOfE
5690: 78 65 63 75 74 61 62 6c 65 28 54 63 6c 5f 4e 65  xecutable(Tcl_Ne
56a0: 77 53 74 72 69 6e 67 4f 62 6a 28 6e 61 6d 65 2c  wStringObj(name,
56b0: 20 2d 31 29 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0c   -1), NULL);.}..
56c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5710: 20 2a 20 54 63 6c 70 4d 61 74 63 68 49 6e 44 69   * TclpMatchInDi
5720: 72 65 63 74 6f 72 79 20 2d 2d 0a 20 2a 0a 20 2a  rectory --. *. *
5730: 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73  .This routine is
5740: 20 75 73 65 64 20 62 79 20 74 68 65 20 67 6c 6f   used by the glo
5750: 62 62 69 6e 67 20 63 6f 64 65 20 74 6f 20 73 65  bbing code to se
5760: 61 72 63 68 20 61 20 64 69 72 65 63 74 6f 72 79  arch a directory
5770: 20 66 6f 72 0a 20 2a 09 61 6c 6c 20 66 69 6c 65   for. *.all file
5780: 73 20 77 68 69 63 68 20 6d 61 74 63 68 20 61 20  s which match a 
5790: 67 69 76 65 6e 20 70 61 74 74 65 72 6e 2e 0a 20  given pattern.. 
57a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
57b0: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75  .The return valu
57c0: 65 20 69 73 20 61 20 73 74 61 6e 64 61 72 64 20  e is a standard 
57d0: 54 63 6c 20 72 65 73 75 6c 74 20 69 6e 64 69 63  Tcl result indic
57e0: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 61 6e  ating whether an
57f0: 20 65 72 72 6f 72 0a 20 2a 09 6f 63 63 75 72 72   error. *.occurr
5800: 65 64 20 69 6e 20 67 6c 6f 62 62 69 6e 67 2e 20  ed in globbing. 
5810: 45 72 72 6f 72 73 20 61 72 65 20 6c 65 66 74 20  Errors are left 
5820: 69 6e 20 69 6e 74 65 72 70 2c 20 67 6f 6f 64 20  in interp, good 
5830: 72 65 73 75 6c 74 73 20 61 72 65 0a 20 2a 09 6c  results are. *.l
5840: 61 70 70 65 6e 64 65 64 20 74 6f 20 72 65 73 75  appended to resu
5850: 6c 74 50 74 72 20 28 77 68 69 63 68 20 6d 75 73  ltPtr (which mus
5860: 74 20 62 65 20 61 20 76 61 6c 69 64 20 6f 62 6a  t be a valid obj
5870: 65 63 74 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ect).. *. * Side
5880: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
5890: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
58e0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4d 61 74 63  */..int.TclpMatc
58f0: 68 49 6e 44 69 72 65 63 74 6f 72 79 28 0a 20 20  hInDirectory(.  
5900: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
5910: 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70  terp,../* Interp
5920: 72 65 74 65 72 20 74 6f 20 72 65 63 65 69 76 65  reter to receive
5930: 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 20 20 20   errors. */.    
5940: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 50  Tcl_Obj *resultP
5950: 74 72 2c 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a  tr,../* List obj
5960: 65 63 74 20 74 6f 20 6c 61 70 70 65 6e 64 20 72  ect to lappend r
5970: 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 54  esults. */.    T
5980: 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c  cl_Obj *pathPtr,
5990: 09 09 2f 2a 20 43 6f 6e 74 61 69 6e 73 20 70 61  ../* Contains pa
59a0: 74 68 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  th to directory 
59b0: 74 6f 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20  to search. */.  
59c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
59d0: 74 74 65 72 6e 2c 09 2f 2a 20 50 61 74 74 65 72  ttern,./* Patter
59e0: 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  n to match again
59f0: 73 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 47  st. */.    Tcl_G
5a00: 6c 6f 62 54 79 70 65 44 61 74 61 20 2a 74 79 70  lobTypeData *typ
5a10: 65 73 29 09 2f 2a 20 4f 62 6a 65 63 74 20 63 6f  es)./* Object co
5a20: 6e 74 61 69 6e 69 6e 67 20 6c 69 73 74 20 6f 66  ntaining list of
5a30: 20 61 63 63 65 70 74 61 62 6c 65 20 74 79 70 65   acceptable type
5a40: 73 2e 0a 09 09 09 09 20 2a 20 4d 61 79 20 62 65  s...... * May be
5a50: 20 4e 55 4c 4c 2e 20 49 6e 20 70 61 72 74 69 63   NULL. In partic
5a60: 75 6c 61 72 20 74 68 65 20 64 69 72 65 63 74 6f  ular the directo
5a70: 72 79 0a 09 09 09 09 20 2a 20 66 6c 61 67 20 69  ry..... * flag i
5a80: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
5a90: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63 6f 6e 73 74  . */.{.    const
5aa0: 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 3b 0a   TCHAR *native;.
5ab0: 0a 20 20 20 20 69 66 20 28 74 79 70 65 73 20 21  .    if (types !
5ac0: 3d 20 4e 55 4c 4c 20 26 26 20 74 79 70 65 73 2d  = NULL && types-
5ad0: 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 47 4c 4f  >type == TCL_GLO
5ae0: 42 5f 54 59 50 45 5f 4d 4f 55 4e 54 29 20 7b 0a  B_TYPE_MOUNT) {.
5af0: 09 2f 2a 0a 09 20 2a 20 54 68 65 20 6e 61 74 69  ./*.. * The nati
5b00: 76 65 20 66 69 6c 65 73 79 73 74 65 6d 20 6e 65  ve filesystem ne
5b10: 76 65 72 20 61 64 64 73 20 6d 6f 75 6e 74 73 2e  ver adds mounts.
5b20: 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20 54  .. */...return T
5b30: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  CL_OK;.    }..  
5b40: 20 20 69 66 20 28 70 61 74 74 65 72 6e 20 3d 3d    if (pattern ==
5b50: 20 4e 55 4c 4c 20 7c 7c 20 28 2a 70 61 74 74 65   NULL || (*patte
5b60: 72 6e 20 3d 3d 20 27 5c 30 27 29 29 20 7b 0a 09  rn == '\0')) {..
5b70: 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 20 3d 20  Tcl_Obj *norm = 
5b80: 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69  Tcl_FSGetNormali
5b90: 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61  zedPath(NULL, pa
5ba0: 74 68 50 74 72 29 3b 0a 09 69 66 20 28 6e 6f 72  thPtr);..if (nor
5bb0: 6d 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  m != NULL) {..  
5bc0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 61 74    /*..     * Mat
5bd0: 63 68 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65  ch a single file
5be0: 20 64 69 72 65 63 74 6c 79 2e 0a 09 20 20 20 20   directly...    
5bf0: 20 2a 2f 0a 0a 09 20 20 20 20 69 6e 74 20 6c 65   */...    int le
5c00: 6e 3b 0a 09 20 20 20 20 44 57 4f 52 44 20 61 74  n;..    DWORD at
5c10: 74 72 3b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63  tr;..    const c
5c20: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47  har *str = Tcl_G
5c30: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5c40: 6e 6f 72 6d 2c 26 6c 65 6e 29 3b 0a 0a 09 20 20  norm,&len);...  
5c50: 20 20 6e 61 74 69 76 65 20 3d 20 28 63 6f 6e 73    native = (cons
5c60: 74 20 54 43 48 41 52 20 2a 29 20 54 63 6c 5f 46  t TCHAR *) Tcl_F
5c70: 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 70  SGetNativePath(p
5c80: 61 74 68 50 74 72 29 3b 0a 0a 09 20 20 20 20 69  athPtr);...    i
5c90: 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e  f (tclWinProcs->
5ca0: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  getFileAttribute
5cb0: 73 45 78 50 72 6f 63 20 3d 3d 20 4e 55 4c 4c 29  sExProc == NULL)
5cc0: 20 7b 0a 09 09 61 74 74 72 20 3d 20 28 2a 74 63   {...attr = (*tc
5cd0: 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 46 69  lWinProcs->getFi
5ce0: 6c 65 41 74 74 72 69 62 75 74 65 73 50 72 6f 63  leAttributesProc
5cf0: 29 28 6e 61 74 69 76 65 29 3b 0a 09 09 69 66 20  )(native);...if 
5d00: 28 61 74 74 72 20 3d 3d 20 30 78 66 66 66 66 66  (attr == 0xfffff
5d10: 66 66 66 29 20 7b 0a 09 09 20 20 20 20 72 65 74  fff) {...    ret
5d20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 09 7d 0a  urn TCL_OK;...}.
5d30: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
5d40: 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
5d50: 42 55 54 45 5f 44 41 54 41 20 64 61 74 61 3b 0a  BUTE_DATA data;.
5d60: 09 09 69 66 20 28 28 2a 74 63 6c 57 69 6e 50 72  ..if ((*tclWinPr
5d70: 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72  ocs->getFileAttr
5d80: 69 62 75 74 65 73 45 78 50 72 6f 63 29 28 6e 61  ibutesExProc)(na
5d90: 74 69 76 65 2c 0a 09 09 09 47 65 74 46 69 6c 65  tive,....GetFile
5da0: 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20  ExInfoStandard, 
5db0: 26 64 61 74 61 29 20 21 3d 20 54 52 55 45 29 20  &data) != TRUE) 
5dc0: 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  {...    return T
5dd0: 43 4c 5f 4f 4b 3b 0a 09 09 7d 0a 09 09 61 74 74  CL_OK;...}...att
5de0: 72 20 3d 20 64 61 74 61 2e 64 77 46 69 6c 65 41  r = data.dwFileA
5df0: 74 74 72 69 62 75 74 65 73 3b 0a 09 20 20 20 20  ttributes;..    
5e00: 7d 0a 0a 09 20 20 20 20 69 66 20 28 4e 61 74 69  }...    if (Nati
5e10: 76 65 4d 61 74 63 68 54 79 70 65 28 57 69 6e 49  veMatchType(WinI
5e20: 73 44 72 69 76 65 28 73 74 72 2c 6c 65 6e 29 2c  sDrive(str,len),
5e30: 20 61 74 74 72 2c 20 6e 61 74 69 76 65 2c 20 74   attr, native, t
5e40: 79 70 65 73 29 29 20 7b 0a 09 09 54 63 6c 5f 4c  ypes)) {...Tcl_L
5e50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5e60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ent(interp, resu
5e70: 6c 74 50 74 72 2c 20 70 61 74 68 50 74 72 29 3b  ltPtr, pathPtr);
5e80: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75  ..    }..}..retu
5e90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
5ea0: 20 65 6c 73 65 20 7b 0a 09 44 57 4f 52 44 20 61   else {..DWORD a
5eb0: 74 74 72 3b 0a 09 48 41 4e 44 4c 45 20 68 61 6e  ttr;..HANDLE han
5ec0: 64 6c 65 3b 0a 09 57 49 4e 33 32 5f 46 49 4e 44  dle;..WIN32_FIND
5ed0: 5f 44 41 54 41 54 20 64 61 74 61 3b 0a 09 63 6f  _DATAT data;..co
5ee0: 6e 73 74 20 63 68 61 72 20 2a 64 69 72 4e 61 6d  nst char *dirNam
5ef0: 65 3b 09 2f 2a 20 55 54 46 2d 38 20 64 69 72 20  e;./* UTF-8 dir 
5f00: 6e 61 6d 65 2c 20 6c 61 74 65 72 20 77 69 74 68  name, later with
5f10: 20 70 61 74 74 65 72 6e 0a 09 09 09 09 20 2a 20   pattern..... * 
5f20: 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 09 69 6e  appended. */..in
5f30: 74 20 64 69 72 4c 65 6e 67 74 68 3b 0a 09 69 6e  t dirLength;..in
5f40: 74 20 6d 61 74 63 68 53 70 65 63 69 61 6c 44 6f  t matchSpecialDo
5f50: 74 73 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ts;..Tcl_DString
5f60: 20 64 73 3b 09 09 2f 2a 20 4e 61 74 69 76 65 20   ds;../* Native 
5f70: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 64 69 72 2c  encoding of dir,
5f80: 20 61 6c 73 6f 20 75 73 65 64 0a 09 09 09 09 20   also used..... 
5f90: 2a 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 66 6f  * temporarily fo
5fa0: 72 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2e 20  r other things. 
5fb0: 2a 2f 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20  */..Tcl_DString 
5fc0: 64 73 4f 72 69 67 3b 09 2f 2a 20 55 54 46 2d 38  dsOrig;./* UTF-8
5fd0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 64 69 72   encoding of dir
5fe0: 2e 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 66  . */..Tcl_Obj *f
5ff0: 69 6c 65 4e 61 6d 65 50 74 72 3b 0a 09 63 68 61  ileNamePtr;..cha
6000: 72 20 6c 61 73 74 43 68 61 72 3b 0a 0a 09 2f 2a  r lastChar;.../*
6010: 0a 09 20 2a 20 47 65 74 20 74 68 65 20 6e 6f 72  .. * Get the nor
6020: 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 72 65 70  malized path rep
6030: 72 65 73 65 6e 74 61 74 69 6f 6e 20 28 74 68 65  resentation (the
6040: 20 6d 61 69 6e 20 74 68 69 6e 67 20 69 73 20 77   main thing is w
6050: 65 20 64 6f 6e 74 0a 09 20 2a 20 77 61 6e 74 20  e dont.. * want 
6060: 61 6e 79 20 27 7e 27 20 73 65 71 75 65 6e 63 65  any '~' sequence
6070: 73 29 2e 0a 09 20 2a 2f 0a 0a 09 66 69 6c 65 4e  s)... */...fileN
6080: 61 6d 65 50 74 72 20 3d 20 54 63 6c 5f 46 53 47  amePtr = Tcl_FSG
6090: 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50 61 74 68  etNormalizedPath
60a0: 28 69 6e 74 65 72 70 2c 20 70 61 74 68 50 74 72  (interp, pathPtr
60b0: 29 3b 0a 09 69 66 20 28 66 69 6c 65 4e 61 6d 65  );..if (fileName
60c0: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr == NULL) {..
60d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
60e0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  RROR;..}.../*.. 
60f0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
6100: 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
6110: 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 61   exists and is a
6120: 63 74 75 61 6c 6c 79 20 61 20 64 69 72 65 63 74  ctually a direct
6130: 6f 72 79 2e 0a 09 20 2a 2f 0a 0a 09 6e 61 74 69  ory... */...nati
6140: 76 65 20 3d 20 54 63 6c 5f 46 53 47 65 74 4e 61  ve = Tcl_FSGetNa
6150: 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72  tivePath(pathPtr
6160: 29 3b 0a 09 69 66 20 28 6e 61 74 69 76 65 20 3d  );..if (native =
6170: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72  = NULL) {..    r
6180: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d  eturn TCL_OK;..}
6190: 0a 09 61 74 74 72 20 3d 20 28 2a 74 63 6c 57 69  ..attr = (*tclWi
61a0: 6e 50 72 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41  nProcs->getFileA
61b0: 74 74 72 69 62 75 74 65 73 50 72 6f 63 29 28 6e  ttributesProc)(n
61c0: 61 74 69 76 65 29 3b 0a 0a 09 69 66 20 28 28 61  ative);...if ((a
61d0: 74 74 72 20 3d 3d 20 30 78 66 66 66 66 66 66 66  ttr == 0xfffffff
61e0: 66 29 20 7c 7c 20 28 28 61 74 74 72 20 26 20 46  f) || ((attr & F
61f0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
6200: 52 45 43 54 4f 52 59 29 20 3d 3d 20 30 29 29 20  RECTORY) == 0)) 
6210: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
6220: 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  L_OK;..}.../*.. 
6230: 2a 20 42 75 69 6c 64 20 75 70 20 74 68 65 20 64  * Build up the d
6240: 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 66 6f  irectory name fo
6250: 72 20 73 65 61 72 63 68 69 6e 67 2c 20 69 6e 63  r searching, inc
6260: 6c 75 64 69 6e 67 20 61 20 74 72 61 69 6c 69 6e  luding a trailin
6270: 67 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79 20  g.. * directory 
6280: 73 65 70 61 72 61 74 6f 72 2e 0a 09 20 2a 2f 0a  separator... */.
6290: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  ..Tcl_DStringIni
62a0: 74 28 26 64 73 4f 72 69 67 29 3b 0a 09 64 69 72  t(&dsOrig);..dir
62b0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
62c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 66 69 6c 65  ringFromObj(file
62d0: 4e 61 6d 65 50 74 72 2c 20 26 64 69 72 4c 65 6e  NamePtr, &dirLen
62e0: 67 74 68 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  gth);..Tcl_DStri
62f0: 6e 67 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67  ngAppend(&dsOrig
6300: 2c 20 64 69 72 4e 61 6d 65 2c 20 64 69 72 4c 65  , dirName, dirLe
6310: 6e 67 74 68 29 3b 0a 0a 09 6c 61 73 74 43 68 61  ngth);...lastCha
6320: 72 20 3d 20 64 69 72 4e 61 6d 65 5b 64 69 72 4c  r = dirName[dirL
6330: 65 6e 67 74 68 20 2d 31 5d 3b 0a 09 69 66 20 28  ength -1];..if (
6340: 28 6c 61 73 74 43 68 61 72 20 21 3d 20 27 5c 5c  (lastChar != '\\
6350: 27 29 20 26 26 20 28 6c 61 73 74 43 68 61 72 20  ') && (lastChar 
6360: 21 3d 20 27 2f 27 29 20 26 26 20 28 6c 61 73 74  != '/') && (last
6370: 43 68 61 72 20 21 3d 20 27 3a 27 29 29 20 7b 0a  Char != ':')) {.
6380: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
6390: 41 70 70 65 6e 64 28 26 64 73 4f 72 69 67 2c 20  Append(&dsOrig, 
63a0: 22 2f 22 2c 20 31 29 3b 0a 09 20 20 20 20 64 69  "/", 1);..    di
63b0: 72 4c 65 6e 67 74 68 2b 2b 3b 0a 09 7d 0a 09 64  rLength++;..}..d
63c0: 69 72 4e 61 6d 65 20 3d 20 54 63 6c 5f 44 53 74  irName = Tcl_DSt
63d0: 72 69 6e 67 56 61 6c 75 65 28 26 64 73 4f 72 69  ringValue(&dsOri
63e0: 67 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20  g);.../*.. * We 
63f0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c  need to check al
6400: 6c 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64  l files in the d
6410: 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 77 65 20  irectory, so we 
6420: 61 70 70 65 6e 64 20 27 2a 2e 2a 27 20 74 6f 0a  append '*.*' to.
6430: 09 20 2a 20 74 68 65 20 70 61 74 68 2c 20 75 6e  . * the path, un
6440: 6c 65 73 73 20 74 68 65 20 70 61 74 74 65 72 6e  less the pattern
6450: 20 77 65 27 76 65 20 62 65 65 6e 20 67 69 76 65   we've been give
6460: 6e 20 69 73 20 72 61 74 68 65 72 20 73 69 6d 70  n is rather simp
6470: 6c 65 2c 0a 09 20 2a 20 77 68 65 6e 20 77 65 20  le,.. * when we 
6480: 63 61 6e 20 75 73 65 20 74 68 61 74 20 69 6e 73  can use that ins
6490: 74 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  tead... */...if 
64a0: 28 73 74 72 70 62 72 6b 28 70 61 74 74 65 72 6e  (strpbrk(pattern
64b0: 2c 20 22 5b 5d 5c 5c 22 29 20 3d 3d 20 4e 55 4c  , "[]\\") == NUL
64c0: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  L) {..    /*..  
64d0: 20 20 20 2a 20 54 68 65 20 70 61 74 74 65 72 6e     * The pattern
64e0: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6f 6e 65   is a simple one
64f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6a 75 73 74   containing just
6500: 20 27 2a 27 20 61 6e 64 2f 6f 72 20 27 3f 27 2e   '*' and/or '?'.
6510: 0a 09 20 20 20 20 20 2a 20 54 68 69 73 20 6d 65  ..     * This me
6520: 61 6e 73 20 77 65 20 63 61 6e 20 67 65 74 20 74  ans we can get t
6530: 68 65 20 4f 53 20 74 6f 20 68 65 6c 70 20 75 73  he OS to help us
6540: 2c 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 20  , by passing it 
6550: 74 68 65 0a 09 20 20 20 20 20 2a 20 70 61 74 74  the..     * patt
6560: 65 72 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  ern...     */...
6570: 20 20 20 20 64 69 72 4e 61 6d 65 20 3d 20 54 63      dirName = Tc
6580: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
6590: 26 64 73 4f 72 69 67 2c 20 70 61 74 74 65 72 6e  &dsOrig, pattern
65a0: 2c 20 2d 31 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  , -1);..} else {
65b0: 0a 09 20 20 20 20 64 69 72 4e 61 6d 65 20 3d 20  ..    dirName = 
65c0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
65d0: 64 28 26 64 73 4f 72 69 67 2c 20 22 2a 2e 2a 22  d(&dsOrig, "*.*"
65e0: 2c 20 33 29 3b 0a 09 7d 0a 0a 09 6e 61 74 69 76  , 3);..}...nativ
65f0: 65 20 3d 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f  e = Tcl_WinUtfTo
6600: 54 43 68 61 72 28 64 69 72 4e 61 6d 65 2c 20 2d  TChar(dirName, -
6610: 31 2c 20 26 64 73 29 3b 0a 09 69 66 20 28 74 63  1, &ds);..if (tc
6620: 6c 57 69 6e 50 72 6f 63 73 2d 3e 66 69 6e 64 46  lWinProcs->findF
6630: 69 72 73 74 46 69 6c 65 45 78 50 72 6f 63 20 3d  irstFileExProc =
6640: 3d 20 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65 73  = NULL || (types
6650: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 7c 7c 20 28   == NULL)...|| (
6660: 74 79 70 65 73 2d 3e 74 79 70 65 20 21 3d 20 54  types->type != T
6670: 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 44 49 52  CL_GLOB_TYPE_DIR
6680: 29 29 20 7b 0a 09 20 20 20 20 68 61 6e 64 6c 65  )) {..    handle
6690: 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73   = (*tclWinProcs
66a0: 2d 3e 66 69 6e 64 46 69 72 73 74 46 69 6c 65 50  ->findFirstFileP
66b0: 72 6f 63 29 28 6e 61 74 69 76 65 2c 20 26 64 61  roc)(native, &da
66c0: 74 61 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ta);..} else {..
66d0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57      /*..     * W
66e0: 65 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66  e can be more ef
66f0: 66 69 63 69 65 6e 74 2c 20 66 6f 72 20 70 75 72  ficient, for pur
6700: 65 20 64 69 72 65 63 74 6f 72 79 20 72 65 71 75  e directory requ
6710: 65 73 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  ests...     */..
6720: 09 20 20 20 20 68 61 6e 64 6c 65 20 3d 20 28 2a  .    handle = (*
6730: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 66 69 6e  tclWinProcs->fin
6740: 64 46 69 72 73 74 46 69 6c 65 45 78 50 72 6f 63  dFirstFileExProc
6750: 29 28 6e 61 74 69 76 65 2c 0a 09 09 20 20 20 20  )(native,...    
6760: 46 69 6e 64 45 78 49 6e 66 6f 53 74 61 6e 64 61  FindExInfoStanda
6770: 72 64 2c 20 26 64 61 74 61 2c 0a 09 09 20 20 20  rd, &data,...   
6780: 20 46 69 6e 64 45 78 53 65 61 72 63 68 4c 69 6d   FindExSearchLim
6790: 69 74 54 6f 44 69 72 65 63 74 6f 72 69 65 73 2c  itToDirectories,
67a0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 09 7d 0a 0a 09   NULL, 0);..}...
67b0: 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e  if (handle == IN
67c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
67d0: 55 45 29 20 7b 0a 09 20 20 20 20 44 57 4f 52 44  UE) {..    DWORD
67e0: 20 65 72 72 20 3d 20 47 65 74 4c 61 73 74 45 72   err = GetLastEr
67f0: 72 6f 72 28 29 3b 0a 09 20 20 20 20 54 63 6c 5f  ror();..    Tcl_
6800: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
6810: 3b 0a 09 20 20 20 20 69 66 20 28 65 72 72 20 3d  ;..    if (err =
6820: 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  = ERROR_FILE_NOT
6830: 5f 46 4f 55 4e 44 29 20 7b 0a 09 09 2f 2a 0a 09  _FOUND) {.../*..
6840: 09 20 2a 20 57 65 20 75 73 65 64 20 6f 75 72 20  . * We used our 
6850: 27 70 61 74 74 65 72 6e 27 20 61 62 6f 76 65 2c  'pattern' above,
6860: 20 61 6e 64 20 6d 61 74 63 68 65 64 20 6e 6f 74   and matched not
6870: 68 69 6e 67 2e 20 54 68 69 73 0a 09 09 20 2a 20  hing. This... * 
6880: 6d 65 61 6e 73 20 77 65 20 6a 75 73 74 20 72 65  means we just re
6890: 74 75 72 6e 20 54 43 4c 5f 4f 4b 2c 20 69 6e 64  turn TCL_OK, ind
68a0: 69 63 61 74 69 6e 67 20 6e 6f 20 72 65 73 75 6c  icating no resul
68b0: 74 73 20 66 6f 75 6e 64 2e 0a 09 09 20 2a 2f 0a  ts found.... */.
68c0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
68d0: 65 65 28 26 64 73 4f 72 69 67 29 3b 0a 09 09 72  ee(&dsOrig);...r
68e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 20  eturn TCL_OK;.. 
68f0: 20 20 20 7d 0a 0a 09 20 20 20 20 54 63 6c 57 69     }...    TclWi
6900: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 65 72  nConvertError(er
6910: 72 29 3b 0a 09 20 20 20 20 69 66 20 28 69 6e 74  r);..    if (int
6920: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  erp != NULL) {..
6930: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
6940: 28 69 6e 74 65 72 70 29 3b 0a 09 09 54 63 6c 5f  (interp);...Tcl_
6950: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6960: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 72  erp, "couldn't r
6970: 65 61 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22  ead directory \"
6980: 22 2c 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e  ",....Tcl_DStrin
6990: 67 56 61 6c 75 65 28 26 64 73 4f 72 69 67 29 2c  gValue(&dsOrig),
69a0: 20 22 5c 22 3a 20 22 2c 0a 09 09 09 54 63 6c 5f   "\": ",....Tcl_
69b0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
69c0: 70 29 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  p), NULL);..    
69d0: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
69e0: 6e 67 46 72 65 65 28 26 64 73 4f 72 69 67 29 3b  ngFree(&dsOrig);
69f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
6a00: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 54 63 6c 5f  _ERROR;..}..Tcl_
6a10: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
6a20: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6d 61  ;.../*.. * We ma
6a30: 79 20 75 73 65 20 74 68 69 73 20 6c 61 74 65 72  y use this later
6a40: 2c 20 73 6f 20 77 65 20 6d 75 73 74 20 72 65 73  , so we must res
6a50: 74 6f 72 65 20 69 74 20 74 6f 20 69 74 73 20 6c  tore it to its l
6a60: 65 6e 67 74 68 0a 09 20 2a 20 69 6e 63 6c 75 64  ength.. * includ
6a70: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
6a80: 79 20 64 65 6c 69 6d 69 74 65 72 2e 0a 09 20 2a  y delimiter... *
6a90: 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 53  /...Tcl_DStringS
6aa0: 65 74 4c 65 6e 67 74 68 28 26 64 73 4f 72 69 67  etLength(&dsOrig
6ab0: 2c 20 64 69 72 4c 65 6e 67 74 68 29 3b 0a 0a 09  , dirLength);...
6ac0: 2f 2a 0a 09 20 2a 20 43 68 65 63 6b 20 74 6f 20  /*.. * Check to 
6ad0: 73 65 65 20 69 66 20 74 68 65 20 70 61 74 74 65  see if the patte
6ae0: 72 6e 20 73 68 6f 75 6c 64 20 6d 61 74 63 68 20  rn should match 
6af0: 74 68 65 20 73 70 65 63 69 61 6c 20 2e 20 61 6e  the special . an
6b00: 64 0a 09 20 2a 20 2e 2e 20 6e 61 6d 65 73 2c 20  d.. * .. names, 
6b10: 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 65  referring to the
6b20: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f   current directo
6b30: 72 79 2c 20 6f 72 20 74 68 65 20 64 69 72 65 63  ry, or the direc
6b40: 74 6f 72 79 0a 09 20 2a 20 61 62 6f 76 65 2e 20  tory.. * above. 
6b50: 57 65 20 6e 65 65 64 20 61 20 73 70 65 63 69 61  We need a specia
6b60: 6c 20 63 68 65 63 6b 20 66 6f 72 20 74 68 69 73  l check for this
6b70: 20 62 65 63 61 75 73 65 20 70 61 74 68 73 20 62   because paths b
6b80: 65 67 69 6e 6e 69 6e 67 0a 09 20 2a 20 77 69 74  eginning.. * wit
6b90: 68 20 61 20 64 6f 74 20 61 72 65 20 6e 6f 74 20  h a dot are not 
6ba0: 63 6f 6e 73 69 64 65 72 65 64 20 68 69 64 64 65  considered hidde
6bb0: 6e 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6e  n on Windows, an
6bc0: 64 20 73 6f 20 6f 74 68 65 72 77 69 73 65 20 61  d so otherwise a
6bd0: 0a 09 20 2a 20 72 65 6c 61 74 69 76 65 20 67 6c  .. * relative gl
6be0: 6f 62 20 6c 69 6b 65 20 27 67 6c 6f 62 20 2d 6a  ob like 'glob -j
6bf0: 6f 69 6e 20 2a 20 2a 27 20 77 69 6c 6c 20 61 63  oin * *' will ac
6c00: 74 75 61 6c 6c 79 20 72 65 74 75 72 6e 0a 09 20  tually return.. 
6c10: 2a 20 27 2e 2f 2e 20 2e 2e 2f 2e 2e 27 20 65 74  * './. ../..' et
6c20: 63 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 70  c... */...if ((p
6c30: 61 74 74 65 72 6e 5b 30 5d 20 3d 3d 20 27 2e 27  attern[0] == '.'
6c40: 29 0a 09 09 7c 7c 20 28 28 70 61 74 74 65 72 6e  )...|| ((pattern
6c50: 5b 30 5d 20 3d 3d 20 27 5c 5c 27 29 20 26 26 20  [0] == '\\') && 
6c60: 28 70 61 74 74 65 72 6e 5b 31 5d 20 3d 3d 20 27  (pattern[1] == '
6c70: 2e 27 29 29 29 20 7b 0a 09 20 20 20 20 6d 61 74  .'))) {..    mat
6c80: 63 68 53 70 65 63 69 61 6c 44 6f 74 73 20 3d 20  chSpecialDots = 
6c90: 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  1;..} else {..  
6ca0: 20 20 6d 61 74 63 68 53 70 65 63 69 61 6c 44 6f    matchSpecialDo
6cb0: 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a  ts = 0;..}.../*.
6cc0: 09 20 2a 20 4e 6f 77 20 69 74 65 72 61 74 65 20  . * Now iterate 
6cd0: 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
6ce0: 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64 69 72  files in the dir
6cf0: 65 63 74 6f 72 79 2c 20 73 74 61 72 74 69 6e 67  ectory, starting
6d00: 20 77 69 74 68 0a 09 20 2a 20 74 68 65 20 66 69   with.. * the fi
6d10: 72 73 74 20 6f 6e 65 20 77 65 20 66 6f 75 6e 64  rst one we found
6d20: 2e 0a 09 20 2a 2f 0a 0a 09 64 6f 20 7b 0a 09 20  ... */...do {.. 
6d30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75     const char *u
6d40: 74 66 6e 61 6d 65 3b 0a 09 20 20 20 20 69 6e 74  tfname;..    int
6d50: 20 63 68 65 63 6b 44 72 69 76 65 20 3d 20 30 2c   checkDrive = 0,
6d60: 20 69 73 44 72 69 76 65 3b 0a 09 20 20 20 20 44   isDrive;..    D
6d70: 57 4f 52 44 20 61 74 74 72 3b 0a 0a 09 20 20 20  WORD attr;...   
6d80: 20 69 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73   if (tclWinProcs
6d90: 2d 3e 75 73 65 57 69 64 65 29 20 7b 0a 09 09 6e  ->useWide) {...n
6da0: 61 74 69 76 65 20 3d 20 28 63 6f 6e 73 74 20 54  ative = (const T
6db0: 43 48 41 52 20 2a 29 20 64 61 74 61 2e 77 2e 63  CHAR *) data.w.c
6dc0: 46 69 6c 65 4e 61 6d 65 3b 0a 09 09 61 74 74 72  FileName;...attr
6dd0: 20 3d 20 64 61 74 61 2e 77 2e 64 77 46 69 6c 65   = data.w.dwFile
6de0: 41 74 74 72 69 62 75 74 65 73 3b 0a 09 20 20 20  Attributes;..   
6df0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 61 74 69   } else {...nati
6e00: 76 65 20 3d 20 28 63 6f 6e 73 74 20 54 43 48 41  ve = (const TCHA
6e10: 52 20 2a 29 20 64 61 74 61 2e 61 2e 63 46 69 6c  R *) data.a.cFil
6e20: 65 4e 61 6d 65 3b 0a 09 09 61 74 74 72 20 3d 20  eName;...attr = 
6e30: 64 61 74 61 2e 61 2e 64 77 46 69 6c 65 41 74 74  data.a.dwFileAtt
6e40: 72 69 62 75 74 65 73 3b 0a 09 20 20 20 20 7d 0a  ributes;..    }.
6e50: 0a 09 20 20 20 20 75 74 66 6e 61 6d 65 20 3d 20  ..    utfname = 
6e60: 54 63 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74  Tcl_WinTCharToUt
6e70: 66 28 6e 61 74 69 76 65 2c 20 2d 31 2c 20 26 64  f(native, -1, &d
6e80: 73 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 6d  s);...    if (!m
6e90: 61 74 63 68 53 70 65 63 69 61 6c 44 6f 74 73 29  atchSpecialDots)
6ea0: 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20   {.../*... * If 
6eb0: 69 74 20 69 73 20 65 78 61 63 74 6c 79 20 27 2e  it is exactly '.
6ec0: 27 20 6f 72 20 27 2e 2e 27 20 74 68 65 6e 20 77  ' or '..' then w
6ed0: 65 20 69 67 6e 6f 72 65 20 69 74 2e 0a 09 09 20  e ignore it.... 
6ee0: 2a 2f 0a 0a 09 09 69 66 20 28 28 75 74 66 6e 61  */....if ((utfna
6ef0: 6d 65 5b 30 5d 20 3d 3d 20 27 2e 27 29 20 26 26  me[0] == '.') &&
6f00: 20 28 75 74 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20   (utfname[1] == 
6f10: 27 5c 30 27 0a 09 09 09 7c 7c 20 28 75 74 66 6e  '\0'....|| (utfn
6f20: 61 6d 65 5b 31 5d 20 3d 3d 20 27 2e 27 20 26 26  ame[1] == '.' &&
6f30: 20 75 74 66 6e 61 6d 65 5b 32 5d 20 3d 3d 20 27   utfname[2] == '
6f40: 5c 30 27 29 29 29 20 7b 0a 09 09 20 20 20 20 54  \0'))) {...    T
6f50: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
6f60: 64 73 29 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69  ds);...    conti
6f70: 6e 75 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20  nue;...}..    } 
6f80: 65 6c 73 65 20 69 66 20 28 75 74 66 6e 61 6d 65  else if (utfname
6f90: 5b 30 5d 20 3d 3d 20 27 2e 27 20 26 26 20 75 74  [0] == '.' && ut
6fa0: 66 6e 61 6d 65 5b 31 5d 20 3d 3d 20 27 2e 27 0a  fname[1] == '.'.
6fb0: 09 09 20 20 20 20 26 26 20 75 74 66 6e 61 6d 65  ..    && utfname
6fc0: 5b 32 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  [2] == '\0') {..
6fd0: 09 2f 2a 0a 09 09 20 2a 20 48 61 76 65 20 74 6f  ./*... * Have to
6fe0: 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   check if this i
6ff0: 73 20 61 20 64 72 69 76 65 20 62 65 6c 6f 77 2c  s a drive below,
7000: 20 73 6f 20 77 65 20 63 61 6e 20 63 6f 72 72 65   so we can corre
7010: 63 74 6c 79 0a 09 09 20 2a 20 6d 61 74 63 68 20  ctly... * match 
7020: 27 68 69 64 64 65 6e 27 20 61 6e 64 20 6e 6f 74  'hidden' and not
7030: 20 68 69 64 64 65 6e 20 66 69 6c 65 73 2e 0a 09   hidden files...
7040: 09 20 2a 2f 0a 0a 09 09 63 68 65 63 6b 44 72 69  . */....checkDri
7050: 76 65 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 0a  ve = 1;..    }..
7060: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
7070: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
7080: 74 68 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73  the file matches
7090: 20 74 68 65 20 70 61 74 74 65 72 6e 2e 20 4e 6f   the pattern. No
70a0: 74 65 20 74 68 61 74 20 77 65 20 61 72 65 0a 09  te that we are..
70b0: 20 20 20 20 20 2a 20 69 67 6e 6f 72 69 6e 67 20       * ignoring 
70c0: 74 68 65 20 63 61 73 65 20 73 65 6e 73 69 74 69  the case sensiti
70d0: 76 69 74 79 20 66 6c 61 67 20 62 65 63 61 75 73  vity flag becaus
70e0: 65 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 6e 27  e Windows doesn'
70f0: 74 0a 09 20 20 20 20 20 2a 20 68 6f 6e 6f 72 20  t..     * honor 
7100: 63 61 73 65 20 65 76 65 6e 20 69 66 20 74 68 65  case even if the
7110: 20 76 6f 6c 75 6d 65 20 69 73 20 63 61 73 65 20   volume is case 
7120: 73 65 6e 73 69 74 69 76 65 2e 20 49 66 20 74 68  sensitive. If th
7130: 65 20 76 6f 6c 75 6d 65 0a 09 20 20 20 20 20 2a  e volume..     *
7140: 20 61 6c 73 6f 20 64 6f 65 73 6e 27 74 20 70 72   also doesn't pr
7150: 65 73 65 72 76 65 20 63 61 73 65 2c 20 74 68 65  eserve case, the
7160: 6e 20 77 65 20 70 72 65 76 69 6f 75 73 6c 79 20  n we previously 
7170: 72 65 74 75 72 6e 65 64 20 74 68 65 0a 09 20 20  returned the..  
7180: 20 20 20 2a 20 6c 6f 77 65 72 20 63 61 73 65 20     * lower case 
7190: 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65  form of the name
71a0: 2e 20 54 68 69 73 20 64 69 64 6e 27 74 20 73 65  . This didn't se
71b0: 65 6d 20 71 75 69 74 65 20 72 69 67 68 74 20 73  em quite right s
71c0: 69 6e 63 65 0a 09 20 20 20 20 20 2a 20 74 68 65  ince..     * the
71d0: 72 65 20 61 72 65 20 6e 6f 6e 2d 63 61 73 65 2d  re are non-case-
71e0: 70 72 65 73 65 72 76 69 6e 67 20 76 6f 6c 75 6d  preserving volum
71f0: 65 73 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  es that actually
7200: 20 72 65 74 75 72 6e 0a 09 20 20 20 20 20 2a 20   return..     * 
7210: 6d 69 78 65 64 20 63 61 73 65 2e 20 53 6f 20 6e  mixed case. So n
7220: 6f 77 20 77 65 20 61 72 65 20 72 65 74 75 72 6e  ow we are return
7230: 69 6e 67 20 65 78 61 63 74 6c 79 20 77 68 61 74  ing exactly what
7240: 20 77 65 20 67 65 74 20 66 72 6f 6d 0a 09 20 20   we get from..  
7250: 20 20 20 2a 20 74 68 65 20 73 79 73 74 65 6d 2e     * the system.
7260: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
7270: 69 66 20 28 54 63 6c 5f 53 74 72 69 6e 67 43 61  if (Tcl_StringCa
7280: 73 65 4d 61 74 63 68 28 75 74 66 6e 61 6d 65 2c  seMatch(utfname,
7290: 20 70 61 74 74 65 72 6e 2c 20 31 29 29 20 7b 0a   pattern, 1)) {.
72a0: 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 74 68 65  ../*... * If the
72b0: 20 66 69 6c 65 20 6d 61 74 63 68 65 73 2c 20 74   file matches, t
72c0: 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 70  hen we need to p
72d0: 72 6f 63 65 73 73 20 74 68 65 20 72 65 6d 61 69  rocess the remai
72e0: 6e 64 65 72 0a 09 09 20 2a 20 6f 66 20 74 68 65  nder... * of the
72f0: 20 70 61 74 68 2e 0a 09 09 20 2a 2f 0a 0a 09 09   path.... */....
7300: 69 66 20 28 63 68 65 63 6b 44 72 69 76 65 29 20  if (checkDrive) 
7310: 7b 0a 09 09 20 20 20 20 63 6f 6e 73 74 20 63 68  {...    const ch
7320: 61 72 20 2a 66 75 6c 6c 6e 61 6d 65 20 3d 20 54  ar *fullname = T
7330: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
7340: 28 26 64 73 4f 72 69 67 2c 20 75 74 66 6e 61 6d  (&dsOrig, utfnam
7350: 65 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53  e,....    Tcl_DS
7360: 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 29  tringLength(&ds)
7370: 29 3b 0a 09 09 20 20 20 20 69 73 44 72 69 76 65  );...    isDrive
7380: 20 3d 20 57 69 6e 49 73 44 72 69 76 65 28 66 75   = WinIsDrive(fu
7390: 6c 6c 6e 61 6d 65 2c 20 54 63 6c 5f 44 53 74 72  llname, Tcl_DStr
73a0: 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 4f 72 69  ingLength(&dsOri
73b0: 67 29 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44  g));...    Tcl_D
73c0: 53 74 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28  StringSetLength(
73d0: 26 64 73 4f 72 69 67 2c 20 64 69 72 4c 65 6e 67  &dsOrig, dirLeng
73e0: 74 68 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  th);...} else {.
73f0: 09 09 20 20 20 20 69 73 44 72 69 76 65 20 3d 20  ..    isDrive = 
7400: 30 3b 0a 09 09 7d 0a 09 09 69 66 20 28 4e 61 74  0;...}...if (Nat
7410: 69 76 65 4d 61 74 63 68 54 79 70 65 28 69 73 44  iveMatchType(isD
7420: 72 69 76 65 2c 20 61 74 74 72 2c 20 6e 61 74 69  rive, attr, nati
7430: 76 65 2c 20 74 79 70 65 73 29 29 20 7b 0a 09 09  ve, types)) {...
7440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7460: 65 72 70 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a  erp, resultPtr,.
7470: 09 09 09 20 20 20 20 54 63 6c 4e 65 77 46 53 50  ...    TclNewFSP
7480: 61 74 68 4f 62 6a 28 70 61 74 68 50 74 72 2c 20  athObj(pathPtr, 
7490: 75 74 66 6e 61 6d 65 2c 0a 09 09 09 09 20 20 20  utfname,.....   
74a0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
74b0: 74 68 28 26 64 73 29 29 29 3b 0a 09 09 7d 0a 09  th(&ds)));...}..
74c0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09      }...    /*..
74d0: 20 20 20 20 20 2a 20 46 72 65 65 20 64 73 20 68       * Free ds h
74e0: 65 72 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ere to ensure th
74f0: 61 74 20 6e 61 74 69 76 65 20 69 73 20 76 61 6c  at native is val
7500: 69 64 20 61 62 6f 76 65 2e 0a 09 20 20 20 20 20  id above...     
7510: 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  */...    Tcl_DSt
7520: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
7530: 7d 20 77 68 69 6c 65 20 28 28 2a 74 63 6c 57 69  } while ((*tclWi
7540: 6e 50 72 6f 63 73 2d 3e 66 69 6e 64 4e 65 78 74  nProcs->findNext
7550: 46 69 6c 65 50 72 6f 63 29 28 68 61 6e 64 6c 65  FileProc)(handle
7560: 2c 20 26 64 61 74 61 29 20 3d 3d 20 54 52 55 45  , &data) == TRUE
7570: 29 3b 0a 0a 09 46 69 6e 64 43 6c 6f 73 65 28 68  );...FindClose(h
7580: 61 6e 64 6c 65 29 3b 0a 09 54 63 6c 5f 44 53 74  andle);..Tcl_DSt
7590: 72 69 6e 67 46 72 65 65 28 26 64 73 4f 72 69 67  ringFree(&dsOrig
75a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  );..return TCL_O
75b0: 4b 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  K;.    }.}.../*.
75c0: 20 2a 20 44 6f 65 73 20 74 68 65 20 67 69 76 65   * Does the give
75d0: 6e 20 70 61 74 68 20 72 65 70 72 65 73 65 6e 74  n path represent
75e0: 20 61 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 3f 20   a root volume? 
75f0: 57 65 20 6e 65 65 64 20 74 68 69 73 20 73 70 65  We need this spe
7600: 63 69 61 6c 20 63 61 73 65 0a 20 2a 20 62 65 63  cial case. * bec
7610: 61 75 73 65 20 66 6f 72 20 4e 54 46 53 20 72 6f  ause for NTFS ro
7620: 6f 74 20 76 6f 6c 75 6d 65 73 2c 20 74 68 65 20  ot volumes, the 
7630: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  getFileAttribute
7640: 73 50 72 6f 63 20 72 65 74 75 72 6e 73 20 61 20  sProc returns a 
7650: 27 68 69 64 64 65 6e 27 0a 20 2a 20 61 74 74 72  'hidden'. * attr
7660: 69 62 75 74 65 20 77 68 65 6e 20 69 74 20 73 68  ibute when it sh
7670: 6f 75 6c 64 20 6e 6f 74 2e 0a 20 2a 2f 0a 0a 73  ould not.. */..s
7680: 74 61 74 69 63 20 69 6e 74 0a 57 69 6e 49 73 44  tatic int.WinIsD
7690: 72 69 76 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  rive(.    const 
76a0: 63 68 61 72 20 2a 6e 61 6d 65 2c 09 09 2f 2a 20  char *name,../* 
76b0: 4e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  Name (UTF-8) */.
76c0: 20 20 20 20 69 6e 74 20 6c 65 6e 29 09 09 09 2f      int len).../
76d0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 6e 61 6d 65  * Length of name
76e0: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 72 65   */.{.    int re
76f0: 6d 6f 76 65 20 3d 20 30 3b 0a 0a 20 20 20 20 77  move = 0;..    w
7700: 68 69 6c 65 20 28 6c 65 6e 20 3e 20 34 29 20 7b  hile (len > 4) {
7710: 0a 09 69 66 20 28 28 6e 61 6d 65 5b 6c 65 6e 2d  ..if ((name[len-
7720: 31 5d 20 21 3d 20 27 2e 27 20 7c 7c 20 6e 61 6d  1] != '.' || nam
7730: 65 5b 6c 65 6e 2d 32 5d 20 21 3d 20 27 2e 27 29  e[len-2] != '.')
7740: 0a 09 09 7c 7c 20 28 6e 61 6d 65 5b 6c 65 6e 2d  ...|| (name[len-
7750: 33 5d 20 21 3d 20 27 2f 27 20 26 26 20 6e 61 6d  3] != '/' && nam
7760: 65 5b 6c 65 6e 2d 33 5d 20 21 3d 20 27 5c 5c 27  e[len-3] != '\\'
7770: 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  )) {..    /*..  
7780: 20 20 20 2a 20 57 65 20 64 6f 6e 27 74 20 68 61     * We don't ha
7790: 76 65 20 27 2f 2e 2e 27 20 61 74 20 74 68 65 20  ve '/..' at the 
77a0: 65 6e 64 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  end...     */...
77b0: 20 20 20 20 69 66 20 28 72 65 6d 6f 76 65 20 3d      if (remove =
77c0: 3d 20 30 29 20 7b 0a 09 09 62 72 65 61 6b 3b 0a  = 0) {...break;.
77d0: 09 20 20 20 20 7d 0a 09 20 20 20 20 72 65 6d 6f  .    }..    remo
77e0: 76 65 2d 2d 3b 0a 09 20 20 20 20 77 68 69 6c 65  ve--;..    while
77f0: 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 6c   (len > 0) {...l
7800: 65 6e 2d 2d 3b 0a 09 09 69 66 20 28 6e 61 6d 65  en--;...if (name
7810: 5b 6c 65 6e 5d 20 3d 3d 20 27 2f 27 20 7c 7c 20  [len] == '/' || 
7820: 6e 61 6d 65 5b 6c 65 6e 5d 20 3d 3d 20 27 5c 5c  name[len] == '\\
7830: 27 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61 6b  ') {...    break
7840: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20  ;...}..    }..  
7850: 20 20 69 66 20 28 6c 65 6e 20 3c 20 34 29 20 7b    if (len < 4) {
7860: 0a 09 09 6c 65 6e 2b 2b 3b 0a 09 09 62 72 65 61  ...len++;...brea
7870: 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  k;..    }..} els
7880: 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  e {..    /*..   
7890: 20 20 2a 20 57 65 20 64 6f 20 68 61 76 65 20 27    * We do have '
78a0: 2f 2e 2e 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  /..'..     */...
78b0: 20 20 20 20 6c 65 6e 20 2d 3d 20 33 3b 0a 09 20      len -= 3;.. 
78c0: 20 20 20 72 65 6d 6f 76 65 2b 2b 3b 0a 09 7d 0a     remove++;..}.
78d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c      }..    if (l
78e0: 65 6e 20 3c 20 34 29 20 7b 0a 09 69 66 20 28 6c  en < 4) {..if (l
78f0: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  en == 0) {..    
7900: 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 74 20 73  /*..     * Not s
7910: 75 72 65 20 69 66 20 74 68 69 73 20 69 73 20 70  ure if this is p
7920: 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 77 65 20  ossible, but we 
7930: 70 61 73 73 20 69 74 20 6f 6e 20 61 6e 79 77 61  pass it on anywa
7940: 79 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 7d 20 65  y...     */..} e
7950: 6c 73 65 20 69 66 20 28 6c 65 6e 20 3d 3d 20 31  lse if (len == 1
7960: 20 26 26 20 28 6e 61 6d 65 5b 30 5d 20 3d 3d 20   && (name[0] == 
7970: 27 2f 27 20 7c 7c 20 6e 61 6d 65 5b 30 5d 20 3d  '/' || name[0] =
7980: 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20 20 20 20  = '\\')) {..    
7990: 2f 2a 0a 09 20 20 20 20 20 2a 20 50 61 74 68 20  /*..     * Path 
79a0: 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  is pointing to t
79b0: 68 65 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 2e 0a  he root volume..
79c0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72  .     */...    r
79d0: 65 74 75 72 6e 20 31 3b 0a 09 7d 20 65 6c 73 65  eturn 1;..} else
79e0: 20 69 66 20 28 28 6e 61 6d 65 5b 31 5d 20 3d 3d   if ((name[1] ==
79f0: 20 27 3a 27 29 0a 09 09 20 20 20 26 26 20 28 6c   ':')...   && (l
7a00: 65 6e 20 3d 3d 20 32 20 7c 7c 20 28 6e 61 6d 65  en == 2 || (name
7a10: 5b 32 5d 20 3d 3d 20 27 2f 27 20 7c 7c 20 6e 61  [2] == '/' || na
7a20: 6d 65 5b 32 5d 20 3d 3d 20 27 5c 5c 27 29 29 29  me[2] == '\\')))
7a30: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
7a40: 20 2a 20 50 61 74 68 20 69 73 20 6f 66 20 74 68   * Path is of th
7a50: 65 20 66 6f 72 6d 20 27 78 3a 27 20 6f 72 20 27  e form 'x:' or '
7a60: 78 3a 2f 27 20 6f 72 20 27 78 3a 5c 27 0a 09 20  x:/' or 'x:\'.. 
7a70: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72 65 74      */...    ret
7a80: 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a  urn 1;..}.    }.
7a90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  .    return 0;.}
7aa0: 0a 0c 0a 2f 2a 0a 20 2a 20 44 6f 65 73 20 74 68  .../*. * Does th
7ab0: 65 20 67 69 76 65 6e 20 70 61 74 68 20 72 65 70  e given path rep
7ac0: 72 65 73 65 6e 74 20 61 20 72 65 73 65 72 76 65  resent a reserve
7ad0: 64 20 77 69 6e 64 6f 77 20 70 61 74 68 20 6e 61  d window path na
7ae0: 6d 65 3f 20 49 66 20 6e 6f 74 20 72 65 74 75 72  me? If not retur
7af0: 6e 20 30 2c 0a 20 2a 20 69 66 20 74 72 75 65 2c  n 0,. * if true,
7b00: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
7b10: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
7b20: 20 6f 66 20 74 68 65 20 70 61 74 68 20 74 68 61   of the path tha
7b30: 74 20 77 65 20 61 63 74 75 61 6c 6c 79 20 77 61  t we actually wa
7b40: 6e 74 0a 20 2a 20 28 6e 6f 74 20 61 6e 79 20 74  nt. * (not any t
7b50: 72 61 69 6c 69 6e 67 20 3a 29 2e 0a 20 2a 2f 0a  railing :).. */.
7b60: 0a 73 74 61 74 69 63 20 69 6e 74 0a 57 69 6e 49  .static int.WinI
7b70: 73 52 65 73 65 72 76 65 64 28 0a 20 20 20 20 63  sReserved(.    c
7b80: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
7b90: 09 09 2f 2a 20 50 61 74 68 20 69 6e 20 55 54 46  ../* Path in UTF
7ba0: 2d 38 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28  -8 */.{.    if (
7bb0: 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 63 27 20  (path[0] == 'c' 
7bc0: 7c 7c 20 70 61 74 68 5b 30 5d 20 3d 3d 20 27 43  || path[0] == 'C
7bd0: 27 29 0a 09 20 20 20 20 26 26 20 28 70 61 74 68  ')..    && (path
7be0: 5b 31 5d 20 3d 3d 20 27 6f 27 20 7c 7c 20 70 61  [1] == 'o' || pa
7bf0: 74 68 5b 31 5d 20 3d 3d 20 27 4f 27 29 29 20 7b  th[1] == 'O')) {
7c00: 0a 09 69 66 20 28 28 70 61 74 68 5b 32 5d 20 3d  ..if ((path[2] =
7c10: 3d 20 27 6d 27 20 7c 7c 20 70 61 74 68 5b 32 5d  = 'm' || path[2]
7c20: 20 3d 3d 20 27 4d 27 29 0a 09 09 26 26 20 70 61   == 'M')...&& pa
7c30: 74 68 5b 33 5d 20 3e 3d 20 27 31 27 20 26 26 20  th[3] >= '1' && 
7c40: 70 61 74 68 5b 33 5d 20 3c 3d 20 27 39 27 29 20  path[3] <= '9') 
7c50: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
7c60: 2a 20 4d 61 79 20 68 61 76 65 20 6d 61 74 63 68  * May have match
7c70: 20 66 6f 72 20 27 63 6f 6d 5b 31 2d 39 5d 3a 3f   for 'com[1-9]:?
7c80: 27 2c 20 77 68 69 63 68 20 69 73 20 61 20 73 65  ', which is a se
7c90: 72 69 61 6c 20 70 6f 72 74 2e 0a 09 20 20 20 20  rial port...    
7ca0: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 70 61   */...    if (pa
7cb0: 74 68 5b 34 5d 20 3d 3d 20 27 5c 30 27 29 20 7b  th[4] == '\0') {
7cc0: 0a 09 09 72 65 74 75 72 6e 20 34 3b 0a 09 20 20  ...return 4;..  
7cd0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 70 61 74    } else if (pat
7ce0: 68 20 5b 34 5d 20 3d 3d 20 27 3a 27 20 26 26 20  h [4] == ':' && 
7cf0: 70 61 74 68 5b 35 5d 20 3d 3d 20 27 5c 30 27 29  path[5] == '\0')
7d00: 20 7b 0a 09 09 72 65 74 75 72 6e 20 34 3b 0a 09   {...return 4;..
7d10: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 69 66      }..} else if
7d20: 20 28 28 70 61 74 68 5b 32 5d 20 3d 3d 20 27 6e   ((path[2] == 'n
7d30: 27 20 7c 7c 20 70 61 74 68 5b 32 5d 20 3d 3d 20  ' || path[2] == 
7d40: 27 4e 27 29 20 26 26 20 70 61 74 68 5b 33 5d 20  'N') && path[3] 
7d50: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 20 20 20 20  == '\0') {..    
7d60: 2f 2a 0a 09 20 20 20 20 20 2a 20 48 61 76 65 20  /*..     * Have 
7d70: 6d 61 74 63 68 20 66 6f 72 20 27 63 6f 6e 27 0a  match for 'con'.
7d80: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 72  .     */...    r
7d90: 65 74 75 72 6e 20 33 3b 0a 09 7d 0a 0a 20 20 20  eturn 3;..}..   
7da0: 20 7d 20 65 6c 73 65 20 69 66 20 28 28 70 61 74   } else if ((pat
7db0: 68 5b 30 5d 20 3d 3d 20 27 6c 27 20 7c 7c 20 70  h[0] == 'l' || p
7dc0: 61 74 68 5b 30 5d 20 3d 3d 20 27 4c 27 29 0a 09  ath[0] == 'L')..
7dd0: 20 20 20 20 26 26 20 28 70 61 74 68 5b 31 5d 20      && (path[1] 
7de0: 3d 3d 20 27 70 27 20 7c 7c 20 70 61 74 68 5b 31  == 'p' || path[1
7df0: 5d 20 3d 3d 20 27 50 27 29 0a 09 20 20 20 20 26  ] == 'P')..    &
7e00: 26 20 28 70 61 74 68 5b 32 5d 20 3d 3d 20 27 74  & (path[2] == 't
7e10: 27 20 7c 7c 20 70 61 74 68 5b 32 5d 20 3d 3d 20  ' || path[2] == 
7e20: 27 54 27 29 29 20 7b 0a 09 69 66 20 28 70 61 74  'T')) {..if (pat
7e30: 68 5b 33 5d 20 3e 3d 20 27 31 27 20 26 26 20 70  h[3] >= '1' && p
7e40: 61 74 68 5b 33 5d 20 3c 3d 20 27 39 27 29 20 7b  ath[3] <= '9') {
7e50: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
7e60: 20 4d 61 79 20 68 61 76 65 20 6d 61 74 63 68 20   May have match 
7e70: 66 6f 72 20 27 6c 70 74 5b 31 2d 39 5d 3a 3f 27  for 'lpt[1-9]:?'
7e80: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
7e90: 69 66 20 28 70 61 74 68 5b 34 5d 20 3d 3d 20 27  if (path[4] == '
7ea0: 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  \0') {...return 
7eb0: 34 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  4;..    } else i
7ec0: 66 20 28 70 61 74 68 20 5b 34 5d 20 3d 3d 20 27  f (path [4] == '
7ed0: 3a 27 20 26 26 20 70 61 74 68 5b 35 5d 20 3d 3d  :' && path[5] ==
7ee0: 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72   '\0') {...retur
7ef0: 6e 20 34 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  n 4;..    }..}..
7f00: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21      } else if (!
7f10: 73 74 72 63 61 73 65 63 6d 70 28 70 61 74 68 2c  strcasecmp(path,
7f20: 20 22 70 72 6e 22 29 20 7c 7c 20 21 73 74 72 63   "prn") || !strc
7f30: 61 73 65 63 6d 70 28 70 61 74 68 2c 20 22 6e 75  asecmp(path, "nu
7f40: 6c 22 29 0a 09 20 20 20 20 7c 7c 20 21 73 74 72  l")..    || !str
7f50: 63 61 73 65 63 6d 70 28 70 61 74 68 2c 20 22 61  casecmp(path, "a
7f60: 75 78 22 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  ux")) {../*.. * 
7f70: 48 61 76 65 20 6d 61 74 63 68 20 66 6f 72 20 27  Have match for '
7f80: 70 72 6e 27 2c 20 27 6e 75 6c 27 20 6f 72 20 27  prn', 'nul' or '
7f90: 61 75 78 27 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74  aux'... */...ret
7fa0: 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
7fb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f   return 0;.}.../
7fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8010: 20 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70 65   NativeMatchType
8020: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
8030: 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 61 20  unction needs a 
8040: 73 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72  special case for
8050: 20 61 20 70 61 74 68 20 77 68 69 63 68 20 69 73   a path which is
8060: 20 61 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 2c 0a   a root volume,.
8070: 20 2a 09 62 65 63 61 75 73 65 20 66 6f 72 20 4e   *.because for N
8080: 54 46 53 20 72 6f 6f 74 20 76 6f 6c 75 6d 65 73  TFS root volumes
8090: 2c 20 74 68 65 20 67 65 74 46 69 6c 65 41 74 74  , the getFileAtt
80a0: 72 69 62 75 74 65 73 50 72 6f 63 20 72 65 74 75  ributesProc retu
80b0: 72 6e 73 20 61 0a 20 2a 09 27 68 69 64 64 65 6e  rns a. *.'hidden
80c0: 27 20 61 74 74 72 69 62 75 74 65 20 77 68 65 6e  ' attribute when
80d0: 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 2e 0a   it should not..
80e0: 20 2a 0a 20 2a 09 57 65 20 6e 65 76 65 72 20 6d   *. *.We never m
80f0: 61 6b 65 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ake any calls to
8100: 20 61 20 27 67 65 74 20 61 74 74 72 69 62 75 74   a 'get attribut
8110: 65 73 27 20 72 6f 75 74 69 6e 65 20 68 65 72 65  es' routine here
8120: 2c 20 73 69 6e 63 65 20 77 65 0a 20 2a 09 68 61  , since we. *.ha
8130: 76 65 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  ve arranged thin
8140: 67 73 20 73 6f 20 74 68 61 74 20 6f 75 72 20 63  gs so that our c
8150: 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 6b 6e  aller already kn
8160: 6f 77 73 20 73 75 63 68 0a 20 2a 09 69 6e 66 6f  ows such. *.info
8170: 72 6d 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  rmation.. *. * R
8180: 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 66  esults:. *.0 = f
8190: 69 6c 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 63  ile doesn't matc
81a0: 68 0a 20 2a 09 31 20 3d 20 66 69 6c 65 20 6d 61  h. *.1 = file ma
81b0: 74 63 68 65 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  tches. *. *-----
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
8210: 74 0a 4e 61 74 69 76 65 4d 61 74 63 68 54 79 70  t.NativeMatchTyp
8220: 65 28 0a 20 20 20 20 69 6e 74 20 69 73 44 72 69  e(.    int isDri
8230: 76 65 2c 09 09 2f 2a 20 49 73 20 74 68 69 73 20  ve,../* Is this 
8240: 61 20 64 72 69 76 65 2e 20 2a 2f 0a 20 20 20 20  a drive. */.    
8250: 44 57 4f 52 44 20 61 74 74 72 2c 09 09 09 2f 2a  DWORD attr,.../*
8260: 20 57 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   We already know
8270: 20 74 68 65 20 61 74 74 72 69 62 75 74 65 73 20   the attributes 
8280: 66 6f 72 20 74 68 65 0a 09 09 09 09 20 2a 20 66  for the..... * f
8290: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ile. */.    cons
82a0: 74 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 4e  t TCHAR *nativeN
82b0: 61 6d 65 2c 09 2f 2a 20 4e 61 74 69 76 65 20 70  ame,./* Native p
82c0: 61 74 68 20 74 6f 20 63 68 65 63 6b 2e 20 2a 2f  ath to check. */
82d0: 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 54 79 70  .    Tcl_GlobTyp
82e0: 65 44 61 74 61 20 2a 74 79 70 65 73 29 09 2f 2a  eData *types)./*
82f0: 20 54 79 70 65 20 64 65 73 63 72 69 70 74 69 6f   Type descriptio
8300: 6e 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  n to match again
8310: 73 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a  st. */.{.    /*.
8320: 20 20 20 20 20 2a 20 27 61 74 74 72 27 20 72 65       * 'attr' re
8330: 70 72 65 73 65 6e 74 73 20 74 68 65 20 61 74 74  presents the att
8340: 72 69 62 75 74 65 73 20 6f 66 20 74 68 65 20 66  ributes of the f
8350: 69 6c 65 2c 20 62 75 74 20 77 65 20 6f 6e 6c 79  ile, but we only
8360: 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 2a 20   want to.     * 
8370: 72 65 74 72 69 65 76 65 20 74 68 69 73 20 69 6e  retrieve this in
8380: 66 6f 20 69 66 20 69 74 20 69 73 20 61 62 73 6f  fo if it is abso
8390: 6c 75 74 65 6c 79 20 6e 65 63 65 73 73 61 72 79  lutely necessary
83a0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
83b0: 6e 0a 20 20 20 20 20 2a 20 65 78 70 65 6e 73 69  n.     * expensi
83c0: 76 65 20 63 61 6c 6c 2e 20 55 6e 66 6f 72 74 75  ve call. Unfortu
83d0: 6e 61 74 65 6c 79 2c 20 74 6f 20 64 65 61 6c 20  nately, to deal 
83e0: 77 69 74 68 20 68 69 64 64 65 6e 20 66 69 6c 65  with hidden file
83f0: 73 20 70 72 6f 70 65 72 6c 79 2c 20 77 65 0a 20  s properly, we. 
8400: 20 20 20 20 2a 20 6d 75 73 74 20 61 6c 77 61 79      * must alway
8410: 73 20 72 65 74 72 69 65 76 65 20 69 74 2e 0a 20  s retrieve it.. 
8420: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
8430: 74 79 70 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  types == NULL) {
8440: 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 69 6e 76 69  ../*.. * If invi
8450: 73 69 62 6c 65 2c 20 64 6f 6e 27 74 20 72 65 74  sible, don't ret
8460: 75 72 6e 20 74 68 65 20 66 69 6c 65 2e 0a 09 20  urn the file... 
8470: 2a 2f 0a 0a 09 69 66 20 28 61 74 74 72 20 26 20  */...if (attr & 
8480: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
8490: 49 44 44 45 4e 20 26 26 20 21 69 73 44 72 69 76  IDDEN && !isDriv
84a0: 65 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  e) {..    return
84b0: 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73   0;..}.    } els
84c0: 65 20 7b 0a 09 69 66 20 28 61 74 74 72 20 26 20  e {..if (attr & 
84d0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
84e0: 49 44 44 45 4e 20 26 26 20 21 69 73 44 72 69 76  IDDEN && !isDriv
84f0: 65 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  e) {..    /*..  
8500: 20 20 20 2a 20 49 66 20 69 6e 76 69 73 69 62 6c     * If invisibl
8510: 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  e...     */...  
8520: 20 20 69 66 20 28 28 74 79 70 65 73 2d 3e 70 65    if ((types->pe
8530: 72 6d 20 3d 3d 20 30 29 20 7c 7c 20 21 28 74 79  rm == 0) || !(ty
8540: 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c 5f  pes->perm & TCL_
8550: 47 4c 4f 42 5f 50 45 52 4d 5f 48 49 44 44 45 4e  GLOB_PERM_HIDDEN
8560: 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b  )) {...return 0;
8570: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20  ..    }..} else 
8580: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
8590: 2a 20 56 69 73 69 62 6c 65 2e 0a 09 20 20 20 20  * Visible...    
85a0: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 74 79   */...    if (ty
85b0: 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c 5f  pes->perm & TCL_
85c0: 47 4c 4f 42 5f 50 45 52 4d 5f 48 49 44 44 45 4e  GLOB_PERM_HIDDEN
85d0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a  ) {...return 0;.
85e0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 28  .    }..}...if (
85f0: 74 79 70 65 73 2d 3e 70 65 72 6d 20 21 3d 20 30  types->perm != 0
8600: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 28 28 74  ) {..    if (((t
8610: 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43 4c  ypes->perm & TCL
8620: 5f 47 4c 4f 42 5f 50 45 52 4d 5f 52 4f 4e 4c 59  _GLOB_PERM_RONLY
8630: 29 20 26 26 0a 09 09 09 21 28 61 74 74 72 20 26  ) &&....!(attr &
8640: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
8650: 52 45 41 44 4f 4e 4c 59 29 29 20 7c 7c 0a 09 09  READONLY)) ||...
8660: 20 20 20 20 28 28 74 79 70 65 73 2d 3e 70 65 72      ((types->per
8670: 6d 20 26 20 54 43 4c 5f 47 4c 4f 42 5f 50 45 52  m & TCL_GLOB_PER
8680: 4d 5f 52 29 20 26 26 0a 09 09 09 28 30 20 2f 2a  M_R) &&....(0 /*
8690: 20 46 69 6c 65 20 65 78 69 73 74 73 20 3d 3e 20   File exists => 
86a0: 52 5f 4f 4b 20 6f 6e 20 57 69 6e 64 6f 77 73 20  R_OK on Windows 
86b0: 2a 2f 29 29 20 7c 7c 0a 09 09 20 20 20 20 28 28  */)) ||...    ((
86c0: 74 79 70 65 73 2d 3e 70 65 72 6d 20 26 20 54 43  types->perm & TC
86d0: 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 57 29 20 26  L_GLOB_PERM_W) &
86e0: 26 0a 09 09 09 28 61 74 74 72 20 26 20 46 49 4c  &....(attr & FIL
86f0: 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
8700: 4f 4e 4c 59 29 29 20 7c 7c 0a 09 09 20 20 20 20  ONLY)) ||...    
8710: 28 28 74 79 70 65 73 2d 3e 70 65 72 6d 20 26 20  ((types->perm & 
8720: 54 43 4c 5f 47 4c 4f 42 5f 50 45 52 4d 5f 58 29  TCL_GLOB_PERM_X)
8730: 20 26 26 0a 09 09 09 28 21 28 61 74 74 72 20 26   &&....(!(attr &
8740: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
8750: 44 49 52 45 43 54 4f 52 59 29 0a 09 09 09 20 26  DIRECTORY).... &
8760: 26 20 21 4e 61 74 69 76 65 49 73 45 78 65 63 28  & !NativeIsExec(
8770: 6e 61 74 69 76 65 4e 61 6d 65 29 29 29 29 20 7b  nativeName)))) {
8780: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20  ...return 0;..  
8790: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 28 74 79 70    }..}..if ((typ
87a0: 65 73 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47  es->type & TCL_G
87b0: 4c 4f 42 5f 54 59 50 45 5f 44 49 52 29 0a 09 09  LOB_TYPE_DIR)...
87c0: 26 26 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f  && (attr & FILE_
87d0: 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
87e0: 4f 52 59 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a  ORY)) {..    /*.
87f0: 09 20 20 20 20 20 2a 20 51 75 69 63 6b 65 72 20  .     * Quicker 
8800: 74 65 73 74 20 66 6f 72 20 64 69 72 65 63 74 6f  test for directo
8810: 72 79 2c 20 77 68 69 63 68 20 69 73 20 61 20 63  ry, which is a c
8820: 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 09 20 20 20  ommon case...   
8830: 20 20 2a 2f 0a 0a 09 20 20 20 20 72 65 74 75 72    */...    retur
8840: 6e 20 31 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66  n 1;...} else if
8850: 20 28 74 79 70 65 73 2d 3e 74 79 70 65 20 21 3d   (types->type !=
8860: 20 30 29 20 7b 0a 09 20 20 20 20 75 6e 73 69 67   0) {..    unsig
8870: 6e 65 64 20 73 68 6f 72 74 20 73 74 5f 6d 6f 64  ned short st_mod
8880: 65 3b 0a 09 20 20 20 20 69 6e 74 20 69 73 45 78  e;..    int isEx
8890: 65 63 20 3d 20 4e 61 74 69 76 65 49 73 45 78 65  ec = NativeIsExe
88a0: 63 28 6e 61 74 69 76 65 4e 61 6d 65 29 3b 0a 0a  c(nativeName);..
88b0: 09 20 20 20 20 73 74 5f 6d 6f 64 65 20 3d 20 4e  .    st_mode = N
88c0: 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28 61 74  ativeStatMode(at
88d0: 74 72 2c 20 30 2c 20 69 73 45 78 65 63 29 3b 0a  tr, 0, isExec);.
88e0: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
88f0: 20 49 6e 20 6f 72 64 65 72 20 62 63 64 70 66 6c   In order bcdpfl
8900: 73 20 61 73 20 69 6e 20 27 66 69 6e 64 20 2d 74  s as in 'find -t
8910: 27 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  '..     */...   
8920: 20 69 66 20 28 28 28 74 79 70 65 73 2d 3e 74 79   if (((types->ty
8930: 70 65 26 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45  pe&TCL_GLOB_TYPE
8940: 5f 42 4c 4f 43 4b 29 20 20 20 20 26 26 20 53 5f  _BLOCK)    && S_
8950: 49 53 42 4c 4b 28 73 74 5f 6d 6f 64 65 29 29 20  ISBLK(st_mode)) 
8960: 7c 7c 0a 09 09 20 20 20 20 28 28 74 79 70 65 73  ||...    ((types
8970: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f  ->type&TCL_GLOB_
8980: 54 59 50 45 5f 43 48 41 52 29 20 26 26 20 53 5f  TYPE_CHAR) && S_
8990: 49 53 43 48 52 28 73 74 5f 6d 6f 64 65 29 29 20  ISCHR(st_mode)) 
89a0: 7c 7c 0a 09 09 20 20 20 20 28 28 74 79 70 65 73  ||...    ((types
89b0: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f  ->type&TCL_GLOB_
89c0: 54 59 50 45 5f 44 49 52 29 20 20 26 26 20 53 5f  TYPE_DIR)  && S_
89d0: 49 53 44 49 52 28 73 74 5f 6d 6f 64 65 29 29 20  ISDIR(st_mode)) 
89e0: 7c 7c 0a 09 09 20 20 20 20 28 28 74 79 70 65 73  ||...    ((types
89f0: 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42 5f  ->type&TCL_GLOB_
8a00: 54 59 50 45 5f 50 49 50 45 29 20 26 26 20 53 5f  TYPE_PIPE) && S_
8a10: 49 53 46 49 46 4f 28 73 74 5f 6d 6f 64 65 29 29  ISFIFO(st_mode))
8a20: 20 7c 7c 0a 23 69 66 64 65 66 20 53 5f 49 53 53   ||.#ifdef S_ISS
8a30: 4f 43 4b 0a 09 09 20 20 20 20 28 28 74 79 70 65  OCK...    ((type
8a40: 73 2d 3e 74 79 70 65 26 54 43 4c 5f 47 4c 4f 42  s->type&TCL_GLOB
8a50: 5f 54 59 50 45 5f 53 4f 43 4b 29 20 26 26 20 53  _TYPE_SOCK) && S
8a60: 5f 49 53 53 4f 43 4b 28 73 74 5f 6d 6f 64 65 29  _ISSOCK(st_mode)
8a70: 29 20 7c 7c 0a 23 65 6e 64 69 66 0a 09 09 20 20  ) ||.#endif...  
8a80: 20 20 28 28 74 79 70 65 73 2d 3e 74 79 70 65 26    ((types->type&
8a90: 54 43 4c 5f 47 4c 4f 42 5f 54 59 50 45 5f 46 49  TCL_GLOB_TYPE_FI
8aa0: 4c 45 29 20 26 26 20 53 5f 49 53 52 45 47 28 73  LE) && S_ISREG(s
8ab0: 74 5f 6d 6f 64 65 29 29 29 20 7b 0a 09 09 2f 2a  t_mode))) {.../*
8ac0: 0a 09 09 20 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  ... * Do nothing
8ad0: 20 2d 20 74 68 69 73 20 66 69 6c 65 20 69 73 20   - this file is 
8ae0: 6f 6b 2e 0a 09 09 20 2a 2f 0a 09 20 20 20 20 7d  ok.... */..    }
8af0: 20 65 6c 73 65 20 7b 0a 23 69 66 64 65 66 20 53   else {.#ifdef S
8b00: 5f 49 53 4c 4e 4b 0a 09 09 69 66 20 28 74 79 70  _ISLNK...if (typ
8b10: 65 73 2d 3e 74 79 70 65 20 26 20 54 43 4c 5f 47  es->type & TCL_G
8b20: 4c 4f 42 5f 54 59 50 45 5f 4c 49 4e 4b 29 20 7b  LOB_TYPE_LINK) {
8b30: 0a 09 09 20 20 20 20 73 74 5f 6d 6f 64 65 20 3d  ...    st_mode =
8b40: 20 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28   NativeStatMode(
8b50: 61 74 74 72 2c 20 31 2c 20 69 73 45 78 65 63 29  attr, 1, isExec)
8b60: 3b 0a 09 09 20 20 20 20 69 66 20 28 53 5f 49 53  ;...    if (S_IS
8b70: 4c 4e 4b 28 73 74 5f 6d 6f 64 65 29 29 20 7b 0a  LNK(st_mode)) {.
8b80: 09 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 09 20  ...return 1;... 
8b90: 20 20 20 7d 0a 09 09 7d 0a 23 65 6e 64 69 66 0a     }...}.#endif.
8ba0: 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20  ..return 0;..   
8bb0: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
8bc0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a  return 1;.}.../*
8bd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
8c20: 54 63 6c 70 47 65 74 55 73 65 72 48 6f 6d 65 20  TclpGetUserHome 
8c30: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
8c40: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74 68 65  nction takes the
8c50: 20 70 61 73 73 65 64 20 69 6e 20 75 73 65 72 20   passed in user 
8c60: 6e 61 6d 65 20 61 6e 64 20 66 69 6e 64 73 20 74  name and finds t
8c70: 68 65 0a 20 2a 09 63 6f 72 72 65 73 70 6f 6e 64  he. *.correspond
8c80: 69 6e 67 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  ing home directo
8c90: 72 79 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ry specified in 
8ca0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 66 69 6c  the password fil
8cb0: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  e.. *. * Results
8cc0: 3a 0a 20 2a 09 54 68 65 20 72 65 73 75 6c 74 20  :. *.The result 
8cd0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
8ce0: 61 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 79  a string specify
8cf0: 69 6e 67 20 74 68 65 20 75 73 65 72 27 73 20 68  ing the user's h
8d00: 6f 6d 65 0a 20 2a 09 64 69 72 65 63 74 6f 72 79  ome. *.directory
8d10: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
8d20: 20 75 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72   user's home dir
8d30: 65 63 74 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74  ectory could not
8d40: 20 62 65 0a 20 2a 09 64 65 74 65 72 6d 69 6e 65   be. *.determine
8d50: 64 2e 20 53 74 6f 72 61 67 65 20 66 6f 72 20 74  d. Storage for t
8d60: 68 65 20 72 65 73 75 6c 74 20 73 74 72 69 6e 67  he result string
8d70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
8d80: 20 62 75 66 66 65 72 50 74 72 3b 0a 20 2a 09 74   bufferPtr;. *.t
8d90: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
8da0: 61 6c 6c 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  all Tcl_DStringF
8db0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 72  ree() when the r
8dc0: 65 73 75 6c 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  esult is no long
8dd0: 65 72 0a 20 2a 09 6e 65 65 64 65 64 2e 0a 20 2a  er. *.needed.. *
8de0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
8df0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e40: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 68 61 72  ------. */..char
8e50: 20 2a 0a 54 63 6c 70 47 65 74 55 73 65 72 48 6f   *.TclpGetUserHo
8e60: 6d 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me(.    const ch
8e70: 61 72 20 2a 6e 61 6d 65 2c 09 09 2f 2a 20 55 73  ar *name,../* Us
8e80: 65 72 20 6e 61 6d 65 20 66 6f 72 20 64 65 73 69  er name for desi
8e90: 72 65 64 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  red home directo
8ea0: 72 79 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  ry. */.    Tcl_D
8eb0: 53 74 72 69 6e 67 20 2a 62 75 66 66 65 72 50 74  String *bufferPt
8ec0: 72 29 09 2f 2a 20 55 6e 69 6e 69 74 69 61 6c 69  r)./* Uninitiali
8ed0: 7a 65 64 20 6f 72 20 66 72 65 65 20 44 53 74 72  zed or free DStr
8ee0: 69 6e 67 20 66 69 6c 6c 65 64 20 77 69 74 68 0a  ing filled with.
8ef0: 09 09 09 09 20 2a 20 6e 61 6d 65 20 6f 66 20 75  .... * name of u
8f00: 73 65 72 27 73 20 68 6f 6d 65 20 64 69 72 65 63  ser's home direc
8f10: 74 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 20 20 63  tory. */.{.    c
8f20: 68 61 72 20 2a 72 65 73 75 6c 74 3b 0a 0a 20 20  har *result;..  
8f30: 20 20 73 74 61 74 69 63 20 4e 45 54 41 50 49 42    static NETAPIB
8f40: 55 46 46 45 52 46 52 45 45 50 52 4f 43 20 2a 6e  UFFERFREEPROC *n
8f50: 65 74 41 70 69 42 75 66 66 65 72 46 72 65 65 50  etApiBufferFreeP
8f60: 72 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20  roc;.    static 
8f70: 4e 45 54 47 45 54 44 43 4e 41 4d 45 50 52 4f 43  NETGETDCNAMEPROC
8f80: 20 2a 6e 65 74 47 65 74 44 43 4e 61 6d 65 50 72   *netGetDCNamePr
8f90: 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20 4e  oc;.    static N
8fa0: 45 54 55 53 45 52 47 45 54 49 4e 46 4f 50 52 4f  ETUSERGETINFOPRO
8fb0: 43 20 2a 6e 65 74 55 73 65 72 47 65 74 49 6e 66  C *netUserGetInf
8fc0: 6f 50 72 6f 63 3b 0a 20 20 20 20 73 74 61 74 69  oProc;.    stati
8fd0: 63 20 47 45 54 50 52 4f 46 49 4c 45 53 44 49 52  c GETPROFILESDIR
8fe0: 45 43 54 4f 52 59 50 52 4f 43 20 2a 67 65 74 50  ECTORYPROC *getP
8ff0: 72 6f 66 69 6c 65 73 44 69 72 65 63 74 6f 72 79  rofilesDirectory
9000: 50 72 6f 63 3b 0a 20 20 20 20 73 74 61 74 69 63  Proc;.    static
9010: 20 69 6e 74 20 61 70 69 73 74 75 62 73 20 3d 20   int apistubs = 
9020: 30 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d  0;..    result =
9030: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
9040: 53 74 72 69 6e 67 49 6e 69 74 28 62 75 66 66 65  StringInit(buffe
9050: 72 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28  rPtr);..    if (
9060: 21 61 70 69 73 74 75 62 73 29 20 7b 0a 09 48 49  !apistubs) {..HI
9070: 4e 53 54 41 4e 43 45 20 68 61 6e 64 6c 65 3b 0a  NSTANCE handle;.
9080: 09 54 43 4c 5f 44 45 43 4c 41 52 45 5f 4d 55 54  .TCL_DECLARE_MUT
9090: 45 58 28 69 6e 69 74 69 61 6c 69 7a 65 4d 75 74  EX(initializeMut
90a0: 65 78 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  ex)..Tcl_MutexLo
90b0: 63 6b 28 26 69 6e 69 74 69 61 6c 69 7a 65 4d 75  ck(&initializeMu
90c0: 74 65 78 29 3b 0a 09 69 66 20 28 21 61 70 69 73  tex);..if (!apis
90d0: 74 75 62 73 29 20 7b 0a 09 20 20 20 20 68 61 6e  tubs) {..    han
90e0: 64 6c 65 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72  dle = LoadLibrar
90f0: 79 41 28 22 6e 65 74 61 70 69 33 32 2e 64 6c 6c  yA("netapi32.dll
9100: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 68 61 6e  ");..    if (han
9110: 64 6c 65 29 20 7b 0a 09 09 6e 65 74 41 70 69 42  dle) {...netApiB
9120: 75 66 66 65 72 46 72 65 65 50 72 6f 63 20 3d 20  ufferFreeProc = 
9130: 28 4e 45 54 41 50 49 42 55 46 46 45 52 46 52 45  (NETAPIBUFFERFRE
9140: 45 50 52 4f 43 20 2a 29 0a 09 09 09 47 65 74 50  EPROC *)....GetP
9150: 72 6f 63 41 64 64 72 65 73 73 28 68 61 6e 64 6c  rocAddress(handl
9160: 65 2c 20 22 4e 65 74 41 70 69 42 75 66 66 65 72  e, "NetApiBuffer
9170: 46 72 65 65 22 29 3b 0a 09 09 6e 65 74 47 65 74  Free");...netGet
9180: 44 43 4e 61 6d 65 50 72 6f 63 20 3d 20 28 4e 45  DCNameProc = (NE
9190: 54 47 45 54 44 43 4e 41 4d 45 50 52 4f 43 20 2a  TGETDCNAMEPROC *
91a0: 29 0a 09 09 09 47 65 74 50 72 6f 63 41 64 64 72  )....GetProcAddr
91b0: 65 73 73 28 68 61 6e 64 6c 65 2c 20 22 4e 65 74  ess(handle, "Net
91c0: 47 65 74 44 43 4e 61 6d 65 22 29 3b 0a 09 09 6e  GetDCName");...n
91d0: 65 74 55 73 65 72 47 65 74 49 6e 66 6f 50 72 6f  etUserGetInfoPro
91e0: 63 20 3d 20 28 4e 45 54 55 53 45 52 47 45 54 49  c = (NETUSERGETI
91f0: 4e 46 4f 50 52 4f 43 20 2a 29 0a 09 09 09 47 65  NFOPROC *)....Ge
9200: 74 50 72 6f 63 41 64 64 72 65 73 73 28 68 61 6e  tProcAddress(han
9210: 64 6c 65 2c 20 22 4e 65 74 55 73 65 72 47 65 74  dle, "NetUserGet
9220: 49 6e 66 6f 22 29 3b 0a 09 09 54 63 6c 5f 43 72  Info");...Tcl_Cr
9230: 65 61 74 65 45 78 69 74 48 61 6e 64 6c 65 72 28  eateExitHandler(
9240: 54 63 6c 70 55 6e 6c 6f 61 64 46 69 6c 65 2c 20  TclpUnloadFile, 
9250: 68 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20 7d 0a  handle);..    }.
9260: 09 20 20 20 20 68 61 6e 64 6c 65 20 3d 20 4c 6f  .    handle = Lo
9270: 61 64 4c 69 62 72 61 72 79 41 28 22 75 73 65 72  adLibraryA("user
9280: 65 6e 76 2e 64 6c 6c 22 29 3b 0a 09 20 20 20 20  env.dll");..    
9290: 69 66 20 28 68 61 6e 64 6c 65 29 20 7b 0a 09 09  if (handle) {...
92a0: 67 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63  getProfilesDirec
92b0: 74 6f 72 79 50 72 6f 63 20 3d 20 28 47 45 54 50  toryProc = (GETP
92c0: 52 4f 46 49 4c 45 53 44 49 52 45 43 54 4f 52 59  ROFILESDIRECTORY
92d0: 50 52 4f 43 20 2a 29 0a 09 09 09 47 65 74 50 72  PROC *)....GetPr
92e0: 6f 63 41 64 64 72 65 73 73 28 68 61 6e 64 6c 65  ocAddress(handle
92f0: 2c 20 22 47 65 74 50 72 6f 66 69 6c 65 73 44 69  , "GetProfilesDi
9300: 72 65 63 74 6f 72 79 57 22 29 3b 0a 09 09 54 63  rectoryW");...Tc
9310: 6c 5f 43 72 65 61 74 65 45 78 69 74 48 61 6e 64  l_CreateExitHand
9320: 6c 65 72 28 54 63 6c 70 55 6e 6c 6f 61 64 46 69  ler(TclpUnloadFi
9330: 6c 65 2c 20 68 61 6e 64 6c 65 29 3b 0a 09 20 20  le, handle);..  
9340: 20 20 7d 0a 09 20 20 20 20 0a 09 20 20 20 20 61    }..    ..    a
9350: 70 69 73 74 75 62 73 20 3d 20 2d 31 3b 0a 09 20  pistubs = -1;.. 
9360: 20 20 20 69 66 20 28 20 28 6e 65 74 55 73 65 72     if ( (netUser
9370: 47 65 74 49 6e 66 6f 50 72 6f 63 20 21 3d 20 4e  GetInfoProc != N
9380: 55 4c 4c 29 20 26 26 20 28 6e 65 74 47 65 74 44  ULL) && (netGetD
9390: 43 4e 61 6d 65 50 72 6f 63 20 21 3d 20 4e 55 4c  CNameProc != NUL
93a0: 4c 29 0a 09 20 20 20 20 20 20 26 26 20 28 6e 65  L)..      && (ne
93b0: 74 41 70 69 42 75 66 66 65 72 46 72 65 65 50 72  tApiBufferFreePr
93c0: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 28  oc != NULL) && (
93d0: 67 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63  getProfilesDirec
93e0: 74 6f 72 79 50 72 6f 63 20 21 3d 20 4e 55 4c 4c  toryProc != NULL
93f0: 29 0a 09 20 20 20 20 29 20 7b 0a 09 09 61 70 69  )..    ) {...api
9400: 73 74 75 62 73 20 3d 20 31 3b 0a 09 20 20 20 20  stubs = 1;..    
9410: 7d 0a 09 7d 0a 09 54 63 6c 5f 4d 75 74 65 78 55  }..}..Tcl_MutexU
9420: 6e 6c 6f 63 6b 28 26 69 6e 69 74 69 61 6c 69 7a  nlock(&initializ
9430: 65 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  eMutex);.    }..
9440: 20 20 20 20 69 66 20 28 61 70 69 73 74 75 62 73      if (apistubs
9450: 20 3d 3d 20 31 29 20 7b 0a 09 55 53 45 52 5f 49   == 1) {..USER_I
9460: 4e 46 4f 5f 31 20 2a 75 69 50 74 72 3b 0a 09 54  NFO_1 *uiPtr;..T
9470: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 09  cl_DString ds;..
9480: 69 6e 74 20 6e 61 6d 65 4c 65 6e 2c 20 72 63 3b  int nameLen, rc;
9490: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 6f  ..const char *do
94a0: 6d 61 69 6e 3b 0a 09 57 43 48 41 52 20 2a 77 4e  main;..WCHAR *wN
94b0: 61 6d 65 2c 20 2a 77 48 6f 6d 65 44 69 72 2c 20  ame, *wHomeDir, 
94c0: 2a 77 44 6f 6d 61 69 6e 3b 0a 09 57 43 48 41 52  *wDomain;..WCHAR
94d0: 20 62 75 66 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a   buf[MAX_PATH];.
94e0: 0a 09 72 63 20 3d 20 30 3b 0a 09 6e 61 6d 65 4c  ..rc = 0;..nameL
94f0: 65 6e 20 3d 20 2d 31 3b 0a 09 77 44 6f 6d 61 69  en = -1;..wDomai
9500: 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 64 6f 6d 61 69  n = NULL;..domai
9510: 6e 20 3d 20 54 63 6c 5f 55 74 66 46 69 6e 64 46  n = Tcl_UtfFindF
9520: 69 72 73 74 28 6e 61 6d 65 2c 20 27 40 27 29 3b  irst(name, '@');
9530: 0a 09 69 66 20 28 64 6f 6d 61 69 6e 20 3d 3d 20  ..if (domain == 
9540: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 63 6f 6e  NULL) {..    con
9550: 73 74 20 63 68 61 72 20 2a 70 74 72 3b 0a 09 20  st char *ptr;.. 
9560: 20 20 20 0a 09 20 20 20 20 2f 2a 20 6e 6f 20 64     ..    /* no d
9570: 6f 6d 61 69 6e 20 2d 20 66 69 72 73 74 6c 79 20  omain - firstly 
9580: 63 68 65 63 6b 20 69 74 27 73 20 74 68 65 20 63  check it's the c
9590: 75 72 72 65 6e 74 20 75 73 65 72 20 2a 2f 0a 09  urrent user */..
95a0: 20 20 20 20 69 66 20 28 20 28 70 74 72 20 3d 20      if ( (ptr = 
95b0: 54 63 6c 70 47 65 74 55 73 65 72 4e 61 6d 65 28  TclpGetUserName(
95c0: 26 64 73 29 29 20 21 3d 20 4e 55 4c 4c 20 0a 09  &ds)) != NULL ..
95d0: 20 20 20 20 20 20 26 26 20 73 74 72 63 61 73 65        && strcase
95e0: 63 6d 70 28 6e 61 6d 65 2c 20 70 74 72 29 20 3d  cmp(name, ptr) =
95f0: 3d 20 30 0a 09 20 20 20 20 29 20 7b 0a 09 09 2f  = 0..    ) {.../
9600: 2a 20 74 72 79 20 73 61 66 65 73 74 20 61 6e 64  * try safest and
9610: 20 66 61 73 74 65 73 74 20 77 61 79 20 74 6f 20   fastest way to 
9620: 67 65 74 20 63 75 72 72 65 6e 74 20 75 73 65 72  get current user
9630: 20 68 6f 6d 65 20 2a 2f 0a 09 09 70 74 72 20 3d   home */...ptr =
9640: 20 54 63 6c 47 65 74 45 6e 76 28 22 48 4f 4d 45   TclGetEnv("HOME
9650: 22 2c 20 26 64 73 29 3b 0a 09 09 69 66 20 28 70  ", &ds);...if (p
9660: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  tr != NULL) {...
9670: 20 20 20 20 54 63 6c 5f 4a 6f 69 6e 50 61 74 68      Tcl_JoinPath
9680: 28 31 2c 20 26 70 74 72 2c 20 62 75 66 66 65 72  (1, &ptr, buffer
9690: 50 74 72 29 3b 0a 09 09 20 20 20 20 72 63 20 3d  Ptr);...    rc =
96a0: 20 31 3b 0a 09 09 20 20 20 20 72 65 73 75 6c 74   1;...    result
96b0: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61   = Tcl_DStringVa
96c0: 6c 75 65 28 62 75 66 66 65 72 50 74 72 29 3b 0a  lue(bufferPtr);.
96d0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ..}..    }..    
96e0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
96f0: 26 64 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  &ds);..} else {.
9700: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9710: 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20  Init(&ds);..    
9720: 77 4e 61 6d 65 20 3d 20 54 63 6c 5f 55 74 66 54  wName = Tcl_UtfT
9730: 6f 55 6e 69 43 68 61 72 44 53 74 72 69 6e 67 28  oUniCharDString(
9740: 64 6f 6d 61 69 6e 20 2b 20 31 2c 20 2d 31 2c 20  domain + 1, -1, 
9750: 26 64 73 29 3b 0a 09 20 20 20 20 72 63 20 3d 20  &ds);..    rc = 
9760: 28 6e 65 74 47 65 74 44 43 4e 61 6d 65 50 72 6f  (netGetDCNamePro
9770: 63 29 28 4e 55 4c 4c 2c 20 77 4e 61 6d 65 2c 20  c)(NULL, wName, 
9780: 28 4c 50 42 59 54 45 20 2a 29 20 26 77 44 6f 6d  (LPBYTE *) &wDom
9790: 61 69 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  ain);..    Tcl_D
97a0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
97b0: 0a 09 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20  ..    nameLen = 
97c0: 64 6f 6d 61 69 6e 20 2d 20 6e 61 6d 65 3b 0a 09  domain - name;..
97d0: 7d 0a 09 69 66 20 28 72 63 20 3d 3d 20 30 29 20  }..if (rc == 0) 
97e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
97f0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20  ngInit(&ds);..  
9800: 20 20 77 4e 61 6d 65 20 3d 20 54 63 6c 5f 55 74    wName = Tcl_Ut
9810: 66 54 6f 55 6e 69 43 68 61 72 44 53 74 72 69 6e  fToUniCharDStrin
9820: 67 28 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2c  g(name, nameLen,
9830: 20 26 64 73 29 3b 0a 09 20 20 20 20 77 68 69 6c   &ds);..    whil
9840: 65 20 28 28 6e 65 74 55 73 65 72 47 65 74 49 6e  e ((netUserGetIn
9850: 66 6f 50 72 6f 63 29 28 77 44 6f 6d 61 69 6e 2c  foProc)(wDomain,
9860: 20 77 4e 61 6d 65 2c 20 31 2c 0a 09 09 20 20 20   wName, 1,...   
9870: 20 28 4c 50 42 59 54 45 20 2a 29 20 26 75 69 50   (LPBYTE *) &uiP
9880: 74 72 29 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a  tr) != 0) {.../*
9890: 20 0a 09 09 20 2a 20 75 73 65 72 20 64 6f 65 73   ... * user does
98a0: 20 6e 6f 74 20 65 78 69 73 74 73 20 2d 20 69 66   not exists - if
98b0: 20 64 6f 6d 61 69 6e 20 77 61 73 20 6e 6f 74 20   domain was not 
98c0: 73 70 65 63 69 66 69 65 64 2c 0a 09 09 20 2a 20  specified,... * 
98d0: 74 72 79 20 61 67 61 69 6e 20 75 73 69 6e 67 20  try again using 
98e0: 63 75 72 72 65 6e 74 20 64 6f 6d 61 69 6e 2e 0a  current domain..
98f0: 09 09 20 2a 2f 0a 09 09 72 63 20 3d 20 31 3b 0a  .. */...rc = 1;.
9900: 09 09 69 66 20 28 64 6f 6d 61 69 6e 20 21 3d 20  ..if (domain != 
9910: 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 2f  NULL) break;.../
9920: 2a 20 67 65 74 20 63 75 72 72 65 6e 74 20 64 6f  * get current do
9930: 6d 61 69 6e 20 2a 2f 0a 09 09 72 63 20 3d 20 28  main */...rc = (
9940: 6e 65 74 47 65 74 44 43 4e 61 6d 65 50 72 6f 63  netGetDCNameProc
9950: 29 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 28 4c  )(NULL, NULL, (L
9960: 50 42 59 54 45 20 2a 29 20 26 77 44 6f 6d 61 69  PBYTE *) &wDomai
9970: 6e 29 3b 0a 09 09 69 66 20 28 72 63 20 21 3d 20  n);...if (rc != 
9980: 30 29 20 62 72 65 61 6b 3b 0a 09 09 64 6f 6d 61  0) break;...doma
9990: 69 6e 20 3d 20 49 4e 54 32 50 54 52 28 2d 31 29  in = INT2PTR(-1)
99a0: 3b 20 2f 2a 20 72 65 70 65 61 74 20 6f 6e 63 65  ; /* repeat once
99b0: 20 2a 2f 0a 09 20 20 20 20 7d 0a 09 20 20 20 20   */..    }..    
99c0: 69 66 20 28 72 63 20 3d 3d 20 30 29 20 7b 0a 09  if (rc == 0) {..
99d0: 09 44 57 4f 52 44 20 69 2c 20 73 69 7a 65 20 3d  .DWORD i, size =
99e0: 20 4d 41 58 5f 50 41 54 48 3b 0a 09 09 77 48 6f   MAX_PATH;...wHo
99f0: 6d 65 44 69 72 20 3d 20 75 69 50 74 72 2d 3e 75  meDir = uiPtr->u
9a00: 73 72 69 31 5f 68 6f 6d 65 5f 64 69 72 3b 0a 09  sri1_home_dir;..
9a10: 09 69 66 20 28 28 77 48 6f 6d 65 44 69 72 20 21  .if ((wHomeDir !
9a20: 3d 20 4e 55 4c 4c 29 20 26 26 20 28 77 48 6f 6d  = NULL) && (wHom
9a30: 65 44 69 72 5b 30 5d 20 21 3d 20 4c 27 5c 30 27  eDir[0] != L'\0'
9a40: 29 29 20 7b 0a 09 09 20 20 20 20 73 69 7a 65 20  )) {...    size 
9a50: 3d 20 6c 73 74 72 6c 65 6e 57 28 77 48 6f 6d 65  = lstrlenW(wHome
9a60: 44 69 72 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f  Dir);...    Tcl_
9a70: 55 6e 69 43 68 61 72 54 6f 55 74 66 44 53 74 72  UniCharToUtfDStr
9a80: 69 6e 67 28 77 48 6f 6d 65 44 69 72 2c 20 73 69  ing(wHomeDir, si
9a90: 7a 65 2c 20 62 75 66 66 65 72 50 74 72 29 3b 0a  ze, bufferPtr);.
9aa0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
9ab0: 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 55 73 65   /*...     * Use
9ac0: 72 20 65 78 69 73 74 73 20 62 75 74 20 68 61 73  r exists but has
9ad0: 20 6e 6f 20 68 6f 6d 65 20 64 69 72 2e 20 52 65   no home dir. Re
9ae0: 74 75 72 6e 0a 09 09 20 20 20 20 20 2a 20 22 7b  turn...     * "{
9af0: 47 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63  GetProfilesDirec
9b00: 74 6f 72 79 7d 2f 3c 75 73 65 72 3e 22 2e 0a 09  tory}/<user>"...
9b10: 09 20 20 20 20 20 2a 2f 0a 09 09 20 20 20 20 67  .     */...    g
9b20: 65 74 50 72 6f 66 69 6c 65 73 44 69 72 65 63 74  etProfilesDirect
9b30: 6f 72 79 50 72 6f 63 28 62 75 66 2c 20 26 73 69  oryProc(buf, &si
9b40: 7a 65 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 55  ze);...    Tcl_U
9b50: 6e 69 43 68 61 72 54 6f 55 74 66 44 53 74 72 69  niCharToUtfDStri
9b60: 6e 67 28 62 75 66 2c 20 73 69 7a 65 2d 31 2c 20  ng(buf, size-1, 
9b70: 62 75 66 66 65 72 50 74 72 29 3b 0a 09 09 20 20  bufferPtr);...  
9b80: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
9b90: 65 6e 64 28 62 75 66 66 65 72 50 74 72 2c 20 22  end(bufferPtr, "
9ba0: 2f 22 2c 20 31 29 3b 0a 09 09 20 20 20 20 54 63  /", 1);...    Tc
9bb0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
9bc0: 62 75 66 66 65 72 50 74 72 2c 20 6e 61 6d 65 2c  bufferPtr, name,
9bd0: 20 6e 61 6d 65 4c 65 6e 29 3b 0a 09 09 7d 0a 09   nameLen);...}..
9be0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 44 53  .result = Tcl_DS
9bf0: 74 72 69 6e 67 56 61 6c 75 65 28 62 75 66 66 65  tringValue(buffe
9c00: 72 50 74 72 29 3b 0a 09 09 2f 2a 20 62 65 20 73  rPtr);.../* be s
9c10: 75 72 65 20 77 65 20 72 65 74 75 72 6e 73 20 6e  ure we returns n
9c20: 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 2a  ormalized path *
9c30: 2f 0a 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  /...for (i = 0; 
9c40: 69 20 3c 20 73 69 7a 65 3b 20 2b 2b 69 29 7b 0a  i < size; ++i){.
9c50: 09 09 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ..    if (result
9c60: 5b 69 5d 20 3d 3d 20 27 5c 5c 27 29 20 72 65 73  [i] == '\\') res
9c70: 75 6c 74 5b 69 5d 20 3d 20 27 2f 27 3b 0a 09 09  ult[i] = '/';...
9c80: 7d 0a 09 09 28 2a 6e 65 74 41 70 69 42 75 66 66  }...(*netApiBuff
9c90: 65 72 46 72 65 65 50 72 6f 63 29 28 28 76 6f 69  erFreeProc)((voi
9ca0: 64 20 2a 29 20 75 69 50 74 72 29 3b 0a 09 20 20  d *) uiPtr);..  
9cb0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
9cc0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
9cd0: 7d 0a 09 69 66 20 28 77 44 6f 6d 61 69 6e 20 21  }..if (wDomain !
9ce0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 28  = NULL) {..    (
9cf0: 2a 6e 65 74 41 70 69 42 75 66 66 65 72 46 72 65  *netApiBufferFre
9d00: 65 50 72 6f 63 29 28 28 76 6f 69 64 20 2a 29 20  eProc)((void *) 
9d10: 77 44 6f 6d 61 69 6e 29 3b 0a 09 7d 0a 20 20 20  wDomain);..}.   
9d20: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c   }.    if (resul
9d30: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  t == NULL) {../*
9d40: 0a 09 20 2a 20 4c 6f 6f 6b 20 69 6e 20 74 68 65  .. * Look in the
9d50: 20 22 50 61 73 73 77 6f 72 64 20 4c 69 73 74 73   "Password Lists
9d60: 22 20 73 65 63 74 69 6f 6e 20 6f 66 20 73 79 73  " section of sys
9d70: 74 65 6d 2e 69 6e 69 20 66 6f 72 20 74 68 65 20  tem.ini for the 
9d80: 6c 6f 63 61 6c 0a 09 20 2a 20 75 73 65 72 2e 20  local.. * user. 
9d90: 54 68 65 72 65 20 61 72 65 20 61 6c 73 6f 20 65  There are also e
9da0: 6e 74 72 69 65 73 20 69 6e 20 74 68 61 74 20 73  ntries in that s
9db0: 65 63 74 69 6f 6e 20 74 68 61 74 20 62 65 67 69  ection that begi
9dc0: 6e 20 77 69 74 68 20 61 20 22 2a 22 0a 09 20 2a  n with a "*".. *
9dd0: 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20   character that 
9de0: 61 72 65 20 75 73 65 64 20 62 79 20 57 69 6e 64  are used by Wind
9df0: 6f 77 73 20 66 6f 72 20 6f 74 68 65 72 20 70 75  ows for other pu
9e00: 72 70 6f 73 65 73 3b 20 69 67 6e 6f 72 65 20 75  rposes; ignore u
9e10: 73 65 72 0a 09 20 2a 20 6e 61 6d 65 73 20 62 65  ser.. * names be
9e20: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 61 20 22  ginning with a "
9e30: 2a 22 2e 0a 09 20 2a 2f 0a 0a 09 63 68 61 72 20  *"... */...char 
9e40: 62 75 66 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 0a  buf[MAX_PATH];..
9e50: 09 69 66 20 28 6e 61 6d 65 5b 30 5d 20 21 3d 20  .if (name[0] != 
9e60: 27 2a 27 29 20 7b 0a 09 20 20 20 20 69 66 20 28  '*') {..    if (
9e70: 47 65 74 50 72 69 76 61 74 65 50 72 6f 66 69 6c  GetPrivateProfil
9e80: 65 53 74 72 69 6e 67 41 28 22 50 61 73 73 77 6f  eStringA("Passwo
9e90: 72 64 20 4c 69 73 74 73 22 2c 20 6e 61 6d 65 2c  rd Lists", name,
9ea0: 20 22 22 2c 20 62 75 66 2c 0a 09 09 20 20 20 20   "", buf,...    
9eb0: 4d 41 58 5f 50 41 54 48 2c 20 22 73 79 73 74 65  MAX_PATH, "syste
9ec0: 6d 2e 69 6e 69 22 29 20 3e 20 30 29 20 7b 0a 09  m.ini") > 0) {..
9ed0: 09 2f 2a 0a 09 09 20 2a 20 55 73 65 72 20 65 78  ./*... * User ex
9ee0: 69 73 74 73 2c 20 62 75 74 20 74 68 65 72 65 20  ists, but there 
9ef0: 69 73 20 6e 6f 20 73 75 63 68 20 74 68 69 6e 67  is no such thing
9f00: 20 61 73 20 61 20 68 6f 6d 65 20 64 69 72 65 63   as a home direc
9f10: 74 6f 72 79 0a 09 09 20 2a 20 69 6e 20 73 79 73  tory... * in sys
9f20: 74 65 6d 2e 69 6e 69 2e 20 52 65 74 75 72 6e 20  tem.ini. Return 
9f30: 22 7b 57 69 6e 64 6f 77 73 20 64 72 69 76 65 7d  "{Windows drive}
9f40: 3a 2f 22 2e 0a 09 09 20 2a 2f 0a 0a 09 09 47 65  :/".... */....Ge
9f50: 74 57 69 6e 64 6f 77 73 44 69 72 65 63 74 6f 72  tWindowsDirector
9f60: 79 41 28 62 75 66 2c 20 4d 41 58 5f 50 41 54 48  yA(buf, MAX_PATH
9f70: 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67  );...Tcl_DString
9f80: 41 70 70 65 6e 64 28 62 75 66 66 65 72 50 74 72  Append(bufferPtr
9f90: 2c 20 62 75 66 2c 20 33 29 3b 0a 09 09 72 65 73  , buf, 3);...res
9fa0: 75 6c 74 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e  ult = Tcl_DStrin
9fb0: 67 56 61 6c 75 65 28 62 75 66 66 65 72 50 74 72  gValue(bufferPtr
9fc0: 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
9fd0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72   }..    return r
9fe0: 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  esult;.}.../*. *
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
a040: 2a 20 4e 61 74 69 76 65 41 63 63 65 73 73 20 2d  * NativeAccess -
a050: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e  -. *. *.This fun
a060: 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74  ction replaces t
a070: 68 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69  he library versi
a080: 6f 6e 20 6f 66 20 61 63 63 65 73 73 28 29 2c 20  on of access(), 
a090: 66 69 78 69 6e 67 20 74 68 65 0a 20 2a 09 66 6f  fixing the. *.fo
a0a0: 6c 6c 6f 77 69 6e 67 20 62 75 67 73 3a 0a 20 2a  llowing bugs:. *
a0b0: 0a 20 2a 09 31 2e 20 61 63 63 65 73 73 28 29 20  . *.1. access() 
a0c0: 72 65 74 75 72 6e 73 20 74 68 61 74 20 61 6c 6c  returns that all
a0d0: 20 66 69 6c 65 73 20 68 61 76 65 20 65 78 65 63   files have exec
a0e0: 75 74 65 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a  ute permission..
a0f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
a100: 2a 09 53 65 65 20 61 63 63 65 73 73 20 64 6f 63  *.See access doc
a110: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20  umentation.. *. 
a120: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
a130: 20 2a 09 53 65 65 20 61 63 63 65 73 73 20 64 6f   *.See access do
a140: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a  cumentation.. *.
a150: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
a160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
a1a0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 61  /..static int.Na
a1b0: 74 69 76 65 41 63 63 65 73 73 28 0a 20 20 20 20  tiveAccess(.    
a1c0: 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61 74  const TCHAR *nat
a1d0: 69 76 65 50 61 74 68 2c 09 2f 2a 20 50 61 74 68  ivePath,./* Path
a1e0: 20 6f 66 20 66 69 6c 65 20 74 6f 20 61 63 63 65   of file to acce
a1f0: 73 73 2c 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ss, native encod
a200: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ing. */.    int 
a210: 6d 6f 64 65 29 09 09 09 2f 2a 20 50 65 72 6d 69  mode).../* Permi
a220: 73 73 69 6f 6e 20 73 65 74 74 69 6e 67 2e 20 2a  ssion setting. *
a230: 2f 0a 7b 0a 20 20 20 20 44 57 4f 52 44 20 61 74  /.{.    DWORD at
a240: 74 72 3b 0a 0a 20 20 20 20 61 74 74 72 20 3d 20  tr;..    attr = 
a250: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67  (*tclWinProcs->g
a260: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
a270: 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68  Proc)(nativePath
a280: 29 3b 0a 0a 20 20 20 20 69 66 20 28 61 74 74 72  );..    if (attr
a290: 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66 29 20   == 0xffffffff) 
a2a0: 7b 0a 09 2f 2a 0a 09 20 2a 20 46 69 6c 65 20 6d  {../*.. * File m
a2b0: 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 2e 0a  ight not exist..
a2c0: 09 20 2a 2f 0a 0a 09 44 57 4f 52 44 20 6c 61 73  . */...DWORD las
a2d0: 74 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74  terror = GetLast
a2e0: 45 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 6c 61  Error();..if (la
a2f0: 73 74 65 72 72 6f 72 20 21 3d 20 45 52 52 4f 52  sterror != ERROR
a300: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
a310: 4f 4e 29 20 7b 0a 09 20 20 20 20 54 63 6c 57 69  ON) {..    TclWi
a320: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 6c 61  nConvertError(la
a330: 73 74 65 72 72 6f 72 29 3b 0a 09 20 20 20 20 72  sterror);..    r
a340: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20  eturn -1;..}.   
a350: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a360: 20 3d 3d 20 46 5f 4f 4b 29 20 7b 0a 09 2f 2a 0a   == F_OK) {../*.
a370: 09 20 2a 20 46 69 6c 65 20 65 78 69 73 74 73 2c  . * File exists,
a380: 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 74 6f   nothing else to
a390: 20 63 68 65 63 6b 2e 0a 09 20 2a 2f 0a 0a 09 72   check... */...r
a3a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
a3b0: 20 20 20 20 2f 2a 20 0a 20 20 20 20 20 2a 20 49      /* .     * I
a3c0: 66 20 69 74 27 73 20 6e 6f 74 20 61 20 64 69 72  f it's not a dir
a3d0: 65 63 74 6f 72 79 20 28 61 73 73 75 6d 65 20 66  ectory (assume f
a3e0: 69 6c 65 29 2c 20 64 6f 20 73 65 76 65 72 61 6c  ile), do several
a3f0: 20 66 61 73 74 20 63 68 65 63 6b 73 3a 0a 20 20   fast checks:.  
a400: 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 28     */.    if (!(
a410: 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
a420: 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
a430: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74  ) {../*.. * If t
a440: 68 65 20 61 74 74 72 69 62 75 74 65 73 20 73 61  he attributes sa
a450: 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 77 72  y this is not wr
a460: 69 74 61 62 6c 65 20 61 74 20 61 6c 6c 2e 20 20  itable at all.  
a470: 54 68 65 20 66 69 6c 65 20 69 73 20 61 0a 09 20  The file is a.. 
a480: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 20 28  * regular file (
a490: 69 2e 65 2e 2c 20 6e 6f 74 20 61 20 64 69 72 65  i.e., not a dire
a4a0: 63 74 6f 72 79 29 2c 20 74 68 65 6e 20 74 68 65  ctory), then the
a4b0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 09 20 2a   file is not.. *
a4c0: 20 77 72 69 74 61 62 6c 65 2c 20 66 75 6c 6c 20   writable, full 
a4d0: 73 74 6f 70 2e 09 20 46 6f 72 20 64 69 72 65 63  stop.. For direc
a4e0: 74 6f 72 69 65 73 2c 20 74 68 65 20 72 65 61 64  tories, the read
a4f0: 2d 6f 6e 6c 79 20 62 69 74 20 69 73 0a 09 20 2a  -only bit is.. *
a500: 20 28 6d 6f 73 74 6c 79 29 20 69 67 6e 6f 72 65   (mostly) ignore
a510: 64 20 62 79 20 57 69 6e 64 6f 77 73 2c 20 73 6f  d by Windows, so
a520: 20 77 65 20 63 61 6e 27 74 20 61 73 63 65 72 74   we can't ascert
a530: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 61 62 6f  ain anything abo
a540: 75 74 0a 09 20 2a 20 64 69 72 65 63 74 6f 72 79  ut.. * directory
a550: 20 61 63 63 65 73 73 20 66 72 6f 6d 20 74 68 65   access from the
a560: 20 61 74 74 72 69 62 20 64 61 74 61 2e 20 20 48   attrib data.  H
a570: 6f 77 65 76 65 72 2c 20 69 66 20 77 65 20 68 61  owever, if we ha
a580: 76 65 20 74 68 65 0a 09 20 2a 20 61 64 76 61 6e  ve the.. * advan
a590: 63 65 64 20 27 67 65 74 46 69 6c 65 53 65 63 75  ced 'getFileSecu
a5a0: 72 69 74 79 50 72 6f 63 27 2c 20 74 68 65 6e 20  rityProc', then 
a5b0: 6d 6f 72 65 20 72 6f 62 75 73 74 20 41 43 4c 20  more robust ACL 
a5c0: 63 68 65 63 6b 73 0a 09 20 2a 20 77 69 6c 6c 20  checks.. * will 
a5d0: 62 65 20 64 6f 6e 65 20 62 65 6c 6f 77 2e 0a 09  be done below...
a5e0: 20 2a 2f 0a 09 69 66 20 28 28 6d 6f 64 65 20 26   */..if ((mode &
a5f0: 20 57 5f 4f 4b 29 20 26 26 20 28 61 74 74 72 20   W_OK) && (attr 
a600: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
a610: 5f 52 45 41 44 4f 4e 4c 59 29 29 20 7b 0a 09 20  _READONLY)) {.. 
a620: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28     Tcl_SetErrno(
a630: 45 41 43 43 45 53 29 3b 0a 09 20 20 20 20 72 65  EACCES);..    re
a640: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a  turn -1;..}.../*
a650: 20 49 66 20 64 6f 65 73 6e 27 74 20 68 61 76 65   If doesn't have
a660: 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 78 74   the correct ext
a670: 65 6e 73 69 6f 6e 2c 20 69 74 20 63 61 6e 27 74  ension, it can't
a680: 20 62 65 20 65 78 65 63 75 74 61 62 6c 65 20 2a   be executable *
a690: 2f 0a 09 69 66 20 28 28 6d 6f 64 65 20 26 20 58  /..if ((mode & X
a6a0: 5f 4f 4b 29 20 26 26 20 21 4e 61 74 69 76 65 49  _OK) && !NativeI
a6b0: 73 45 78 65 63 28 6e 61 74 69 76 65 50 61 74 68  sExec(nativePath
a6c0: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  )) {..    Tcl_Se
a6d0: 74 45 72 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a  tErrno(EACCES);.
a6e0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
a6f0: 09 7d 0a 09 2f 2a 20 53 70 65 63 69 61 6c 20 63  .}../* Special c
a700: 61 73 65 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ase for read/wri
a710: 74 65 2f 65 78 65 63 75 74 61 62 6c 65 20 63 68  te/executable ch
a720: 65 63 6b 20 6f 6e 20 66 69 6c 65 20 2a 2f 0a 09  eck on file */..
a730: 69 66 20 28 28 6d 6f 64 65 20 26 20 28 52 5f 4f  if ((mode & (R_O
a740: 4b 7c 57 5f 4f 4b 7c 58 5f 4f 4b 29 29 20 26 26  K|W_OK|X_OK)) &&
a750: 20 21 28 6d 6f 64 65 20 26 20 7e 28 52 5f 4f 4b   !(mode & ~(R_OK
a760: 7c 57 5f 4f 4b 7c 58 5f 4f 4b 29 29 29 20 7b 0a  |W_OK|X_OK))) {.
a770: 09 20 20 20 20 44 57 4f 52 44 20 6d 61 73 6b 20  .    DWORD mask 
a780: 3d 20 30 3b 0a 09 20 20 20 20 48 41 4e 44 4c 45  = 0;..    HANDLE
a790: 20 68 46 69 6c 65 3b 0a 09 20 20 20 20 69 66 20   hFile;..    if 
a7a0: 28 6d 6f 64 65 20 26 20 52 5f 4f 4b 29 20 7b 20  (mode & R_OK) { 
a7b0: 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43 5f  mask |= GENERIC_
a7c0: 52 45 41 44 3b 20 20 7d 0a 09 20 20 20 20 69 66  READ;  }..    if
a7d0: 20 28 6d 6f 64 65 20 26 20 57 5f 4f 4b 29 20 7b   (mode & W_OK) {
a7e0: 20 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49 43   mask |= GENERIC
a7f0: 5f 57 52 49 54 45 3b 20 7d 0a 09 20 20 20 20 69  _WRITE; }..    i
a800: 66 20 28 6d 6f 64 65 20 26 20 58 5f 4f 4b 29 20  f (mode & X_OK) 
a810: 7b 20 6d 61 73 6b 20 7c 3d 20 47 45 4e 45 52 49  { mask |= GENERI
a820: 43 5f 45 58 45 43 55 54 45 3b 20 7d 0a 0a 09 20  C_EXECUTE; }... 
a830: 20 20 20 68 46 69 6c 65 20 3d 20 28 74 63 6c 57     hFile = (tclW
a840: 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65 46  inProcs->createF
a850: 69 6c 65 50 72 6f 63 29 28 6e 61 74 69 76 65 50  ileProc)(nativeP
a860: 61 74 68 2c 20 6d 61 73 6b 2c 0a 09 09 46 49 4c  ath, mask,...FIL
a870: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
a880: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 20  ILE_SHARE_WRITE 
a890: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 44 45 4c  | FILE_SHARE_DEL
a8a0: 45 54 45 2c 20 4e 55 4c 4c 2c 0a 09 09 4f 50 45  ETE, NULL,...OPE
a8b0: 4e 5f 45 58 49 53 54 49 4e 47 2c 20 46 49 4c 45  N_EXISTING, FILE
a8c0: 5f 46 4c 41 47 5f 4e 4f 5f 42 55 46 46 45 52 49  _FLAG_NO_BUFFERI
a8d0: 4e 47 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  NG, NULL);..    
a8e0: 69 66 20 28 68 46 69 6c 65 20 21 3d 20 49 4e 56  if (hFile != INV
a8f0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
a900: 45 29 20 7b 0a 09 09 43 6c 6f 73 65 48 61 6e 64  E) {...CloseHand
a910: 6c 65 28 68 46 69 6c 65 29 3b 0a 09 09 72 65 74  le(hFile);...ret
a920: 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20  urn 0;..    }.. 
a930: 20 20 20 2f 2a 20 66 61 73 74 20 65 78 69 74 20     /* fast exit 
a940: 69 66 20 61 63 63 65 73 73 20 77 61 73 20 64 65  if access was de
a950: 6e 69 65 64 20 2a 2f 0a 09 20 20 20 20 69 66 20  nied */..    if 
a960: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  (GetLastError() 
a970: 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  == ERROR_ACCESS_
a980: 44 45 4e 49 45 44 29 20 7b 0a 09 09 54 63 6c 5f  DENIED) {...Tcl_
a990: 53 65 74 45 72 72 6e 6f 28 45 41 43 43 45 53 29  SetErrno(EACCES)
a9a0: 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09  ;...return -1;..
a9b0: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 57 65 20      }..}../* We 
a9c0: 63 61 6e 6e 6e 6f 74 20 76 65 72 69 66 79 20 74  cannnot verify t
a9d0: 68 65 20 61 63 63 65 73 73 20 66 61 73 74 2c 20  he access fast, 
a9e0: 63 68 65 63 6b 20 69 74 20 62 65 6c 6f 77 20 75  check it below u
a9f0: 73 69 6e 67 20 73 65 63 75 72 69 74 79 20 69 6e  sing security in
aa00: 66 6f 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  fo. */.    }..  
aa10: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 74 20 6c    /*.     * It l
aa20: 6f 6f 6b 73 20 61 73 20 69 66 20 74 68 65 20 70  ooks as if the p
aa30: 65 72 6d 69 73 73 69 6f 6e 73 20 61 72 65 20 6f  ermissions are o
aa40: 6b 2c 20 62 75 74 20 69 66 20 77 65 20 61 72 65  k, but if we are
aa50: 20 6f 6e 20 4e 54 2c 20 32 30 30 30 20 6f 72 20   on NT, 2000 or 
aa60: 58 50 2c 0a 20 20 20 20 20 2a 20 77 65 20 68 61  XP,.     * we ha
aa70: 76 65 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  ve a more comple
aa80: 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 73 74  x permissions st
aa90: 72 75 63 74 75 72 65 20 73 6f 20 77 65 20 74 72  ructure so we tr
aaa0: 79 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 2e  y to check that.
aab0: 0a 20 20 20 20 20 2a 20 54 68 65 20 63 6f 64 65  .     * The code
aac0: 20 62 65 6c 6f 77 20 69 73 20 72 65 6d 61 72 6b   below is remark
aad0: 61 62 6c 79 20 63 6f 6d 70 6c 65 78 20 66 6f 72  ably complex for
aae0: 20 73 75 63 68 20 61 20 73 69 6d 70 6c 65 20 74   such a simple t
aaf0: 68 69 6e 67 20 61 73 20 66 69 6e 64 69 6e 67 0a  hing as finding.
ab00: 20 20 20 20 20 2a 20 77 68 61 74 20 70 65 72 6d       * what perm
ab10: 69 73 73 69 6f 6e 73 20 74 68 65 20 4f 53 20 68  issions the OS h
ab20: 61 73 20 73 65 74 20 66 6f 72 20 61 20 66 69 6c  as set for a fil
ab30: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
ab40: 69 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d  if (tclWinProcs-
ab50: 3e 67 65 74 46 69 6c 65 53 65 63 75 72 69 74 79  >getFileSecurity
ab60: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Proc != NULL) {.
ab70: 09 53 45 43 55 52 49 54 59 5f 44 45 53 43 52 49  .SECURITY_DESCRI
ab80: 50 54 4f 52 20 2a 73 64 50 74 72 20 3d 20 4e 55  PTOR *sdPtr = NU
ab90: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  LL;..unsigned lo
aba0: 6e 67 20 73 69 7a 65 3b 0a 09 50 53 49 44 20 70  ng size;..PSID p
abb0: 53 69 64 20 3d 20 30 3b 0a 09 42 4f 4f 4c 20 53  Sid = 0;..BOOL S
abc0: 69 64 44 65 66 61 75 6c 74 65 64 3b 0a 09 53 49  idDefaulted;..SI
abd0: 44 5f 49 44 45 4e 54 49 46 49 45 52 5f 41 55 54  D_IDENTIFIER_AUT
abe0: 48 4f 52 49 54 59 20 73 61 6d 62 61 5f 75 6e 6d  HORITY samba_unm
abf0: 61 70 70 65 64 20 3d 20 7b 7b 30 2c 20 30 2c 20  apped = {{0, 0, 
ac00: 30 2c 20 30 2c 20 30 2c 20 32 32 7d 7d 3b 0a 09  0, 0, 0, 22}};..
ac10: 47 45 4e 45 52 49 43 5f 4d 41 50 50 49 4e 47 20  GENERIC_MAPPING 
ac20: 67 65 6e 4d 61 70 3b 0a 09 48 41 4e 44 4c 45 20  genMap;..HANDLE 
ac30: 68 54 6f 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 09  hToken = NULL;..
ac40: 44 57 4f 52 44 20 64 65 73 69 72 65 64 41 63 63  DWORD desiredAcc
ac50: 65 73 73 20 3d 20 30 2c 20 67 72 61 6e 74 65 64  ess = 0, granted
ac60: 41 63 63 65 73 73 20 3d 20 30 3b 0a 09 42 4f 4f  Access = 0;..BOO
ac70: 4c 20 61 63 63 65 73 73 59 65 73 4e 6f 20 3d 20  L accessYesNo = 
ac80: 46 41 4c 53 45 3b 0a 09 50 52 49 56 49 4c 45 47  FALSE;..PRIVILEG
ac90: 45 5f 53 45 54 20 70 72 69 76 53 65 74 3b 0a 09  E_SET privSet;..
aca0: 44 57 4f 52 44 20 70 72 69 76 53 65 74 53 69 7a  DWORD privSetSiz
acb0: 65 20 3d 20 73 69 7a 65 6f 66 28 50 52 49 56 49  e = sizeof(PRIVI
acc0: 4c 45 47 45 5f 53 45 54 29 3b 0a 09 69 6e 74 20  LEGE_SET);..int 
acd0: 65 72 72 6f 72 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  error;.../*.. * 
ace0: 46 69 72 73 74 20 66 69 6e 64 20 6f 75 74 20 68  First find out h
acf0: 6f 77 20 62 69 67 20 74 68 65 20 62 75 66 66 65  ow big the buffe
ad00: 72 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 09 20  r needs to be.. 
ad10: 2a 2f 0a 0a 09 73 69 7a 65 20 3d 20 30 3b 0a 09  */...size = 0;..
ad20: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67  (*tclWinProcs->g
ad30: 65 74 46 69 6c 65 53 65 63 75 72 69 74 79 50 72  etFileSecurityPr
ad40: 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c 0a  oc)(nativePath,.
ad50: 09 09 4f 57 4e 45 52 5f 53 45 43 55 52 49 54 59  ..OWNER_SECURITY
ad60: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 47  _INFORMATION | G
ad70: 52 4f 55 50 5f 53 45 43 55 52 49 54 59 5f 49 4e  ROUP_SECURITY_IN
ad80: 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c 20 44 41  FORMATION...| DA
ad90: 43 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f  CL_SECURITY_INFO
ada0: 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 45 4c 5f  RMATION | LABEL_
adb0: 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41  SECURITY_INFORMA
adc0: 54 49 4f 4e 2c 0a 09 09 30 2c 20 30 2c 20 26 73  TION,...0, 0, &s
add0: 69 7a 65 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53  ize);.../*.. * S
ade0: 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c 65  hould have faile
adf0: 64 20 77 69 74 68 20 45 52 52 4f 52 5f 49 4e 53  d with ERROR_INS
ae00: 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52  UFFICIENT_BUFFER
ae10: 0a 09 20 2a 2f 0a 0a 09 65 72 72 6f 72 20 3d 20  .. */...error = 
ae20: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
ae30: 09 69 66 20 28 65 72 72 6f 72 20 21 3d 20 45 52  .if (error != ER
ae40: 52 4f 52 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  ROR_INSUFFICIENT
ae50: 5f 42 55 46 46 45 52 29 20 7b 0a 09 20 20 20 20  _BUFFER) {..    
ae60: 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 6f 73 74 20  /*..     * Most 
ae70: 6c 69 6b 65 6c 79 20 63 61 73 65 20 69 73 20 45  likely case is E
ae80: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
ae90: 45 44 2c 20 77 68 69 63 68 20 77 65 20 77 69 6c  ED, which we wil
aea0: 6c 20 63 6f 6e 76 65 72 74 0a 09 20 20 20 20 20  l convert..     
aeb0: 2a 20 74 6f 20 45 41 43 43 45 53 20 2d 20 6a 75  * to EACCES - ju
aec0: 73 74 20 77 68 61 74 20 77 65 20 77 61 6e 74 21  st what we want!
aed0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
aee0: 54 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72  TclWinConvertErr
aef0: 6f 72 28 28 44 57 4f 52 44 29 20 65 72 72 6f 72  or((DWORD) error
af00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d  );..    return -
af10: 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4e  1;..}.../*.. * N
af20: 6f 77 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 73  ow size contains
af30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 62 75 66   the size of buf
af40: 66 65 72 20 6e 65 65 64 65 64 2e 0a 09 20 2a 2f  fer needed... */
af50: 0a 0a 09 73 64 50 74 72 20 3d 20 28 53 45 43 55  ...sdPtr = (SECU
af60: 52 49 54 59 5f 44 45 53 43 52 49 50 54 4f 52 20  RITY_DESCRIPTOR 
af70: 2a 29 20 48 65 61 70 41 6c 6c 6f 63 28 47 65 74  *) HeapAlloc(Get
af80: 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30  ProcessHeap(), 0
af90: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 73  , size);...if (s
afa0: 64 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  dPtr == NULL) {.
afb0: 09 20 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73  .    goto access
afc0: 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  Error;..}.../*..
afd0: 20 2a 20 43 61 6c 6c 20 47 65 74 46 69 6c 65 53   * Call GetFileS
afe0: 65 63 75 72 69 74 79 28 29 20 66 6f 72 20 72 65  ecurity() for re
aff0: 61 6c 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21  al... */...if (!
b000: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67  (*tclWinProcs->g
b010: 65 74 46 69 6c 65 53 65 63 75 72 69 74 79 50 72  etFileSecurityPr
b020: 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c 0a  oc)(nativePath,.
b030: 09 09 4f 57 4e 45 52 5f 53 45 43 55 52 49 54 59  ..OWNER_SECURITY
b040: 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 7c 20 47  _INFORMATION | G
b050: 52 4f 55 50 5f 53 45 43 55 52 49 54 59 5f 49 4e  ROUP_SECURITY_IN
b060: 46 4f 52 4d 41 54 49 4f 4e 0a 09 09 7c 20 44 41  FORMATION...| DA
b070: 43 4c 5f 53 45 43 55 52 49 54 59 5f 49 4e 46 4f  CL_SECURITY_INFO
b080: 52 4d 41 54 49 4f 4e 20 7c 20 4c 41 42 45 4c 5f  RMATION | LABEL_
b090: 53 45 43 55 52 49 54 59 5f 49 4e 46 4f 52 4d 41  SECURITY_INFORMA
b0a0: 54 49 4f 4e 2c 0a 09 09 73 64 50 74 72 2c 20 73  TION,...sdPtr, s
b0b0: 69 7a 65 2c 20 26 73 69 7a 65 29 29 20 7b 0a 09  ize, &size)) {..
b0c0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45      /*..     * E
b0d0: 72 72 6f 72 20 67 65 74 74 69 6e 67 20 6f 77 6e  rror getting own
b0e0: 65 72 20 53 44 0a 09 20 20 20 20 20 2a 2f 0a 0a  er SD..     */..
b0f0: 09 20 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73  .    goto access
b100: 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  Error;..}.../*..
b110: 20 2a 20 41 73 20 6f 66 20 53 61 6d 62 61 20 33   * As of Samba 3
b120: 2e 30 2e 32 33 20 28 31 30 2d 4a 75 6c 2d 32 30  .0.23 (10-Jul-20
b130: 30 36 29 2c 20 75 6e 6d 61 70 70 65 64 20 75 73  06), unmapped us
b140: 65 72 73 20 61 6e 64 20 67 72 6f 75 70 73 20 61  ers and groups a
b150: 72 65 0a 09 20 2a 20 61 73 73 69 67 6e 65 64 20  re.. * assigned 
b160: 74 6f 20 53 49 44 20 64 6f 6d 61 69 6e 73 20 53  to SID domains S
b170: 2d 31 2d 32 32 2d 31 20 61 6e 64 20 53 2d 31 2d  -1-22-1 and S-1-
b180: 32 32 2d 32 2c 20 77 68 65 72 65 20 22 32 32 22  22-2, where "22"
b190: 20 69 73 20 74 68 65 0a 09 20 2a 20 74 6f 70 2d   is the.. * top-
b1a0: 6c 65 76 65 6c 20 61 75 74 68 6f 72 69 74 79 2e  level authority.
b1b0: 09 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 77  . If the file ow
b1c0: 6e 65 72 20 61 6e 64 20 67 72 6f 75 70 20 69 73  ner and group is
b1d0: 20 75 6e 6d 61 70 70 65 64 20 74 68 65 6e 0a 09   unmapped then..
b1e0: 20 2a 20 74 68 65 20 41 43 4c 20 61 63 63 65 73   * the ACL acces
b1f0: 73 20 63 68 65 63 6b 20 62 65 6c 6f 77 20 77 69  s check below wi
b200: 6c 6c 20 6f 6e 6c 79 20 74 65 73 74 20 61 67 61  ll only test aga
b210: 69 6e 73 74 20 77 6f 72 6c 64 20 61 63 63 65 73  inst world acces
b220: 73 2c 0a 09 20 2a 20 77 68 69 63 68 20 69 73 20  s,.. * which is 
b230: 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 6d 6f 72  likely to be mor
b240: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 74 68  e restrictive th
b250: 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 61 63  an the actual ac
b260: 63 65 73 73 0a 09 20 2a 20 72 65 73 74 72 69 63  cess.. * restric
b270: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 74 68  tions.  Since th
b280: 65 20 41 43 4c 20 74 65 73 74 73 20 61 72 65 20  e ACL tests are 
b290: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 77 72 6f 6e  more likely wron
b2a0: 67 20 74 68 61 6e 0a 09 20 2a 20 72 69 67 68 74  g than.. * right
b2b0: 2c 20 73 6b 69 70 20 74 68 65 6d 2e 20 20 4d 6f  , skip them.  Mo
b2c0: 72 65 6f 76 65 72 2c 20 74 68 65 20 75 6e 69 78  reover, the unix
b2d0: 20 6f 77 6e 65 72 20 61 63 63 65 73 73 20 70 65   owner access pe
b2e0: 72 6d 69 73 73 69 6f 6e 73 20 61 72 65 0a 09 20  rmissions are.. 
b2f0: 2a 20 75 73 75 61 6c 6c 79 20 6d 61 70 70 65 64  * usually mapped
b300: 20 74 6f 20 74 68 65 20 57 69 6e 64 6f 77 73 20   to the Windows 
b310: 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 20 69  attributes, so i
b320: 66 20 74 68 65 20 75 73 65 72 20 69 73 20 74 68  f the user is th
b330: 65 0a 09 20 2a 20 66 69 6c 65 20 6f 77 6e 65 72  e.. * file owner
b340: 20 74 68 65 6e 20 74 68 65 20 61 74 74 72 69 62   then the attrib
b350: 20 63 68 65 63 6b 73 20 61 62 6f 76 65 20 61 72   checks above ar
b360: 65 20 63 6f 72 72 65 63 74 20 28 61 73 20 66 61  e correct (as fa
b370: 72 20 61 73 20 74 68 65 79 0a 09 20 2a 20 67 6f  r as they.. * go
b380: 29 2e 0a 09 20 2a 2f 0a 0a 09 69 66 28 21 47 65  )... */...if(!Ge
b390: 74 53 65 63 75 72 69 74 79 44 65 73 63 72 69 70  tSecurityDescrip
b3a0: 74 6f 72 4f 77 6e 65 72 28 73 64 50 74 72 2c 26  torOwner(sdPtr,&
b3b0: 70 53 69 64 2c 26 53 69 64 44 65 66 61 75 6c 74  pSid,&SidDefault
b3c0: 65 64 29 20 7c 7c 0a 09 20 20 20 6d 65 6d 63 6d  ed) ||..   memcm
b3d0: 70 28 47 65 74 53 69 64 49 64 65 6e 74 69 66 69  p(GetSidIdentifi
b3e0: 65 72 41 75 74 68 6f 72 69 74 79 28 70 53 69 64  erAuthority(pSid
b3f0: 29 2c 26 73 61 6d 62 61 5f 75 6e 6d 61 70 70 65  ),&samba_unmappe
b400: 64 2c 0a 09 09 20 20 73 69 7a 65 6f 66 28 53 49  d,...  sizeof(SI
b410: 44 5f 49 44 45 4e 54 49 46 49 45 52 5f 41 55 54  D_IDENTIFIER_AUT
b420: 48 4f 52 49 54 59 29 29 3d 3d 30 29 20 7b 0a 09  HORITY))==0) {..
b430: 20 20 20 20 48 65 61 70 46 72 65 65 28 47 65 74      HeapFree(Get
b440: 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30  ProcessHeap(), 0
b450: 2c 20 73 64 50 74 72 29 3b 0a 09 20 20 20 20 72  , sdPtr);..    r
b460: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 41 74 74 72  eturn 0; /* Attr
b470: 69 62 20 74 65 73 74 73 20 73 61 79 20 61 63 63  ib tests say acc
b480: 65 73 73 20 61 6c 6c 6f 77 65 64 2e 20 2a 2f 0a  ess allowed. */.
b490: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66  .}.../*.. * Perf
b4a0: 6f 72 6d 20 73 65 63 75 72 69 74 79 20 69 6d 70  orm security imp
b4b0: 65 72 73 6f 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ersonation of th
b4c0: 65 20 75 73 65 72 20 61 6e 64 20 6f 70 65 6e 20  e user and open 
b4d0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 09 20  the resulting.. 
b4e0: 2a 20 74 68 72 65 61 64 20 74 6f 6b 65 6e 2e 0a  * thread token..
b4f0: 09 20 2a 2f 0a 0a 09 69 66 20 28 21 28 2a 74 63  . */...if (!(*tc
b500: 6c 57 69 6e 50 72 6f 63 73 2d 3e 69 6d 70 65 72  lWinProcs->imper
b510: 73 6f 6e 61 74 65 53 65 6c 66 50 72 6f 63 29 28  sonateSelfProc)(
b520: 53 65 63 75 72 69 74 79 49 6d 70 65 72 73 6f 6e  SecurityImperson
b530: 61 74 69 6f 6e 29 29 20 7b 0a 09 20 20 20 20 2f  ation)) {..    /
b540: 2a 0a 09 20 20 20 20 20 2a 20 55 6e 61 62 6c 65  *..     * Unable
b550: 20 74 6f 20 70 65 72 66 6f 72 6d 20 73 65 63 75   to perform secu
b560: 72 69 74 79 20 69 6d 70 65 72 73 6f 6e 61 74 69  rity impersonati
b570: 6f 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  on...     */... 
b580: 20 20 20 67 6f 74 6f 20 61 63 63 65 73 73 45 72     goto accessEr
b590: 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 21 28 2a  ror;..}..if (!(*
b5a0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 6f 70 65  tclWinProcs->ope
b5b0: 6e 54 68 72 65 61 64 54 6f 6b 65 6e 50 72 6f 63  nThreadTokenProc
b5c0: 29 28 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  )(GetCurrentThre
b5d0: 61 64 28 29 2c 0a 09 09 54 4f 4b 45 4e 5f 44 55  ad(),...TOKEN_DU
b5e0: 50 4c 49 43 41 54 45 20 7c 20 54 4f 4b 45 4e 5f  PLICATE | TOKEN_
b5f0: 51 55 45 52 59 2c 20 46 41 4c 53 45 2c 20 26 68  QUERY, FALSE, &h
b600: 54 6f 6b 65 6e 29 29 20 7b 0a 09 20 20 20 20 2f  Token)) {..    /
b610: 2a 0a 09 20 20 20 20 20 2a 20 55 6e 61 62 6c 65  *..     * Unable
b620: 20 74 6f 20 67 65 74 20 63 75 72 72 65 6e 74 20   to get current 
b630: 74 68 72 65 61 64 27 73 20 74 6f 6b 65 6e 2e 0a  thread's token..
b640: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 67  .     */...    g
b650: 6f 74 6f 20 61 63 63 65 73 73 45 72 72 6f 72 3b  oto accessError;
b660: 0a 09 7d 0a 0a 09 28 2a 74 63 6c 57 69 6e 50 72  ..}...(*tclWinPr
b670: 6f 63 73 2d 3e 72 65 76 65 72 74 54 6f 53 65 6c  ocs->revertToSel
b680: 66 50 72 6f 63 29 28 29 3b 0a 0a 09 2f 2a 0a 09  fProc)();.../*..
b690: 20 2a 20 53 65 74 75 70 20 64 65 73 69 72 65 64   * Setup desired
b6a0: 41 63 63 65 73 73 20 61 63 63 6f 72 64 69 6e 67  Access according
b6b0: 20 74 6f 20 74 68 65 20 61 63 63 65 73 73 20 70   to the access p
b6c0: 72 69 76 65 6c 65 67 65 73 20 77 65 20 61 72 65  riveleges we are
b6d0: 0a 09 20 2a 20 63 68 65 63 6b 69 6e 67 2e 0a 09  .. * checking...
b6e0: 20 2a 2f 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26   */...if (mode &
b6f0: 20 52 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65   R_OK) {..    de
b700: 73 69 72 65 64 41 63 63 65 73 73 20 7c 3d 20 46  siredAccess |= F
b710: 49 4c 45 5f 47 45 4e 45 52 49 43 5f 52 45 41 44  ILE_GENERIC_READ
b720: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
b730: 20 57 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64 65   W_OK) {..    de
b740: 73 69 72 65 64 41 63 63 65 73 73 20 7c 3d 20 46  siredAccess |= F
b750: 49 4c 45 5f 47 45 4e 45 52 49 43 5f 57 52 49 54  ILE_GENERIC_WRIT
b760: 45 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  E;..}..if (mode 
b770: 26 20 58 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 64  & X_OK) {..    d
b780: 65 73 69 72 65 64 41 63 63 65 73 73 20 7c 3d 20  esiredAccess |= 
b790: 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 45 58 45  FILE_GENERIC_EXE
b7a0: 43 55 54 45 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  CUTE;..}...memse
b7b0: 74 28 26 67 65 6e 4d 61 70 2c 20 30 78 30 2c 20  t(&genMap, 0x0, 
b7c0: 73 69 7a 65 6f 66 28 47 45 4e 45 52 49 43 5f 4d  sizeof(GENERIC_M
b7d0: 41 50 50 49 4e 47 29 29 3b 0a 09 67 65 6e 4d 61  APPING));..genMa
b7e0: 70 2e 47 65 6e 65 72 69 63 52 65 61 64 20 3d 20  p.GenericRead = 
b7f0: 46 49 4c 45 5f 47 45 4e 45 52 49 43 5f 52 45 41  FILE_GENERIC_REA
b800: 44 3b 0a 09 67 65 6e 4d 61 70 2e 47 65 6e 65 72  D;..genMap.Gener
b810: 69 63 57 72 69 74 65 20 3d 20 46 49 4c 45 5f 47  icWrite = FILE_G
b820: 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 09 67  ENERIC_WRITE;..g
b830: 65 6e 4d 61 70 2e 47 65 6e 65 72 69 63 45 78 65  enMap.GenericExe
b840: 63 75 74 65 20 3d 20 46 49 4c 45 5f 47 45 4e 45  cute = FILE_GENE
b850: 52 49 43 5f 45 58 45 43 55 54 45 3b 0a 09 67 65  RIC_EXECUTE;..ge
b860: 6e 4d 61 70 2e 47 65 6e 65 72 69 63 41 6c 6c 20  nMap.GenericAll 
b870: 3d 20 46 49 4c 45 5f 41 4c 4c 5f 41 43 43 45 53  = FILE_ALL_ACCES
b880: 53 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 50 65 72 66  S;.../*.. * Perf
b890: 6f 72 6d 20 61 63 63 65 73 73 20 63 68 65 63 6b  orm access check
b8a0: 20 75 73 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e   using the token
b8b0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 21 28 2a  ... */...if (!(*
b8c0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 61 63 63  tclWinProcs->acc
b8d0: 65 73 73 43 68 65 63 6b 50 72 6f 63 29 28 73 64  essCheckProc)(sd
b8e0: 50 74 72 2c 20 68 54 6f 6b 65 6e 2c 20 64 65 73  Ptr, hToken, des
b8f0: 69 72 65 64 41 63 63 65 73 73 2c 0a 09 09 26 67  iredAccess,...&g
b900: 65 6e 4d 61 70 2c 20 26 70 72 69 76 53 65 74 2c  enMap, &privSet,
b910: 20 26 70 72 69 76 53 65 74 53 69 7a 65 2c 20 26   &privSetSize, &
b920: 67 72 61 6e 74 65 64 41 63 63 65 73 73 2c 0a 09  grantedAccess,..
b930: 09 26 61 63 63 65 73 73 59 65 73 4e 6f 29 29 20  .&accessYesNo)) 
b940: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
b950: 2a 20 55 6e 61 62 6c 65 20 74 6f 20 70 65 72 66  * Unable to perf
b960: 6f 72 6d 20 61 63 63 65 73 73 20 63 68 65 63 6b  orm access check
b970: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 61 63 63  ...     */...acc
b980: 65 73 73 45 72 72 6f 72 3a 0a 09 20 20 20 20 54  essError:..    T
b990: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  clWinConvertErro
b9a0: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  r(GetLastError()
b9b0: 29 3b 0a 09 20 20 20 20 69 66 20 28 73 64 50 74  );..    if (sdPt
b9c0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 48  r != NULL) {...H
b9d0: 65 61 70 46 72 65 65 28 47 65 74 50 72 6f 63 65  eapFree(GetProce
b9e0: 73 73 48 65 61 70 28 29 2c 20 30 2c 20 73 64 50  ssHeap(), 0, sdP
b9f0: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  tr);..    }..   
ba00: 20 69 66 20 28 68 54 6f 6b 65 6e 20 21 3d 20 4e   if (hToken != N
ba10: 55 4c 4c 29 20 7b 0a 09 09 43 6c 6f 73 65 48 61  ULL) {...CloseHa
ba20: 6e 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 20  ndle(hToken);.. 
ba30: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
ba40: 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a   -1;..}.../*.. *
ba50: 20 43 6c 65 61 6e 20 75 70 2e 0a 09 20 2a 2f 0a   Clean up... */.
ba60: 0a 09 48 65 61 70 46 72 65 65 28 47 65 74 50 72  ..HeapFree(GetPr
ba70: 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20  ocessHeap(), 0, 
ba80: 73 64 50 74 72 29 3b 0a 09 43 6c 6f 73 65 48 61  sdPtr);..CloseHa
ba90: 6e 64 6c 65 28 68 54 6f 6b 65 6e 29 3b 0a 09 69  ndle(hToken);..i
baa0: 66 20 28 21 61 63 63 65 73 73 59 65 73 4e 6f 29  f (!accessYesNo)
bab0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45   {..    Tcl_SetE
bac0: 72 72 6e 6f 28 45 41 43 43 45 53 29 3b 0a 09 20  rrno(EACCES);.. 
bad0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d     return -1;..}
bae0: 0a 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ..    }.    retu
baf0: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
bb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb40: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61 74 69  -----. *. * Nati
bb50: 76 65 49 73 45 78 65 63 20 2d 2d 0a 20 2a 0a 20  veIsExec --. *. 
bb60: 2a 09 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20  *.Determines if 
bb70: 61 20 70 61 74 68 20 69 73 20 65 78 65 63 75 74  a path is execut
bb80: 61 62 6c 65 2e 20 4f 6e 20 77 69 6e 64 6f 77 73  able. On windows
bb90: 20 74 68 69 73 20 69 73 20 73 69 6d 70 6c 79 20   this is simply 
bba0: 64 65 66 69 6e 65 64 0a 20 2a 09 62 79 20 77 68  defined. *.by wh
bbb0: 65 74 68 65 72 20 74 68 65 20 70 61 74 68 20 65  ether the path e
bbc0: 6e 64 73 20 69 6e 20 61 20 73 74 61 6e 64 61 72  nds in a standar
bbd0: 64 20 65 78 65 63 75 74 61 62 6c 65 20 65 78 74  d executable ext
bbe0: 65 6e 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  ension.. *. * Re
bbf0: 73 75 6c 74 73 3a 0a 20 2a 09 31 20 3d 20 65 78  sults:. *.1 = ex
bc00: 65 63 75 74 61 62 6c 65 2c 20 30 20 3d 20 6e 6f  ecutable, 0 = no
bc10: 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  t.. *. *--------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
bc60: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e  */..static int.N
bc70: 61 74 69 76 65 49 73 45 78 65 63 28 0a 20 20 20  ativeIsExec(.   
bc80: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61   const TCHAR *na
bc90: 74 69 76 65 50 61 74 68 29 0a 7b 0a 20 20 20 20  tivePath).{.    
bca0: 69 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d  if (tclWinProcs-
bcb0: 3e 75 73 65 57 69 64 65 29 20 7b 0a 09 63 6f 6e  >useWide) {..con
bcc0: 73 74 20 57 43 48 41 52 20 2a 70 61 74 68 20 3d  st WCHAR *path =
bcd0: 20 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29   (const WCHAR *)
bce0: 20 6e 61 74 69 76 65 50 61 74 68 3b 0a 09 69 6e   nativePath;..in
bcf0: 74 20 6c 65 6e 20 3d 20 77 63 73 6c 65 6e 28 70  t len = wcslen(p
bd00: 61 74 68 29 3b 0a 0a 09 69 66 20 28 6c 65 6e 20  ath);...if (len 
bd10: 3c 20 35 29 20 7b 0a 09 20 20 20 20 72 65 74 75  < 5) {..    retu
bd20: 72 6e 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  rn 0;..}...if (p
bd30: 61 74 68 5b 6c 65 6e 2d 34 5d 20 21 3d 20 4c 27  ath[len-4] != L'
bd40: 2e 27 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  .') {..    retur
bd50: 6e 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  n 0;..}.../*.. *
bd60: 20 55 73 65 20 77 69 64 65 2d 63 68 61 72 20 63   Use wide-char c
bd70: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
bd80: 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 20 2a 2f 0a  comparison.. */.
bd90: 0a 09 70 61 74 68 20 2b 3d 20 6c 65 6e 2d 33 3b  ..path += len-3;
bda0: 0a 09 69 66 20 28 28 5f 77 63 73 69 63 6d 70 28  ..if ((_wcsicmp(
bdb0: 70 61 74 68 2c 20 4c 22 65 78 65 22 29 20 3d 3d  path, L"exe") ==
bdc0: 20 30 29 0a 09 09 7c 7c 20 28 5f 77 63 73 69 63   0)...|| (_wcsic
bdd0: 6d 70 28 70 61 74 68 2c 20 4c 22 63 6f 6d 22 29  mp(path, L"com")
bde0: 20 3d 3d 20 30 29 0a 09 09 7c 7c 20 28 5f 77 63   == 0)...|| (_wc
bdf0: 73 69 63 6d 70 28 70 61 74 68 2c 20 4c 22 63 6d  sicmp(path, L"cm
be00: 64 22 29 20 3d 3d 20 30 29 0a 09 09 7c 7c 20 28  d") == 0)...|| (
be10: 5f 77 63 73 69 63 6d 70 28 70 61 74 68 2c 20 4c  _wcsicmp(path, L
be20: 22 70 73 31 22 29 20 3d 3d 20 30 29 0a 09 09 7c  "ps1") == 0)...|
be30: 7c 20 28 5f 77 63 73 69 63 6d 70 28 70 61 74 68  | (_wcsicmp(path
be40: 2c 20 4c 22 62 61 74 22 29 20 3d 3d 20 30 29 29  , L"bat") == 0))
be50: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31   {..    return 1
be60: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
be70: 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  {..const char *p
be80: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 61 72  ;.../*.. * We ar
be90: 65 20 6f 6e 6c 79 20 6c 6f 6f 6b 69 6e 67 20 66  e only looking f
bea0: 6f 72 20 70 75 72 65 20 61 73 63 69 69 2e 0a 09  or pure ascii...
beb0: 20 2a 2f 0a 0a 09 70 20 3d 20 73 74 72 72 63 68   */...p = strrch
bec0: 72 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  r((const char *)
bed0: 20 6e 61 74 69 76 65 50 61 74 68 2c 20 27 2e 27   nativePath, '.'
bee0: 29 3b 0a 09 69 66 20 28 70 20 21 3d 20 4e 55 4c  );..if (p != NUL
bef0: 4c 29 20 7b 0a 09 20 20 20 20 70 2b 2b 3b 0a 0a  L) {..    p++;..
bf00: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
bf10: 4e 6f 74 65 3a 20 69 6e 20 74 68 65 20 6f 6c 64  Note: in the old
bf20: 20 63 6f 64 65 2c 20 73 74 61 74 20 63 6f 6e 73   code, stat cons
bf30: 69 64 65 72 65 64 20 27 2e 70 69 66 27 20 66 69  idered '.pif' fi
bf40: 6c 65 73 20 61 73 0a 09 20 20 20 20 20 2a 20 65  les as..     * e
bf50: 78 65 63 75 74 61 62 6c 65 2c 20 77 68 65 72 65  xecutable, where
bf60: 61 73 20 61 63 63 65 73 73 20 64 69 64 20 6e 6f  as access did no
bf70: 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  t...     */...  
bf80: 20 20 69 66 20 28 28 73 74 72 63 61 73 65 63 6d    if ((strcasecm
bf90: 70 28 70 2c 20 22 65 78 65 22 29 20 3d 3d 20 30  p(p, "exe") == 0
bfa0: 29 0a 09 09 20 20 20 20 7c 7c 20 28 73 74 72 63  )...    || (strc
bfb0: 61 73 65 63 6d 70 28 70 2c 20 22 63 6f 6d 22 29  asecmp(p, "com")
bfc0: 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 7c 7c 20   == 0)...    || 
bfd0: 28 73 74 72 63 61 73 65 63 6d 70 28 70 2c 20 22  (strcasecmp(p, "
bfe0: 63 6d 64 22 29 20 3d 3d 20 30 29 0a 09 09 20 20  cmd") == 0)...  
bff0: 20 20 7c 7c 20 28 73 74 72 63 61 73 65 63 6d 70    || (strcasecmp
c000: 28 70 2c 20 22 70 73 31 22 29 20 3d 3d 20 30 29  (p, "ps1") == 0)
c010: 0a 09 09 20 20 20 20 7c 7c 20 28 73 74 72 63 61  ...    || (strca
c020: 73 65 63 6d 70 28 70 2c 20 22 62 61 74 22 29 20  secmp(p, "bat") 
c030: 3d 3d 20 30 29 29 20 7b 0a 09 09 2f 2a 0a 09 09  == 0)) {.../*...
c040: 20 2a 20 46 69 6c 65 20 74 68 61 74 20 65 6e 64   * File that end
c050: 73 20 77 69 74 68 20 2e 65 78 65 2c 20 2e 63 6f  s with .exe, .co
c060: 6d 2c 20 6f 72 20 2e 62 61 74 20 69 73 20 65 78  m, or .bat is ex
c070: 65 63 75 74 61 62 6c 65 2e 0a 09 09 20 2a 2f 0a  ecutable.... */.
c080: 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 20 20  ...return 1;..  
c090: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20    }..}.    }.   
c0a0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f   return 0;.}.../
c0b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
c100: 20 54 63 6c 70 4f 62 6a 43 68 64 69 72 20 2d 2d   TclpObjChdir --
c110: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
c120: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 74 68  tion replaces th
c130: 65 20 6c 69 62 72 61 72 79 20 76 65 72 73 69 6f  e library versio
c140: 6e 20 6f 66 20 63 68 64 69 72 28 29 2e 0a 20 2a  n of chdir().. *
c150: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
c160: 53 65 65 20 63 68 64 69 72 28 29 20 64 6f 63 75  See chdir() docu
c170: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  mentation.. *. *
c180: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
c190: 2a 09 53 65 65 20 63 68 64 69 72 28 29 20 64 6f  *.See chdir() do
c1a0: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a  cumentation.. *.
c1b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
c1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e  --------. */..in
c200: 74 0a 54 63 6c 70 4f 62 6a 43 68 64 69 72 28 0a  t.TclpObjChdir(.
c210: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74      Tcl_Obj *pat
c220: 68 50 74 72 29 09 2f 2a 20 50 61 74 68 20 74 6f  hPtr)./* Path to
c230: 20 6e 65 77 20 77 6f 72 6b 69 6e 67 20 64 69 72   new working dir
c240: 65 63 74 6f 72 79 2e 20 2a 2f 0a 7b 0a 20 20 20  ectory. */.{.   
c250: 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20   int result;.   
c260: 20 63 6f 6e 73 74 20 54 43 48 41 52 20 2a 6e 61   const TCHAR *na
c270: 74 69 76 65 50 61 74 68 3b 0a 0a 20 20 20 20 6e  tivePath;..    n
c280: 61 74 69 76 65 50 61 74 68 20 3d 20 28 63 6f 6e  ativePath = (con
c290: 73 74 20 54 43 48 41 52 20 2a 29 20 54 63 6c 5f  st TCHAR *) Tcl_
c2a0: 46 53 47 65 74 4e 61 74 69 76 65 50 61 74 68 28  FSGetNativePath(
c2b0: 70 61 74 68 50 74 72 29 3b 0a 0a 20 20 20 20 69  pathPtr);..    i
c2c0: 66 20 28 21 6e 61 74 69 76 65 50 61 74 68 29 20  f (!nativePath) 
c2d0: 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  {..return -1;.  
c2e0: 20 20 7d 0a 20 20 20 20 72 65 73 75 6c 74 20 3d    }.    result =
c2f0: 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e   (*tclWinProcs->
c300: 73 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  setCurrentDirect
c310: 6f 72 79 50 72 6f 63 29 28 6e 61 74 69 76 65 50  oryProc)(nativeP
c320: 61 74 68 29 3b 0a 0a 20 20 20 20 69 66 20 28 72  ath);..    if (r
c330: 65 73 75 6c 74 20 3d 3d 20 30 29 20 7b 0a 09 54  esult == 0) {..T
c340: 63 6c 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f  clWinConvertErro
c350: 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  r(GetLastError()
c360: 29 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20  );..return -1;. 
c370: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
c380: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0;.}.../*. *----
c390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 47 65 74  --. *. * TclpGet
c3e0: 43 77 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cwd --. *. *.Thi
c3f0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
c400: 63 65 73 20 74 68 65 20 6c 69 62 72 61 72 79 20  ces the library 
c410: 76 65 72 73 69 6f 6e 20 6f 66 20 67 65 74 63 77  version of getcw
c420: 64 28 29 2e 20 28 4f 62 73 6f 6c 65 74 65 0a 20  d(). (Obsolete. 
c430: 2a 09 66 75 6e 63 74 69 6f 6e 2c 20 6f 6e 6c 79  *.function, only
c440: 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 6f 6c   retained for ol
c450: 64 20 65 78 74 65 6e 73 69 6f 6e 73 20 77 68 69  d extensions whi
c460: 63 68 20 6d 61 79 20 63 61 6c 6c 20 69 74 0a 20  ch may call it. 
c470: 2a 09 64 69 72 65 63 74 6c 79 29 2e 0a 20 2a 0a  *.directly).. *.
c480: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
c490: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 70  he result is a p
c4a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
c4b0: 6e 67 20 73 70 65 63 69 66 79 69 6e 67 20 74 68  ng specifying th
c4c0: 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74  e current direct
c4d0: 6f 72 79 2c 0a 20 2a 09 6f 72 20 4e 55 4c 4c 20  ory,. *.or NULL 
c4e0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  if the current d
c4f0: 69 72 65 63 74 6f 72 79 20 63 6f 75 6c 64 20 6e  irectory could n
c500: 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64  ot be determined
c510: 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 20 2a 09  . If NULL is. *.
c520: 72 65 74 75 72 6e 65 64 2c 20 61 6e 20 65 72 72  returned, an err
c530: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
c540: 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ft in the interp
c550: 27 73 20 72 65 73 75 6c 74 2e 20 53 74 6f 72 61  's result. Stora
c560: 67 65 20 66 6f 72 0a 20 2a 09 74 68 65 20 72 65  ge for. *.the re
c570: 73 75 6c 74 20 73 74 72 69 6e 67 20 69 73 20 61  sult string is a
c580: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 62 75 66 66  llocated in buff
c590: 65 72 50 74 72 3b 20 74 68 65 20 63 61 6c 6c 65  erPtr; the calle
c5a0: 72 20 6d 75 73 74 20 63 61 6c 6c 0a 20 2a 09 54  r must call. *.T
c5b0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 29  cl_DStringFree()
c5c0: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
c5d0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
c5e0: 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  eded.. *. * Side
c5f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
c600: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
c650: 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  */..const char *
c660: 0a 54 63 6c 70 47 65 74 43 77 64 28 0a 20 20 20  .TclpGetCwd(.   
c670: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c680: 65 72 70 2c 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d  erp,../* If non-
c690: 4e 55 4c 4c 2c 20 75 73 65 64 20 66 6f 72 20 65  NULL, used for e
c6a0: 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 20  rror reporting. 
c6b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
c6c0: 6e 67 20 2a 62 75 66 66 65 72 50 74 72 29 09 2f  ng *bufferPtr)./
c6d0: 2a 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * Uninitialized 
c6e0: 6f 72 20 66 72 65 65 20 44 53 74 72 69 6e 67 20  or free DString 
c6f0: 66 69 6c 6c 65 64 20 77 69 74 68 0a 09 09 09 09  filled with.....
c700: 20 2a 20 6e 61 6d 65 20 6f 66 20 63 75 72 72 65   * name of curre
c710: 6e 74 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f  nt directory. */
c720: 0a 7b 0a 20 20 20 20 57 43 48 41 52 20 62 75 66  .{.    WCHAR buf
c730: 66 65 72 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  fer[MAX_PATH];. 
c740: 20 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20     char *p;..   
c750: 20 69 66 20 28 28 2a 74 63 6c 57 69 6e 50 72 6f   if ((*tclWinPro
c760: 63 73 2d 3e 67 65 74 43 75 72 72 65 6e 74 44 69  cs->getCurrentDi
c770: 72 65 63 74 6f 72 79 50 72 6f 63 29 28 4d 41 58  rectoryProc)(MAX
c780: 5f 50 41 54 48 2c 20 62 75 66 66 65 72 29 20 3d  _PATH, buffer) =
c790: 3d 20 30 29 20 7b 0a 09 54 63 6c 57 69 6e 43 6f  = 0) {..TclWinCo
c7a0: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61  nvertError(GetLa
c7b0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 69 66 20  stError());..if 
c7c0: 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29  (interp != NULL)
c7d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
c7e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c7f0: 20 22 65 72 72 6f 72 20 67 65 74 74 69 6e 67 20   "error getting 
c800: 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
c810: 79 20 6e 61 6d 65 3a 20 22 2c 0a 09 09 20 20 20  y name: ",...   
c820: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28   Tcl_PosixError(
c830: 69 6e 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a  interp), NULL);.
c840: 09 7d 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  .}..return NULL;
c850: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
c860: 20 20 20 20 2a 20 57 61 74 63 68 20 66 6f 72 20      * Watch for 
c870: 74 68 65 20 77 65 69 72 64 20 57 69 6e 64 6f 77  the weird Window
c880: 73 20 63 3a 5c 5c 55 4e 43 20 73 79 6e 74 61 78  s c:\\UNC syntax
c890: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
c8a0: 66 20 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e  f (tclWinProcs->
c8b0: 75 73 65 57 69 64 65 29 20 7b 0a 09 57 43 48 41  useWide) {..WCHA
c8c0: 52 20 2a 6e 61 74 69 76 65 3b 0a 0a 09 6e 61 74  R *native;...nat
c8d0: 69 76 65 20 3d 20 28 57 43 48 41 52 20 2a 29 20  ive = (WCHAR *) 
c8e0: 62 75 66 66 65 72 3b 0a 09 69 66 20 28 28 6e 61  buffer;..if ((na
c8f0: 74 69 76 65 5b 30 5d 20 21 3d 20 27 5c 30 27 29  tive[0] != '\0')
c900: 20 26 26 20 28 6e 61 74 69 76 65 5b 31 5d 20 3d   && (native[1] =
c910: 3d 20 27 3a 27 29 0a 09 09 26 26 20 28 6e 61 74  = ':')...&& (nat
c920: 69 76 65 5b 32 5d 20 3d 3d 20 27 5c 5c 27 29 20  ive[2] == '\\') 
c930: 26 26 20 28 6e 61 74 69 76 65 5b 33 5d 20 3d 3d  && (native[3] ==
c940: 20 27 5c 5c 27 29 29 20 7b 0a 09 20 20 20 20 6e   '\\')) {..    n
c950: 61 74 69 76 65 20 2b 3d 20 32 3b 0a 09 7d 0a 09  ative += 2;..}..
c960: 54 63 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74  Tcl_WinTCharToUt
c970: 66 28 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69  f((TCHAR *) nati
c980: 76 65 2c 20 2d 31 2c 20 62 75 66 66 65 72 50 74  ve, -1, bufferPt
c990: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  r);.    } else {
c9a0: 0a 09 63 68 61 72 20 2a 6e 61 74 69 76 65 3b 0a  ..char *native;.
c9b0: 0a 09 6e 61 74 69 76 65 20 3d 20 28 63 68 61 72  ..native = (char
c9c0: 20 2a 29 20 62 75 66 66 65 72 3b 0a 09 69 66 20   *) buffer;..if 
c9d0: 28 28 6e 61 74 69 76 65 5b 30 5d 20 21 3d 20 27  ((native[0] != '
c9e0: 5c 30 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b  \0') && (native[
c9f0: 31 5d 20 3d 3d 20 27 3a 27 29 0a 09 09 26 26 20  1] == ':')...&& 
ca00: 28 6e 61 74 69 76 65 5b 32 5d 20 3d 3d 20 27 5c  (native[2] == '\
ca10: 5c 27 29 20 26 26 20 28 6e 61 74 69 76 65 5b 33  \') && (native[3
ca20: 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09 20  ] == '\\')) {.. 
ca30: 20 20 20 6e 61 74 69 76 65 20 2b 3d 20 32 3b 0a     native += 2;.
ca40: 09 7d 0a 09 54 63 6c 5f 57 69 6e 54 43 68 61 72  .}..Tcl_WinTChar
ca50: 54 6f 55 74 66 28 28 54 43 48 41 52 20 2a 29 20  ToUtf((TCHAR *) 
ca60: 6e 61 74 69 76 65 2c 20 2d 31 2c 20 62 75 66 66  native, -1, buff
ca70: 65 72 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  erPtr);.    }.. 
ca80: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e     /*.     * Con
ca90: 76 65 72 74 20 74 6f 20 66 6f 72 77 61 72 64 20  vert to forward 
caa0: 73 6c 61 73 68 65 73 20 66 6f 72 20 65 61 73 69  slashes for easi
cab0: 65 72 20 75 73 65 20 69 6e 20 73 63 72 69 70 74  er use in script
cac0: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  s..     */..    
cad0: 66 6f 72 20 28 70 20 3d 20 54 63 6c 5f 44 53 74  for (p = Tcl_DSt
cae0: 72 69 6e 67 56 61 6c 75 65 28 62 75 66 66 65 72  ringValue(buffer
caf0: 50 74 72 29 3b 20 2a 70 20 21 3d 20 27 5c 30 27  Ptr); *p != '\0'
cb00: 3b 20 70 2b 2b 29 20 7b 0a 09 69 66 20 28 2a 70  ; p++) {..if (*p
cb10: 20 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 20   == '\\') {..   
cb20: 20 2a 70 20 3d 20 27 2f 27 3b 0a 09 7d 0a 20 20   *p = '/';..}.  
cb30: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
cb40: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
cb50: 62 75 66 66 65 72 50 74 72 29 3b 0a 7d 0a 0c 0a  bufferPtr);.}...
cb60: 69 6e 74 0a 54 63 6c 70 4f 62 6a 53 74 61 74 28  int.TclpObjStat(
cb70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
cb80: 74 68 50 74 72 2c 09 09 2f 2a 20 50 61 74 68 20  thPtr,../* Path 
cb90: 6f 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74 2e  of file to stat.
cba0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 74 61 74   */.    Tcl_Stat
cbb0: 42 75 66 20 2a 73 74 61 74 50 74 72 29 09 2f 2a  Buf *statPtr)./*
cbc0: 20 46 69 6c 6c 65 64 20 77 69 74 68 20 72 65 73   Filled with res
cbd0: 75 6c 74 73 20 6f 66 20 73 74 61 74 20 63 61 6c  ults of stat cal
cbe0: 6c 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20  l. */.{.    /*. 
cbf0: 20 20 20 20 2a 20 45 6e 73 75 72 65 20 63 6f 72      * Ensure cor
cc00: 72 65 63 74 20 66 69 6c 65 20 73 69 7a 65 73 20  rect file sizes 
cc10: 62 79 20 66 6f 72 63 69 6e 67 20 74 68 65 20 4f  by forcing the O
cc20: 53 20 74 6f 20 77 72 69 74 65 20 61 6e 79 20 70  S to write any p
cc30: 65 6e 64 69 6e 67 20 64 61 74 61 0a 20 20 20 20  ending data.    
cc40: 20 2a 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73   * to disk. This
cc50: 20 69 73 20 64 6f 6e 65 20 6f 6e 6c 79 20 66 6f   is done only fo
cc60: 72 20 63 68 61 6e 6e 65 6c 73 20 77 68 69 63 68  r channels which
cc70: 20 61 72 65 20 64 69 72 74 79 2c 20 69 2e 65 2e   are dirty, i.e.
cc80: 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20   have been.     
cc90: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 73 69 6e  * written to sin
cca0: 63 65 20 74 68 65 20 6c 61 73 74 20 66 6c 75 73  ce the last flus
ccb0: 68 20 68 65 72 65 2e 0a 20 20 20 20 20 2a 2f 0a  h here..     */.
ccc0: 0a 20 20 20 20 54 63 6c 57 69 6e 46 6c 75 73 68  .    TclWinFlush
ccd0: 44 69 72 74 79 43 68 61 6e 6e 65 6c 73 28 29 3b  DirtyChannels();
cce0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 61 74  ..    return Nat
ccf0: 69 76 65 53 74 61 74 28 28 63 6f 6e 73 74 20 54  iveStat((const T
cd00: 43 48 41 52 20 2a 29 20 54 63 6c 5f 46 53 47 65  CHAR *) Tcl_FSGe
cd10: 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68  tNativePath(path
cd20: 50 74 72 29 2c 0a 09 20 20 20 20 73 74 61 74 50  Ptr),..    statP
cd30: 74 72 2c 20 30 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  tr, 0);.}.../*. 
cd40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 61  -------. *. * Na
cd90: 74 69 76 65 53 74 61 74 20 2d 2d 0a 20 2a 0a 20  tiveStat --. *. 
cda0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
cdb0: 72 65 70 6c 61 63 65 73 20 74 68 65 20 6c 69 62  replaces the lib
cdc0: 72 61 72 79 20 76 65 72 73 69 6f 6e 20 6f 66 20  rary version of 
cdd0: 73 74 61 74 28 29 2c 20 66 69 78 69 6e 67 20 74  stat(), fixing t
cde0: 68 65 0a 20 2a 09 66 6f 6c 6c 6f 77 69 6e 67 20  he. *.following 
cdf0: 62 75 67 73 3a 0a 20 2a 0a 20 2a 09 31 2e 20 73  bugs:. *. *.1. s
ce00: 74 61 74 28 22 63 3a 22 29 20 72 65 74 75 72 6e  tat("c:") return
ce10: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 32  s an error.. *.2
ce20: 2e 20 42 6f 72 6c 61 6e 64 20 73 74 61 74 28 29  . Borland stat()
ce30: 20 72 65 74 75 72 6e 20 74 69 6d 65 20 69 6e 20   return time in 
ce40: 47 4d 54 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  GMT instead of l
ce50: 6f 63 61 6c 74 69 6d 65 2e 0a 20 2a 09 33 2e 20  ocaltime.. *.3. 
ce60: 73 74 61 74 28 22 5c 5c 73 65 72 76 65 72 5c 6d  stat("\\server\m
ce70: 6f 75 6e 74 22 29 20 77 6f 75 6c 64 20 72 65 74  ount") would ret
ce80: 75 72 6e 20 65 72 72 6f 72 2e 0a 20 2a 09 34 2e  urn error.. *.4.
ce90: 20 41 63 63 65 70 74 73 20 73 6c 61 73 68 65 73   Accepts slashes
cea0: 20 6f 72 20 62 61 63 6b 73 6c 61 73 68 65 73 2e   or backslashes.
ceb0: 0a 20 2a 09 35 2e 20 73 74 5f 64 65 76 20 61 6e  . *.5. st_dev an
cec0: 64 20 73 74 5f 72 64 65 76 20 77 65 72 65 20 77  d st_rdev were w
ced0: 72 6f 6e 67 20 66 6f 72 20 55 4e 43 20 70 61 74  rong for UNC pat
cee0: 68 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  hs.. *. * Result
cef0: 73 3a 0a 20 2a 09 53 65 65 20 73 74 61 74 20 64  s:. *.See stat d
cf00: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a  ocumentation.. *
cf10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
cf20: 3a 0a 20 2a 09 53 65 65 20 73 74 61 74 20 64 6f  :. *.See stat do
cf30: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a  cumentation.. *.
cf40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
cf50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
cf90: 61 74 69 63 20 69 6e 74 0a 4e 61 74 69 76 65 53  atic int.NativeS
cfa0: 74 61 74 28 0a 20 20 20 20 63 6f 6e 73 74 20 54  tat(.    const T
cfb0: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 74 68  CHAR *nativePath
cfc0: 2c 09 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c  ,./* Path of fil
cfd0: 65 20 74 6f 20 73 74 61 74 20 2a 2f 0a 20 20 20  e to stat */.   
cfe0: 20 54 63 6c 5f 53 74 61 74 42 75 66 20 2a 73 74   Tcl_StatBuf *st
cff0: 61 74 50 74 72 2c 09 2f 2a 20 46 69 6c 6c 65 64  atPtr,./* Filled
d000: 20 77 69 74 68 20 72 65 73 75 6c 74 73 20 6f 66   with results of
d010: 20 73 74 61 74 20 63 61 6c 6c 2e 20 2a 2f 0a 20   stat call. */. 
d020: 20 20 20 69 6e 74 20 63 68 65 63 6b 4c 69 6e 6b     int checkLink
d030: 73 29 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65  s)../* If non-ze
d040: 72 6f 2c 20 62 65 68 61 76 65 20 6c 69 6b 65 20  ro, behave like 
d050: 27 6c 73 74 61 74 27 20 2a 2f 0a 7b 0a 20 20 20  'lstat' */.{.   
d060: 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 20   DWORD attr;.   
d070: 20 69 6e 74 20 64 65 76 2c 20 6e 6c 69 6e 6b 20   int dev, nlink 
d080: 3d 20 31 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 1;.    unsigne
d090: 64 20 73 68 6f 72 74 20 6d 6f 64 65 3b 0a 20 20  d short mode;.  
d0a0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
d0b0: 6e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 48 41  node = 0;.    HA
d0c0: 4e 44 4c 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b  NDLE fileHandle;
d0d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
d0e0: 49 66 20 77 65 20 63 61 6e 20 75 73 65 20 27 63  If we can use 'c
d0f0: 72 65 61 74 65 46 69 6c 65 27 20 6f 6e 20 74 68  reateFile' on th
d100: 69 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  is, then we can 
d110: 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  use the resultin
d120: 67 0a 20 20 20 20 20 2a 20 66 69 6c 65 48 61 6e  g.     * fileHan
d130: 64 6c 65 20 74 6f 20 72 65 61 64 20 6d 6f 72 65  dle to read more
d140: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 6e 6c   information (nl
d150: 69 6e 6b 2c 20 69 6e 6f 29 20 74 68 61 6e 20 77  ink, ino) than w
d160: 65 20 63 61 6e 20 67 65 74 20 66 72 6f 6d 0a 20  e can get from. 
d170: 20 20 20 20 2a 20 6f 74 68 65 72 20 61 74 74 72      * other attr
d180: 69 62 75 74 65 73 20 72 65 61 64 69 6e 67 20 41  ibutes reading A
d190: 50 49 73 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65  PIs. If not, the
d1a0: 6e 20 77 65 20 74 72 79 20 74 6f 20 66 61 6c 6c  n we try to fall
d1b0: 20 62 61 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   back on the.   
d1c0: 20 20 2a 20 27 67 65 74 46 69 6c 65 41 74 74 72    * 'getFileAttr
d1d0: 69 62 75 74 65 73 45 78 50 72 6f 63 27 2c 20 61  ibutesExProc', a
d1e0: 6e 64 20 69 66 20 74 68 61 74 20 69 73 6e 27 74  nd if that isn't
d1f0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e   available, then
d200: 20 6f 6e 20 65 76 65 6e 0a 20 20 20 20 20 2a 20   on even.     * 
d210: 73 69 6d 70 6c 65 72 20 72 6f 75 74 69 6e 65 73  simpler routines
d220: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66  ..     */..    f
d230: 69 6c 65 48 61 6e 64 6c 65 20 3d 20 28 74 63 6c  ileHandle = (tcl
d240: 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61 74 65  WinProcs->create
d250: 46 69 6c 65 50 72 6f 63 29 28 6e 61 74 69 76 65  FileProc)(native
d260: 50 61 74 68 2c 20 47 45 4e 45 52 49 43 5f 52 45  Path, GENERIC_RE
d270: 41 44 2c 0a 09 20 20 20 20 46 49 4c 45 5f 53 48  AD,..    FILE_SH
d280: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
d290: 53 48 41 52 45 5f 57 52 49 54 45 2c 20 4e 55 4c  SHARE_WRITE, NUL
d2a0: 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47  L, OPEN_EXISTING
d2b0: 2c 0a 09 20 20 20 20 46 49 4c 45 5f 46 4c 41 47  ,..    FILE_FLAG
d2c0: 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 49 43  _BACKUP_SEMANTIC
d2d0: 53 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 4f 50  S | FILE_FLAG_OP
d2e0: 45 4e 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54  EN_REPARSE_POINT
d2f0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  , NULL);..    if
d300: 20 28 66 69 6c 65 48 61 6e 64 6c 65 20 21 3d 20   (fileHandle != 
d310: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
d320: 41 4c 55 45 29 20 7b 0a 09 42 59 5f 48 41 4e 44  ALUE) {..BY_HAND
d330: 4c 45 5f 46 49 4c 45 5f 49 4e 46 4f 52 4d 41 54  LE_FILE_INFORMAT
d340: 49 4f 4e 20 64 61 74 61 3b 0a 0a 09 69 66 20 28  ION data;...if (
d350: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
d360: 6f 6e 42 79 48 61 6e 64 6c 65 28 66 69 6c 65 48  onByHandle(fileH
d370: 61 6e 64 6c 65 2c 26 64 61 74 61 29 20 21 3d 20  andle,&data) != 
d380: 54 52 55 45 29 20 7b 0a 09 20 20 20 20 43 6c 6f  TRUE) {..    Clo
d390: 73 65 48 61 6e 64 6c 65 28 66 69 6c 65 48 61 6e  seHandle(fileHan
d3a0: 64 6c 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  dle);..    Tcl_S
d3b0: 65 74 45 72 72 6e 6f 28 45 4e 4f 45 4e 54 29 3b  etErrno(ENOENT);
d3c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
d3d0: 0a 09 7d 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65  ..}..CloseHandle
d3e0: 28 66 69 6c 65 48 61 6e 64 6c 65 29 3b 0a 0a 09  (fileHandle);...
d3f0: 61 74 74 72 20 3d 20 64 61 74 61 2e 64 77 46 69  attr = data.dwFi
d400: 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 0a 09  leAttributes;...
d410: 73 74 61 74 50 74 72 2d 3e 73 74 5f 73 69 7a 65  statPtr->st_size
d420: 20 3d 20 28 28 54 63 6c 5f 57 69 64 65 49 6e 74   = ((Tcl_WideInt
d430: 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  ) data.nFileSize
d440: 4c 6f 77 29 20 7c 0a 09 09 28 28 28 54 63 6c 5f  Low) |...(((Tcl_
d450: 57 69 64 65 49 6e 74 29 20 64 61 74 61 2e 6e 46  WideInt) data.nF
d460: 69 6c 65 53 69 7a 65 48 69 67 68 29 20 3c 3c 20  ileSizeHigh) << 
d470: 33 32 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73  32);..statPtr->s
d480: 74 5f 61 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d  t_atime = ToCTim
d490: 65 28 64 61 74 61 2e 66 74 4c 61 73 74 41 63 63  e(data.ftLastAcc
d4a0: 65 73 73 54 69 6d 65 29 3b 0a 09 73 74 61 74 50  essTime);..statP
d4b0: 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d 20 54  tr->st_mtime = T
d4c0: 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74 4c 61  oCTime(data.ftLa
d4d0: 73 74 57 72 69 74 65 54 69 6d 65 29 3b 0a 09 73  stWriteTime);..s
d4e0: 74 61 74 50 74 72 2d 3e 73 74 5f 63 74 69 6d 65  tatPtr->st_ctime
d4f0: 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e   = ToCTime(data.
d500: 66 74 43 72 65 61 74 69 6f 6e 54 69 6d 65 29 3b  ftCreationTime);
d510: 0a 0a 09 2f 2a 0a 09 20 2a 20 4f 6e 20 55 6e 69  .../*.. * On Uni
d520: 78 2c 20 66 6f 72 20 64 69 72 65 63 74 6f 72 69  x, for directori
d530: 65 73 2c 20 6e 6c 69 6e 6b 20 61 70 70 61 72 65  es, nlink appare
d540: 6e 74 6c 79 20 64 65 70 65 6e 64 73 20 6f 6e 20  ntly depends on 
d550: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 09 20  the number of.. 
d560: 2a 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20 64  * files in the d
d570: 69 72 65 63 74 6f 72 79 2e 20 20 57 65 20 63 6f  irectory.  We co
d580: 75 6c 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68  uld calculate th
d590: 61 74 2c 20 62 75 74 20 69 74 20 77 6f 75 6c 64  at, but it would
d5a0: 20 62 65 20 61 0a 09 20 2a 20 62 69 74 20 6f 66   be a.. * bit of
d5b0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70   a performance p
d5c0: 65 6e 61 6c 74 79 2c 20 49 20 74 68 69 6e 6b 2e  enalty, I think.
d5d0: 20 48 65 6e 63 65 20 77 65 20 6a 75 73 74 20 75   Hence we just u
d5e0: 73 65 20 77 68 61 74 0a 09 20 2a 20 57 69 6e 64  se what.. * Wind
d5f0: 6f 77 73 20 67 69 76 65 73 20 75 73 2c 20 77 68  ows gives us, wh
d600: 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
d610: 61 73 20 55 6e 69 78 20 66 6f 72 20 66 69 6c 65  as Unix for file
d620: 73 2c 20 61 74 20 6c 65 61 73 74 2e 0a 09 20 2a  s, at least... *
d630: 2f 0a 0a 09 6e 6c 69 6e 6b 20 3d 20 64 61 74 61  /...nlink = data
d640: 2e 6e 4e 75 6d 62 65 72 4f 66 4c 69 6e 6b 73 3b  .nNumberOfLinks;
d650: 0a 0a 09 2f 2a 0a 09 20 2a 20 55 6e 66 6f 72 74  .../*.. * Unfort
d660: 75 6e 61 74 65 6c 79 20 6f 75 72 20 73 74 61 74  unately our stat
d670: 20 64 65 66 69 6e 69 74 69 6f 6e 27 73 20 69 6e   definition's in
d680: 6f 64 65 20 66 69 65 6c 64 20 28 75 6e 73 69 67  ode field (unsig
d690: 6e 65 64 20 73 68 6f 72 74 29 0a 09 20 2a 20 77  ned short).. * w
d6a0: 69 6c 6c 20 74 68 72 6f 77 20 61 77 61 79 20 6d  ill throw away m
d6b0: 6f 73 74 20 6f 66 20 74 68 65 20 70 72 65 63 69  ost of the preci
d6c0: 73 69 6f 6e 20 77 65 20 68 61 76 65 20 68 65 72  sion we have her
d6d0: 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77  e, which means w
d6e0: 65 0a 09 20 2a 20 63 61 6e 27 74 20 72 65 6c 79  e.. * can't rely
d6f0: 20 6f 6e 20 69 6e 6f 64 65 20 61 73 20 61 20 75   on inode as a u
d700: 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72  nique identifier
d710: 20 6f 66 20 61 20 66 69 6c 65 2e 20 57 65 27 64   of a file. We'd
d720: 20 72 65 61 6c 6c 79 0a 09 20 2a 20 6c 69 6b 65   really.. * like
d730: 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
d740: 20 6c 69 6b 65 20 68 6f 77 20 77 65 20 68 61 6e   like how we han
d750: 64 6c 65 20 27 73 74 5f 73 69 7a 65 27 2e 0a 09  dle 'st_size'...
d760: 20 2a 2f 0a 0a 09 69 6e 6f 64 65 20 3d 20 64 61   */...inode = da
d770: 74 61 2e 6e 46 69 6c 65 49 6e 64 65 78 48 69 67  ta.nFileIndexHig
d780: 68 20 7c 20 64 61 74 61 2e 6e 46 69 6c 65 49 6e  h | data.nFileIn
d790: 64 65 78 4c 6f 77 3b 0a 20 20 20 20 7d 20 65 6c  dexLow;.    } el
d7a0: 73 65 20 69 66 20 28 74 63 6c 57 69 6e 50 72 6f  se if (tclWinPro
d7b0: 63 73 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 69  cs->getFileAttri
d7c0: 62 75 74 65 73 45 78 50 72 6f 63 20 21 3d 20 4e  butesExProc != N
d7d0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 46  ULL) {../*.. * F
d7e0: 61 6c 6c 20 62 61 63 6b 20 6f 6e 20 74 68 65 20  all back on the 
d7f0: 6c 65 73 73 20 63 61 70 61 62 6c 65 20 72 6f 75  less capable rou
d800: 74 69 6e 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  tines. This mean
d810: 73 20 6e 6f 20 6e 6c 69 6e 6b 20 6f 72 20 69 6e  s no nlink or in
d820: 6f 2e 0a 09 20 2a 2f 0a 0a 09 57 49 4e 33 32 5f  o... */...WIN32_
d830: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
d840: 41 54 41 20 64 61 74 61 3b 0a 0a 09 69 66 20 28  ATA data;...if (
d850: 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67  (*tclWinProcs->g
d860: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
d870: 45 78 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61  ExProc)(nativePa
d880: 74 68 2c 0a 09 09 47 65 74 46 69 6c 65 45 78 49  th,...GetFileExI
d890: 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 26 64 61  nfoStandard, &da
d8a0: 74 61 29 20 21 3d 20 54 52 55 45 29 20 7b 0a 09  ta) != TRUE) {..
d8b0: 20 20 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64      HANDLE hFind
d8c0: 3b 0a 09 20 20 20 20 57 49 4e 33 32 5f 46 49 4e  ;..    WIN32_FIN
d8d0: 44 5f 44 41 54 41 54 20 66 66 64 3b 0a 09 20 20  D_DATAT ffd;..  
d8e0: 20 20 44 57 4f 52 44 20 6c 61 73 74 65 72 72 6f    DWORD lasterro
d8f0: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  r = GetLastError
d900: 28 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 6c 61  ();...    if (la
d910: 73 74 65 72 72 6f 72 20 21 3d 20 45 52 52 4f 52  sterror != ERROR
d920: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
d930: 4f 4e 29 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f  ON) {...TclWinCo
d940: 6e 76 65 72 74 45 72 72 6f 72 28 6c 61 73 74 65  nvertError(laste
d950: 72 72 6f 72 29 3b 0a 09 09 72 65 74 75 72 6e 20  rror);...return 
d960: 2d 31 3b 0a 09 09 7d 0a 09 20 20 20 20 68 46 69  -1;...}..    hFi
d970: 6e 64 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f  nd = (*tclWinPro
d980: 63 73 2d 3e 66 69 6e 64 46 69 72 73 74 46 69 6c  cs->findFirstFil
d990: 65 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74  eProc)(nativePat
d9a0: 68 2c 20 26 66 66 64 29 3b 0a 09 20 20 20 20 69  h, &ffd);..    i
d9b0: 66 20 28 68 46 69 6e 64 20 3d 3d 20 49 4e 56 41  f (hFind == INVA
d9c0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
d9d0: 29 20 7b 0a 09 09 54 63 6c 57 69 6e 43 6f 6e 76  ) {...TclWinConv
d9e0: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
d9f0: 45 72 72 6f 72 28 29 29 3b 0a 09 09 72 65 74 75  Error());...retu
da00: 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20  rn -1;..    }.. 
da10: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
da20: 20 26 66 66 64 2c 20 73 69 7a 65 6f 66 28 64 61   &ffd, sizeof(da
da30: 74 61 29 29 3b 0a 09 20 20 20 20 46 69 6e 64 43  ta));..    FindC
da40: 6c 6f 73 65 28 68 46 69 6e 64 29 3b 0a 09 7d 0a  lose(hFind);..}.
da50: 0a 09 61 74 74 72 20 3d 20 64 61 74 61 2e 64 77  ..attr = data.dw
da60: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
da70: 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 73 69  ..statPtr->st_si
da80: 7a 65 20 3d 20 28 28 54 63 6c 5f 57 69 64 65 49  ze = ((Tcl_WideI
da90: 6e 74 29 20 64 61 74 61 2e 6e 46 69 6c 65 53 69  nt) data.nFileSi
daa0: 7a 65 4c 6f 77 29 20 7c 0a 09 09 28 28 28 54 63  zeLow) |...(((Tc
dab0: 6c 5f 57 69 64 65 49 6e 74 29 20 64 61 74 61 2e  l_WideInt) data.
dac0: 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 29 20 3c  nFileSizeHigh) <
dad0: 3c 20 33 32 29 3b 0a 09 73 74 61 74 50 74 72 2d  < 32);..statPtr-
dae0: 3e 73 74 5f 61 74 69 6d 65 20 3d 20 54 6f 43 54  >st_atime = ToCT
daf0: 69 6d 65 28 64 61 74 61 2e 66 74 4c 61 73 74 41  ime(data.ftLastA
db00: 63 63 65 73 73 54 69 6d 65 29 3b 0a 09 73 74 61  ccessTime);..sta
db10: 74 50 74 72 2d 3e 73 74 5f 6d 74 69 6d 65 20 3d  tPtr->st_mtime =
db20: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 66 74   ToCTime(data.ft
db30: 4c 61 73 74 57 72 69 74 65 54 69 6d 65 29 3b 0a  LastWriteTime);.
db40: 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 63 74 69  .statPtr->st_cti
db50: 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28 64 61 74  me = ToCTime(dat
db60: 61 2e 66 74 43 72 65 61 74 69 6f 6e 54 69 6d 65  a.ftCreationTime
db70: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
db80: 09 2f 2a 0a 09 20 2a 20 57 65 20 64 6f 6e 27 74  ./*.. * We don't
db90: 20 68 61 76 65 20 74 68 65 20 66 61 73 74 65 72   have the faster
dba0: 20 61 74 74 72 69 62 75 74 65 73 20 70 72 6f 63   attributes proc
dbb0: 2c 20 73 6f 20 77 65 27 72 65 20 70 72 6f 62 61  , so we're proba
dbc0: 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 09 20 2a 20  bly running.. * 
dbd0: 6f 6e 20 57 69 6e 39 35 2e 0a 09 20 2a 2f 0a 0a  on Win95... */..
dbe0: 09 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41  .WIN32_FIND_DATA
dbf0: 54 20 64 61 74 61 3b 0a 09 48 41 4e 44 4c 45 20  T data;..HANDLE 
dc00: 68 61 6e 64 6c 65 3b 0a 0a 09 68 61 6e 64 6c 65  handle;...handle
dc10: 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73   = (*tclWinProcs
dc20: 2d 3e 66 69 6e 64 46 69 72 73 74 46 69 6c 65 50  ->findFirstFileP
dc30: 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c  roc)(nativePath,
dc40: 20 26 64 61 74 61 29 3b 0a 09 69 66 20 28 68 61   &data);..if (ha
dc50: 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  ndle == INVALID_
dc60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a  HANDLE_VALUE) {.
dc70: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
dc80: 46 69 6e 64 46 69 72 73 74 46 69 6c 65 28 29 20  FindFirstFile() 
dc90: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 6f 6e 20  doesn't work on 
dca0: 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73  root directories
dcb0: 2c 20 73 6f 20 63 61 6c 6c 0a 09 20 20 20 20 20  , so call..     
dcc0: 2a 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  * GetFileAttribu
dcd0: 74 65 73 28 29 20 74 6f 20 73 65 65 20 69 66 20  tes() to see if 
dce0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
dcf0: 6c 65 20 65 78 69 73 74 73 2e 0a 09 20 20 20 20  le exists...    
dd00: 20 2a 2f 0a 0a 09 20 20 20 20 61 74 74 72 20 3d   */...    attr =
dd10: 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e   (*tclWinProcs->
dd20: 67 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  getFileAttribute
dd30: 73 50 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74  sProc)(nativePat
dd40: 68 29 3b 0a 09 20 20 20 20 69 66 20 28 61 74 74  h);..    if (att
dd50: 72 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  r == INVALID_FIL
dd60: 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a  E_ATTRIBUTES) {.
dd70: 09 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45  ..Tcl_SetErrno(E
dd80: 4e 4f 45 4e 54 29 3b 0a 09 09 72 65 74 75 72 6e  NOENT);...return
dd90: 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20   -1;..    }...  
dda0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4d 61 6b    /*..     * Mak
ddb0: 65 20 75 70 20 73 6f 6d 65 20 66 61 6b 65 20 69  e up some fake i
ddc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
ddd0: 68 69 73 20 66 69 6c 65 2e 20 49 74 20 68 61 73  his file. It has
dde0: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 09 20 20   the correct..  
ddf0: 20 20 20 2a 20 66 69 6c 65 20 61 74 74 72 69 62     * file attrib
de00: 75 74 65 73 20 61 6e 64 20 61 20 74 69 6d 65 20  utes and a time 
de10: 6f 66 20 30 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  of 0...     */..
de20: 09 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
de30: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, 0, sizeof(dat
de40: 61 29 29 3b 0a 09 20 20 20 20 64 61 74 61 2e 61  a));..    data.a
de50: 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
de60: 73 20 3d 20 61 74 74 72 3b 0a 09 7d 20 65 6c 73  s = attr;..} els
de70: 65 20 7b 0a 09 20 20 20 20 46 69 6e 64 43 6c 6f  e {..    FindClo
de80: 73 65 28 68 61 6e 64 6c 65 29 3b 0a 09 7d 0a 0a  se(handle);..}..
de90: 09 61 74 74 72 20 3d 20 64 61 74 61 2e 61 2e 64  .attr = data.a.d
dea0: 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
deb0: 0a 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f 73  ...statPtr->st_s
dec0: 69 7a 65 20 3d 20 28 28 54 63 6c 5f 57 69 64 65  ize = ((Tcl_Wide
ded0: 49 6e 74 29 20 64 61 74 61 2e 61 2e 6e 46 69 6c  Int) data.a.nFil
dee0: 65 53 69 7a 65 4c 6f 77 29 20 7c 0a 09 09 28 28  eSizeLow) |...((
def0: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 20 64 61  (Tcl_WideInt) da
df00: 74 61 2e 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69  ta.a.nFileSizeHi
df10: 67 68 29 20 3c 3c 20 33 32 29 3b 0a 09 73 74 61  gh) << 32);..sta
df20: 74 50 74 72 2d 3e 73 74 5f 61 74 69 6d 65 20 3d  tPtr->st_atime =
df30: 20 54 6f 43 54 69 6d 65 28 64 61 74 61 2e 61 2e   ToCTime(data.a.
df40: 66 74 4c 61 73 74 41 63 63 65 73 73 54 69 6d 65  ftLastAccessTime
df50: 29 3b 0a 09 73 74 61 74 50 74 72 2d 3e 73 74 5f  );..statPtr->st_
df60: 6d 74 69 6d 65 20 3d 20 54 6f 43 54 69 6d 65 28  mtime = ToCTime(
df70: 64 61 74 61 2e 61 2e 66 74 4c 61 73 74 57 72 69  data.a.ftLastWri
df80: 74 65 54 69 6d 65 29 3b 0a 09 73 74 61 74 50 74  teTime);..statPt
df90: 72 2d 3e 73 74 5f 63 74 69 6d 65 20 3d 20 54 6f  r->st_ctime = To
dfa0: 43 54 69 6d 65 28 64 61 74 61 2e 61 2e 66 74 43  CTime(data.a.ftC
dfb0: 72 65 61 74 69 6f 6e 54 69 6d 65 29 3b 0a 20 20  reationTime);.  
dfc0: 20 20 7d 0a 0a 20 20 20 20 64 65 76 20 3d 20 4e    }..    dev = N
dfd0: 61 74 69 76 65 44 65 76 28 6e 61 74 69 76 65 50  ativeDev(nativeP
dfe0: 61 74 68 29 3b 0a 20 20 20 20 6d 6f 64 65 20 3d  ath);.    mode =
dff0: 20 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 28   NativeStatMode(
e000: 61 74 74 72 2c 20 63 68 65 63 6b 4c 69 6e 6b 73  attr, checkLinks
e010: 2c 20 4e 61 74 69 76 65 49 73 45 78 65 63 28 6e  , NativeIsExec(n
e020: 61 74 69 76 65 50 61 74 68 29 29 3b 0a 0a 20 20  ativePath));..  
e030: 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 64 65    statPtr->st_de
e040: 76 09 3d 20 28 64 65 76 5f 74 29 20 64 65 76 3b  v.= (dev_t) dev;
e050: 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e 73 74  .    statPtr->st
e060: 5f 69 6e 6f 09 3d 20 69 6e 6f 64 65 3b 0a 20 20  _ino.= inode;.  
e070: 20 20 73 74 61 74 50 74 72 2d 3e 73 74 5f 6d 6f    statPtr->st_mo
e080: 64 65 09 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 73  de.= mode;.    s
e090: 74 61 74 50 74 72 2d 3e 73 74 5f 6e 6c 69 6e 6b  tatPtr->st_nlink
e0a0: 09 3d 20 6e 6c 69 6e 6b 3b 0a 20 20 20 20 73 74  .= nlink;.    st
e0b0: 61 74 50 74 72 2d 3e 73 74 5f 75 69 64 09 3d 20  atPtr->st_uid.= 
e0c0: 30 3b 0a 20 20 20 20 73 74 61 74 50 74 72 2d 3e  0;.    statPtr->
e0d0: 73 74 5f 67 69 64 09 3d 20 30 3b 0a 20 20 20 20  st_gid.= 0;.    
e0e0: 73 74 61 74 50 74 72 2d 3e 73 74 5f 72 64 65 76  statPtr->st_rdev
e0f0: 09 3d 20 28 64 65 76 5f 74 29 20 64 65 76 3b 0a  .= (dev_t) dev;.
e100: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
e110: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
e120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
e160: 0a 20 2a 20 4e 61 74 69 76 65 44 65 76 20 2d 2d  . * NativeDev --
e170: 0a 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65  . *. *.Calculate
e180: 20 6a 75 73 74 20 74 68 65 20 27 73 74 5f 64 65   just the 'st_de
e190: 76 27 20 66 69 65 6c 64 20 6f 66 20 61 20 27 73  v' field of a 's
e1a0: 74 61 74 27 20 73 74 72 75 63 74 75 72 65 2e 0a  tat' structure..
e1b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
e1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
e200: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 61 74 69  .static int.Nati
e210: 76 65 44 65 76 28 0a 20 20 20 20 63 6f 6e 73 74  veDev(.    const
e220: 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61   TCHAR *nativePa
e230: 74 68 29 09 2f 2a 20 46 75 6c 6c 20 70 61 74 68  th)./* Full path
e240: 20 6f 66 20 66 69 6c 65 20 74 6f 20 73 74 61 74   of file to stat
e250: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 64 65   */.{.    int de
e260: 76 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  v;.    Tcl_DStri
e270: 6e 67 20 64 73 3b 0a 20 20 20 20 57 43 48 41 52  ng ds;.    WCHAR
e280: 20 6e 61 74 69 76 65 46 75 6c 6c 50 61 74 68 5b   nativeFullPath[
e290: 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 54  MAX_PATH];.    T
e2a0: 43 48 41 52 20 2a 6e 61 74 69 76 65 50 61 72 74  CHAR *nativePart
e2b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e2c0: 20 2a 66 75 6c 6c 50 61 74 68 3b 0a 0a 20 20 20   *fullPath;..   
e2d0: 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e   (*tclWinProcs->
e2e0: 67 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 50  getFullPathNameP
e2f0: 72 6f 63 29 28 6e 61 74 69 76 65 50 61 74 68 2c  roc)(nativePath,
e300: 20 4d 41 58 5f 50 41 54 48 2c 0a 09 20 20 20 20   MAX_PATH,..    
e310: 6e 61 74 69 76 65 46 75 6c 6c 50 61 74 68 2c 20  nativeFullPath, 
e320: 26 6e 61 74 69 76 65 50 61 72 74 29 3b 0a 0a 20  &nativePart);.. 
e330: 20 20 20 66 75 6c 6c 50 61 74 68 20 3d 20 54 63     fullPath = Tc
e340: 6c 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28  l_WinTCharToUtf(
e350: 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65  (TCHAR *) native
e360: 46 75 6c 6c 50 61 74 68 2c 20 2d 31 2c 20 26 64  FullPath, -1, &d
e370: 73 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 75  s);..    if ((fu
e380: 6c 6c 50 61 74 68 5b 30 5d 20 3d 3d 20 27 5c 5c  llPath[0] == '\\
e390: 27 29 20 26 26 20 28 66 75 6c 6c 50 61 74 68 5b  ') && (fullPath[
e3a0: 31 5d 20 3d 3d 20 27 5c 5c 27 29 29 20 7b 0a 09  1] == '\\')) {..
e3b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 09  const char *p;..
e3c0: 44 57 4f 52 44 20 64 77 3b 0a 09 63 6f 6e 73 74  DWORD dw;..const
e3d0: 20 54 43 48 41 52 20 2a 6e 61 74 69 76 65 56 6f   TCHAR *nativeVo
e3e0: 6c 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20  l;..Tcl_DString 
e3f0: 76 6f 6c 53 74 72 69 6e 67 3b 0a 0a 09 70 20 3d  volString;...p =
e400: 20 73 74 72 63 68 72 28 66 75 6c 6c 50 61 74 68   strchr(fullPath
e410: 20 2b 20 32 2c 20 27 5c 5c 27 29 3b 0a 09 70 20   + 2, '\\');..p 
e420: 3d 20 73 74 72 63 68 72 28 70 20 2b 20 31 2c 20  = strchr(p + 1, 
e430: 27 5c 5c 27 29 3b 0a 09 69 66 20 28 70 20 3d 3d  '\\');..if (p ==
e440: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
e450: 0a 09 20 20 20 20 20 2a 20 41 64 64 20 74 65 72  ..     * Add ter
e460: 6d 69 6e 61 74 69 6e 67 20 62 61 63 6b 73 6c 61  minating backsla
e470: 73 68 20 74 6f 20 66 75 6c 6c 70 61 74 68 20 6f  sh to fullpath o
e480: 72 20 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72  r GetVolumeInfor
e490: 6d 61 74 69 6f 6e 28 29 0a 09 20 20 20 20 20 2a  mation()..     *
e4a0: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 0a 09 20 20   won't work...  
e4b0: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 66 75 6c 6c     */...    full
e4c0: 50 61 74 68 20 3d 20 54 63 6c 5f 44 53 74 72 69  Path = Tcl_DStri
e4d0: 6e 67 41 70 70 65 6e 64 28 26 64 73 2c 20 22 5c  ngAppend(&ds, "\
e4e0: 5c 22 2c 20 31 29 3b 0a 09 20 20 20 20 70 20 3d  \", 1);..    p =
e4f0: 20 66 75 6c 6c 50 61 74 68 20 2b 20 54 63 6c 5f   fullPath + Tcl_
e500: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
e510: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  s);..} else {.. 
e520: 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09 6e 61 74 69     p++;..}..nati
e530: 76 65 56 6f 6c 20 3d 20 54 63 6c 5f 57 69 6e 55  veVol = Tcl_WinU
e540: 74 66 54 6f 54 43 68 61 72 28 66 75 6c 6c 50 61  tfToTChar(fullPa
e550: 74 68 2c 20 70 20 2d 20 66 75 6c 6c 50 61 74 68  th, p - fullPath
e560: 2c 20 26 76 6f 6c 53 74 72 69 6e 67 29 3b 0a 09  , &volString);..
e570: 64 77 20 3d 20 28 44 57 4f 52 44 29 20 2d 31 3b  dw = (DWORD) -1;
e580: 0a 09 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d  ..(*tclWinProcs-
e590: 3e 67 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d  >getVolumeInform
e5a0: 61 74 69 6f 6e 50 72 6f 63 29 28 6e 61 74 69 76  ationProc)(nativ
e5b0: 65 56 6f 6c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 26  eVol, NULL, 0, &
e5c0: 64 77 2c 0a 09 09 4e 55 4c 4c 2c 20 4e 55 4c 4c  dw,...NULL, NULL
e5d0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f 2a  , NULL, 0);.../*
e5e0: 0a 09 20 2a 20 47 65 74 46 75 6c 6c 50 61 74 68  .. * GetFullPath
e5f0: 4e 61 6d 65 28 29 20 74 75 72 6e 73 20 73 70 65  Name() turns spe
e600: 63 69 61 6c 20 64 65 76 69 63 65 73 20 6c 69 6b  cial devices lik
e610: 65 20 22 4e 55 4c 22 20 69 6e 74 6f 20 22 5c 5c  e "NUL" into "\\
e620: 2e 5c 4e 55 4c 22 2c 0a 09 20 2a 20 62 75 74 20  .\NUL",.. * but 
e630: 47 65 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61  GetVolumeInforma
e640: 74 69 6f 6e 28 29 20 72 65 74 75 72 6e 73 20 66  tion() returns f
e650: 61 69 6c 75 72 65 20 66 6f 72 20 22 5c 5c 2e 5c  ailure for "\\.\
e660: 4e 55 4c 22 2e 20 54 68 69 73 20 77 69 6c 6c 0a  NUL". This will.
e670: 09 20 2a 20 63 61 75 73 65 20 22 4e 55 4c 22 20  . * cause "NUL" 
e680: 74 6f 20 67 65 74 20 61 20 64 72 69 76 65 20 6e  to get a drive n
e690: 75 6d 62 65 72 20 6f 66 20 2d 31 2c 20 77 68 69  umber of -1, whi
e6a0: 63 68 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 61  ch makes about a
e6b0: 73 20 6d 75 63 68 0a 09 20 2a 20 73 65 6e 73 65  s much.. * sense
e6c0: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 73 69 6e   as anything sin
e6d0: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 64  ce the special d
e6e0: 65 76 69 63 65 73 20 64 6f 6e 27 74 20 6c 69 76  evices don't liv
e6f0: 65 20 6f 6e 20 61 6e 79 0a 09 20 2a 20 64 72 69  e on any.. * dri
e700: 76 65 2e 0a 09 20 2a 2f 0a 0a 09 64 65 76 20 3d  ve... */...dev =
e710: 20 64 77 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e   dw;..Tcl_DStrin
e720: 67 46 72 65 65 28 26 76 6f 6c 53 74 72 69 6e 67  gFree(&volString
e730: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
e740: 20 28 28 66 75 6c 6c 50 61 74 68 5b 30 5d 20 21   ((fullPath[0] !
e750: 3d 20 27 5c 30 27 29 20 26 26 20 28 66 75 6c 6c  = '\0') && (full
e760: 50 61 74 68 5b 31 5d 20 3d 3d 20 27 3a 27 29 29  Path[1] == ':'))
e770: 20 7b 0a 09 64 65 76 20 3d 20 54 63 6c 5f 55 6e   {..dev = Tcl_Un
e780: 69 43 68 61 72 54 6f 4c 6f 77 65 72 28 66 75 6c  iCharToLower(ful
e790: 6c 50 61 74 68 5b 30 5d 29 20 2d 20 27 61 27 3b  lPath[0]) - 'a';
e7a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 64  .    } else {..d
e7b0: 65 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ev = -1;.    }. 
e7c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
e7d0: 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 72 65  ee(&ds);..    re
e7e0: 74 75 72 6e 20 64 65 76 3b 0a 7d 0a 0c 0a 2f 2a  turn dev;.}.../*
e7f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
e800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
e840: 4e 61 74 69 76 65 53 74 61 74 4d 6f 64 65 20 2d  NativeStatMode -
e850: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74  -. *. *.Calculat
e860: 65 20 6a 75 73 74 20 74 68 65 20 27 73 74 5f 6d  e just the 'st_m
e870: 6f 64 65 27 20 66 69 65 6c 64 20 6f 66 20 61 20  ode' field of a 
e880: 27 73 74 61 74 27 20 73 74 72 75 63 74 75 72 65  'stat' structure
e890: 2e 0a 20 2a 0a 20 2a 09 49 6e 20 6d 61 6e 79 20  .. *. *.In many 
e8a0: 70 6c 61 63 65 73 20 77 65 20 64 6f 6e 27 74 20  places we don't 
e8b0: 6e 65 65 64 20 74 68 65 20 66 75 6c 6c 20 73 74  need the full st
e8c0: 61 74 20 73 74 72 75 63 74 75 72 65 2c 20 61 6e  at structure, an
e8d0: 64 20 69 74 27 73 20 6d 75 63 68 0a 20 2a 09 66  d it's much. *.f
e8e0: 61 73 74 65 72 20 6a 75 73 74 20 74 6f 20 63 61  aster just to ca
e8f0: 6c 63 75 6c 61 74 65 20 74 68 65 73 65 20 70 69  lculate these pi
e900: 65 63 65 73 2c 20 69 66 20 74 68 61 74 27 73 20  eces, if that's 
e910: 61 6c 6c 20 77 65 20 6e 65 65 64 2e 0a 20 2a 0a  all we need.. *.
e920: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
e930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
e970: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 73 68  atic unsigned sh
e980: 6f 72 74 0a 4e 61 74 69 76 65 53 74 61 74 4d 6f  ort.NativeStatMo
e990: 64 65 28 0a 20 20 20 20 44 57 4f 52 44 20 61 74  de(.    DWORD at
e9a0: 74 72 2c 0a 20 20 20 20 69 6e 74 20 63 68 65 63  tr,.    int chec
e9b0: 6b 4c 69 6e 6b 73 2c 0a 20 20 20 20 69 6e 74 20  kLinks,.    int 
e9c0: 69 73 45 78 65 63 29 0a 7b 0a 20 20 20 20 69 6e  isExec).{.    in
e9d0: 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 66 20  t mode;..    if 
e9e0: 28 63 68 65 63 6b 4c 69 6e 6b 73 20 26 26 20 28  (checkLinks && (
e9f0: 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
ea00: 49 42 55 54 45 5f 52 45 50 41 52 53 45 5f 50 4f  IBUTE_REPARSE_PO
ea10: 49 4e 54 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  INT)) {../*.. * 
ea20: 49 74 20 69 73 20 61 20 6c 69 6e 6b 2e 0a 09 20  It is a link... 
ea30: 2a 2f 0a 0a 09 6d 6f 64 65 20 3d 20 53 5f 49 46  */...mode = S_IF
ea40: 4c 4e 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LNK;.    } else 
ea50: 7b 0a 09 6d 6f 64 65 20 3d 20 28 61 74 74 72 20  {..mode = (attr 
ea60: 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
ea70: 5f 44 49 52 45 43 54 4f 52 59 29 20 3f 20 53 5f  _DIRECTORY) ? S_
ea80: 49 46 44 49 52 7c 53 5f 49 45 58 45 43 20 3a 20  IFDIR|S_IEXEC : 
ea90: 53 5f 49 46 52 45 47 3b 0a 20 20 20 20 7d 0a 20  S_IFREG;.    }. 
eaa0: 20 20 20 6d 6f 64 65 20 7c 3d 20 28 61 74 74 72     mode |= (attr
eab0: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
eac0: 45 5f 52 45 41 44 4f 4e 4c 59 29 20 3f 20 53 5f  E_READONLY) ? S_
ead0: 49 52 45 41 44 20 3a 20 53 5f 49 52 45 41 44 7c  IREAD : S_IREAD|
eae0: 53 5f 49 57 52 49 54 45 3b 0a 20 20 20 20 69 66  S_IWRITE;.    if
eaf0: 20 28 69 73 45 78 65 63 29 20 7b 0a 09 6d 6f 64   (isExec) {..mod
eb00: 65 20 7c 3d 20 53 5f 49 45 58 45 43 3b 0a 20 20  e |= S_IEXEC;.  
eb10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
eb20: 20 2a 20 50 72 6f 70 61 67 61 74 65 20 74 68 65   * Propagate the
eb30: 20 53 5f 49 52 45 41 44 2c 20 53 5f 49 57 52 49   S_IREAD, S_IWRI
eb40: 54 45 2c 20 53 5f 49 45 58 45 43 20 62 69 74 73  TE, S_IEXEC bits
eb50: 20 74 6f 20 74 68 65 20 67 72 6f 75 70 20 61 6e   to the group an
eb60: 64 20 6f 74 68 65 72 0a 20 20 20 20 20 2a 20 70  d other.     * p
eb70: 6f 73 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 2a  ositions..     *
eb80: 2f 0a 0a 20 20 20 20 6d 6f 64 65 20 7c 3d 20 28  /..    mode |= (
eb90: 6d 6f 64 65 20 26 20 28 53 5f 49 52 45 41 44 7c  mode & (S_IREAD|
eba0: 53 5f 49 57 52 49 54 45 7c 53 5f 49 45 58 45 43  S_IWRITE|S_IEXEC
ebb0: 29 29 20 3e 3e 20 33 3b 0a 20 20 20 20 6d 6f 64  )) >> 3;.    mod
ebc0: 65 20 7c 3d 20 28 6d 6f 64 65 20 26 20 28 53 5f  e |= (mode & (S_
ebd0: 49 52 45 41 44 7c 53 5f 49 57 52 49 54 45 7c 53  IREAD|S_IWRITE|S
ebe0: 5f 49 45 58 45 43 29 29 20 3e 3e 20 36 3b 0a 20  _IEXEC)) >> 6;. 
ebf0: 20 20 20 72 65 74 75 72 6e 20 28 75 6e 73 69 67     return (unsig
ec00: 6e 65 64 20 73 68 6f 72 74 29 20 6d 6f 64 65 3b  ned short) mode;
ec10: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
ec20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 2d 0a 20 2a 0a 20 2a 20 54 6f 43 54 69 6d 65  --. *. * ToCTime
ec70: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72   --. *. *.Conver
ec80: 74 73 20 61 20 57 69 6e 64 6f 77 73 20 46 49 4c  ts a Windows FIL
ec90: 45 54 49 4d 45 20 74 6f 20 61 20 74 69 6d 65 5f  ETIME to a time_
eca0: 74 20 69 6e 20 55 54 43 2e 0a 20 2a 0a 20 2a 20  t in UTC.. *. * 
ecb0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75  Results:. *.Retu
ecc0: 72 6e 73 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  rns the count of
ecd0: 20 73 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74 68   seconds from th
ece0: 65 20 50 6f 73 69 78 20 65 70 6f 63 68 2e 0a 20  e Posix epoch.. 
ecf0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
ed00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
ed40: 0a 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 0a  ..static time_t.
ed50: 54 6f 43 54 69 6d 65 28 0a 20 20 20 20 46 49 4c  ToCTime(.    FIL
ed60: 45 54 49 4d 45 20 66 69 6c 65 54 69 6d 65 29 09  ETIME fileTime).
ed70: 09 2f 2a 20 55 54 43 20 74 69 6d 65 20 2a 2f 0a  ./* UTC time */.
ed80: 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
ed90: 47 45 52 20 63 6f 6e 76 65 72 74 65 64 54 69 6d  GER convertedTim
eda0: 65 3b 0a 0a 20 20 20 20 63 6f 6e 76 65 72 74 65  e;..    converte
edb0: 64 54 69 6d 65 2e 4c 6f 77 50 61 72 74 20 3d 20  dTime.LowPart = 
edc0: 66 69 6c 65 54 69 6d 65 2e 64 77 4c 6f 77 44 61  fileTime.dwLowDa
edd0: 74 65 54 69 6d 65 3b 0a 20 20 20 20 63 6f 6e 76  teTime;.    conv
ede0: 65 72 74 65 64 54 69 6d 65 2e 48 69 67 68 50 61  ertedTime.HighPa
edf0: 72 74 20 3d 20 28 4c 4f 4e 47 29 20 66 69 6c 65  rt = (LONG) file
ee00: 54 69 6d 65 2e 64 77 48 69 67 68 44 61 74 65 54  Time.dwHighDateT
ee10: 69 6d 65 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  ime;..    return
ee20: 20 28 74 69 6d 65 5f 74 29 20 28 28 63 6f 6e 76   (time_t) ((conv
ee30: 65 72 74 65 64 54 69 6d 65 2e 51 75 61 64 50 61  ertedTime.QuadPa
ee40: 72 74 20 2d 0a 09 20 20 20 20 28 54 63 6c 5f 57  rt -..    (Tcl_W
ee50: 69 64 65 49 6e 74 29 20 50 4f 53 49 58 5f 45 50  ideInt) POSIX_EP
ee60: 4f 43 48 5f 41 53 5f 46 49 4c 45 54 49 4d 45 29  OCH_AS_FILETIME)
ee70: 20 2f 20 28 54 63 6c 5f 57 69 64 65 49 6e 74 29   / (Tcl_WideInt)
ee80: 20 31 30 30 30 30 30 30 30 29 3b 0a 7d 0a 0c 0a   10000000);.}...
ee90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
eee0: 0a 20 2a 20 46 72 6f 6d 43 54 69 6d 65 20 2d 2d  . * FromCTime --
eef0: 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 72 74 73 20  . *. *.Converts 
ef00: 61 20 74 69 6d 65 5f 74 20 74 6f 20 61 20 57 69  a time_t to a Wi
ef10: 6e 64 6f 77 73 20 46 49 4c 45 54 49 4d 45 0a 20  ndows FILETIME. 
ef20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
ef30: 09 52 65 74 75 72 6e 73 20 74 68 65 20 63 6f 75  .Returns the cou
ef40: 6e 74 20 6f 66 20 31 30 30 2d 6e 73 20 74 69 63  nt of 100-ns tic
ef50: 6b 73 20 73 65 63 6f 6e 64 73 20 66 72 6f 6d 20  ks seconds from 
ef60: 74 68 65 20 57 69 6e 64 6f 77 73 20 65 70 6f 63  the Windows epoc
ef70: 68 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  h.. *. *--------
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efc0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  . */..static voi
efd0: 64 0a 46 72 6f 6d 43 54 69 6d 65 28 0a 20 20 20  d.FromCTime(.   
efe0: 20 74 69 6d 65 5f 74 20 70 6f 73 69 78 54 69 6d   time_t posixTim
eff0: 65 2c 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  e,.    FILETIME 
f000: 2a 66 69 6c 65 54 69 6d 65 29 09 09 2f 2a 20 55  *fileTime)../* U
f010: 54 43 20 54 69 6d 65 20 2a 2f 0a 7b 0a 20 20 20  TC Time */.{.   
f020: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 63   LARGE_INTEGER c
f030: 6f 6e 76 65 72 74 65 64 54 69 6d 65 3b 0a 20 20  onvertedTime;.  
f040: 20 20 63 6f 6e 76 65 72 74 65 64 54 69 6d 65 2e    convertedTime.
f050: 51 75 61 64 50 61 72 74 20 3d 20 28 28 4c 4f 4e  QuadPart = ((LON
f060: 47 4c 4f 4e 47 29 20 70 6f 73 69 78 54 69 6d 65  GLONG) posixTime
f070: 29 20 2a 20 31 30 30 30 30 30 30 30 0a 09 2b 20  ) * 10000000..+ 
f080: 50 4f 53 49 58 5f 45 50 4f 43 48 5f 41 53 5f 46  POSIX_EPOCH_AS_F
f090: 49 4c 45 54 49 4d 45 3b 0a 20 20 20 20 66 69 6c  ILETIME;.    fil
f0a0: 65 54 69 6d 65 2d 3e 64 77 4c 6f 77 44 61 74 65  eTime->dwLowDate
f0b0: 54 69 6d 65 20 3d 20 63 6f 6e 76 65 72 74 65 64  Time = converted
f0c0: 54 69 6d 65 2e 4c 6f 77 50 61 72 74 3b 0a 20 20  Time.LowPart;.  
f0d0: 20 20 66 69 6c 65 54 69 6d 65 2d 3e 64 77 48 69    fileTime->dwHi
f0e0: 67 68 44 61 74 65 54 69 6d 65 20 3d 20 63 6f 6e  ghDateTime = con
f0f0: 76 65 72 74 65 64 54 69 6d 65 2e 48 69 67 68 50  vertedTime.HighP
f100: 61 72 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  art;.}.../*. *--
f110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
f160: 54 63 6c 70 47 65 74 4e 61 74 69 76 65 43 77 64  TclpGetNativeCwd
f170: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
f180: 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
f190: 20 74 68 65 20 6c 69 62 72 61 72 79 20 76 65 72   the library ver
f1a0: 73 69 6f 6e 20 6f 66 20 67 65 74 63 77 64 28 29  sion of getcwd()
f1b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
f1c0: 0a 20 2a 09 54 68 65 20 69 6e 70 75 74 20 61 6e  . *.The input an
f1d0: 64 20 6f 75 74 70 75 74 20 61 72 65 20 66 69 6c  d output are fil
f1e0: 65 73 79 73 74 65 6d 20 70 61 74 68 73 20 69 6e  esystem paths in
f1f0: 20 6e 61 74 69 76 65 20 66 6f 72 6d 2e 20 54 68   native form. Th
f200: 65 20 72 65 73 75 6c 74 0a 20 2a 09 69 73 20 65  e result. *.is e
f210: 69 74 68 65 72 20 74 68 65 20 67 69 76 65 6e 20  ither the given 
f220: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 66 20 74  clientData, if t
f230: 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  he working direc
f240: 74 6f 72 79 20 68 61 73 6e 27 74 0a 20 2a 09 63  tory hasn't. *.c
f250: 68 61 6e 67 65 64 2c 20 6f 72 20 61 20 6e 65 77  hanged, or a new
f260: 20 63 6c 69 65 6e 74 44 61 74 61 20 28 6f 77 6e   clientData (own
f270: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
f280: 29 2c 20 67 69 76 69 6e 67 20 74 68 65 20 6e 65  ), giving the ne
f290: 77 0a 20 2a 09 6e 61 74 69 76 65 20 70 61 74 68  w. *.native path
f2a0: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
f2b0: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f   current directo
f2c0: 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ry could not be 
f2d0: 64 65 74 65 72 6d 69 6e 65 64 2e 0a 20 2a 09 49  determined.. *.I
f2e0: 66 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  f NULL is return
f2f0: 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 63  ed, the caller c
f300: 61 6e 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73  an examine the s
f310: 74 61 6e 64 61 72 64 20 70 6f 73 69 78 20 65 72  tandard posix er
f320: 72 6f 72 0a 20 2a 09 63 6f 64 65 73 20 74 6f 20  ror. *.codes to 
f330: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 61  determine the ca
f340: 75 73 65 20 6f 66 20 74 68 65 20 70 72 6f 62 6c  use of the probl
f350: 65 6d 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  em.. *. * Side e
f360: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
f370: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
f380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
f3c0: 0a 0a 43 6c 69 65 6e 74 44 61 74 61 0a 54 63 6c  ..ClientData.Tcl
f3d0: 70 47 65 74 4e 61 74 69 76 65 43 77 64 28 0a 20  pGetNativeCwd(. 
f3e0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c     ClientData cl
f3f0: 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20 20 20  ientData).{.    
f400: 57 43 48 41 52 20 62 75 66 66 65 72 5b 4d 41 58  WCHAR buffer[MAX
f410: 5f 50 41 54 48 5d 3b 0a 0a 20 20 20 20 69 66 20  _PATH];..    if 
f420: 28 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e  ((*tclWinProcs->
f430: 67 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  getCurrentDirect
f440: 6f 72 79 50 72 6f 63 29 28 4d 41 58 5f 50 41 54  oryProc)(MAX_PAT
f450: 48 2c 20 62 75 66 66 65 72 29 20 3d 3d 20 30 29  H, buffer) == 0)
f460: 20 7b 0a 09 54 63 6c 57 69 6e 43 6f 6e 76 65 72   {..TclWinConver
f470: 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72  tError(GetLastEr
f480: 72 6f 72 28 29 29 3b 0a 09 72 65 74 75 72 6e 20  ror());..return 
f490: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
f4a0: 20 69 66 20 28 63 6c 69 65 6e 74 44 61 74 61 20   if (clientData 
f4b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  != NULL) {..if (
f4c0: 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 75 73 65  tclWinProcs->use
f4d0: 57 69 64 65 29 20 7b 0a 09 20 20 20 20 2f 2a 0a  Wide) {..    /*.
f4e0: 09 20 20 20 20 20 2a 20 55 6e 69 63 6f 64 65 20  .     * Unicode 
f4f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
f500: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 4e  hen running on N
f510: 54 2f 32 4b 2f 58 50 2e 0a 09 20 20 20 20 20 2a  T/2K/XP...     *
f520: 2f 0a 0a 09 20 20 20 20 69 66 20 28 77 63 73 63  /...    if (wcsc
f530: 6d 70 28 28 63 6f 6e 73 74 20 57 43 48 41 52 2a  mp((const WCHAR*
f540: 29 63 6c 69 65 6e 74 44 61 74 61 2c 20 28 63 6f  )clientData, (co
f550: 6e 73 74 20 57 43 48 41 52 2a 29 62 75 66 66 65  nst WCHAR*)buffe
f560: 72 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  r) == 0) {...ret
f570: 75 72 6e 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  urn clientData;.
f580: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b  .    }..} else {
f590: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
f5a0: 20 41 4e 53 49 20 72 65 70 72 65 73 65 6e 74 61   ANSI representa
f5b0: 74 69 6f 6e 20 77 68 65 6e 20 72 75 6e 6e 69 6e  tion when runnin
f5c0: 67 20 6f 6e 20 39 35 2f 39 38 2f 4d 45 2e 0a 09  g on 95/98/ME...
f5d0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
f5e0: 20 28 73 74 72 63 6d 70 28 28 63 6f 6e 73 74 20   (strcmp((const 
f5f0: 63 68 61 72 2a 29 20 63 6c 69 65 6e 74 44 61 74  char*) clientDat
f600: 61 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  a, (const char*)
f610: 20 62 75 66 66 65 72 29 20 3d 3d 20 30 29 20 7b   buffer) == 0) {
f620: 0a 09 09 72 65 74 75 72 6e 20 63 6c 69 65 6e 74  ...return client
f630: 44 61 74 61 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  Data;..    }..}.
f640: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72      }..    retur
f650: 6e 20 54 63 6c 4e 61 74 69 76 65 44 75 70 49 6e  n TclNativeDupIn
f660: 74 65 72 6e 61 6c 52 65 70 28 28 43 6c 69 65 6e  ternalRep((Clien
f670: 74 44 61 74 61 29 20 62 75 66 66 65 72 29 3b 0a  tData) buffer);.
f680: 7d 0a 0c 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 41  }...int.TclpObjA
f690: 63 63 65 73 73 28 0a 20 20 20 20 54 63 6c 5f 4f  ccess(.    Tcl_O
f6a0: 62 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 20  bj *pathPtr,.   
f6b0: 20 69 6e 74 20 6d 6f 64 65 29 0a 7b 0a 20 20 20   int mode).{.   
f6c0: 20 72 65 74 75 72 6e 20 4e 61 74 69 76 65 41 63   return NativeAc
f6d0: 63 65 73 73 28 28 63 6f 6e 73 74 20 54 43 48 41  cess((const TCHA
f6e0: 52 20 2a 29 20 54 63 6c 5f 46 53 47 65 74 4e 61  R *) Tcl_FSGetNa
f6f0: 74 69 76 65 50 61 74 68 28 70 61 74 68 50 74 72  tivePath(pathPtr
f700: 29 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0c 0a 69 6e  ), mode);.}...in
f710: 74 0a 54 63 6c 70 4f 62 6a 4c 73 74 61 74 28 0a  t.TclpObjLstat(.
f720: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 74      Tcl_Obj *pat
f730: 68 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f 53 74  hPtr,.    Tcl_St
f740: 61 74 42 75 66 20 2a 73 74 61 74 50 74 72 29 0a  atBuf *statPtr).
f750: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  {.    /*.     * 
f760: 45 6e 73 75 72 65 20 63 6f 72 72 65 63 74 20 66  Ensure correct f
f770: 69 6c 65 20 73 69 7a 65 73 20 62 79 20 66 6f 72  ile sizes by for
f780: 63 69 6e 67 20 74 68 65 20 4f 53 20 74 6f 20 77  cing the OS to w
f790: 72 69 74 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  rite any pending
f7a0: 20 64 61 74 61 0a 20 20 20 20 20 2a 20 74 6f 20   data.     * to 
f7b0: 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 64 6f  disk. This is do
f7c0: 6e 65 20 6f 6e 6c 79 20 66 6f 72 20 63 68 61 6e  ne only for chan
f7d0: 6e 65 6c 73 20 77 68 69 63 68 20 61 72 65 20 64  nels which are d
f7e0: 69 72 74 79 2c 20 69 2e 65 2e 20 68 61 76 65 20  irty, i.e. have 
f7f0: 62 65 65 6e 0a 20 20 20 20 20 2a 20 77 72 69 74  been.     * writ
f800: 74 65 6e 20 74 6f 20 73 69 6e 63 65 20 74 68 65  ten to since the
f810: 20 6c 61 73 74 20 66 6c 75 73 68 20 68 65 72 65   last flush here
f820: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54  ..     */..    T
f830: 63 6c 57 69 6e 46 6c 75 73 68 44 69 72 74 79 43  clWinFlushDirtyC
f840: 68 61 6e 6e 65 6c 73 28 29 3b 0a 0a 20 20 20 20  hannels();..    
f850: 72 65 74 75 72 6e 20 4e 61 74 69 76 65 53 74 61  return NativeSta
f860: 74 28 28 63 6f 6e 73 74 20 54 43 48 41 52 20 2a  t((const TCHAR *
f870: 29 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76  ) Tcl_FSGetNativ
f880: 65 50 61 74 68 28 70 61 74 68 50 74 72 29 2c 0a  ePath(pathPtr),.
f890: 09 20 20 20 20 73 74 61 74 50 74 72 2c 20 31 29  .    statPtr, 1)
f8a0: 3b 0a 7d 0a 0c 0a 23 69 66 64 65 66 20 53 5f 49  ;.}...#ifdef S_I
f8b0: 46 4c 4e 4b 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54  FLNK.Tcl_Obj *.T
f8c0: 63 6c 70 4f 62 6a 4c 69 6e 6b 28 0a 20 20 20 20  clpObjLink(.    
f8d0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72  Tcl_Obj *pathPtr
f8e0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74  ,.    Tcl_Obj *t
f8f0: 6f 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 6c 69  oPtr,.    int li
f900: 6e 6b 41 63 74 69 6f 6e 29 0a 7b 0a 20 20 20 20  nkAction).{.    
f910: 69 66 20 28 74 6f 50 74 72 20 21 3d 20 4e 55 4c  if (toPtr != NUL
f920: 4c 29 20 7b 0a 09 69 6e 74 20 72 65 73 3b 0a 09  L) {..int res;..
f930: 54 43 48 41 52 20 2a 4c 69 6e 6b 54 61 72 67 65  TCHAR *LinkTarge
f940: 74 3b 0a 09 54 43 48 41 52 20 2a 4c 69 6e 6b 53  t;..TCHAR *LinkS
f950: 6f 75 72 63 65 20 3d 20 28 54 43 48 41 52 20 2a  ource = (TCHAR *
f960: 29 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76  ) Tcl_FSGetNativ
f970: 65 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a  ePath(pathPtr);.
f980: 09 54 63 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 61 6c  .Tcl_Obj *normal
f990: 69 7a 65 64 54 6f 50 74 72 20 3d 20 54 63 6c 5f  izedToPtr = Tcl_
f9a0: 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64 50  FSGetNormalizedP
f9b0: 61 74 68 28 4e 55 4c 4c 2c 20 74 6f 50 74 72 29  ath(NULL, toPtr)
f9c0: 3b 0a 0a 09 69 66 20 28 6e 6f 72 6d 61 6c 69 7a  ;...if (normaliz
f9d0: 65 64 54 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29  edToPtr == NULL)
f9e0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e   {..    return N
f9f0: 55 4c 4c 3b 0a 09 7d 0a 0a 09 4c 69 6e 6b 54 61  ULL;..}...LinkTa
fa00: 72 67 65 74 20 3d 20 28 54 43 48 41 52 20 2a 29  rget = (TCHAR *)
fa10: 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65   Tcl_FSGetNative
fa20: 50 61 74 68 28 6e 6f 72 6d 61 6c 69 7a 65 64 54  Path(normalizedT
fa30: 6f 50 74 72 29 3b 0a 0a 09 69 66 20 28 4c 69 6e  oPtr);...if (Lin
fa40: 6b 53 6f 75 72 63 65 20 3d 3d 20 4e 55 4c 4c 20  kSource == NULL 
fa50: 7c 7c 20 4c 69 6e 6b 54 61 72 67 65 74 20 3d 3d  || LinkTarget ==
fa60: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65   NULL) {..    re
fa70: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 72  turn NULL;..}..r
fa80: 65 73 20 3d 20 57 69 6e 4c 69 6e 6b 28 4c 69 6e  es = WinLink(Lin
fa90: 6b 53 6f 75 72 63 65 2c 20 4c 69 6e 6b 54 61 72  kSource, LinkTar
faa0: 67 65 74 2c 20 6c 69 6e 6b 41 63 74 69 6f 6e 29  get, linkAction)
fab0: 3b 0a 09 69 66 20 28 72 65 73 20 3d 3d 20 30 29  ;..if (res == 0)
fac0: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 74   {..    return t
fad0: 6f 50 74 72 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  oPtr;..} else {.
fae0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
faf0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
fb00: 7b 0a 09 54 43 48 41 52 20 2a 4c 69 6e 6b 53 6f  {..TCHAR *LinkSo
fb10: 75 72 63 65 20 3d 20 28 54 43 48 41 52 20 2a 29  urce = (TCHAR *)
fb20: 20 54 63 6c 5f 46 53 47 65 74 4e 61 74 69 76 65   Tcl_FSGetNative
fb30: 50 61 74 68 28 70 61 74 68 50 74 72 29 3b 0a 0a  Path(pathPtr);..
fb40: 09 69 66 20 28 4c 69 6e 6b 53 6f 75 72 63 65 20  .if (LinkSource 
fb50: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
fb60: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
fb70: 09 72 65 74 75 72 6e 20 57 69 6e 52 65 61 64 4c  .return WinReadL
fb80: 69 6e 6b 28 4c 69 6e 6b 53 6f 75 72 63 65 29 3b  ink(LinkSource);
fb90: 0a 20 20 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  .    }.}.#endif.
fba0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbf0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 46 69 6c  --. *. * TclpFil
fc00: 65 73 79 73 74 65 6d 50 61 74 68 54 79 70 65 20  esystemPathType 
fc10: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75  --. *. *.This fu
fc20: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
fc30: 66 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c  f the native fil
fc40: 65 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 2c  esystem support,
fc50: 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a 09   and returns. *.
fc60: 74 68 65 20 70 61 74 68 20 74 79 70 65 20 6f 66  the path type of
fc70: 20 74 68 65 20 67 69 76 65 6e 20 70 61 74 68 2e   the given path.
fc80: 20 52 65 74 75 72 6e 73 20 4e 54 46 53 20 6f 72   Returns NTFS or
fc90: 20 46 41 54 20 6f 72 20 77 68 61 74 65 76 65 72   FAT or whatever
fca0: 20 69 73 0a 20 2a 09 72 65 74 75 72 6e 65 64 20   is. *.returned 
fcb0: 62 79 20 74 68 65 20 27 76 6f 6c 75 6d 65 20 69  by the 'volume i
fcc0: 6e 66 6f 72 6d 61 74 69 6f 6e 27 20 70 72 6f 63  nformation' proc
fcd0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
fce0: 0a 20 2a 09 4e 55 4c 4c 20 61 74 20 70 72 65 73  . *.NULL at pres
fcf0: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ent.. *. * Side 
fd00: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
fd10: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
fd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd60: 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20  --. */..Tcl_Obj 
fd70: 2a 0a 54 63 6c 70 46 69 6c 65 73 79 73 74 65 6d  *.TclpFilesystem
fd80: 50 61 74 68 54 79 70 65 28 0a 20 20 20 20 54 63  PathType(.    Tc
fd90: 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 0a  l_Obj *pathPtr).
fda0: 7b 0a 23 64 65 66 69 6e 65 20 56 4f 4c 5f 42 55  {.#define VOL_BU
fdb0: 46 5f 53 49 5a 45 20 33 32 0a 20 20 20 20 69 6e  F_SIZE 32.    in
fdc0: 74 20 66 6f 75 6e 64 3b 0a 20 20 20 20 57 43 48  t found;.    WCH
fdd0: 41 52 20 76 6f 6c 54 79 70 65 5b 56 4f 4c 5f 42  AR volType[VOL_B
fde0: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 63 68  UF_SIZE];.    ch
fdf0: 61 72 20 2a 66 69 72 73 74 53 65 70 61 72 61 74  ar *firstSeparat
fe00: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  or;.    const ch
fe10: 61 72 20 2a 70 61 74 68 3b 0a 20 20 20 20 54 63  ar *path;.    Tc
fe20: 6c 5f 4f 62 6a 20 2a 6e 6f 72 6d 50 61 74 68 20  l_Obj *normPath 
fe30: 3d 20 54 63 6c 5f 46 53 47 65 74 4e 6f 72 6d 61  = Tcl_FSGetNorma
fe40: 6c 69 7a 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20  lizedPath(NULL, 
fe50: 70 61 74 68 50 74 72 29 3b 0a 0a 20 20 20 20 69  pathPtr);..    i
fe60: 66 20 28 6e 6f 72 6d 50 61 74 68 20 3d 3d 20 4e  f (normPath == N
fe70: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
fe80: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ULL;.    }.    p
fe90: 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ath = Tcl_GetStr
fea0: 69 6e 67 28 6e 6f 72 6d 50 61 74 68 29 3b 0a 20  ing(normPath);. 
feb0: 20 20 20 69 66 20 28 70 61 74 68 20 3d 3d 20 4e     if (path == N
fec0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ULL) {..return N
fed0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
fee0: 66 69 72 73 74 53 65 70 61 72 61 74 6f 72 20 3d  firstSeparator =
fef0: 20 73 74 72 63 68 72 28 70 61 74 68 2c 20 27 2f   strchr(path, '/
ff00: 27 29 3b 0a 20 20 20 20 69 66 20 28 66 69 72 73  ');.    if (firs
ff10: 74 53 65 70 61 72 61 74 6f 72 20 3d 3d 20 4e 55  tSeparator == NU
ff20: 4c 4c 29 20 7b 0a 09 66 6f 75 6e 64 20 3d 20 74  LL) {..found = t
ff30: 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65 74 56  clWinProcs->getV
ff40: 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  olumeInformation
ff50: 50 72 6f 63 28 0a 09 09 54 63 6c 5f 46 53 47 65  Proc(...Tcl_FSGe
ff60: 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74 68  tNativePath(path
ff70: 50 74 72 29 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e  Ptr), NULL, 0, N
ff80: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ULL, NULL, NULL,
ff90: 0a 09 09 28 57 43 48 41 52 20 2a 29 20 76 6f 6c  ...(WCHAR *) vol
ffa0: 54 79 70 65 2c 20 56 4f 4c 5f 42 55 46 5f 53 49  Type, VOL_BUF_SI
ffb0: 5a 45 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ZE);.    } else 
ffc0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 64 72 69 76  {..Tcl_Obj *driv
ffd0: 65 4e 61 6d 65 20 3d 20 54 63 6c 5f 4e 65 77 53  eName = Tcl_NewS
ffe0: 74 72 69 6e 67 4f 62 6a 28 70 61 74 68 2c 20 66  tringObj(path, f
fff0: 69 72 73 74 53 65 70 61 72 61 74 6f 72 20 2d 20  irstSeparator - 
10000 70 61 74 68 2b 31 29 3b 0a 0a 09 54 63 6c 5f 49  path+1);...Tcl_I
10010 6e 63 72 52 65 66 43 6f 75 6e 74 28 64 72 69 76  ncrRefCount(driv
10020 65 4e 61 6d 65 29 3b 0a 09 66 6f 75 6e 64 20 3d  eName);..found =
10030 20 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 67 65   tclWinProcs->ge
10040 74 56 6f 6c 75 6d 65 49 6e 66 6f 72 6d 61 74 69  tVolumeInformati
10050 6f 6e 50 72 6f 63 28 0a 09 09 54 63 6c 5f 46 53  onProc(...Tcl_FS
10060 47 65 74 4e 61 74 69 76 65 50 61 74 68 28 64 72  GetNativePath(dr
10070 69 76 65 4e 61 6d 65 29 2c 20 4e 55 4c 4c 2c 20  iveName), NULL, 
10080 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  0, NULL, NULL, N
10090 55 4c 4c 2c 0a 09 09 28 57 43 48 41 52 20 2a 29  ULL,...(WCHAR *)
100a0 20 76 6f 6c 54 79 70 65 2c 20 56 4f 4c 5f 42 55   volType, VOL_BU
100b0 46 5f 53 49 5a 45 29 3b 0a 09 54 63 6c 5f 44 65  F_SIZE);..Tcl_De
100c0 63 72 52 65 66 43 6f 75 6e 74 28 64 72 69 76 65  crRefCount(drive
100d0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Name);.    }..  
100e0 20 20 69 66 20 28 66 6f 75 6e 64 20 3d 3d 20 30    if (found == 0
100f0 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
10100 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10110 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
10120 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72  .Tcl_Obj *objPtr
10130 3b 0a 0a 09 54 63 6c 5f 57 69 6e 54 43 68 61 72  ;...Tcl_WinTChar
10140 54 6f 55 74 66 28 28 63 6f 6e 73 74 20 63 68 61  ToUtf((const cha
10150 72 20 2a 29 20 76 6f 6c 54 79 70 65 2c 20 2d 31  r *) volType, -1
10160 2c 20 26 64 73 29 3b 0a 09 6f 62 6a 50 74 72 20  , &ds);..objPtr 
10170 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
10180 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
10190 6c 75 65 28 26 64 73 29 2c 0a 09 09 54 63 6c 5f  lue(&ds),...Tcl_
101a0 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
101b0 73 29 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  s));..Tcl_DStrin
101c0 67 46 72 65 65 28 26 64 73 29 3b 0a 09 72 65 74  gFree(&ds);..ret
101d0 75 72 6e 20 6f 62 6a 50 74 72 3b 0a 20 20 20 20  urn objPtr;.    
101e0 7d 0a 23 75 6e 64 65 66 20 56 4f 4c 5f 42 55 46  }.#undef VOL_BUF
101f0 5f 53 49 5a 45 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20  _SIZE.}.../*. * 
10200 54 68 69 73 20 64 65 66 69 6e 65 20 63 61 6e 20  This define can 
10210 62 65 20 74 75 72 6e 65 64 20 6f 6e 20 74 6f 20  be turned on to 
10220 65 78 70 65 72 69 6d 65 6e 74 20 77 69 74 68 20  experiment with 
10230 61 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 20  a different way 
10240 6f 66 0a 20 2a 20 6e 6f 72 6d 61 6c 69 7a 69 6e  of. * normalizin
10250 67 20 70 61 74 68 73 20 28 75 73 69 6e 67 20 61  g paths (using a
10260 20 64 69 66 66 65 72 65 6e 74 20 57 69 6e 64 6f   different Windo
10270 77 73 20 41 50 49 29 2e 20 55 6e 66 6f 72 74 75  ws API). Unfortu
10280 6e 61 74 65 6c 79 20 74 68 65 20 6e 65 77 0a 20  nately the new. 
10290 2a 20 70 61 74 68 20 73 65 65 6d 73 20 74 6f 20  * path seems to 
102a0 74 61 6b 65 20 61 6c 6d 6f 73 74 20 65 78 61 63  take almost exac
102b0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  tly the same amo
102c0 75 6e 74 20 6f 66 20 74 69 6d 65 20 61 73 20 74  unt of time as t
102d0 68 65 20 6f 6c 64 20 70 61 74 68 21 0a 20 2a 20  he old path!. * 
102e0 54 68 65 20 70 72 69 6d 61 72 79 20 74 69 6d 65  The primary time
102f0 20 74 61 6b 65 6e 20 62 79 20 6e 6f 72 6d 61 6c   taken by normal
10300 69 7a 61 74 69 6f 6e 20 69 73 20 69 6e 0a 20 2a  ization is in. *
10310 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
10320 65 73 45 78 2f 46 69 6e 64 46 69 72 73 74 46 69  esEx/FindFirstFi
10330 6c 65 20 6f 72 20 47 65 74 46 69 6c 65 41 74 74  le or GetFileAtt
10340 72 69 62 75 74 65 73 45 78 2f 47 65 74 4c 6f 6e  ributesEx/GetLon
10350 67 50 61 74 68 4e 61 6d 65 2e 0a 20 2a 20 43 6f  gPathName.. * Co
10360 6e 76 65 72 73 69 6f 6e 20 74 6f 2f 66 72 6f 6d  nversion to/from
10370 20 6e 61 74 69 76 65 20 69 73 20 6e 6f 74 20 61   native is not a
10380 20 73 69 67 6e 69 66 69 63 61 6e 74 20 66 61 63   significant fac
10390 74 6f 72 20 61 74 20 61 6c 6c 2e 0a 20 2a 0a 20  tor at all.. *. 
103a0 2a 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 77 65  * Also, since we
103b0 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 66   have to check f
103c0 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
103d0 73 20 28 72 65 70 61 72 73 65 20 70 6f 69 6e 74  s (reparse point
103e0 73 29 20 74 68 65 6e 20 77 65 0a 20 2a 20 68 61  s) then we. * ha
103f0 76 65 20 74 6f 20 63 61 6c 6c 20 47 65 74 46 69  ve to call GetFi
10400 6c 65 41 74 74 72 69 62 75 74 65 73 20 6f 6e 20  leAttributes on 
10410 65 61 63 68 20 70 61 74 68 20 73 65 67 6d 65 6e  each path segmen
10420 74 20 61 6e 79 77 61 79 2c 20 73 6f 20 74 68 65  t anyway, so the
10430 72 65 27 73 20 6e 6f 0a 20 2a 20 62 65 6e 65 66  re's no. * benef
10440 69 74 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 74  it to doing anyt
10450 68 69 6e 67 20 63 6c 65 76 65 72 20 74 68 65 72  hing clever ther
10460 65 2e 0a 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69  e.. */../* #defi
10470 6e 65 20 54 63 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f  ne TclNORM_LONG_
10480 50 41 54 48 20 2a 2f 0a 0c 0a 2f 2a 0a 20 2a 2d  PATH */.../*. *-
10490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
104e0 20 54 63 6c 70 4f 62 6a 4e 6f 72 6d 61 6c 69 7a   TclpObjNormaliz
104f0 65 50 61 74 68 20 2d 2d 0a 20 2a 0a 20 2a 09 54  ePath --. *. *.T
10500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 63 61  his function sca
10510 6e 73 20 74 68 72 6f 75 67 68 20 61 20 70 61 74  ns through a pat
10520 68 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  h specification 
10530 61 6e 64 20 72 65 70 6c 61 63 65 73 20 69 74 2c  and replaces it,
10540 20 69 6e 0a 20 2a 09 70 6c 61 63 65 2c 20 77 69   in. *.place, wi
10550 74 68 20 61 20 6e 6f 72 6d 61 6c 69 7a 65 64 20  th a normalized 
10560 76 65 72 73 69 6f 6e 2e 20 54 68 69 73 20 6d 65  version. This me
10570 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20 27 6c  ans using the 'l
10580 6f 6e 67 6e 61 6d 65 27 2c 20 61 6e 64 0a 20 2a  ongname', and. *
10590 09 65 78 70 61 6e 64 69 6e 67 20 61 6e 79 20 73  .expanding any s
105a0 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 63 6f  ymbolic links co
105b0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
105c0 68 65 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 52  he path.. *. * R
105d0 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e  esults:. *.The n
105e0 65 77 20 27 6e 65 78 74 43 68 65 63 6b 70 6f 69  ew 'nextCheckpoi
105f0 6e 74 27 20 76 61 6c 75 65 2c 20 67 69 76 69 6e  nt' value, givin
10600 67 20 61 73 20 66 61 72 20 61 73 20 77 65 20 63  g as far as we c
10610 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 0a  ould understand.
10620 20 2a 09 69 6e 20 74 68 65 20 70 61 74 68 2e 0a   *.in the path..
10630 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
10640 74 73 3a 0a 20 2a 09 54 68 65 20 70 61 74 68 50  ts:. *.The pathP
10650 74 72 20 73 74 72 69 6e 67 2c 20 77 68 69 63 68  tr string, which
10660 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 61 20   must contain a 
10670 76 61 6c 69 64 20 70 61 74 68 2c 20 69 73 20 70  valid path, is p
10680 6f 73 73 69 62 6c 79 0a 20 2a 09 6d 6f 64 69 66  ossibly. *.modif
10690 69 65 64 20 69 6e 20 70 6c 61 63 65 2e 0a 20 2a  ied in place.. *
106a0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
106f0 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 4f 62 6a 4e  */..int.TclpObjN
10700 6f 72 6d 61 6c 69 7a 65 50 61 74 68 28 0a 20 20  ormalizePath(.  
10710 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10720 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62  terp,.    Tcl_Ob
10730 6a 20 2a 70 61 74 68 50 74 72 2c 0a 20 20 20 20  j *pathPtr,.    
10740 69 6e 74 20 6e 65 78 74 43 68 65 63 6b 70 6f 69  int nextCheckpoi
10750 6e 74 29 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a  nt).{.    char *
10760 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64  lastValidPathEnd
10770 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
10780 5f 44 53 74 72 69 6e 67 20 64 73 4e 6f 72 6d 3b  _DString dsNorm;
10790 09 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 68  ../* This will h
107a0 6f 6c 64 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a  old the normaliz
107b0 65 64 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20  ed string. */.  
107c0 20 20 63 68 61 72 20 2a 70 61 74 68 2c 20 2a 63    char *path, *c
107d0 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73  urrentPathEndPos
107e0 69 74 69 6f 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f  ition;.    Tcl_O
107f0 62 6a 20 2a 74 65 6d 70 20 3d 20 4e 55 4c 4c 3b  bj *temp = NULL;
10800 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
10810 67 49 6e 69 74 28 26 64 73 4e 6f 72 6d 29 3b 0a  gInit(&dsNorm);.
10820 20 20 20 20 70 61 74 68 20 3d 20 54 63 6c 5f 47      path = Tcl_G
10830 65 74 53 74 72 69 6e 67 28 70 61 74 68 50 74 72  etString(pathPtr
10840 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 57  );..    if (TclW
10850 69 6e 47 65 74 50 6c 61 74 66 6f 72 6d 49 64 28  inGetPlatformId(
10860 29 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  ) == VER_PLATFOR
10870 4d 5f 57 49 4e 33 32 5f 57 49 4e 44 4f 57 53 29  M_WIN32_WINDOWS)
10880 20 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 27 72 65   {../*.. * We're
10890 20 6f 6e 20 57 69 6e 39 35 2c 20 39 38 20 6f 72   on Win95, 98 or
108a0 20 4d 45 2e 20 54 68 65 72 65 20 61 72 65 20 74   ME. There are t
108b0 77 6f 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 69  wo assumptions i
108c0 6e 20 74 68 69 73 20 62 6c 6f 63 6b 0a 09 20 2a  n this block.. *
108d0 20 6f 66 20 63 6f 64 65 2e 20 46 69 72 73 74 20   of code. First 
108e0 74 68 61 74 20 74 68 65 20 6e 61 74 69 76 65 20  that the native 
108f0 28 4e 55 4c 4c 29 20 65 6e 63 6f 64 69 6e 67 20  (NULL) encoding 
10900 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 73 63  is basically asc
10910 69 69 2c 0a 09 20 2a 20 61 6e 64 20 73 65 63 6f  ii,.. * and seco
10920 6e 64 20 74 68 61 74 20 73 79 6d 62 6f 6c 69 63  nd that symbolic
10930 20 6c 69 6e 6b 73 20 61 72 65 20 6e 6f 74 20 70   links are not p
10940 6f 73 73 69 62 6c 65 2e 20 42 6f 74 68 20 6f 66  ossible. Both of
10950 20 74 68 65 73 65 0a 09 20 2a 20 61 73 73 75 6d   these.. * assum
10960 70 74 69 6f 6e 73 20 61 70 70 65 61 72 20 74 6f  ptions appear to
10970 20 62 65 20 74 72 75 65 20 6f 66 20 74 68 65 73   be true of thes
10980 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
10990 65 6d 73 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20  ems... */...int 
109a0 69 73 44 72 69 76 65 20 3d 20 31 3b 0a 09 54 63  isDrive = 1;..Tc
109b0 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 0a 09  l_DString ds;...
109c0 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f  currentPathEndPo
109d0 73 69 74 69 6f 6e 20 3d 20 70 61 74 68 20 2b 20  sition = path + 
109e0 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a  nextCheckpoint;.
109f0 09 69 66 20 28 2a 63 75 72 72 65 6e 74 50 61 74  .if (*currentPat
10a00 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 3d 20  hEndPosition == 
10a10 27 2f 27 29 20 7b 0a 09 20 20 20 20 63 75 72 72  '/') {..    curr
10a20 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69  entPathEndPositi
10a30 6f 6e 2b 2b 3b 0a 09 7d 0a 0a 09 77 68 69 6c 65  on++;..}...while
10a40 20 28 31 29 20 7b 0a 09 20 20 20 20 63 68 61 72   (1) {..    char
10a50 20 63 75 72 20 3d 20 2a 63 75 72 72 65 6e 74 50   cur = *currentP
10a60 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a  athEndPosition;.
10a70 0a 09 20 20 20 20 69 66 20 28 28 63 75 72 3d 3d  ..    if ((cur==
10a80 27 2f 27 20 7c 7c 20 63 75 72 3d 3d 30 29 20 26  '/' || cur==0) &
10a90 26 20 28 70 61 74 68 20 21 3d 20 63 75 72 72 65  & (path != curre
10aa0 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f  ntPathEndPositio
10ab0 6e 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20  n)) {.../*... * 
10ac0 52 65 61 63 68 65 64 20 64 69 72 65 63 74 6f 72  Reached director
10ad0 79 20 73 65 70 61 72 61 74 6f 72 2c 20 6f 72 20  y separator, or 
10ae0 65 6e 64 20 6f 66 20 73 74 72 69 6e 67 2e 0a 09  end of string...
10af0 09 20 2a 2f 0a 0a 09 09 63 6f 6e 73 74 20 63 68  . */....const ch
10b00 61 72 20 2a 6e 61 74 69 76 65 50 61 74 68 20 3d  ar *nativePath =
10b10 20 54 63 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e   Tcl_UtfToExtern
10b20 61 6c 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  alDString(NULL, 
10b30 70 61 74 68 2c 0a 09 09 09 63 75 72 72 65 6e 74  path,....current
10b40 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20  PathEndPosition 
10b50 2d 20 70 61 74 68 2c 20 26 64 73 29 3b 0a 0a 09  - path, &ds);...
10b60 09 2f 2a 0a 09 09 20 2a 20 4e 6f 77 20 77 65 20  ./*... * Now we 
10b70 63 6f 6e 76 65 72 74 20 74 68 65 20 74 61 69 6c  convert the tail
10b80 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
10b90 70 61 74 68 20 74 6f 20 69 74 73 20 27 6c 6f 6e  path to its 'lon
10ba0 67 0a 09 09 20 2a 20 66 6f 72 6d 27 2c 20 61 6e  g... * form', an
10bb0 64 20 61 70 70 65 6e 64 20 69 74 20 74 6f 20 27  d append it to '
10bc0 64 73 4e 6f 72 6d 27 20 77 68 69 63 68 20 68 6f  dsNorm' which ho
10bd0 6c 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a  lds the current.
10be0 09 09 20 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20  .. * normalized 
10bf0 70 61 74 68 2c 20 69 66 20 74 68 65 20 66 69 6c  path, if the fil
10c00 65 20 65 78 69 73 74 73 2e 0a 09 09 20 2a 2f 0a  e exists.... */.
10c10 0a 09 09 69 66 20 28 69 73 44 72 69 76 65 29 20  ...if (isDrive) 
10c20 7b 0a 09 09 20 20 20 20 69 66 20 28 47 65 74 46  {...    if (GetF
10c30 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 6e  ileAttributesA(n
10c40 61 74 69 76 65 50 61 74 68 29 0a 09 09 09 20 20  ativePath)....  
10c50 20 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c    == INVALID_FIL
10c60 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 7b 0a  E_ATTRIBUTES) {.
10c70 09 09 09 2f 2a 0a 09 09 09 20 2a 20 46 69 6c 65  .../*.... * File
10c80 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a   doesn't exist..
10c90 09 09 09 20 2a 2f 0a 0a 09 09 09 69 66 20 28 69  ... */.....if (i
10ca0 73 44 72 69 76 65 29 20 7b 0a 09 09 09 20 20 20  sDrive) {....   
10cb0 20 69 6e 74 20 6c 65 6e 20 3d 20 57 69 6e 49 73   int len = WinIs
10cc0 52 65 73 65 72 76 65 64 28 70 61 74 68 29 3b 0a  Reserved(path);.
10cd0 0a 09 09 09 20 20 20 20 69 66 20 28 6c 65 6e 20  ....    if (len 
10ce0 3e 20 30 29 20 7b 0a 09 09 09 09 2f 2a 0a 09 09  > 0) {...../*...
10cf0 09 09 20 2a 20 41 63 74 75 61 6c 6c 79 20 69 74  .. * Actually it
10d00 20 64 6f 65 73 20 65 78 69 73 74 20 2d 20 43 4f   does exist - CO
10d10 4d 31 2c 20 65 74 63 2e 0a 09 09 09 09 20 2a 2f  M1, etc...... */
10d20 0a 0a 09 09 09 09 69 6e 74 20 69 3b 0a 0a 09 09  ......int i;....
10d30 09 09 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c 6c  ..for (i=0 ; i<l
10d40 65 6e 20 3b 20 69 2b 2b 29 20 7b 0a 09 09 09 09  en ; i++) {.....
10d50 20 20 20 20 69 66 20 28 6e 61 74 69 76 65 50 61      if (nativePa
10d60 74 68 5b 69 5d 20 3e 3d 20 27 61 27 29 20 7b 0a  th[i] >= 'a') {.
10d70 09 09 09 09 09 28 28 63 68 61 72 20 2a 29 20 6e  .....((char *) n
10d80 61 74 69 76 65 50 61 74 68 29 5b 69 5d 20 2d 3d  ativePath)[i] -=
10d90 20 28 27 61 27 2d 27 41 27 29 3b 0a 09 09 09 09   ('a'-'A');.....
10da0 20 20 20 20 7d 0a 09 09 09 09 7d 0a 09 09 09 09      }.....}.....
10db0 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
10dc0 64 28 26 64 73 4e 6f 72 6d 2c 20 6e 61 74 69 76  d(&dsNorm, nativ
10dd0 65 50 61 74 68 2c 20 6c 65 6e 29 3b 0a 09 09 09  ePath, len);....
10de0 09 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e  .lastValidPathEn
10df0 64 20 3d 20 63 75 72 72 65 6e 74 50 61 74 68 45  d = currentPathE
10e00 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 09 09 09 20  ndPosition;.... 
10e10 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6e 65     } else if (ne
10e20 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d 3d 20  xtCheckpoint == 
10e30 30 29 20 7b 0a 09 09 09 09 2f 2a 20 50 61 74 68  0) {...../* Path
10e40 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64   starts with a d
10e50 72 69 76 65 20 64 65 73 69 67 6e 61 74 69 6f 6e  rive designation
10e60 0a 09 09 09 09 20 2a 20 74 68 61 74 27 73 20 6e  ..... * that's n
10e70 6f 74 20 61 63 74 75 61 6c 6c 79 20 6f 6e 20 74  ot actually on t
10e80 68 65 20 73 79 73 74 65 6d 2e 0a 09 09 09 09 20  he system...... 
10e90 2a 20 57 65 20 73 74 69 6c 6c 20 6d 75 73 74 20  * We still must 
10ea0 6e 6f 72 6d 61 6c 69 7a 65 20 75 70 20 70 61 73  normalize up pas
10eb0 74 20 74 68 65 0a 09 09 09 09 20 2a 20 66 69 72  t the..... * fir
10ec0 73 74 20 73 65 70 61 72 61 74 6f 72 2e 20 20 5b  st separator.  [
10ed0 42 75 67 20 33 36 30 33 34 33 34 5d 20 2a 2f 0a  Bug 3603434] */.
10ee0 09 09 09 09 63 75 72 72 65 6e 74 50 61 74 68 45  ....currentPathE
10ef0 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 09 09  ndPosition++;...
10f00 09 20 20 20 20 7d 0a 09 09 09 7d 0a 09 09 09 54  .    }....}....T
10f10 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
10f20 64 73 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ds);....break;..
10f30 09 20 20 20 20 7d 0a 09 09 20 20 20 20 69 66 20  .    }...    if 
10f40 28 6e 61 74 69 76 65 50 61 74 68 5b 30 5d 20 3e  (nativePath[0] >
10f50 3d 20 27 61 27 29 20 7b 0a 09 09 09 28 28 63 68  = 'a') {....((ch
10f60 61 72 20 2a 29 20 6e 61 74 69 76 65 50 61 74 68  ar *) nativePath
10f70 29 5b 30 5d 20 2d 3d 20 28 27 61 27 20 2d 20 27  )[0] -= ('a' - '
10f80 41 27 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20  A');...    }... 
10f90 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
10fa0 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 6e 61  pend(&dsNorm, na
10fb0 74 69 76 65 50 61 74 68 2c 0a 09 09 09 20 20 20  tivePath,....   
10fc0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
10fd0 74 68 28 26 64 73 29 29 3b 0a 09 09 7d 20 65 6c  th(&ds));...} el
10fe0 73 65 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20  se {...    char 
10ff0 2a 63 68 65 63 6b 44 6f 74 73 20 3d 20 4e 55 4c  *checkDots = NUL
11000 4c 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 6c 61  L;....    if (la
11010 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 5b 31  stValidPathEnd[1
11020 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 09 63  ] == '.') {....c
11030 68 65 63 6b 44 6f 74 73 20 3d 20 6c 61 73 74 56  heckDots = lastV
11040 61 6c 69 64 50 61 74 68 45 6e 64 20 2b 20 31 3b  alidPathEnd + 1;
11050 0a 09 09 09 77 68 69 6c 65 20 28 63 68 65 63 6b  ....while (check
11060 44 6f 74 73 20 3c 20 63 75 72 72 65 6e 74 50 61  Dots < currentPa
11070 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 29 20 7b  thEndPosition) {
11080 0a 09 09 09 20 20 20 20 69 66 20 28 2a 63 68 65  ....    if (*che
11090 63 6b 44 6f 74 73 20 21 3d 20 27 2e 27 29 20 7b  ckDots != '.') {
110a0 0a 09 09 09 09 63 68 65 63 6b 44 6f 74 73 20 3d  .....checkDots =
110b0 20 4e 55 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b   NULL;.....break
110c0 3b 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 20 20  ;....    }....  
110d0 20 20 63 68 65 63 6b 44 6f 74 73 2b 2b 3b 0a 09    checkDots++;..
110e0 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20  ..}...    }...  
110f0 20 20 69 66 20 28 63 68 65 63 6b 44 6f 74 73 20    if (checkDots 
11100 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 6e  != NULL) {....in
11110 74 20 64 6f 74 4c 65 6e 20 3d 20 63 75 72 72 65  t dotLen = curre
11120 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f  ntPathEndPositio
11130 6e 2d 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45  n-lastValidPathE
11140 6e 64 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a  nd;...../*.... *
11150 20 50 61 74 68 20 69 73 20 6a 75 73 74 20 64 6f   Path is just do
11160 74 73 2e 20 57 65 20 73 68 6f 75 6c 64 6e 27 74  ts. We shouldn't
11170 20 72 65 61 6c 6c 79 20 65 76 65 72 20 73 65 65   really ever see
11180 20 61 0a 09 09 09 20 2a 20 70 61 74 68 20 6c 69   a.... * path li
11190 6b 65 20 74 68 61 74 2e 20 48 6f 77 65 76 65 72  ke that. However
111a0 2c 20 74 6f 20 62 65 20 6e 69 63 65 20 77 65 20  , to be nice we 
111b0 61 74 20 6c 65 61 73 74 0a 09 09 09 20 2a 20 64  at least.... * d
111c0 6f 6e 27 74 20 6d 61 6e 67 6c 65 20 74 68 65 20  on't mangle the 
111d0 70 61 74 68 20 2d 20 77 65 20 6a 75 73 74 20 61  path - we just a
111e0 64 64 20 74 68 65 20 64 6f 74 73 20 61 73 20 61  dd the dots as a
111f0 0a 09 09 09 20 2a 20 70 61 74 68 20 73 65 67 6d  .... * path segm
11200 65 6e 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  ent and continue
11210 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 54 63 6c 5f  .... */.....Tcl_
11220 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
11230 73 4e 6f 72 6d 2c 20 28 54 43 48 41 52 20 2a 29  sNorm, (TCHAR *)
11240 0a 09 09 09 09 28 6e 61 74 69 76 65 50 61 74 68  .....(nativePath
11250 20 2b 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65   + Tcl_DStringLe
11260 6e 67 74 68 28 26 64 73 29 2d 64 6f 74 4c 65 6e  ngth(&ds)-dotLen
11270 29 2c 0a 09 09 09 09 64 6f 74 4c 65 6e 29 3b 0a  ),.....dotLen);.
11280 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
11290 09 09 2f 2a 0a 09 09 09 20 2a 20 4e 6f 72 6d 61  ../*.... * Norma
112a0 6c 20 70 61 74 68 2e 0a 09 09 09 20 2a 2f 0a 0a  l path..... */..
112b0 09 09 09 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41  ...WIN32_FIND_DA
112c0 54 41 20 66 44 61 74 61 3b 0a 09 09 09 48 41 4e  TA fData;....HAN
112d0 44 4c 45 20 68 61 6e 64 6c 65 3b 0a 0a 09 09 09  DLE handle;.....
112e0 68 61 6e 64 6c 65 20 3d 20 46 69 6e 64 46 69 72  handle = FindFir
112f0 73 74 46 69 6c 65 41 28 6e 61 74 69 76 65 50 61  stFileA(nativePa
11300 74 68 2c 20 26 66 44 61 74 61 29 3b 0a 09 09 09  th, &fData);....
11310 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e  if (handle == IN
11320 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
11330 55 45 29 20 7b 0a 09 09 09 20 20 20 20 69 66 20  UE) {....    if 
11340 28 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  (GetFileAttribut
11350 65 73 41 28 6e 61 74 69 76 65 50 61 74 68 29 0a  esA(nativePath).
11360 09 09 09 09 20 20 20 20 3d 3d 20 49 4e 56 41 4c  ....    == INVAL
11370 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
11380 45 53 29 20 7b 0a 09 09 09 09 2f 2a 0a 09 09 09  ES) {...../*....
11390 09 20 2a 20 46 69 6c 65 20 64 6f 65 73 6e 27 74  . * File doesn't
113a0 20 65 78 69 73 74 2e 0a 09 09 09 09 20 2a 2f 0a   exist...... */.
113b0 0a 09 09 09 09 54 63 6c 5f 44 53 74 72 69 6e 67  .....Tcl_DString
113c0 46 72 65 65 28 26 64 73 29 3b 0a 09 09 09 09 62  Free(&ds);.....b
113d0 72 65 61 6b 3b 0a 09 09 09 20 20 20 20 7d 0a 0a  reak;....    }..
113e0 09 09 09 20 20 20 20 2f 2a 0a 09 09 09 20 20 20  ...    /*....   
113f0 20 20 2a 20 54 68 69 73 20 69 73 20 75 73 75 61    * This is usua
11400 6c 6c 79 20 74 68 65 20 27 2f 27 20 69 6e 20 27  lly the '/' in '
11410 63 3a 2f 27 20 61 74 20 65 6e 64 20 6f 66 0a 09  c:/' at end of..
11420 09 09 20 20 20 20 20 2a 20 73 74 72 69 6e 67 2e  ..     * string.
11430 0a 09 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 09  ....     */.....
11440 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41      Tcl_DStringA
11450 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 22 2f  ppend(&dsNorm,"/
11460 22 2c 20 31 29 3b 0a 09 09 09 7d 20 65 6c 73 65  ", 1);....} else
11470 20 7b 0a 09 09 09 20 20 20 20 63 68 61 72 20 2a   {....    char *
11480 6e 61 74 69 76 65 4e 61 6d 65 3b 0a 0a 09 09 09  nativeName;.....
11490 20 20 20 20 69 66 20 28 66 44 61 74 61 2e 63 46      if (fData.cF
114a0 69 6c 65 4e 61 6d 65 5b 30 5d 20 21 3d 20 27 5c  ileName[0] != '\
114b0 30 27 29 20 7b 0a 09 09 09 09 6e 61 74 69 76 65  0') {.....native
114c0 4e 61 6d 65 20 3d 20 66 44 61 74 61 2e 63 46 69  Name = fData.cFi
114d0 6c 65 4e 61 6d 65 3b 0a 09 09 09 20 20 20 20 7d  leName;....    }
114e0 20 65 6c 73 65 20 7b 0a 09 09 09 09 6e 61 74 69   else {.....nati
114f0 76 65 4e 61 6d 65 20 3d 20 66 44 61 74 61 2e 63  veName = fData.c
11500 41 6c 74 65 72 6e 61 74 65 46 69 6c 65 4e 61 6d  AlternateFileNam
11510 65 3b 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 20  e;....    }.... 
11520 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 61 6e     FindClose(han
11530 64 6c 65 29 3b 0a 09 09 09 20 20 20 20 54 63 6c  dle);....    Tcl
11540 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
11550 64 73 4e 6f 72 6d 2c 22 2f 22 2c 20 31 29 3b 0a  dsNorm,"/", 1);.
11560 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ...    Tcl_DStri
11570 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d  ngAppend(&dsNorm
11580 2c 6e 61 74 69 76 65 4e 61 6d 65 2c 2d 31 29 3b  ,nativeName,-1);
11590 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09  ....}...    }...
115a0 7d 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  }...Tcl_DStringF
115b0 72 65 65 28 26 64 73 29 3b 0a 09 09 6c 61 73 74  ree(&ds);...last
115c0 56 61 6c 69 64 50 61 74 68 45 6e 64 20 3d 20 63  ValidPathEnd = c
115d0 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73  urrentPathEndPos
115e0 69 74 69 6f 6e 3b 0a 09 09 69 66 20 28 63 75 72  ition;...if (cur
115f0 20 3d 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 62   == 0) {...    b
11600 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a  reak;...}..../*.
11610 09 09 20 2a 20 49 66 20 77 65 20 67 65 74 20 68  .. * If we get h
11620 65 72 65 2c 20 77 65 27 76 65 20 67 6f 74 20 70  ere, we've got p
11630 61 73 74 20 6f 6e 65 20 64 69 72 65 63 74 6f 72  ast one director
11640 79 20 64 65 6c 69 6d 69 74 65 72 2c 20 73 6f 0a  y delimiter, so.
11650 09 09 20 2a 20 77 65 20 6b 6e 6f 77 20 69 74 20  .. * we know it 
11660 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 20 64  is no longer a d
11670 72 69 76 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09 69  rive.... */....i
11680 73 44 72 69 76 65 20 3d 20 30 3b 0a 09 20 20 20  sDrive = 0;..   
11690 20 7d 0a 09 20 20 20 20 63 75 72 72 65 6e 74 50   }..    currentP
116a0 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b  athEndPosition++
116b0 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
116c0 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 27 72 65 20  {../*.. * We're 
116d0 6f 6e 20 57 69 6e 4e 54 20 28 6f 72 20 32 30 30  on WinNT (or 200
116e0 30 20 6f 72 20 58 50 3b 20 73 6f 6d 65 74 68 69  0 or XP; somethi
116f0 6e 67 20 77 69 74 68 20 61 6e 20 4e 54 20 63 6f  ng with an NT co
11700 72 65 29 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20  re)... */...int 
11710 69 73 44 72 69 76 65 20 3d 20 31 3b 0a 09 54 63  isDrive = 1;..Tc
11720 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 0a 09  l_DString ds;...
11730 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f  currentPathEndPo
11740 73 69 74 69 6f 6e 20 3d 20 70 61 74 68 20 2b 20  sition = path + 
11750 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a  nextCheckpoint;.
11760 09 69 66 20 28 2a 63 75 72 72 65 6e 74 50 61 74  .if (*currentPat
11770 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 3d 20  hEndPosition == 
11780 27 2f 27 29 20 7b 0a 09 20 20 20 20 63 75 72 72  '/') {..    curr
11790 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69  entPathEndPositi
117a0 6f 6e 2b 2b 3b 0a 09 7d 0a 09 77 68 69 6c 65 20  on++;..}..while 
117b0 28 31 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  (1) {..    char 
117c0 63 75 72 20 3d 20 2a 63 75 72 72 65 6e 74 50 61  cur = *currentPa
117d0 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 3b 0a 0a  thEndPosition;..
117e0 09 20 20 20 20 69 66 20 28 28 63 75 72 3d 3d 27  .    if ((cur=='
117f0 2f 27 20 7c 7c 20 63 75 72 3d 3d 30 29 20 26 26  /' || cur==0) &&
11800 20 28 70 61 74 68 20 21 3d 20 63 75 72 72 65 6e   (path != curren
11810 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e  tPathEndPosition
11820 29 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 52  )) {.../*... * R
11830 65 61 63 68 65 64 20 64 69 72 65 63 74 6f 72 79  eached directory
11840 20 73 65 70 61 72 61 74 6f 72 2c 20 6f 72 20 65   separator, or e
11850 6e 64 20 6f 66 20 73 74 72 69 6e 67 2e 0a 09 09  nd of string....
11860 20 2a 2f 0a 0a 09 09 57 49 4e 33 32 5f 46 49 4c   */....WIN32_FIL
11870 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
11880 20 64 61 74 61 3b 0a 09 09 63 6f 6e 73 74 20 63   data;...const c
11890 68 61 72 20 2a 6e 61 74 69 76 65 50 61 74 68 20  har *nativePath 
118a0 3d 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f 54 43  = Tcl_WinUtfToTC
118b0 68 61 72 28 70 61 74 68 2c 0a 09 09 09 63 75 72  har(path,....cur
118c0 72 65 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74  rentPathEndPosit
118d0 69 6f 6e 20 2d 20 70 61 74 68 2c 20 26 64 73 29  ion - path, &ds)
118e0 3b 0a 0a 09 09 69 66 20 28 28 2a 74 63 6c 57 69  ;....if ((*tclWi
118f0 6e 50 72 6f 63 73 2d 3e 67 65 74 46 69 6c 65 41  nProcs->getFileA
11900 74 74 72 69 62 75 74 65 73 45 78 50 72 6f 63 29  ttributesExProc)
11910 28 6e 61 74 69 76 65 50 61 74 68 2c 0a 09 09 09  (nativePath,....
11920 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
11930 6e 64 61 72 64 2c 20 26 64 61 74 61 29 20 21 3d  ndard, &data) !=
11940 20 54 52 55 45 29 20 7b 0a 09 09 20 20 20 20 2f   TRUE) {...    /
11950 2a 0a 09 09 20 20 20 20 20 2a 20 46 69 6c 65 20  *...     * File 
11960 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2e 0a 09  doesn't exist...
11970 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20  .     */....    
11980 69 66 20 28 69 73 44 72 69 76 65 29 20 7b 0a 09  if (isDrive) {..
11990 09 09 69 6e 74 20 6c 65 6e 20 3d 20 57 69 6e 49  ..int len = WinI
119a0 73 52 65 73 65 72 76 65 64 28 70 61 74 68 29 3b  sReserved(path);
119b0 0a 0a 09 09 09 69 66 20 28 6c 65 6e 20 3e 20 30  .....if (len > 0
119c0 29 20 7b 0a 09 09 09 20 20 20 20 2f 2a 0a 09 09  ) {....    /*...
119d0 09 20 20 20 20 20 2a 20 41 63 74 75 61 6c 6c 79  .     * Actually
119e0 20 69 74 20 64 6f 65 73 20 65 78 69 73 74 20 2d   it does exist -
119f0 20 43 4f 4d 31 2c 20 65 74 63 2e 0a 09 09 09 20   COM1, etc..... 
11a00 20 20 20 20 2a 2f 0a 0a 09 09 09 20 20 20 20 69      */.....    i
11a10 6e 74 20 69 3b 0a 0a 09 09 09 20 20 20 20 66 6f  nt i;.....    fo
11a20 72 20 28 69 3d 30 20 3b 20 69 3c 6c 65 6e 20 3b  r (i=0 ; i<len ;
11a30 20 69 2b 2b 29 20 7b 0a 09 09 09 09 57 43 48 41   i++) {.....WCHA
11a40 52 20 77 63 20 3d 20 28 28 57 43 48 41 52 20 2a  R wc = ((WCHAR *
11a50 29 20 6e 61 74 69 76 65 50 61 74 68 29 5b 69 5d  ) nativePath)[i]
11a60 3b 0a 0a 09 09 09 09 69 66 20 28 77 63 20 3e 3d  ;......if (wc >=
11a70 20 4c 27 61 27 29 20 7b 0a 09 09 09 09 20 20 20   L'a') {.....   
11a80 20 77 63 20 2d 3d 20 28 4c 27 61 27 20 2d 20 4c   wc -= (L'a' - L
11a90 27 41 27 29 3b 0a 09 09 09 09 20 20 20 20 28 28  'A');.....    ((
11aa0 57 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50  WCHAR *) nativeP
11ab0 61 74 68 29 5b 69 5d 20 3d 20 77 63 3b 0a 09 09  ath)[i] = wc;...
11ac0 09 09 7d 0a 09 09 09 20 20 20 20 7d 0a 09 09 09  ..}....    }....
11ad0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41      Tcl_DStringA
11ae0 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 6e  ppend(&dsNorm, n
11af0 61 74 69 76 65 50 61 74 68 2c 0a 09 09 09 09 20  ativePath,..... 
11b00 20 20 20 28 69 6e 74 29 28 73 69 7a 65 6f 66 28     (int)(sizeof(
11b10 57 43 48 41 52 29 20 2a 20 6c 65 6e 29 29 3b 0a  WCHAR) * len));.
11b20 09 09 09 20 20 20 20 6c 61 73 74 56 61 6c 69 64  ...    lastValid
11b30 50 61 74 68 45 6e 64 20 3d 20 63 75 72 72 65 6e  PathEnd = curren
11b40 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e  tPathEndPosition
11b50 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  ;....} else if (
11b60 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d  nextCheckpoint =
11b70 3d 20 30 29 20 7b 0a 09 09 09 20 20 20 20 2f 2a  = 0) {....    /*
11b80 20 50 61 74 68 20 73 74 61 72 74 73 20 77 69 74   Path starts wit
11b90 68 20 61 20 64 72 69 76 65 20 64 65 73 69 67 6e  h a drive design
11ba0 61 74 69 6f 6e 0a 09 09 09 20 20 20 20 20 2a 20  ation....     * 
11bb0 74 68 61 74 27 73 20 6e 6f 74 20 61 63 74 75 61  that's not actua
11bc0 6c 6c 79 20 6f 6e 20 74 68 65 20 73 79 73 74 65  lly on the syste
11bd0 6d 2e 0a 09 09 09 20 20 20 20 20 2a 20 57 65 20  m.....     * We 
11be0 73 74 69 6c 6c 20 6d 75 73 74 20 6e 6f 72 6d 61  still must norma
11bf0 6c 69 7a 65 20 75 70 20 70 61 73 74 20 74 68 65  lize up past the
11c00 0a 09 09 09 20 20 20 20 20 2a 20 66 69 72 73 74  ....     * first
11c10 20 73 65 70 61 72 61 74 6f 72 2e 20 20 5b 42 75   separator.  [Bu
11c20 67 20 33 36 30 33 34 33 34 5d 20 2a 2f 0a 09 09  g 3603434] */...
11c30 09 20 20 20 20 63 75 72 72 65 6e 74 50 61 74 68  .    currentPath
11c40 45 6e 64 50 6f 73 69 74 69 6f 6e 2b 2b 3b 0a 09  EndPosition++;..
11c50 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20  ..}...    }...  
11c60 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
11c70 65 28 26 64 73 29 3b 0a 09 09 20 20 20 20 62 72  e(&ds);...    br
11c80 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a 09  eak;...}..../*..
11c90 09 20 2a 20 46 69 6c 65 20 27 6e 61 74 69 76 65  . * File 'native
11ca0 50 61 74 68 27 20 64 6f 65 73 20 65 78 69 73 74  Path' does exist
11cb0 20 69 66 20 77 65 20 67 65 74 20 68 65 72 65 2e   if we get here.
11cc0 20 57 65 20 6e 6f 77 20 77 61 6e 74 20 74 6f 0a   We now want to.
11cd0 09 09 20 2a 20 63 68 65 63 6b 20 69 66 20 69 74  .. * check if it
11ce0 20 69 73 20 61 20 73 79 6d 6c 69 6e 6b 20 61 6e   is a symlink an
11cf0 64 20 6f 74 68 65 72 77 69 73 65 20 63 6f 6e 74  d otherwise cont
11d00 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a 09 09  inue with the...
11d10 20 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 70   * rest of the p
11d20 61 74 68 2e 0a 09 09 20 2a 2f 0a 0a 09 09 2f 2a  ath.... */..../*
11d30 0a 09 09 20 2a 20 43 68 65 63 6b 20 66 6f 72 20  ... * Check for 
11d40 73 79 6d 6c 69 6e 6b 73 2c 20 65 78 63 65 70 74  symlinks, except
11d50 20 61 74 20 6c 61 73 74 20 63 6f 6d 70 6f 6e 65   at last compone
11d60 6e 74 20 6f 66 20 70 61 74 68 20 28 77 65 0a 09  nt of path (we..
11d70 09 20 2a 20 64 6f 6e 27 74 20 66 6f 6c 6c 6f 77  . * don't follow
11d80 20 66 69 6e 61 6c 20 73 79 6d 6c 69 6e 6b 73 29   final symlinks)
11d90 2e 20 41 6c 73 6f 20 61 20 64 72 69 76 65 20 28  . Also a drive (
11da0 43 3a 2f 29 20 66 6f 72 0a 09 09 20 2a 20 65 78  C:/) for... * ex
11db0 61 6d 70 6c 65 2c 20 6d 61 79 20 73 6f 6d 65 74  ample, may somet
11dc0 69 6d 65 73 20 68 61 76 65 20 74 68 65 20 72 65  imes have the re
11dd0 70 61 72 73 65 20 66 6c 61 67 20 73 65 74 20 66  parse flag set f
11de0 6f 72 20 73 6f 6d 65 0a 09 09 20 2a 20 72 65 61  or some... * rea
11df0 73 6f 6e 20 49 20 64 6f 6e 27 74 20 75 6e 64 65  son I don't unde
11e00 72 73 74 61 6e 64 2e 20 57 65 20 74 68 65 72 65  rstand. We there
11e10 66 6f 72 65 20 64 6f 6e 27 74 20 70 65 72 66 6f  fore don't perfo
11e20 72 6d 20 74 68 69 73 0a 09 09 20 2a 20 63 68 65  rm this... * che
11e30 63 6b 20 66 6f 72 20 64 72 69 76 65 73 2e 0a 09  ck for drives...
11e40 09 20 2a 2f 0a 0a 09 09 69 66 20 28 63 75 72 20  . */....if (cur 
11e50 21 3d 20 30 20 26 26 20 21 69 73 44 72 69 76 65  != 0 && !isDrive
11e60 20 26 26 0a 09 09 09 64 61 74 61 2e 64 77 46 69   &&....data.dwFi
11e70 6c 65 41 74 74 72 69 62 75 74 65 73 20 26 20 46  leAttributes & F
11e80 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
11e90 50 41 52 53 45 5f 50 4f 49 4e 54 29 7b 0a 09 09  PARSE_POINT){...
11ea0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 6f 20      Tcl_Obj *to 
11eb0 3d 20 57 69 6e 52 65 61 64 4c 69 6e 6b 44 69 72  = WinReadLinkDir
11ec0 65 63 74 6f 72 79 28 6e 61 74 69 76 65 50 61 74  ectory(nativePat
11ed0 68 29 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 74  h);....    if (t
11ee0 6f 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  o != NULL) {....
11ef0 2f 2a 0a 09 09 09 20 2a 20 52 65 61 64 20 74 68  /*.... * Read th
11f00 65 20 72 65 70 61 72 73 65 20 70 6f 69 6e 74 20  e reparse point 
11f10 6f 6b 2e 20 4e 6f 77 2c 20 72 65 70 61 72 73 65  ok. Now, reparse
11f20 20 70 6f 69 6e 74 73 20 6e 65 65 64 0a 09 09 09   points need....
11f30 20 2a 20 6e 6f 74 20 62 65 20 6e 6f 72 6d 61 6c   * not be normal
11f40 69 7a 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20  ized, otherwise 
11f50 77 65 20 63 6f 75 6c 64 20 75 73 65 3a 0a 09 09  we could use:...
11f60 09 20 2a 0a 09 09 09 20 2a 20 54 63 6c 5f 47 65  . *.... * Tcl_Ge
11f70 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 74  tStringFromObj(t
11f80 6f 2c 20 26 70 61 74 68 4c 65 6e 29 3b 0a 09 09  o, &pathLen);...
11f90 09 20 2a 20 6e 65 78 74 43 68 65 63 6b 70 6f 69  . * nextCheckpoi
11fa0 6e 74 20 3d 20 70 61 74 68 4c 65 6e 0a 09 09 09  nt = pathLen....
11fb0 20 2a 0a 09 09 09 20 2a 20 53 6f 2c 20 69 6e 73   *.... * So, ins
11fc0 74 65 61 64 20 77 65 20 68 61 76 65 20 74 6f 20  tead we have to 
11fd0 73 74 61 72 74 20 66 72 6f 6d 20 74 68 65 20 62  start from the b
11fe0 65 67 69 6e 6e 69 6e 67 2e 0a 09 09 09 20 2a 2f  eginning..... */
11ff0 0a 0a 09 09 09 6e 65 78 74 43 68 65 63 6b 70 6f  .....nextCheckpo
12000 69 6e 74 20 3d 20 30 3b 0a 09 09 09 54 63 6c 5f  int = 0;....Tcl_
12010 41 70 70 65 6e 64 54 6f 4f 62 6a 28 74 6f 2c 20  AppendToObj(to, 
12020 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f  currentPathEndPo
12030 73 69 74 69 6f 6e 2c 20 2d 31 29 3b 0a 0a 09 09  sition, -1);....
12040 09 2f 2a 0a 09 09 09 20 2a 20 43 6f 6e 76 65 72  ./*.... * Conver
12050 74 20 6c 69 6e 6b 20 74 6f 20 66 6f 72 77 61 72  t link to forwar
12060 64 20 73 6c 61 73 68 65 73 2e 0a 09 09 09 20 2a  d slashes..... *
12070 2f 0a 0a 09 09 09 66 6f 72 20 28 70 61 74 68 20  /.....for (path 
12080 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
12090 74 6f 29 3b 20 2a 70 61 74 68 20 21 3d 20 30 3b  to); *path != 0;
120a0 20 70 61 74 68 2b 2b 29 20 7b 0a 09 09 09 20 20   path++) {....  
120b0 20 20 69 66 20 28 2a 70 61 74 68 20 3d 3d 20 27    if (*path == '
120c0 5c 5c 27 29 20 7b 0a 09 09 09 09 2a 70 61 74 68  \\') {.....*path
120d0 20 3d 20 27 2f 27 3b 0a 09 09 09 20 20 20 20 7d   = '/';....    }
120e0 0a 09 09 09 7d 0a 09 09 09 70 61 74 68 20 3d 20  ....}....path = 
120f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 74 6f  Tcl_GetString(to
12100 29 3b 0a 09 09 09 63 75 72 72 65 6e 74 50 61 74  );....currentPat
12110 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 3d 20 70  hEndPosition = p
12120 61 74 68 20 2b 20 6e 65 78 74 43 68 65 63 6b 70  ath + nextCheckp
12130 6f 69 6e 74 3b 0a 09 09 09 69 66 20 28 74 65 6d  oint;....if (tem
12140 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p != NULL) {....
12150 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
12160 6f 75 6e 74 28 74 65 6d 70 29 3b 0a 09 09 09 7d  ount(temp);....}
12170 0a 09 09 09 74 65 6d 70 20 3d 20 74 6f 3b 0a 0a  ....temp = to;..
12180 09 09 09 2f 2a 0a 09 09 09 20 2a 20 52 65 73 65  .../*.... * Rese
12190 74 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 77  t variables so w
121a0 65 20 63 61 6e 20 72 65 73 74 61 72 74 20 6e 6f  e can restart no
121b0 72 6d 61 6c 69 7a 61 74 69 6f 6e 2e 0a 09 09 09  rmalization.....
121c0 20 2a 2f 0a 0a 09 09 09 69 73 44 72 69 76 65 20   */.....isDrive 
121d0 3d 20 31 3b 0a 09 09 09 54 63 6c 5f 44 53 74 72  = 1;....Tcl_DStr
121e0 69 6e 67 46 72 65 65 28 26 64 73 4e 6f 72 6d 29  ingFree(&dsNorm)
121f0 3b 0a 09 09 09 54 63 6c 5f 44 53 74 72 69 6e 67  ;....Tcl_DString
12200 49 6e 69 74 28 26 64 73 4e 6f 72 6d 29 3b 0a 09  Init(&dsNorm);..
12210 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
12220 65 28 26 64 73 29 3b 0a 09 09 09 63 6f 6e 74 69  e(&ds);....conti
12230 6e 75 65 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  nue;...    }...}
12240 0a 0a 23 69 66 6e 64 65 66 20 54 63 6c 4e 4f 52  ..#ifndef TclNOR
12250 4d 5f 4c 4f 4e 47 5f 50 41 54 48 0a 09 09 2f 2a  M_LONG_PATH.../*
12260 0a 09 09 20 2a 20 4e 6f 77 20 77 65 20 63 6f 6e  ... * Now we con
12270 76 65 72 74 20 74 68 65 20 74 61 69 6c 20 6f 66  vert the tail of
12280 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74   the current pat
12290 68 20 74 6f 20 69 74 73 20 27 6c 6f 6e 67 0a 09  h to its 'long..
122a0 09 20 2a 20 66 6f 72 6d 27 2c 20 61 6e 64 20 61  . * form', and a
122b0 70 70 65 6e 64 20 69 74 20 74 6f 20 27 64 73 4e  ppend it to 'dsN
122c0 6f 72 6d 27 20 77 68 69 63 68 20 68 6f 6c 64 73  orm' which holds
122d0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 09 09 20   the current... 
122e0 2a 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74  * normalized pat
122f0 68 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 69  h... */....if (i
12300 73 44 72 69 76 65 29 20 7b 0a 09 09 20 20 20 20  sDrive) {...    
12310 57 43 48 41 52 20 64 72 69 76 65 20 3d 20 28 28  WCHAR drive = ((
12320 57 43 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50  WCHAR *) nativeP
12330 61 74 68 29 5b 30 5d 3b 0a 09 09 20 20 20 20 69  ath)[0];...    i
12340 66 20 28 64 72 69 76 65 20 3e 3d 20 4c 27 61 27  f (drive >= L'a'
12350 29 20 7b 0a 09 09 09 64 72 69 76 65 20 2d 3d 20  ) {....drive -= 
12360 28 4c 27 61 27 20 2d 20 4c 27 41 27 29 3b 0a 09  (L'a' - L'A');..
12370 09 09 28 28 57 43 48 41 52 20 2a 29 20 6e 61 74  ..((WCHAR *) nat
12380 69 76 65 50 61 74 68 29 5b 30 5d 20 3d 20 64 72  ivePath)[0] = dr
12390 69 76 65 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20  ive;...    }... 
123a0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
123b0 70 65 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 6e 61  pend(&dsNorm, na
123c0 74 69 76 65 50 61 74 68 2c 0a 09 09 09 20 20 20  tivePath,....   
123d0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
123e0 74 68 28 26 64 73 29 29 3b 0a 09 09 7d 20 65 6c  th(&ds));...} el
123f0 73 65 20 7b 0a 09 09 20 20 20 20 63 68 61 72 20  se {...    char 
12400 2a 63 68 65 63 6b 44 6f 74 73 20 3d 20 4e 55 4c  *checkDots = NUL
12410 4c 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 6c 61  L;....    if (la
12420 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 5b 31  stValidPathEnd[1
12430 5d 20 3d 3d 20 27 2e 27 29 20 7b 0a 09 09 09 63  ] == '.') {....c
12440 68 65 63 6b 44 6f 74 73 20 3d 20 6c 61 73 74 56  heckDots = lastV
12450 61 6c 69 64 50 61 74 68 45 6e 64 20 2b 20 31 3b  alidPathEnd + 1;
12460 0a 09 09 09 77 68 69 6c 65 20 28 63 68 65 63 6b  ....while (check
12470 44 6f 74 73 20 3c 20 63 75 72 72 65 6e 74 50 61  Dots < currentPa
12480 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 29 20 7b  thEndPosition) {
12490 0a 09 09 09 20 20 20 20 69 66 20 28 2a 63 68 65  ....    if (*che
124a0 63 6b 44 6f 74 73 20 21 3d 20 27 2e 27 29 20 7b  ckDots != '.') {
124b0 0a 09 09 09 09 63 68 65 63 6b 44 6f 74 73 20 3d  .....checkDots =
124c0 20 4e 55 4c 4c 3b 0a 09 09 09 09 62 72 65 61 6b   NULL;.....break
124d0 3b 0a 09 09 09 20 20 20 20 7d 0a 09 09 09 20 20  ;....    }....  
124e0 20 20 63 68 65 63 6b 44 6f 74 73 2b 2b 3b 0a 09    checkDots++;..
124f0 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09 20 20  ..}...    }...  
12500 20 20 69 66 20 28 63 68 65 63 6b 44 6f 74 73 20    if (checkDots 
12510 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 6e  != NULL) {....in
12520 74 20 64 6f 74 4c 65 6e 20 3d 20 63 75 72 72 65  t dotLen = curre
12530 6e 74 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f  ntPathEndPositio
12540 6e 2d 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45  n-lastValidPathE
12550 6e 64 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a  nd;...../*.... *
12560 20 50 61 74 68 20 69 73 20 6a 75 73 74 20 64 6f   Path is just do
12570 74 73 2e 20 57 65 20 73 68 6f 75 6c 64 6e 27 74  ts. We shouldn't
12580 20 72 65 61 6c 6c 79 20 65 76 65 72 20 73 65 65   really ever see
12590 20 61 0a 09 09 09 20 2a 20 70 61 74 68 20 6c 69   a.... * path li
125a0 6b 65 20 74 68 61 74 2e 20 48 6f 77 65 76 65 72  ke that. However
125b0 2c 20 74 6f 20 62 65 20 6e 69 63 65 20 77 65 20  , to be nice we 
125c0 61 74 20 6c 65 61 73 74 0a 09 09 09 20 2a 20 64  at least.... * d
125d0 6f 6e 27 74 20 6d 61 6e 67 6c 65 20 74 68 65 20  on't mangle the 
125e0 70 61 74 68 20 2d 20 77 65 20 6a 75 73 74 20 61  path - we just a
125f0 64 64 20 74 68 65 20 64 6f 74 73 20 61 73 20 61  dd the dots as a
12600 0a 09 09 09 20 2a 20 70 61 74 68 20 73 65 67 6d  .... * path segm
12610 65 6e 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  ent and continue
12620 2e 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 54 63 6c  ..... */.....Tcl
12630 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
12640 64 73 4e 6f 72 6d 2c 20 28 54 43 48 41 52 20 2a  dsNorm, (TCHAR *
12650 29 0a 09 09 09 09 28 28 57 43 48 41 52 2a 29 28  ).....((WCHAR*)(
12660 6e 61 74 69 76 65 50 61 74 68 20 2b 20 54 63 6c  nativePath + Tcl
12670 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26  _DStringLength(&
12680 64 73 29 29 0a 09 09 09 09 2d 20 64 6f 74 4c 65  ds)).....- dotLe
12690 6e 29 2c 20 28 69 6e 74 29 28 64 6f 74 4c 65 6e  n), (int)(dotLen
126a0 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
126b0 29 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ));...    } else
126c0 20 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 4e   {..../*.... * N
126d0 6f 72 6d 61 6c 20 70 61 74 68 2e 0a 09 09 09 20  ormal path..... 
126e0 2a 2f 0a 0a 09 09 09 57 49 4e 33 32 5f 46 49 4e  */.....WIN32_FIN
126f0 44 5f 44 41 54 41 57 20 66 44 61 74 61 3b 0a 09  D_DATAW fData;..
12700 09 09 48 41 4e 44 4c 45 20 68 61 6e 64 6c 65 3b  ..HANDLE handle;
12710 0a 0a 09 09 09 68 61 6e 64 6c 65 20 3d 20 46 69  .....handle = Fi
12720 6e 64 46 69 72 73 74 46 69 6c 65 57 28 28 57 43  ndFirstFileW((WC
12730 48 41 52 20 2a 29 20 6e 61 74 69 76 65 50 61 74  HAR *) nativePat
12740 68 2c 20 26 66 44 61 74 61 29 3b 0a 09 09 09 69  h, &fData);....i
12750 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e 56  f (handle == INV
12760 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
12770 45 29 20 7b 0a 09 09 09 20 20 20 20 2f 2a 0a 09  E) {....    /*..
12780 09 09 20 20 20 20 20 2a 20 54 68 69 73 20 69 73  ..     * This is
12790 20 75 73 75 61 6c 6c 79 20 74 68 65 20 27 2f 27   usually the '/'
127a0 20 69 6e 20 27 63 3a 2f 27 20 61 74 20 65 6e 64   in 'c:/' at end
127b0 20 6f 66 0a 09 09 09 20 20 20 20 20 2a 20 73 74   of....     * st
127c0 72 69 6e 67 2e 0a 09 09 09 20 20 20 20 20 2a 2f  ring.....     */
127d0 0a 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74  .....    Tcl_DSt
127e0 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f  ringAppend(&dsNo
127f0 72 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  rm, (const char 
12800 2a 29 20 4c 22 2f 22 2c 0a 09 09 09 09 20 20 20  *) L"/",.....   
12810 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b   sizeof(WCHAR));
12820 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
12830 20 20 20 20 57 43 48 41 52 20 2a 6e 61 74 69 76      WCHAR *nativ
12840 65 4e 61 6d 65 3b 0a 0a 09 09 09 20 20 20 20 69  eName;.....    i
12850 66 20 28 66 44 61 74 61 2e 63 46 69 6c 65 4e 61  f (fData.cFileNa
12860 6d 65 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b  me[0] != '\0') {
12870 0a 09 09 09 09 6e 61 74 69 76 65 4e 61 6d 65 20  .....nativeName 
12880 3d 20 66 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d  = fData.cFileNam
12890 65 3b 0a 09 09 09 20 20 20 20 7d 20 65 6c 73 65  e;....    } else
128a0 20 7b 0a 09 09 09 09 6e 61 74 69 76 65 4e 61 6d   {.....nativeNam
128b0 65 20 3d 20 66 44 61 74 61 2e 63 41 6c 74 65 72  e = fData.cAlter
128c0 6e 61 74 65 46 69 6c 65 4e 61 6d 65 3b 0a 09 09  nateFileName;...
128d0 09 20 20 20 20 7d 0a 09 09 09 20 20 20 20 46 69  .    }....    Fi
128e0 6e 64 43 6c 6f 73 65 28 68 61 6e 64 6c 65 29 3b  ndClose(handle);
128f0 0a 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72  ....    Tcl_DStr
12900 69 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72  ingAppend(&dsNor
12910 6d 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  m, (const char *
12920 29 20 4c 22 2f 22 2c 0a 09 09 09 09 20 20 20 20  ) L"/",.....    
12930 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3b 0a  sizeof(WCHAR));.
12940 09 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ...    Tcl_DStri
12950 6e 67 41 70 70 65 6e 64 28 26 64 73 4e 6f 72 6d  ngAppend(&dsNorm
12960 2c 20 28 54 43 48 41 52 20 2a 29 20 6e 61 74 69  , (TCHAR *) nati
12970 76 65 4e 61 6d 65 2c 0a 09 09 09 09 20 20 20 20  veName,.....    
12980 28 69 6e 74 29 20 28 77 63 73 6c 65 6e 28 6e 61  (int) (wcslen(na
12990 74 69 76 65 4e 61 6d 65 29 2a 73 69 7a 65 6f 66  tiveName)*sizeof
129a0 28 57 43 48 41 52 29 29 29 3b 0a 09 09 09 7d 0a  (WCHAR)));....}.
129b0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 23 65 6e 64  ..    }...}.#end
129c0 69 66 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67  if...Tcl_DString
129d0 46 72 65 65 28 26 64 73 29 3b 0a 09 09 6c 61 73  Free(&ds);...las
129e0 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20 3d 20  tValidPathEnd = 
129f0 63 75 72 72 65 6e 74 50 61 74 68 45 6e 64 50 6f  currentPathEndPo
12a00 73 69 74 69 6f 6e 3b 0a 09 09 69 66 20 28 63 75  sition;...if (cu
12a10 72 20 3d 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  r == 0) {...    
12a20 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  break;...}..../*
12a30 0a 09 09 20 2a 20 49 66 20 77 65 20 67 65 74 20  ... * If we get 
12a40 68 65 72 65 2c 20 77 65 27 76 65 20 67 6f 74 20  here, we've got 
12a50 70 61 73 74 20 6f 6e 65 20 64 69 72 65 63 74 6f  past one directo
12a60 72 79 20 64 65 6c 69 6d 69 74 65 72 2c 20 73 6f  ry delimiter, so
12a70 0a 09 09 20 2a 20 77 65 20 6b 6e 6f 77 20 69 74  ... * we know it
12a80 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 20   is no longer a 
12a90 64 72 69 76 65 2e 0a 09 09 20 2a 2f 0a 0a 09 09  drive.... */....
12aa0 69 73 44 72 69 76 65 20 3d 20 30 3b 0a 09 20 20  isDrive = 0;..  
12ab0 20 20 7d 0a 09 20 20 20 20 63 75 72 72 65 6e 74    }..    current
12ac0 50 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 2b  PathEndPosition+
12ad0 2b 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 54 63  +;..}..#ifdef Tc
12ae0 6c 4e 4f 52 4d 5f 4c 4f 4e 47 5f 50 41 54 48 0a  lNORM_LONG_PATH.
12af0 09 2f 2a 0a 09 20 2a 20 43 6f 6e 76 65 72 74 20  ./*.. * Convert 
12b00 74 68 65 20 65 6e 74 69 72 65 20 6b 6e 6f 77 6e  the entire known
12b10 20 70 61 74 68 20 74 6f 20 6c 6f 6e 67 20 66 6f   path to long fo
12b20 72 6d 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 31  rm... */...if (1
12b30 29 20 7b 0a 09 20 20 20 20 57 43 48 41 52 20 77  ) {..    WCHAR w
12b40 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  path[MAX_PATH];.
12b50 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
12b60 2a 6e 61 74 69 76 65 50 61 74 68 20 3d 0a 09 09  *nativePath =...
12b70 20 20 20 20 54 63 6c 5f 57 69 6e 55 74 66 54 6f      Tcl_WinUtfTo
12b80 54 43 68 61 72 28 70 61 74 68 2c 20 6c 61 73 74  TChar(path, last
12b90 56 61 6c 69 64 50 61 74 68 45 6e 64 20 2d 20 70  ValidPathEnd - p
12ba0 61 74 68 2c 20 26 64 73 29 3b 0a 09 20 20 20 20  ath, &ds);..    
12bb0 44 57 4f 52 44 20 77 70 61 74 68 6c 65 6e 20 3d  DWORD wpathlen =
12bc0 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e   (*tclWinProcs->
12bd0 67 65 74 4c 6f 6e 67 50 61 74 68 4e 61 6d 65 50  getLongPathNameP
12be0 72 6f 63 29 28 0a 09 09 20 20 20 20 6e 61 74 69  roc)(...    nati
12bf0 76 65 50 61 74 68 2c 20 28 54 43 48 41 52 20 2a  vePath, (TCHAR *
12c00 29 20 77 70 61 74 68 2c 20 4d 41 58 5f 50 41 54  ) wpath, MAX_PAT
12c10 48 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20  H);...    /*..  
12c20 20 20 20 2a 20 57 65 20 68 61 76 65 20 74 6f 20     * We have to 
12c30 6d 61 6b 65 20 74 68 65 20 64 72 69 76 65 20 6c  make the drive l
12c40 65 74 74 65 72 20 75 70 70 65 72 63 61 73 65 2e  etter uppercase.
12c50 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
12c60 69 66 20 28 77 70 61 74 68 5b 30 5d 20 3e 3d 20  if (wpath[0] >= 
12c70 4c 27 61 27 29 20 7b 0a 09 09 77 70 61 74 68 5b  L'a') {...wpath[
12c80 30 5d 20 2d 3d 20 28 4c 27 61 27 20 2d 20 4c 27  0] -= (L'a' - L'
12c90 41 27 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  A');..    }..   
12ca0 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
12cb0 6e 64 28 26 64 73 4e 6f 72 6d 2c 20 28 54 43 48  nd(&dsNorm, (TCH
12cc0 41 52 2a 29 77 70 61 74 68 2c 20 77 70 61 74 68  AR*)wpath, wpath
12cd0 6c 65 6e 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  len*sizeof(WCHAR
12ce0 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ));..    Tcl_DSt
12cf0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
12d00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
12d10 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f      /*.     * Co
12d20 6d 6d 6f 6e 20 63 6f 64 65 20 70 61 74 68 20 66  mmon code path f
12d30 6f 72 20 61 6c 6c 20 57 69 6e 64 6f 77 73 20 70  or all Windows p
12d40 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 20 20 20 2a  latforms..     *
12d50 2f 0a 0a 20 20 20 20 6e 65 78 74 43 68 65 63 6b  /..    nextCheck
12d60 70 6f 69 6e 74 20 3d 20 63 75 72 72 65 6e 74 50  point = currentP
12d70 61 74 68 45 6e 64 50 6f 73 69 74 69 6f 6e 20 2d  athEndPosition -
12d80 20 70 61 74 68 3b 0a 20 20 20 20 69 66 20 28 6c   path;.    if (l
12d90 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e 64 20  astValidPathEnd 
12da0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  != NULL) {../*..
12db0 20 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65 20 74   * Concatenate t
12dc0 68 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 73 74  he normalized st
12dd0 72 69 6e 67 20 69 6e 20 64 73 4e 6f 72 6d 20 77  ring in dsNorm w
12de0 69 74 68 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ith the tail of 
12df0 74 68 65 0a 09 20 2a 20 70 61 74 68 20 77 68 69  the.. * path whi
12e00 63 68 20 77 65 20 64 69 64 6e 27 74 20 72 65 63  ch we didn't rec
12e10 6f 67 6e 69 73 65 2e 20 54 68 65 20 73 74 72 69  ognise. The stri
12e20 6e 67 20 69 6e 20 64 73 4e 6f 72 6d 20 69 73 20  ng in dsNorm is 
12e30 69 6e 20 74 68 65 0a 09 20 2a 20 6e 61 74 69 76  in the.. * nativ
12e40 65 20 65 6e 63 6f 64 69 6e 67 2c 20 73 6f 20 77  e encoding, so w
12e50 65 20 68 61 76 65 20 74 6f 20 63 6f 6e 76 65 72  e have to conver
12e60 74 20 69 74 20 74 6f 20 55 74 66 2e 0a 09 20 2a  t it to Utf... *
12e70 2f 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 20  /...Tcl_DString 
12e80 64 73 54 65 6d 70 3b 0a 0a 09 54 63 6c 5f 57 69  dsTemp;...Tcl_Wi
12e90 6e 54 43 68 61 72 54 6f 55 74 66 28 54 63 6c 5f  nTCharToUtf(Tcl_
12ea0 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73  DStringValue(&ds
12eb0 4e 6f 72 6d 29 2c 0a 09 09 54 63 6c 5f 44 53 74  Norm),...Tcl_DSt
12ec0 72 69 6e 67 4c 65 6e 67 74 68 28 26 64 73 4e 6f  ringLength(&dsNo
12ed0 72 6d 29 2c 20 26 64 73 54 65 6d 70 29 3b 0a 09  rm), &dsTemp);..
12ee0 6e 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 20 3d  nextCheckpoint =
12ef0 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67   Tcl_DStringLeng
12f00 74 68 28 26 64 73 54 65 6d 70 29 3b 0a 09 69 66  th(&dsTemp);..if
12f10 20 28 2a 6c 61 73 74 56 61 6c 69 64 50 61 74 68   (*lastValidPath
12f20 45 6e 64 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  End != 0) {..   
12f30 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 74 20   /*..     * Not 
12f40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
12f50 74 72 69 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a  tring...     */.
12f60 0a 09 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 09  ..    int len;..
12f70 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 3b 0a      char *path;.
12f80 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 74 6d  .    Tcl_Obj *tm
12f90 70 50 61 74 68 50 74 72 3b 0a 0a 09 20 20 20 20  pPathPtr;...    
12fa0 74 6d 70 50 61 74 68 50 74 72 20 3d 20 54 63 6c  tmpPathPtr = Tcl
12fb0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
12fc0 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
12fd0 64 73 54 65 6d 70 29 2c 0a 09 09 20 20 20 20 6e  dsTemp),...    n
12fe0 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 29 3b 0a  extCheckpoint);.
12ff0 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54  .    Tcl_AppendT
13000 6f 4f 62 6a 28 74 6d 70 50 61 74 68 50 74 72 2c  oObj(tmpPathPtr,
13010 20 6c 61 73 74 56 61 6c 69 64 50 61 74 68 45 6e   lastValidPathEn
13020 64 2c 20 2d 31 29 3b 0a 09 20 20 20 20 70 61 74  d, -1);..    pat
13030 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  h = Tcl_GetStrin
13040 67 46 72 6f 6d 4f 62 6a 28 74 6d 70 50 61 74 68  gFromObj(tmpPath
13050 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  Ptr, &len);..   
13060 20 54 63 6c 5f 53 65 74 53 74 72 69 6e 67 4f 62   Tcl_SetStringOb
13070 6a 28 70 61 74 68 50 74 72 2c 20 70 61 74 68 2c  j(pathPtr, path,
13080 20 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f   len);..    Tcl_
13090 44 65 63 72 52 65 66 43 6f 75 6e 74 28 74 6d 70  DecrRefCount(tmp
130a0 50 61 74 68 50 74 72 29 3b 0a 09 7d 20 65 6c 73  PathPtr);..} els
130b0 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  e {..    /*..   
130c0 20 20 2a 20 45 6e 64 20 6f 66 20 73 74 72 69 6e    * End of strin
130d0 67 20 77 61 73 20 72 65 61 63 68 65 64 20 61 62  g was reached ab
130e0 6f 76 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  ove...     */...
130f0 20 20 20 20 54 63 6c 5f 53 65 74 53 74 72 69 6e      Tcl_SetStrin
13100 67 4f 62 6a 28 70 61 74 68 50 74 72 2c 20 54 63  gObj(pathPtr, Tc
13110 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
13120 64 73 54 65 6d 70 29 2c 0a 09 09 20 20 20 20 6e  dsTemp),...    n
13130 65 78 74 43 68 65 63 6b 70 6f 69 6e 74 29 3b 0a  extCheckpoint);.
13140 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  .}..Tcl_DStringF
13150 72 65 65 28 26 64 73 54 65 6d 70 29 3b 0a 20 20  ree(&dsTemp);.  
13160 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72    }.    Tcl_DStr
13170 69 6e 67 46 72 65 65 28 26 64 73 4e 6f 72 6d 29  ingFree(&dsNorm)
13180 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
13190 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
131a0 6e 65 20 61 66 74 65 72 20 77 65 20 61 72 65 20  ne after we are 
131b0 74 6f 74 61 6c 6c 79 20 66 69 6e 69 73 68 65 64  totally finished
131c0 20 77 69 74 68 20 27 70 61 74 68 27 20 61 73 20   with 'path' as 
131d0 77 65 20 61 72 65 0a 20 20 20 20 20 2a 20 73 68  we are.     * sh
131e0 61 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 75  aring the same u
131f0 6e 64 65 72 6c 79 69 6e 67 20 73 74 72 69 6e 67  nderlying string
13200 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
13210 66 20 28 74 65 6d 70 20 21 3d 20 4e 55 4c 4c 29  f (temp != NULL)
13220 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
13230 6f 75 6e 74 28 74 65 6d 70 29 3b 0a 20 20 20 20  ount(temp);.    
13240 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 65 78  }.    return nex
13250 74 43 68 65 63 6b 70 6f 69 6e 74 3b 0a 7d 0a 0c  tCheckpoint;.}..
13260 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
13270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132b0 2d 0a 20 2a 0a 20 2a 20 54 63 6c 57 69 6e 56 6f  -. *. * TclWinVo
132c0 6c 75 6d 65 52 65 6c 61 74 69 76 65 4e 6f 72 6d  lumeRelativeNorm
132d0 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 4f  alize --. *. *.O
132e0 6e 6c 79 20 57 69 6e 64 6f 77 73 20 68 61 73 20  nly Windows has 
132f0 76 6f 6c 75 6d 65 2d 72 65 6c 61 74 69 76 65 20  volume-relative 
13300 70 61 74 68 73 2e 20 54 68 65 73 65 20 70 61 74  paths. These pat
13310 68 73 20 61 72 65 20 72 61 74 68 65 72 20 72 61  hs are rather ra
13320 72 65 2c 0a 20 2a 09 62 75 74 20 69 74 20 69 73  re,. *.but it is
13330 20 6e 69 63 65 20 69 66 20 54 63 6c 20 63 61 6e   nice if Tcl can
13340 20 68 61 6e 64 6c 65 20 74 68 65 6d 2e 20 49 74   handle them. It
13350 20 69 73 20 6d 75 63 68 20 62 65 74 74 65 72 20   is much better 
13360 69 66 20 77 65 20 63 61 6e 0a 20 2a 09 68 61 6e  if we can. *.han
13370 64 6c 65 20 74 68 65 6d 20 68 65 72 65 2c 20 72  dle them here, r
13380 61 74 68 65 72 20 74 68 61 6e 20 69 6e 20 74 68  ather than in th
13390 65 20 6e 61 74 69 76 65 20 66 73 20 63 6f 64 65  e native fs code
133a0 2c 20 62 65 63 61 75 73 65 20 77 65 20 72 65 61  , because we rea
133b0 6c 6c 79 0a 20 2a 09 6e 65 65 64 20 74 6f 20 68  lly. *.need to h
133c0 61 76 65 20 61 20 72 65 61 6c 20 61 62 73 6f 6c  ave a real absol
133d0 75 74 65 20 70 61 74 68 20 6a 75 73 74 20 62 65  ute path just be
133e0 6c 6f 77 2e 0a 20 2a 0a 20 2a 09 57 65 20 64 6f  low.. *. *.We do
133f0 20 6e 6f 74 20 6c 65 74 20 74 68 69 73 20 62 6c   not let this bl
13400 6f 63 6b 20 63 6f 6d 70 69 6c 65 20 6f 6e 20 6e  ock compile on n
13410 6f 6e 2d 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  on-Windows platf
13420 6f 72 6d 73 20 62 65 63 61 75 73 65 20 74 68 65  orms because the
13430 0a 20 2a 09 74 65 73 74 20 73 75 69 74 65 27 73  . *.test suite's
13440 20 6d 61 6e 75 61 6c 20 66 6f 72 63 69 6e 67 20   manual forcing 
13450 6f 66 20 74 63 6c 50 6c 61 74 66 6f 72 6d 20 63  of tclPlatform c
13460 61 6e 20 6f 74 68 65 72 77 69 73 65 20 63 61 75  an otherwise cau
13470 73 65 20 74 68 69 73 0a 20 2a 09 63 6f 64 65 20  se this. *.code 
13480 70 61 74 68 20 74 6f 20 62 65 20 65 78 65 63 75  path to be execu
13490 74 65 64 2c 20 63 61 75 73 69 6e 67 20 76 61 72  ted, causing var
134a0 69 6f 75 73 20 65 72 72 6f 72 73 20 62 65 63 61  ious errors beca
134b0 75 73 65 0a 20 2a 09 76 6f 6c 75 6d 65 2d 72 65  use. *.volume-re
134c0 6c 61 74 69 76 65 20 70 61 74 68 73 20 72 65 61  lative paths rea
134d0 6c 6c 79 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  lly do not exist
134e0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
134f0 0a 20 2a 09 41 20 76 61 6c 69 64 20 6e 6f 72 6d  . *.A valid norm
13500 61 6c 69 7a 65 64 20 70 61 74 68 2e 0a 20 2a 0a  alized path.. *.
13510 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
13520 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
13530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
13580 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 57 69 6e  Tcl_Obj *.TclWin
13590 56 6f 6c 75 6d 65 52 65 6c 61 74 69 76 65 4e 6f  VolumeRelativeNo
135a0 72 6d 61 6c 69 7a 65 28 0a 20 20 20 20 54 63 6c  rmalize(.    Tcl
135b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
135c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
135d0 2a 70 61 74 68 2c 0a 20 20 20 20 54 63 6c 5f 4f  *path,.    Tcl_O
135e0 62 6a 20 2a 2a 75 73 65 54 68 69 73 43 77 64 50  bj **useThisCwdP
135f0 74 72 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  tr).{.    Tcl_Ob
13600 6a 20 2a 61 62 73 6f 6c 75 74 65 50 61 74 68 2c  j *absolutePath,
13610 20 2a 75 73 65 54 68 69 73 43 77 64 3b 0a 0a 20   *useThisCwd;.. 
13620 20 20 20 75 73 65 54 68 69 73 43 77 64 20 3d 20     useThisCwd = 
13630 54 63 6c 5f 46 53 47 65 74 43 77 64 28 69 6e 74  Tcl_FSGetCwd(int
13640 65 72 70 29 3b 0a 20 20 20 20 69 66 20 28 75 73  erp);.    if (us
13650 65 54 68 69 73 43 77 64 20 3d 3d 20 4e 55 4c 4c  eThisCwd == NULL
13660 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
13670 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
13680 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 29  (path[0] == '/')
13690 20 7b 0a 09 2f 2a 0a 09 20 2a 20 50 61 74 68 20   {../*.. * Path 
136a0 6f 66 20 66 6f 72 6d 20 2f 66 6f 6f 2f 62 61 72  of form /foo/bar
136b0 20 77 68 69 63 68 20 69 73 20 61 20 70 61 74 68   which is a path
136c0 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 64 69 72   in the root dir
136d0 65 63 74 6f 72 79 20 6f 66 20 74 68 65 0a 09 20  ectory of the.. 
136e0 2a 20 63 75 72 72 65 6e 74 20 76 6f 6c 75 6d 65  * current volume
136f0 2e 0a 09 20 2a 2f 0a 0a 09 63 6f 6e 73 74 20 63  ... */...const c
13700 68 61 72 20 2a 64 72 69 76 65 20 3d 20 54 63 6c  har *drive = Tcl
13710 5f 47 65 74 53 74 72 69 6e 67 28 75 73 65 54 68  _GetString(useTh
13720 69 73 43 77 64 29 3b 0a 0a 09 61 62 73 6f 6c 75  isCwd);...absolu
13730 74 65 50 61 74 68 20 3d 20 54 63 6c 5f 4e 65 77  tePath = Tcl_New
13740 53 74 72 69 6e 67 4f 62 6a 28 64 72 69 76 65 2c  StringObj(drive,
13750 32 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54  2);..Tcl_AppendT
13760 6f 4f 62 6a 28 61 62 73 6f 6c 75 74 65 50 61 74  oObj(absolutePat
13770 68 2c 20 70 61 74 68 2c 20 2d 31 29 3b 0a 09 54  h, path, -1);..T
13780 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
13790 61 62 73 6f 6c 75 74 65 50 61 74 68 29 3b 0a 0a  absolutePath);..
137a0 09 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20  ./*.. * We have 
137b0 61 20 72 65 66 43 6f 75 6e 74 20 6f 6e 20 74 68  a refCount on th
137c0 65 20 63 77 64 2e 0a 09 20 2a 2f 0a 20 20 20 20  e cwd... */.    
137d0 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a  } else {../*.. *
137e0 20 50 61 74 68 20 6f 66 20 66 6f 72 6d 20 43 3a   Path of form C:
137f0 66 6f 6f 2f 62 61 72 2c 20 62 75 74 20 74 68 69  foo/bar, but thi
13800 73 20 6f 6e 6c 79 20 6d 61 6b 65 73 20 73 65 6e  s only makes sen
13810 73 65 20 69 66 20 74 68 65 20 63 77 64 20 69 73  se if the cwd is
13820 0a 09 20 2a 20 61 6c 73 6f 20 6f 6e 20 64 72 69  .. * also on dri
13830 76 65 20 43 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74  ve C... */...int
13840 20 63 77 64 4c 65 6e 3b 0a 09 63 6f 6e 73 74 20   cwdLen;..const 
13850 63 68 61 72 20 2a 64 72 69 76 65 20 3d 0a 09 09  char *drive =...
13860 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
13870 6d 4f 62 6a 28 75 73 65 54 68 69 73 43 77 64 2c  mObj(useThisCwd,
13880 20 26 63 77 64 4c 65 6e 29 3b 0a 09 63 68 61 72   &cwdLen);..char
13890 20 64 72 69 76 65 5f 63 75 72 20 3d 20 70 61 74   drive_cur = pat
138a0 68 5b 30 5d 3b 0a 0a 09 69 66 20 28 64 72 69 76  h[0];...if (driv
138b0 65 5f 63 75 72 20 3e 3d 20 27 61 27 29 20 7b 0a  e_cur >= 'a') {.
138c0 09 20 20 20 20 64 72 69 76 65 5f 63 75 72 20 2d  .    drive_cur -
138d0 3d 20 28 27 61 27 20 2d 20 27 41 27 29 3b 0a 09  = ('a' - 'A');..
138e0 7d 0a 09 69 66 20 28 64 72 69 76 65 5b 30 5d 20  }..if (drive[0] 
138f0 3d 3d 20 64 72 69 76 65 5f 63 75 72 29 20 7b 0a  == drive_cur) {.
13900 09 20 20 20 20 61 62 73 6f 6c 75 74 65 50 61 74  .    absolutePat
13910 68 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  h = Tcl_Duplicat
13920 65 4f 62 6a 28 75 73 65 54 68 69 73 43 77 64 29  eObj(useThisCwd)
13930 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  ;...    /*..    
13940 20 2a 20 57 65 20 68 61 76 65 20 61 20 72 65 66   * We have a ref
13950 43 6f 75 6e 74 20 6f 6e 20 74 68 65 20 63 77 64  Count on the cwd
13960 2c 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  , which we will 
13970 72 65 6c 65 61 73 65 20 6c 61 74 65 72 2e 0a 09  release later...
13980 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66       */...    if
13990 20 28 64 72 69 76 65 5b 63 77 64 4c 65 6e 2d 31   (drive[cwdLen-1
139a0 5d 20 21 3d 20 27 2f 27 20 26 26 20 28 70 61 74  ] != '/' && (pat
139b0 68 5b 32 5d 20 21 3d 20 27 5c 30 27 29 29 20 7b  h[2] != '\0')) {
139c0 0a 09 09 2f 2a 0a 09 09 20 2a 20 4f 6e 6c 79 20  .../*... * Only 
139d0 61 64 64 20 61 20 74 72 61 69 6c 69 6e 67 20 27  add a trailing '
139e0 2f 27 20 69 66 20 6e 65 65 64 65 64 2c 20 77 68  /' if needed, wh
139f0 69 63 68 20 69 73 20 69 66 20 74 68 65 72 65 20  ich is if there 
13a00 69 73 6e 27 74 0a 09 09 20 2a 20 6f 6e 65 20 61  isn't... * one a
13a10 6c 72 65 61 64 79 2c 20 61 6e 64 20 69 66 20 77  lready, and if w
13a20 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 62  e are going to b
13a30 65 20 61 64 64 69 6e 67 20 73 6f 6d 65 20 6d 6f  e adding some mo
13a40 72 65 0a 09 09 20 2a 20 63 68 61 72 61 63 74 65  re... * characte
13a50 72 73 2e 0a 09 09 20 2a 2f 0a 0a 09 09 54 63 6c  rs.... */....Tcl
13a60 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73  _AppendToObj(abs
13a70 6f 6c 75 74 65 50 61 74 68 2c 20 22 2f 22 2c 20  olutePath, "/", 
13a80 31 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  1);..    }..} el
13a90 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65  se {..    Tcl_De
13aa0 63 72 52 65 66 43 6f 75 6e 74 28 75 73 65 54 68  crRefCount(useTh
13ab0 69 73 43 77 64 29 3b 0a 09 20 20 20 20 75 73 65  isCwd);..    use
13ac0 54 68 69 73 43 77 64 20 3d 20 4e 55 4c 4c 3b 0a  ThisCwd = NULL;.
13ad0 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
13ae0 20 54 68 65 20 70 61 74 68 20 69 73 20 6e 6f 74   The path is not
13af0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
13b00 64 72 69 76 65 2c 20 62 75 74 20 69 73 20 76 6f  drive, but is vo
13b10 6c 75 6d 65 2d 72 65 6c 61 74 69 76 65 2e 0a 09  lume-relative...
13b20 20 20 20 20 20 2a 20 54 68 65 20 77 61 79 20 54       * The way T
13b30 63 6c 20 38 2e 33 20 68 61 6e 64 6c 65 73 20 74  cl 8.3 handles t
13b40 68 69 73 20 69 73 20 74 68 61 74 20 69 74 20 74  his is that it t
13b50 72 65 61 74 73 20 73 75 63 68 20 61 20 70 61 74  reats such a pat
13b60 68 20 61 73 0a 09 20 20 20 20 20 2a 20 72 65 6c  h as..     * rel
13b70 61 74 69 76 65 20 74 6f 20 74 68 65 20 72 6f 6f  ative to the roo
13b80 74 20 6f 66 20 74 68 65 20 64 72 69 76 65 2e 20  t of the drive. 
13b90 57 65 20 74 68 65 72 65 66 6f 72 65 20 62 65 68  We therefore beh
13ba0 61 76 65 20 74 68 65 20 73 61 6d 65 0a 09 20 20  ave the same..  
13bb0 20 20 20 2a 20 68 65 72 65 2e 20 54 68 69 73 20     * here. This 
13bc0 62 65 68 61 76 69 6f 75 72 20 69 73 2c 20 68 6f  behaviour is, ho
13bd0 77 65 76 65 72 2c 20 64 69 66 66 65 72 65 6e 74  wever, different
13be0 20 74 6f 20 74 68 61 74 20 6f 66 20 74 68 65 0a   to that of the.
13bf0 09 20 20 20 20 20 2a 20 77 69 6e 64 6f 77 73 20  .     * windows 
13c00 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 20 49 66  command-line. If
13c10 20 77 65 20 77 61 6e 74 20 74 6f 20 66 69 78 20   we want to fix 
13c20 74 68 69 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  this at some poi
13c30 6e 74 20 69 6e 0a 09 20 20 20 20 20 2a 20 74 68  nt in..     * th
13c40 65 20 66 75 74 75 72 65 20 28 61 74 20 74 68 65  e future (at the
13c50 20 65 78 70 65 6e 73 65 20 6f 66 20 61 20 62 65   expense of a be
13c60 68 61 76 69 6f 75 72 20 63 68 61 6e 67 65 20 74  haviour change t
13c70 6f 20 54 63 6c 29 2c 20 77 65 0a 09 20 20 20 20  o Tcl), we..    
13c80 20 2a 20 63 6f 75 6c 64 20 75 73 65 20 74 68 65   * could use the
13c90 20 27 5f 64 67 65 74 64 63 77 64 27 20 57 69 6e   '_dgetdcwd' Win
13ca0 33 32 20 41 50 49 20 74 6f 20 67 65 74 20 74 68  32 API to get th
13cb0 65 20 64 72 69 76 65 27 73 20 63 77 64 2e 0a 09  e drive's cwd...
13cc0 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 61 62       */...    ab
13cd0 73 6f 6c 75 74 65 50 61 74 68 20 3d 20 54 63 6c  solutePath = Tcl
13ce0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 61  _NewStringObj(pa
13cf0 74 68 2c 20 32 29 3b 0a 09 20 20 20 20 54 63 6c  th, 2);..    Tcl
13d00 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 61 62 73  _AppendToObj(abs
13d10 6f 6c 75 74 65 50 61 74 68 2c 20 22 2f 22 2c 20  olutePath, "/", 
13d20 31 29 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72  1);..}..Tcl_Incr
13d30 52 65 66 43 6f 75 6e 74 28 61 62 73 6f 6c 75 74  RefCount(absolut
13d40 65 50 61 74 68 29 3b 0a 09 54 63 6c 5f 41 70 70  ePath);..Tcl_App
13d50 65 6e 64 54 6f 4f 62 6a 28 61 62 73 6f 6c 75 74  endToObj(absolut
13d60 65 50 61 74 68 2c 20 70 61 74 68 2b 32 2c 20 2d  ePath, path+2, -
13d70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 75  1);.    }.    *u
13d80 73 65 54 68 69 73 43 77 64 50 74 72 20 3d 20 75  seThisCwdPtr = u
13d90 73 65 54 68 69 73 43 77 64 3b 0a 20 20 20 20 72  seThisCwd;.    r
13da0 65 74 75 72 6e 20 61 62 73 6f 6c 75 74 65 50 61  eturn absolutePa
13db0 74 68 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  th;.}.../*. *---
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
13e10 63 6c 70 4e 61 74 69 76 65 54 6f 4e 6f 72 6d 61  clpNativeToNorma
13e20 6c 69 7a 65 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43  lized --. *. *.C
13e30 6f 6e 76 65 72 74 20 6e 61 74 69 76 65 20 66 6f  onvert native fo
13e40 72 6d 61 74 20 74 6f 20 61 20 6e 6f 72 6d 61 6c  rmat to a normal
13e50 69 7a 65 64 20 70 61 74 68 20 6f 62 6a 65 63 74  ized path object
13e60 2c 20 77 69 74 68 20 72 65 66 43 6f 75 6e 74 20  , with refCount 
13e70 6f 66 0a 20 2a 09 7a 65 72 6f 2e 0a 20 2a 0a 20  of. *.zero.. *. 
13e80 2a 09 43 75 72 72 65 6e 74 6c 79 20 61 73 73 75  *.Currently assu
13e90 6d 65 73 20 61 6c 6c 20 6e 61 74 69 76 65 20 70  mes all native p
13ea0 61 74 68 73 20 61 72 65 20 61 63 74 75 61 6c 6c  aths are actuall
13eb0 79 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 61 6c 72  y normalized alr
13ec0 65 61 64 79 2c 20 73 6f 0a 20 2a 09 69 66 20 74  eady, so. *.if t
13ed0 68 65 20 70 61 74 68 20 67 69 76 65 6e 20 69 73  he path given is
13ee0 20 6e 6f 74 20 6e 6f 72 6d 61 6c 69 7a 65 64 20   not normalized 
13ef0 74 68 69 73 20 77 69 6c 6c 20 61 63 74 75 61 6c  this will actual
13f00 6c 79 20 6a 75 73 74 20 63 6f 6e 76 65 72 74 20  ly just convert 
13f10 74 6f 0a 20 2a 09 61 20 76 61 6c 69 64 20 73 74  to. *.a valid st
13f20 72 69 6e 67 20 70 61 74 68 2c 20 62 75 74 20 6e  ring path, but n
13f30 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ot necessarily a
13f40 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 6f 6e 65 2e   normalized one.
13f50 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
13f60 20 2a 09 41 20 76 61 6c 69 64 20 6e 6f 72 6d 61   *.A valid norma
13f70 6c 69 7a 65 64 20 70 61 74 68 2e 0a 20 2a 0a 20  lized path.. *. 
13f80 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
13f90 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54  ---------. */..T
13ff0 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 70 4e 61 74  cl_Obj *.TclpNat
14000 69 76 65 54 6f 4e 6f 72 6d 61 6c 69 7a 65 64 28  iveToNormalized(
14010 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
14020 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20  clientData).{.  
14030 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
14040 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
14050 62 6a 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6c  bjPtr;.    int l
14060 65 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6f  en;.    char *co
14070 70 79 2c 20 2a 70 3b 0a 0a 20 20 20 20 54 63 6c  py, *p;..    Tcl
14080 5f 57 69 6e 54 43 68 61 72 54 6f 55 74 66 28 28  _WinTCharToUtf((
14090 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 63 6c  const char *) cl
140a0 69 65 6e 74 44 61 74 61 2c 20 2d 31 2c 20 26 64  ientData, -1, &d
140b0 73 29 3b 0a 20 20 20 20 63 6f 70 79 20 3d 20 54  s);.    copy = T
140c0 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
140d0 26 64 73 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  &ds);.    len = 
140e0 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74  Tcl_DStringLengt
140f0 68 28 26 64 73 29 3b 0a 0a 20 20 20 20 2f 2a 0a  h(&ds);..    /*.
14100 20 20 20 20 20 2a 20 43 65 72 74 61 69 6e 20 6e       * Certain n
14110 61 74 69 76 65 20 70 61 74 68 20 72 65 70 72 65  ative path repre
14120 73 65 6e 74 61 74 69 6f 6e 73 20 6f 6e 20 57 69  sentations on Wi
14130 6e 64 6f 77 73 20 68 61 76 65 20 74 68 69 73 20  ndows have this 
14140 73 70 65 63 69 61 6c 20 70 72 65 66 69 78 0a 20  special prefix. 
14150 20 20 20 20 2a 20 74 6f 20 69 6e 64 69 63 61 74      * to indicat
14160 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
14170 74 6f 20 62 65 20 74 72 65 61 74 65 64 20 73 70  to be treated sp
14180 65 63 69 61 6c 6c 79 2e 20 46 6f 72 20 65 78 61  ecially. For exa
14190 6d 70 6c 65 0a 20 20 20 20 20 2a 20 65 78 74 72  mple.     * extr
141a0 65 6d 65 6c 79 20 6c 6f 6e 67 20 70 61 74 68 73  emely long paths
141b0 2c 20 6f 72 20 73 79 6d 6c 69 6e 6b 73 2e 0a 20  , or symlinks.. 
141c0 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
141d0 2a 63 6f 70 79 20 3d 3d 20 27 5c 5c 27 29 20 7b  *copy == '\\') {
141e0 0a 09 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63  ..if (0 == strnc
141f0 6d 70 28 63 6f 70 79 2c 22 5c 5c 3f 3f 5c 5c 22  mp(copy,"\\??\\"
14200 2c 34 29 29 20 7b 0a 09 20 20 20 20 63 6f 70 79  ,4)) {..    copy
14210 20 2b 3d 20 34 3b 0a 09 20 20 20 20 6c 65 6e 20   += 4;..    len 
14220 2d 3d 20 34 3b 0a 09 7d 20 65 6c 73 65 20 69 66  -= 4;..} else if
14230 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 63   (0 == strncmp(c
14240 6f 70 79 2c 22 5c 5c 5c 5c 3f 5c 5c 22 2c 34 29  opy,"\\\\?\\",4)
14250 29 20 7b 0a 09 20 20 20 20 63 6f 70 79 20 2b 3d  ) {..    copy +=
14260 20 34 3b 0a 09 20 20 20 20 6c 65 6e 20 2d 3d 20   4;..    len -= 
14270 34 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  4;..}.    }..   
14280 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 73 75 72   /*.     * Ensur
14290 65 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 66  e we are using f
142a0 6f 72 77 61 72 64 20 73 6c 61 73 68 65 73 20 6f  orward slashes o
142b0 6e 6c 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  nly..     */..  
142c0 20 20 66 6f 72 20 28 70 20 3d 20 63 6f 70 79 3b    for (p = copy;
142d0 20 2a 70 20 21 3d 20 27 5c 30 27 3b 20 70 2b 2b   *p != '\0'; p++
142e0 29 20 7b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27  ) {..if (*p == '
142f0 5c 5c 27 29 20 7b 0a 09 20 20 20 20 2a 70 20 3d  \\') {..    *p =
14300 20 27 2f 27 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a   '/';..}.    }..
14310 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
14320 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 6f  _NewStringObj(co
14330 70 79 2c 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c  py,len);.    Tcl
14340 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
14350 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  );..    return o
14360 62 6a 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  bjPtr;.}.../*. *
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
143b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
143c0 2a 20 54 63 6c 4e 61 74 69 76 65 43 72 65 61 74  * TclNativeCreat
143d0 65 4e 61 74 69 76 65 52 65 70 20 2d 2d 0a 20 2a  eNativeRep --. *
143e0 0a 20 2a 09 43 72 65 61 74 65 20 61 20 6e 61 74  . *.Create a nat
143f0 69 76 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ive representati
14400 6f 6e 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  on for the given
14410 20 70 61 74 68 2e 0a 20 2a 0a 20 2a 20 52 65 73   path.. *. * Res
14420 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 61 74  ults:. *.The nat
14430 69 76 65 50 61 74 68 20 72 65 70 72 65 73 65 6e  ivePath represen
14440 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69  tation.. *. * Si
14450 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
14460 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 61 6c  emory will be al
14470 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 70 61 74  located. The pat
14480 68 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  h may need to be
14490 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0a 20 2a 0a   normalized.. *.
144a0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
144f0 2f 0a 0a 43 6c 69 65 6e 74 44 61 74 61 0a 54 63  /..ClientData.Tc
14500 6c 4e 61 74 69 76 65 43 72 65 61 74 65 4e 61 74  lNativeCreateNat
14510 69 76 65 52 65 70 28 0a 20 20 20 20 54 63 6c 5f  iveRep(.    Tcl_
14520 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 0a 7b 0a  Obj *pathPtr).{.
14530 20 20 20 20 63 68 61 72 20 2a 6e 61 74 69 76 65      char *native
14540 50 61 74 68 50 74 72 2c 20 2a 73 74 72 3b 0a 20  PathPtr, *str;. 
14550 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
14560 73 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  s;.    Tcl_Obj *
14570 76 61 6c 69 64 50 61 74 68 50 74 72 3b 0a 20 20  validPathPtr;.  
14580 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 20 20    int len;..    
14590 69 66 20 28 54 63 6c 46 53 43 77 64 49 73 4e 61  if (TclFSCwdIsNa
145a0 74 69 76 65 28 29 29 20 7b 0a 09 2f 2a 0a 09 20  tive()) {../*.. 
145b0 2a 20 54 68 65 20 63 77 64 20 69 73 20 6e 61 74  * The cwd is nat
145c0 69 76 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ive, which means
145d0 20 77 65 20 63 61 6e 20 75 73 65 20 74 68 65 20   we can use the 
145e0 74 72 61 6e 73 6c 61 74 65 64 20 70 61 74 68 0a  translated path.
145f0 09 20 2a 20 77 69 74 68 6f 75 74 20 77 6f 72 72  . * without worr
14600 79 69 6e 67 20 61 62 6f 75 74 20 6e 6f 72 6d 61  ying about norma
14610 6c 69 7a 61 74 69 6f 6e 20 28 74 68 69 73 20 77  lization (this w
14620 69 6c 6c 20 61 6c 73 6f 20 75 73 75 61 6c 6c 79  ill also usually
14630 20 62 65 0a 09 20 2a 20 73 68 6f 72 74 65 72 20   be.. * shorter 
14640 73 6f 20 74 68 65 20 75 74 66 2d 74 6f 2d 65 78  so the utf-to-ex
14650 74 65 72 6e 61 6c 20 63 6f 6e 76 65 72 73 69 6f  ternal conversio
14660 6e 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 77 68  n will be somewh
14670 61 74 20 66 61 73 74 65 72 29 2e 0a 09 20 2a 2f  at faster)... */
14680 0a 0a 09 76 61 6c 69 64 50 61 74 68 50 74 72 20  ...validPathPtr 
14690 3d 20 54 63 6c 5f 46 53 47 65 74 54 72 61 6e 73  = Tcl_FSGetTrans
146a0 6c 61 74 65 64 50 61 74 68 28 4e 55 4c 4c 2c 20  latedPath(NULL, 
146b0 70 61 74 68 50 74 72 29 3b 0a 09 69 66 20 28 76  pathPtr);..if (v
146c0 61 6c 69 64 50 61 74 68 50 74 72 20 3d 3d 20 4e  alidPathPtr == N
146d0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ULL) {..    retu
146e0 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
146f0 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a  } else {../*.. *
14700 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
14710 6f 72 6d 61 6c 69 7a 65 64 20 70 61 74 68 20 69  ormalized path i
14720 73 20 73 65 74 2e 0a 09 20 2a 2f 0a 0a 09 76 61  s set... */...va
14730 6c 69 64 50 61 74 68 50 74 72 20 3d 20 54 63 6c  lidPathPtr = Tcl
14740 5f 46 53 47 65 74 4e 6f 72 6d 61 6c 69 7a 65 64  _FSGetNormalized
14750 50 61 74 68 28 4e 55 4c 4c 2c 20 70 61 74 68 50  Path(NULL, pathP
14760 74 72 29 3b 0a 09 69 66 20 28 76 61 6c 69 64 50  tr);..if (validP
14770 61 74 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  athPtr == NULL) 
14780 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  {..    return NU
14790 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72  LL;..}..Tcl_Incr
147a0 52 65 66 43 6f 75 6e 74 28 76 61 6c 69 64 50 61  RefCount(validPa
147b0 74 68 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  thPtr);.    }.. 
147c0 20 20 20 73 74 72 20 3d 20 54 63 6c 5f 47 65 74     str = Tcl_Get
147d0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 61  StringFromObj(va
147e0 6c 69 64 50 61 74 68 50 74 72 2c 20 26 6c 65 6e  lidPathPtr, &len
147f0 29 3b 0a 20 20 20 20 54 63 6c 5f 57 69 6e 55 74  );.    Tcl_WinUt
14800 66 54 6f 54 43 68 61 72 28 73 74 72 2c 20 6c 65  fToTChar(str, le
14810 6e 2c 20 26 64 73 29 3b 0a 20 20 20 20 69 66 20  n, &ds);.    if 
14820 28 74 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 75 73  (tclWinProcs->us
14830 65 57 69 64 65 29 20 7b 0a 09 57 43 48 41 52 20  eWide) {..WCHAR 
14840 2a 77 70 20 3d 20 28 57 43 48 41 52 20 2a 29 20  *wp = (WCHAR *) 
14850 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
14860 28 26 64 73 29 3b 0a 09 2f 2a 20 46 6f 72 20 61  (&ds);../* For a
14870 20 72 65 73 65 72 76 65 64 20 64 65 76 69 63 65   reserved device
14880 2c 20 73 74 72 69 70 20 61 20 70 6f 73 73 69 62  , strip a possib
14890 6c 65 20 70 6f 73 74 66 69 78 20 27 3a 27 20 2a  le postfix ':' *
148a0 2f 0a 09 6c 65 6e 20 3d 20 57 69 6e 49 73 52 65  /..len = WinIsRe
148b0 73 65 72 76 65 64 28 73 74 72 29 3b 0a 09 2f 2a  served(str);../*
148c0 20 46 6f 72 20 6e 6f 72 6d 61 6c 20 64 65 76 69   For normal devi
148d0 63 65 73 20 2a 2f 0a 09 69 66 20 28 6c 65 6e 20  ces */..if (len 
148e0 3d 3d 20 30 29 20 6c 65 6e 20 3d 20 54 63 6c 5f  == 0) len = Tcl_
148f0 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
14900 73 29 3e 3e 31 3b 0a 09 2f 2a 0a 09 2a 2a 20 49  s)>>1;../*..** I
14910 66 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  f path starts wi
14920 74 68 20 22 2f 2f 3f 2f 22 20 6f 72 20 22 5c 5c  th "//?/" or "\\
14930 3f 5c 22 20 28 65 78 74 65 6e 64 65 64 20 70 61  ?\" (extended pa
14940 74 68 29 2c 20 74 72 61 6e 73 6c 61 74 65 0a 09  th), translate..
14950 2a 2a 20 61 6e 79 20 73 6c 61 73 68 65 73 20 74  ** any slashes t
14960 6f 20 62 61 63 6b 73 6c 61 73 68 65 73 20 62 75  o backslashes bu
14970 74 20 61 63 63 65 70 74 20 74 68 65 20 27 3f 27  t accept the '?'
14980 20 61 73 20 62 65 69 6e 67 20 76 61 6c 69 64 2e   as being valid.
14990 0a 09 2a 2f 0a 09 69 66 20 28 28 73 74 72 5b 30  ..*/..if ((str[0
149a0 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 74 72 5b 30  ]=='\\' || str[0
149b0 5d 3d 3d 27 2f 27 29 20 26 26 20 28 73 74 72 5b  ]=='/') && (str[
149c0 31 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 74 72 5b  1]=='\\' || str[
149d0 31 5d 3d 3d 27 2f 27 29 0a 09 09 26 26 20 73 74  1]=='/')...&& st
149e0 72 5b 32 5d 3d 3d 27 3f 27 20 26 26 20 28 73 74  r[2]=='?' && (st
149f0 72 5b 33 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73 74  r[3]=='\\' || st
14a00 72 5b 33 5d 3d 3d 27 2f 27 29 29 20 7b 0a 09 20  r[3]=='/')) {.. 
14a10 20 20 20 77 70 5b 30 5d 20 3d 20 77 70 5b 31 5d     wp[0] = wp[1]
14a20 20 3d 20 77 70 5b 33 5d 20 3d 20 27 5c 5c 27 3b   = wp[3] = '\\';
14a30 0a 09 20 20 20 20 73 74 72 20 2b 3d 20 34 3b 0a  ..    str += 4;.
14a40 09 20 20 20 20 77 70 20 2b 3d 20 34 3b 0a 09 20  .    wp += 4;.. 
14a50 20 20 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d 0a     len -= 4;..}.
14a60 09 2f 2a 0a 09 2a 2a 20 49 66 20 74 68 65 72 65  ./*..** If there
14a70 20 69 73 20 61 20 64 72 69 76 65 20 70 72 65 66   is a drive pref
14a80 69 78 2c 20 74 68 65 20 27 3a 27 20 6d 75 73 74  ix, the ':' must
14a90 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76   be considered v
14aa0 61 6c 69 64 2e 0a 09 2a 2a 2f 0a 09 69 66 20 28  alid...**/..if (
14ab0 28 28 73 74 72 5b 30 5d 3e 3d 27 41 27 26 26 73  ((str[0]>='A'&&s
14ac0 74 72 5b 30 5d 3c 3d 27 5a 27 29 20 7c 7c 20 28  tr[0]<='Z') || (
14ad0 73 74 72 5b 30 5d 3e 3d 27 61 27 26 26 73 74 72  str[0]>='a'&&str
14ae0 5b 30 5d 3c 3d 27 7a 27 29 29 0a 09 09 26 26 20  [0]<='z'))...&& 
14af0 73 74 72 5b 31 5d 3d 3d 27 3a 27 29 20 7b 0a 09  str[1]==':') {..
14b00 20 20 20 20 77 70 20 2b 3d 20 32 3b 0a 09 20 20      wp += 2;..  
14b10 20 20 6c 65 6e 20 2d 3d 20 32 3b 0a 09 7d 0a 09    len -= 2;..}..
14b20 77 68 69 6c 65 20 28 6c 65 6e 2d 2d 3e 30 29 20  while (len-->0) 
14b30 7b 0a 09 20 20 20 20 69 66 20 28 28 2a 77 70 20  {..    if ((*wp 
14b40 3c 20 27 20 27 29 20 7c 7c 20 77 63 73 63 68 72  < ' ') || wcschr
14b50 28 4c 22 5c 22 2a 3a 3c 3e 3f 7c 22 2c 20 2a 77  (L"\"*:<>?|", *w
14b60 70 29 29 20 7b 0a 09 09 54 63 6c 5f 44 65 63 72  p)) {...Tcl_Decr
14b70 52 65 66 43 6f 75 6e 74 28 76 61 6c 69 64 50 61  RefCount(validPa
14b80 74 68 50 74 72 29 3b 0a 09 09 54 63 6c 5f 44 53  thPtr);...Tcl_DS
14b90 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
14ba0 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
14bb0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 2a      } else if (*
14bc0 77 70 3d 3d 27 2f 27 29 20 7b 0a 09 09 2a 77 70  wp=='/') {...*wp
14bd0 20 3d 20 27 5c 5c 27 3b 0a 09 20 20 20 20 7d 0a   = '\\';..    }.
14be0 09 20 20 20 20 2b 2b 77 70 3b 0a 09 7d 0a 09 6c  .    ++wp;..}..l
14bf0 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67  en = Tcl_DString
14c00 4c 65 6e 67 74 68 28 26 64 73 29 20 2b 20 73 69  Length(&ds) + si
14c10 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 20  zeof(WCHAR);.   
14c20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 68 61 72 20   } else {..char 
14c30 2a 70 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67  *p = Tcl_DString
14c40 56 61 6c 75 65 28 26 64 73 29 3b 0a 09 6c 65 6e  Value(&ds);..len
14c50 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65   = Tcl_DStringLe
14c60 6e 67 74 68 28 26 64 73 29 3b 0a 09 2f 2a 0a 09  ngth(&ds);../*..
14c70 2a 2a 20 49 66 20 70 61 74 68 20 73 74 61 72 74  ** If path start
14c80 73 20 77 69 74 68 20 22 2f 2f 3f 2f 22 20 6f 72  s with "//?/" or
14c90 20 22 5c 5c 3f 5c 22 20 28 65 78 74 65 6e 64 65   "\\?\" (extende
14ca0 64 20 70 61 74 68 29 2c 20 74 72 61 6e 73 6c 61  d path), transla
14cb0 74 65 0a 09 2a 2a 20 61 6e 79 20 73 6c 61 73 68  te..** any slash
14cc0 65 73 20 74 6f 20 62 61 63 6b 73 6c 61 73 68 65  es to backslashe
14cd0 73 20 62 75 74 20 61 63 63 65 70 74 20 74 68 65  s but accept the
14ce0 20 27 3f 27 20 61 73 20 62 65 69 6e 67 20 76 61   '?' as being va
14cf0 6c 69 64 2e 0a 09 2a 2f 0a 09 69 66 20 28 28 73  lid...*/..if ((s
14d00 74 72 5b 30 5d 3d 3d 27 5c 5c 27 20 7c 7c 20 73  tr[0]=='\\' || s
14d10 74 72 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 28  tr[0]=='/') && (
14d20 73 74 72 5b 31 5d 3d 3d 27 5c 5c 27 20 7c 7c 20  str[1]=='\\' || 
14d30 73 74 72 5b 31 5d 3d 3d 27 2f 27 29 0a 09 09 26  str[1]=='/')...&
14d40 26 20 73 74 72 5b 32 5d 3d 3d 27 3f 27 20 26 26  & str[2]=='?' &&
14d50 20 28 73 74 72 5b 33 5d 3d 3d 27 5c 5c 27 20 7c   (str[3]=='\\' |
14d60 7c 20 73 74 72 5b 33 5d 3d 3d 27 2f 27 29 29 20  | str[3]=='/')) 
14d70 7b 0a 09 20 20 20 20 70 5b 30 5d 20 3d 20 70 5b  {..    p[0] = p[
14d80 31 5d 20 3d 20 70 5b 33 5d 20 3d 20 27 5c 5c 27  1] = p[3] = '\\'
14d90 3b 0a 09 20 20 20 20 73 74 72 20 2b 3d 20 34 3b  ;..    str += 4;
14da0 0a 09 20 20 20 20 70 20 2b 3d 20 34 3b 0a 09 20  ..    p += 4;.. 
14db0 20 20 20 6c 65 6e 20 2d 3d 20 34 3b 0a 09 7d 0a     len -= 4;..}.
14dc0 09 2f 2a 0a 09 2a 2a 20 49 66 20 74 68 65 72 65  ./*..** If there
14dd0 20 69 73 20 61 20 64 72 69 76 65 20 70 72 65 66   is a drive pref
14de0 69 78 2c 20 74 68 65 20 27 3a 27 20 6d 75 73 74  ix, the ':' must
14df0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76   be considered v
14e00 61 6c 69 64 2e 0a 09 2a 2a 2f 0a 09 69 66 20 28  alid...**/..if (
14e10 28 28 73 74 72 5b 30 5d 3e 3d 27 41 27 26 26 73  ((str[0]>='A'&&s
14e20 74 72 5b 30 5d 3c 3d 27 5a 27 29 20 7c 7c 20 28  tr[0]<='Z') || (
14e30 73 74 72 5b 30 5d 3e 3d 27 61 27 26 26 73 74 72  str[0]>='a'&&str
14e40 5b 30 5d 3c 3d 27 7a 27 29 29 0a 09 09 26 26 20  [0]<='z'))...&& 
14e50 73 74 72 5b 31 5d 3d 3d 27 3a 27 29 20 7b 0a 09  str[1]==':') {..
14e60 20 20 20 20 70 20 2b 3d 20 32 3b 0a 09 20 20 20      p += 2;..   
14e70 20 6c 65 6e 20 2d 3d 20 32 3b 0a 09 7d 0a 09 77   len -= 2;..}..w
14e80 68 69 6c 65 20 28 6c 65 6e 2d 2d 3e 30 29 20 7b  hile (len-->0) {
14e90 0a 09 20 20 20 20 69 66 20 28 28 2a 70 20 3c 20  ..    if ((*p < 
14ea0 27 20 27 29 20 7c 7c 20 73 74 72 63 68 72 28 22  ' ') || strchr("
14eb0 5c 22 2a 3a 3c 3e 3f 7c 22 2c 20 2a 70 29 29 20  \"*:<>?|", *p)) 
14ec0 7b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43  {...Tcl_DecrRefC
14ed0 6f 75 6e 74 28 76 61 6c 69 64 50 61 74 68 50 74  ount(validPathPt
14ee0 72 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  r);...Tcl_DStrin
14ef0 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 72 65  gFree(&ds);...re
14f00 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
14f10 7d 20 65 6c 73 65 20 69 66 20 28 2a 70 3d 3d 27  } else if (*p=='
14f20 2f 27 29 20 7b 0a 09 09 2a 70 20 3d 20 27 5c 5c  /') {...*p = '\\
14f30 27 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2b  ';..    }..    +
14f40 2b 70 3b 0a 09 7d 0a 09 6c 65 6e 20 3d 20 54 63  +p;..}..len = Tc
14f50 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28  l_DStringLength(
14f60 26 64 73 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  &ds) + sizeof(ch
14f70 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ar);.    }.    T
14f80 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14f90 76 61 6c 69 64 50 61 74 68 50 74 72 29 3b 0a 20  validPathPtr);. 
14fa0 20 20 20 6e 61 74 69 76 65 50 61 74 68 50 74 72     nativePathPtr
14fb0 20 3d 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69   = ckalloc((unsi
14fc0 67 6e 65 64 29 20 6c 65 6e 29 3b 0a 20 20 20 20  gned) len);.    
14fd0 6d 65 6d 63 70 79 28 6e 61 74 69 76 65 50 61 74  memcpy(nativePat
14fe0 68 50 74 72 2c 20 54 63 6c 5f 44 53 74 72 69 6e  hPtr, Tcl_DStrin
14ff0 67 56 61 6c 75 65 28 26 64 73 29 2c 20 28 73 69  gValue(&ds), (si
15000 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 0a 20 20 20  ze_t) len);..   
15010 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
15020 28 26 64 73 29 3b 0a 20 20 20 20 72 65 74 75 72  (&ds);.    retur
15030 6e 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 6e  n (ClientData) n
15040 61 74 69 76 65 50 61 74 68 50 74 72 3b 0a 7d 0a  ativePathPtr;.}.
15050 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
15060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150a0 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4e 61 74 69  --. *. * TclNati
150b0 76 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70  veDupInternalRep
150c0 20 2d 2d 0a 20 2a 0a 20 2a 09 44 75 70 6c 69 63   --. *. *.Duplic
150d0 61 74 65 20 74 68 65 20 6e 61 74 69 76 65 20 72  ate the native r
150e0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20  epresentation.. 
150f0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
15100 09 54 68 65 20 63 6f 70 69 65 64 20 6e 61 74 69  .The copied nati
15110 76 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ve representatio
15120 6e 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74  n, or NULL if it
15130 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
15140 20 74 6f 0a 20 2a 09 63 6f 70 79 20 74 68 65 20   to. *.copy the 
15150 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a  representation..
15160 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
15170 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 61 6c  ts:. *.Memory al
15180 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  location for the
15190 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   copy.. *. *----
151a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 43 6c 69  -------. */..Cli
151f0 65 6e 74 44 61 74 61 0a 54 63 6c 4e 61 74 69 76  entData.TclNativ
15200 65 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70 28  eDupInternalRep(
15210 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
15220 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20  clientData).{.  
15230 20 20 63 68 61 72 20 2a 63 6f 70 79 3b 0a 20 20    char *copy;.  
15240 20 20 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 0a 20    size_t len;.. 
15250 20 20 20 69 66 20 28 63 6c 69 65 6e 74 44 61 74     if (clientDat
15260 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  a == NULL) {..re
15270 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
15280 0a 0a 20 20 20 20 69 66 20 28 74 63 6c 57 69 6e  ..    if (tclWin
15290 50 72 6f 63 73 2d 3e 75 73 65 57 69 64 65 29 20  Procs->useWide) 
152a0 7b 0a 09 2f 2a 0a 09 20 2a 20 55 6e 69 63 6f 64  {../*.. * Unicod
152b0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
152c0 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   when running on
152d0 20 4e 54 2f 32 4b 2f 58 50 2e 0a 09 20 2a 2f 0a   NT/2K/XP... */.
152e0 0a 09 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 57  ..len = sizeof(W
152f0 43 48 41 52 29 20 2a 20 28 77 63 73 6c 65 6e 28  CHAR) * (wcslen(
15300 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 29 20  (const WCHAR *) 
15310 63 6c 69 65 6e 74 44 61 74 61 29 20 2b 20 31 29  clientData) + 1)
15320 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
15330 2f 2a 0a 09 20 2a 20 41 4e 53 49 20 72 65 70 72  /*.. * ANSI repr
15340 65 73 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20  esentation when 
15350 72 75 6e 6e 69 6e 67 20 6f 6e 20 39 35 2f 39 38  running on 95/98
15360 2f 4d 45 2e 0a 09 20 2a 2f 0a 0a 09 6c 65 6e 20  /ME... */...len 
15370 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20 2a  = sizeof(char) *
15380 20 28 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20   (strlen((const 
15390 63 68 61 72 20 2a 29 20 63 6c 69 65 6e 74 44 61  char *) clientDa
153a0 74 61 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a  ta) + 1);.    }.
153b0 0a 20 20 20 20 63 6f 70 79 20 3d 20 28 63 68 61  .    copy = (cha
153c0 72 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 6c 65 6e  r *) ckalloc(len
153d0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 63 6f  );.    memcpy(co
153e0 70 79 2c 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  py, clientData, 
153f0 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
15400 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 63 6f   (ClientData) co
15410 70 79 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  py;.}.../*. *---
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15460 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
15470 63 6c 70 55 74 69 6d 65 20 2d 2d 0a 20 2a 0a 20  clpUtime --. *. 
15480 2a 09 53 65 74 20 74 68 65 20 6d 6f 64 69 66 69  *.Set the modifi
15490 63 61 74 69 6f 6e 20 64 61 74 65 20 66 6f 72 20  cation date for 
154a0 61 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65  a file.. *. * Re
154b0 73 75 6c 74 73 3a 0a 20 2a 09 30 20 6f 6e 20 73  sults:. *.0 on s
154c0 75 63 63 65 73 73 2c 20 2d 31 20 6f 6e 20 65 72  uccess, -1 on er
154d0 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ror.. *. * Side 
154e0 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
154f0 20 65 72 72 6e 6f 20 74 6f 20 61 20 72 65 70 72   errno to a repr
15500 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e  esentation of an
15510 79 20 57 69 6e 64 6f 77 73 20 70 72 6f 62 6c 65  y Windows proble
15520 6d 20 74 68 61 74 27 73 20 6f 62 73 65 72 76 65  m that's observe
15530 64 0a 20 2a 09 69 6e 20 74 68 65 20 70 72 6f 63  d. *.in the proc
15540 65 73 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ess.. *. *------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15590 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
155a0 63 6c 70 55 74 69 6d 65 28 0a 20 20 20 20 54 63  clpUtime(.    Tc
155b0 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c 09  l_Obj *pathPtr,.
155c0 09 2f 2a 20 46 69 6c 65 20 74 6f 20 6d 6f 64 69  ./* File to modi
155d0 66 79 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  fy */.    struct
155e0 20 75 74 69 6d 62 75 66 20 2a 74 76 61 6c 29 09   utimbuf *tval).
155f0 2f 2a 20 4e 65 77 20 6d 6f 64 69 66 69 63 61 74  /* New modificat
15600 69 6f 6e 20 64 61 74 65 20 73 74 72 75 63 74 75  ion date structu
15610 72 65 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20  re */.{.    int 
15620 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 48 41 4e  res = 0;.    HAN
15630 44 4c 45 20 66 69 6c 65 48 61 6e 64 6c 65 3b 0a  DLE fileHandle;.
15640 20 20 20 20 63 6f 6e 73 74 20 54 43 48 41 52 20      const TCHAR 
15650 2a 6e 61 74 69 76 65 3b 0a 20 20 20 20 44 57 4f  *native;.    DWO
15660 52 44 20 61 74 74 72 20 3d 20 30 3b 0a 20 20 20  RD attr = 0;.   
15670 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46   DWORD flags = F
15680 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
15690 52 4d 41 4c 3b 0a 20 20 20 20 46 49 4c 45 54 49  RMAL;.    FILETI
156a0 4d 45 20 6c 61 73 74 41 63 63 65 73 73 54 69 6d  ME lastAccessTim
156b0 65 2c 20 6c 61 73 74 4d 6f 64 54 69 6d 65 3b 0a  e, lastModTime;.
156c0 0a 20 20 20 20 46 72 6f 6d 43 54 69 6d 65 28 74  .    FromCTime(t
156d0 76 61 6c 2d 3e 61 63 74 69 6d 65 2c 20 26 6c 61  val->actime, &la
156e0 73 74 41 63 63 65 73 73 54 69 6d 65 29 3b 0a 20  stAccessTime);. 
156f0 20 20 20 46 72 6f 6d 43 54 69 6d 65 28 74 76 61     FromCTime(tva
15700 6c 2d 3e 6d 6f 64 74 69 6d 65 2c 20 26 6c 61 73  l->modtime, &las
15710 74 4d 6f 64 54 69 6d 65 29 3b 0a 0a 20 20 20 20  tModTime);..    
15720 6e 61 74 69 76 65 20 3d 20 28 63 6f 6e 73 74 20  native = (const 
15730 54 43 48 41 52 20 2a 29 20 54 63 6c 5f 46 53 47  TCHAR *) Tcl_FSG
15740 65 74 4e 61 74 69 76 65 50 61 74 68 28 70 61 74  etNativePath(pat
15750 68 50 74 72 29 3b 0a 0a 20 20 20 20 61 74 74 72  hPtr);..    attr
15760 20 3d 20 28 2a 74 63 6c 57 69 6e 50 72 6f 63 73   = (*tclWinProcs
15770 2d 3e 67 65 74 46 69 6c 65 41 74 74 72 69 62 75  ->getFileAttribu
15780 74 65 73 50 72 6f 63 29 28 6e 61 74 69 76 65 29  tesProc)(native)
15790 3b 0a 0a 20 20 20 20 69 66 20 28 61 74 74 72 20  ;..    if (attr 
157a0 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  != INVALID_FILE_
157b0 41 54 54 52 49 42 55 54 45 53 20 26 26 20 61 74  ATTRIBUTES && at
157c0 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
157d0 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 20 7b  UTE_DIRECTORY) {
157e0 0a 09 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46  ..flags = FILE_F
157f0 4c 41 47 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e  LAG_BACKUP_SEMAN
15800 54 49 43 53 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TICS;.    }..   
15810 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 75 73   /*.     * We us
15820 65 20 74 68 65 20 6e 61 74 69 76 65 20 41 50 49  e the native API
15830 73 20 28 6e 6f 74 20 27 75 74 69 6d 65 27 29 20  s (not 'utime') 
15840 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
15850 65 20 73 6f 6d 65 20 64 61 79 6c 69 67 68 74 0a  e some daylight.
15860 20 20 20 20 20 2a 20 73 61 76 69 6e 67 73 20 63       * savings c
15870 6f 6d 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61  omplications tha
15880 74 20 75 74 69 6d 65 20 67 65 74 73 20 77 72 6f  t utime gets wro
15890 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ng..     */..   
158a0 20 66 69 6c 65 48 61 6e 64 6c 65 20 3d 20 28 74   fileHandle = (t
158b0 63 6c 57 69 6e 50 72 6f 63 73 2d 3e 63 72 65 61  clWinProcs->crea
158c0 74 65 46 69 6c 65 50 72 6f 63 29 28 6e 61 74 69  teFileProc)(nati
158d0 76 65 2c 20 46 49 4c 45 5f 57 52 49 54 45 5f 41  ve, FILE_WRITE_A
158e0 54 54 52 49 42 55 54 45 53 2c 0a 09 20 20 20 20  TTRIBUTES,..    
158f0 30 2c 20 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58  0, NULL, OPEN_EX
15900 49 53 54 49 4e 47 2c 20 66 6c 61 67 73 2c 20 4e  ISTING, flags, N
15910 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 66  ULL);..    if (f
15920 69 6c 65 48 61 6e 64 6c 65 20 3d 3d 20 49 4e 56  ileHandle == INV
15930 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
15940 45 20 7c 7c 0a 09 20 20 20 20 21 53 65 74 46 69  E ||..    !SetFi
15950 6c 65 54 69 6d 65 28 66 69 6c 65 48 61 6e 64 6c  leTime(fileHandl
15960 65 2c 20 4e 55 4c 4c 2c 20 26 6c 61 73 74 41 63  e, NULL, &lastAc
15970 63 65 73 73 54 69 6d 65 2c 20 26 6c 61 73 74 4d  cessTime, &lastM
15980 6f 64 54 69 6d 65 29 29 20 7b 0a 09 54 63 6c 57  odTime)) {..TclW
15990 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47  inConvertError(G
159a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
159b0 09 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  .res = -1;.    }
159c0 0a 20 20 20 20 69 66 20 28 66 69 6c 65 48 61 6e  .    if (fileHan
159d0 64 6c 65 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48  dle != INVALID_H
159e0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09  ANDLE_VALUE) {..
159f0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 66 69 6c 65  CloseHandle(file
15a00 48 61 6e 64 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  Handle);.    }. 
15a10 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
15a20 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56  .../*. * Local V
15a30 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64  ariables:. * mod
15a40 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73 69 63 2d  e: c. * c-basic-
15a50 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 66 69 6c  offset: 4. * fil
15a60 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20  l-column: 78. * 
15a70 45 6e 64 3a 0a 20 2a 2f 0a                       End:. */.