aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2019-02-18 16:19:38 +0000
committerRon Yorston <rmy@pobox.com>2019-02-18 16:19:38 +0000
commit4d47580175918882dd827183569d6a50f460f00a (patch)
treed0835b5c34ecbbb74498941bcc6bb0ee1a510886
parent2fd5e7b7562331be0150a89ea7b94be0bdbcc42b (diff)
downloadbusybox-w32-4d47580175918882dd827183569d6a50f460f00a.tar.gz
busybox-w32-4d47580175918882dd827183569d6a50f460f00a.tar.bz2
busybox-w32-4d47580175918882dd827183569d6a50f460f00a.zip
win32: tidy up stat(2) implementation
Since st_nlink now depends on st_mode it should be set after st_mode is initialised. Rearrange the code to fetch extra metadata.
-rw-r--r--win32/mingw.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/win32/mingw.c b/win32/mingw.c
index 74cf56934..3713fea95 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -398,13 +398,17 @@ static int do_lstat(int follow, const char *file_name, struct mingw_stat *buf)
398{ 398{
399 int err; 399 int err;
400 WIN32_FILE_ATTRIBUTE_DATA fdata; 400 WIN32_FILE_ATTRIBUTE_DATA fdata;
401#if ENABLE_FEATURE_EXTRA_FILE_DATA
402 BY_HANDLE_FILE_INFORMATION hdata;
403 HANDLE fh;
404#endif
401 405
402 if (!(err = get_file_attr(file_name, &fdata))) { 406 if (!(err = get_file_attr(file_name, &fdata))) {
403 buf->st_ino = 0; 407 buf->st_ino = 0;
404 buf->st_uid = DEFAULT_UID; 408 buf->st_uid = DEFAULT_UID;
405 buf->st_gid = DEFAULT_GID; 409 buf->st_gid = DEFAULT_GID;
406 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : 1;
407 buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes); 410 buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
411 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : 1;
408 if (S_ISREG(buf->st_mode) && 412 if (S_ISREG(buf->st_mode) &&
409 (has_exe_suffix(file_name) || has_exec_format(file_name))) 413 (has_exe_suffix(file_name) || has_exec_format(file_name)))
410 buf->st_mode |= S_IXUSR|S_IXGRP|S_IXOTH; 414 buf->st_mode |= S_IXUSR|S_IXGRP|S_IXOTH;
@@ -435,26 +439,23 @@ static int do_lstat(int follow, const char *file_name, struct mingw_stat *buf)
435 } 439 }
436 440
437#if ENABLE_FEATURE_EXTRA_FILE_DATA 441#if ENABLE_FEATURE_EXTRA_FILE_DATA
438 { 442 fh = CreateFile(file_name, 0, 0, NULL, OPEN_EXISTING,
439 BY_HANDLE_FILE_INFORMATION hdata; 443 FILE_FLAG_BACKUP_SEMANTICS, NULL);
440 HANDLE fh = CreateFile(file_name, 0, 444 if (fh == INVALID_HANDLE_VALUE)
441 0, NULL, OPEN_EXISTING, 445 goto error;
442 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, 446
443 NULL); 447 if (GetFileInformationByHandle(fh, &hdata)) {
444 if (fh != INVALID_HANDLE_VALUE) { 448 buf->st_dev = hdata.dwVolumeSerialNumber;
445 if (GetFileInformationByHandle(fh, &hdata)) { 449 buf->st_ino = hdata.nFileIndexLow |
446 buf->st_dev = hdata.dwVolumeSerialNumber; 450 (((ino_t)hdata.nFileIndexHigh)<<32);
447 buf->st_ino = hdata.nFileIndexLow | 451 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : hdata.nNumberOfLinks;
448 (((uint64_t)hdata.nFileIndexHigh)<<32); 452 CloseHandle(fh);
449 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : 453 }
450 hdata.nNumberOfLinks; 454 else {
451 } 455 error:
452 CloseHandle(fh); 456 errno = err_win_to_posix(GetLastError());
453 } 457 CloseHandle(fh);
454 else { 458 return -1;
455 errno = err_win_to_posix(GetLastError());
456 return -1;
457 }
458 } 459 }
459#endif 460#endif
460 461