summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2009-01-24 15:47:27 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2009-01-24 15:47:27 (GMT)
commitf081e1c9d99818328a4e0862e6e9429cbd0a54b7 (patch)
tree898d18ae5eb76caacd96ce63c898adbaf6f3560f /Lib
parent7d7e1b7c2e6097c36e01b4785cde840193286174 (diff)
downloadcpython-f081e1c9d99818328a4e0862e6e9429cbd0a54b7.zip
cpython-f081e1c9d99818328a4e0862e6e9429cbd0a54b7.tar.gz
cpython-f081e1c9d99818328a4e0862e6e9429cbd0a54b7.tar.bz2
Issue #3881: Help Tcl to load even when started through the
unreadable local symlink to "Program Files" on Vista.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/lib-tk/FixTk.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/Lib/lib-tk/FixTk.py b/Lib/lib-tk/FixTk.py
index 346d3c3..cb60b612 100644
--- a/Lib/lib-tk/FixTk.py
+++ b/Lib/lib-tk/FixTk.py
@@ -10,6 +10,40 @@ import sys, os
# <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to
# the real Tcl library will do.
+# Expand symbolic links on Vista
+try:
+ import ctypes
+ ctypes.windll.kernel32.GetFinalPathNameByHandleW
+except (ImportError, AttributeError):
+ def convert_path(s):
+ return s
+else:
+ def convert_path(s):
+ if isinstance(s, str):
+ s = s.decode("mbcs")
+ hdir = ctypes.windll.kernel32.\
+ CreateFileW(s, 0x80, # FILE_READ_ATTRIBUTES
+ 1, # FILE_SHARE_READ
+ None, 3, # OPEN_EXISTING
+ 0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
+ None)
+ if hdir == -1:
+ # Cannot open directory, give up
+ return s
+ buf = ctypes.create_unicode_buffer(u"", 32768)
+ res = ctypes.windll.kernel32.\
+ GetFinalPathNameByHandleW(hdir, buf, len(buf),
+ 0) # VOLUME_NAME_DOS
+ ctypes.windll.kernel32.CloseHandle(hdir)
+ if res == 0:
+ # Conversion failed (e.g. network location)
+ return s
+ s = buf[:res]
+ # Ignore leading \\?\
+ if s.startswith(u"\\\\?\\"):
+ s = s[4:]
+ return s
+
prefix = os.path.join(sys.prefix,"tcl")
if not os.path.exists(prefix):
# devdir/../tcltk/lib
@@ -17,6 +51,7 @@ if not os.path.exists(prefix):
prefix = os.path.abspath(prefix)
# if this does not exist, no further search is needed
if os.path.exists(prefix):
+ prefix = convert_path(prefix)
if not os.environ.has_key("TCL_LIBRARY"):
for name in os.listdir(prefix):
if name.startswith("tcl"):