diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-12-17 18:21:24 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-12-17 18:21:24 (GMT) |
commit | 517a6a51597411ce3a2a383546fb70d6e0735833 (patch) | |
tree | bb23158fc1fcc228d42b60d2093995e0da173505 /win | |
parent | 18c766a08cdeb05dcacec91282ca6c228c40033e (diff) | |
parent | f9a71ac12894590429c6314d0178aa872f07c5ba (diff) | |
download | tcl-517a6a51597411ce3a2a383546fb70d6e0735833.zip tcl-517a6a51597411ce3a2a383546fb70d6e0735833.tar.gz tcl-517a6a51597411ce3a2a383546fb70d6e0735833.tar.bz2 |
Merge 8.6
Diffstat (limited to 'win')
-rw-r--r-- | win/rules.vc | 4 | ||||
-rw-r--r-- | win/tclWinFile.c | 18 | ||||
-rw-r--r-- | win/tclWinInit.c | 3 | ||||
-rw-r--r-- | win/tclWinInt.h | 1 |
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; |