summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-12-17 18:21:24 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-12-17 18:21:24 (GMT)
commit517a6a51597411ce3a2a383546fb70d6e0735833 (patch)
treebb23158fc1fcc228d42b60d2093995e0da173505 /win
parent18c766a08cdeb05dcacec91282ca6c228c40033e (diff)
parentf9a71ac12894590429c6314d0178aa872f07c5ba (diff)
downloadtcl-517a6a51597411ce3a2a383546fb70d6e0735833.zip
tcl-517a6a51597411ce3a2a383546fb70d6e0735833.tar.gz
tcl-517a6a51597411ce3a2a383546fb70d6e0735833.tar.bz2
Merge 8.6
Diffstat (limited to 'win')
-rw-r--r--win/rules.vc4
-rw-r--r--win/tclWinFile.c18
-rw-r--r--win/tclWinInit.c3
-rw-r--r--win/tclWinInt.h1
4 files changed, 20 insertions, 6 deletions
diff --git a/win/rules.vc b/win/rules.vc
index a076edc..d966066 100644
--- a/win/rules.vc
+++ b/win/rules.vc
@@ -1808,8 +1808,8 @@ $<
TCLNMAKECONFIG = "$(_TCLDIR)\lib\nmake\tcl.nmake"
!endif
!else # !$(TCLINSTALL) - building against Tcl source
-!if exist("$(OUT_DIR)\tcl.nmake")
-TCLNMAKECONFIG = "$(_TCLDIR)\win\$(BUILDDIRTOP)\tcl.nmake""
+!if exist("$(_TCLDIR)\win\$(BUILDDIRTOP)\tcl.nmake")
+TCLNMAKECONFIG = "$(_TCLDIR)\win\$(BUILDDIRTOP)\tcl.nmake"
!endif
!endif # TCLINSTALL
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index 2967cce..6aacde6 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -264,11 +264,21 @@ WinLink(
TclWinConvertError(GetLastError());
} else if (linkAction & TCL_CREATE_SYMBOLIC_LINK) {
- /*
- * Can't symlink files.
- */
+ if (!tclWinProcs.createSymbolicLink) {
+ /*
+ * Can't symlink files.
+ */
+ Tcl_SetErrno(ENOTDIR);
+ } else if (tclWinProcs.createSymbolicLink(linkSourcePath, linkTargetPath,
+ 0x2 /* SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE */)) {
+ /*
+ * Success!
+ */
- Tcl_SetErrno(ENOTDIR);
+ return 0;
+ }
+
+ TclWinConvertError(GetLastError());
} else {
Tcl_SetErrno(ENODEV);
}
diff --git a/win/tclWinInit.c b/win/tclWinInit.c
index 6b8f18a..409c87f 100644
--- a/win/tclWinInit.c
+++ b/win/tclWinInit.c
@@ -164,6 +164,9 @@ TclpInitPlatform(void)
tclWinProcs.cancelSynchronousIo =
(BOOL (WINAPI *)(HANDLE))(void *)GetProcAddress(handle,
"CancelSynchronousIo");
+ tclWinProcs.createSymbolicLink =
+ (BOOLEAN (WINAPI *)(LPCWSTR, LPCWSTR, DWORD))(void *)GetProcAddress(handle,
+ "CreateSymbolicLinkW");
}
/*
diff --git a/win/tclWinInt.h b/win/tclWinInt.h
index ac95da5..7aac7d0 100644
--- a/win/tclWinInt.h
+++ b/win/tclWinInt.h
@@ -36,6 +36,7 @@ typedef struct TCLEXCEPTION_REGISTRATION {
*/
typedef struct TclWinProcs {
BOOL (WINAPI *cancelSynchronousIo)(HANDLE);
+ BOOLEAN (WINAPI *createSymbolicLink)(LPCWSTR, LPCWSTR, DWORD);
} TclWinProcs;
MODULE_SCOPE TclWinProcs tclWinProcs;