@@ -90,15 +90,19 @@
90 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
91 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
92 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ULARGE_INTEGER ull;
93 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94 94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* if a link was retrieved, it is a symlink, otherwise a dir or file */
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- buf->st_mode = (tlen > 0) ? S_IFLNK :
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ((attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- S_IFDIR : S_IFREG);
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (tlen == 0){
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ buf->st_mode = ((attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ S_IFDIR : S_IFREG);
98 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- buf->st_size = (((i64)attr.nFileSizeHigh)<<32) | attr.nFileSizeLow;
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ buf->st_size = (((i64)attr.nFileSizeHigh)<<32) | attr.nFileSizeLow;
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ buf->st_mode = S_IFLNK;
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ buf->st_size = tlen;
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100 104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101 105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ull.LowPart = attr.ftLastWriteTime.dwLowDateTime;
102 106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ull.HighPart = attr.ftLastWriteTime.dwHighDateTime;
103 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
buf->st_mtime = ull.QuadPart / 10000000ULL - 11644473600ULL;
104 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -128,11 +132,11 @@
128 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* exit on error or not link */
129 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ((rc != 0) || (buf->st_mode != S_IFLNK))
130 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
131 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* it is a link, so open the linked file */
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- file = CreateFileW(zFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file = CreateFileW(zFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
134 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ((file == NULL) || (file == INVALID_HANDLE_VALUE)){
135 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 1;
136 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
137 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
138 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -167,12 +171,12 @@
167 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WIN32_FILE_ATTRIBUTE_DATA attr;
168 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = GetFileAttributesEx(path, GetFileExInfoStandard, &attr);
169 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if (rc && (attr.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)){
170 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
171 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* since it is a reparse point, open it */
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING,
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FILE_FLAG_OPEN_REPARSE_POINT, NULL);
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ HANDLE file = CreateFile(path, FILE_READ_EA, 0, NULL, OPEN_EXISTING,
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
174 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ((file != NULL) && (file != INVALID_HANDLE_VALUE)){
175 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
176 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* use DeviceIoControl to get the reparse point data */
177 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
178 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int data_size = sizeof(REPARSE_DATA_BUFFER) + LINK_BUFFER_SIZE * sizeof(wchar_t);
@@ -223,13 +227,13 @@
223 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** deleting a symlink of some type.
224 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returns 0 on success, 1 on failure.
225 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
226 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int win32_unlink_rmdir(const wchar_t *zFilename){
227 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossilStat stat;
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (win32_stat(zFilename, &stat) == 0){
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (stat.st_mode == S_IFDIR)
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WIN32_FILE_ATTRIBUTE_DATA attr;
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (GetFileAttributesExW(zFilename, GetFileExInfoStandard, &attr)){
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if ((attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
231 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = RemoveDirectoryW(zFilename);
232 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else
233 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = DeleteFileW(zFilename);
234 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
235 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return !rc;
@@ -274,10 +278,34 @@
274 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
created = 1;
275 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
276 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
277 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return !created;
278 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Given a pathname to a file, return true if:
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. the file exists
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. the file is a symbolic link
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. the symbolic link's attributes can be acquired
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4. the symbolic link type is different than the target type
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int win32_check_symlink_type_changed(const char* zName){
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int changed = 0;
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wchar_t* zMbcs;
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossilStat lstat_buf, stat_buf;
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WIN32_FILE_ATTRIBUTE_DATA lstat_attr;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMbcs = fossil_utf8_to_filename(zName);
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (win32_stat(zMbcs, &stat_buf) != 0)
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stat_buf.st_mode = S_IFREG;
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ changed =
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (win32_lstat(zMbcs, &lstat_buf) == 0) &&
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (lstat_buf.st_mode == S_IFLNK) &&
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ GetFileAttributesExW(zMbcs, GetFileExInfoStandard, &lstat_attr) &&
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ((stat_buf.st_mode == S_IFDIR) != ((lstat_attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY));
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_filename_free(zMbcs);
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return changed;
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
279 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
280 308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
281 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Check if symlinks are potentially supported on the current OS for the given file.
282 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Theoretically this code should work on any NT based version of windows
283 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** but I have no way of testing that. The initial check for
284 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!