summaryrefslogtreecommitdiffstats
path: root/win/tclWinFile.c
diff options
context:
space:
mode:
authorkjnash <k.j.nash@usa.net>2022-08-31 15:24:20 (GMT)
committerkjnash <k.j.nash@usa.net>2022-08-31 15:24:20 (GMT)
commit7443a97bd1d5060c2bc3ea57dbd1899ea2efb9b8 (patch)
treea7402019faf3e75458552fe9dde90324f981fe7b /win/tclWinFile.c
parent19f8c3bb6b2aa8d571a7534b588ddacfb49952d3 (diff)
parent52b58d0c7d1575d7c784ccb344862e0de8a9686b (diff)
downloadtcl-7443a97bd1d5060c2bc3ea57dbd1899ea2efb9b8.zip
tcl-7443a97bd1d5060c2bc3ea57dbd1899ea2efb9b8.tar.gz
tcl-7443a97bd1d5060c2bc3ea57dbd1899ea2efb9b8.tar.bz2
Merge old 8.7 6c69a72c58
Diffstat (limited to 'win/tclWinFile.c')
-rw-r--r--win/tclWinFile.c81
1 files changed, 43 insertions, 38 deletions
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index 89f485a..f54349b 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -6,7 +6,7 @@
* files, which can be manipulated through the Win32 console redirection
* interfaces.
*
- * Copyright (c) 1995-1998 Sun Microsystems, Inc.
+ * Copyright © 1995-1998 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -29,7 +29,7 @@
*/
#define POSIX_EPOCH_AS_FILETIME \
- ((Tcl_WideInt) 116444736 * (Tcl_WideInt) 1000000000)
+ ((long long) 116444736 * (long long) 1000000000)
/*
* Declarations for 'link' related information. This information should come
@@ -209,7 +209,7 @@ WinLink(
* Invalid file.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
@@ -233,7 +233,7 @@ WinLink(
* Invalid file.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
@@ -247,7 +247,7 @@ WinLink(
* The target doesn't exist.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
} else if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
/*
* It is a file.
@@ -262,13 +262,18 @@ WinLink(
return 0;
}
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
} else if (linkAction & TCL_CREATE_SYMBOLIC_LINK) {
- /*
- * Can't symlink files.
- */
+ if (CreateSymbolicLinkW(linkSourcePath, linkTargetPath,
+ 0x2 /* SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE */)) {
+ /*
+ * Success!
+ */
- Tcl_SetErrno(ENOTDIR);
+ return 0;
+ } else {
+ Tcl_WinConvertError(GetLastError());
+ }
} else {
Tcl_SetErrno(ENODEV);
}
@@ -322,7 +327,7 @@ WinReadLink(
* Invalid file.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return NULL;
}
@@ -336,7 +341,7 @@ WinReadLink(
* The source doesn't exist.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return NULL;
} else if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
@@ -497,7 +502,7 @@ TclWinSymLinkDelete(
* Error setting junction.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
CloseHandle(hFile);
} else {
CloseHandle(hFile);
@@ -690,7 +695,7 @@ NativeReadReparse(
* Error creating directory.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
@@ -704,7 +709,7 @@ NativeReadReparse(
* Error setting junction.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
CloseHandle(hFile);
return -1;
}
@@ -746,7 +751,7 @@ NativeWriteReparse(
* Error creating directory.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
hFile = CreateFileW(linkDirPath, GENERIC_WRITE, 0, NULL,
@@ -757,7 +762,7 @@ NativeWriteReparse(
* Error creating directory.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
@@ -772,7 +777,7 @@ NativeWriteReparse(
* Error setting junction.
*/
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
CloseHandle(hFile);
RemoveDirectoryW(linkDirPath);
return -1;
@@ -880,7 +885,7 @@ TclpFindExecutable(
Tcl_SetPanicProc(tclWinDebugPanic);
}
- GetModuleFileNameW(NULL, wName, MAX_PATH);
+ GetModuleFileNameW(NULL, wName, sizeof(wName)/sizeof(WCHAR));
WideCharToMultiByte(CP_UTF8, 0, wName, -1, name, sizeof(name), NULL, NULL);
TclWinNoBackslash(name);
TclSetObjNameOfExecutable(Tcl_NewStringObj(name, -1), NULL);
@@ -1052,7 +1057,7 @@ TclpMatchInDirectory(
return TCL_OK;
}
- TclWinConvertError(err);
+ Tcl_WinConvertError(err);
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"couldn't read directory \"%s\": %s",
@@ -1254,7 +1259,7 @@ WinIsReserved(
if (path[4] == '\0') {
return 4;
- } else if (path [4] == ':' && path[5] == '\0') {
+ } else if (path[4] == ':' && path[5] == '\0') {
return 4;
}
} else if ((path[2] == 'n' || path[2] == 'N') && path[3] == '\0') {
@@ -1275,7 +1280,7 @@ WinIsReserved(
if (path[4] == '\0') {
return 4;
- } else if (path [4] == ':' && path[5] == '\0') {
+ } else if (path[4] == ':' && path[5] == '\0') {
return 4;
}
}
@@ -1601,7 +1606,7 @@ NativeAccess(
DWORD lasterror = GetLastError();
if (lasterror != ERROR_SHARING_VIOLATION) {
- TclWinConvertError(lasterror);
+ Tcl_WinConvertError(lasterror);
return -1;
}
}
@@ -1727,7 +1732,7 @@ NativeAccess(
* to EACCES - just what we want!
*/
- TclWinConvertError((DWORD) error);
+ Tcl_WinConvertError((DWORD) error);
return -1;
}
@@ -1832,7 +1837,7 @@ NativeAccess(
*/
accessError:
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
if (sdPtr != NULL) {
HeapFree(GetProcessHeap(), 0, sdPtr);
}
@@ -1889,7 +1894,6 @@ NativeIsExec(
if ((_wcsicmp(path, L"exe") == 0)
|| (_wcsicmp(path, L"com") == 0)
|| (_wcsicmp(path, L"cmd") == 0)
- || (_wcsicmp(path, L"cmd") == 0)
|| (_wcsicmp(path, L"bat") == 0)) {
return 1;
}
@@ -1927,7 +1931,7 @@ TclpObjChdir(
result = SetCurrentDirectoryW(nativePath);
if (result == 0) {
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
return 0;
@@ -1966,7 +1970,7 @@ TclpGetCwd(
WCHAR *native;
if (GetCurrentDirectoryW(MAX_PATH, buffer) == 0) {
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
if (interp != NULL) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"error getting working directory name: %s",
@@ -2097,8 +2101,8 @@ NativeStat(
statPtr->st_ctime = ToCTime(data.ftCreationTime);
}
attr = data.dwFileAttributes;
- statPtr->st_size = ((Tcl_WideInt) data.nFileSizeLow) |
- (((Tcl_WideInt) data.nFileSizeHigh) << 32);
+ statPtr->st_size = ((long long) data.nFileSizeLow) |
+ (((long long) data.nFileSizeHigh) << 32);
/*
* On Unix, for directories, nlink apparently depends on the number of
@@ -2131,12 +2135,12 @@ NativeStat(
DWORD lasterror = GetLastError();
if (lasterror != ERROR_SHARING_VIOLATION) {
- TclWinConvertError(lasterror);
+ Tcl_WinConvertError(lasterror);
return -1;
}
hFind = FindFirstFileW(nativePath, &ffd);
if (hFind == INVALID_HANDLE_VALUE) {
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return -1;
}
memcpy(&data, &ffd, sizeof(data));
@@ -2145,8 +2149,8 @@ NativeStat(
attr = data.dwFileAttributes;
- statPtr->st_size = ((Tcl_WideInt) data.nFileSizeLow) |
- (((Tcl_WideInt) data.nFileSizeHigh) << 32);
+ statPtr->st_size = ((long long) data.nFileSizeLow) |
+ (((long long) data.nFileSizeHigh) << 32);
statPtr->st_atime = ToCTime(data.ftLastAccessTime);
statPtr->st_mtime = ToCTime(data.ftLastWriteTime);
statPtr->st_ctime = ToCTime(data.ftCreationTime);
@@ -2308,7 +2312,7 @@ ToCTime(
convertedTime.HighPart = (LONG) fileTime.dwHighDateTime;
return (time_t) ((convertedTime.QuadPart -
- (Tcl_WideInt) POSIX_EPOCH_AS_FILETIME) / (Tcl_WideInt) 10000000);
+ (long long) POSIX_EPOCH_AS_FILETIME) / (long long) 10000000);
}
/*
@@ -2365,7 +2369,7 @@ TclpGetNativeCwd(
WCHAR buffer[MAX_PATH];
if (GetCurrentDirectoryW(MAX_PATH, buffer) == 0) {
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
return NULL;
}
@@ -3117,7 +3121,8 @@ TclNativeCreateNativeRep(
goto done;
}
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1, nativePathPtr,
- len + 1);
+ len + 2);
+ nativePathPtr[len] = 0;
/*
* If path starts with "//?/" or "\\?\" (extended path), translate any
@@ -3265,7 +3270,7 @@ TclpUtime(
if (fileHandle == INVALID_HANDLE_VALUE ||
!SetFileTime(fileHandle, NULL, &lastAccessTime, &lastModTime)) {
- TclWinConvertError(GetLastError());
+ Tcl_WinConvertError(GetLastError());
res = -1;
}
if (fileHandle != INVALID_HANDLE_VALUE) {