diff options
author | Ron Yorston <rmy@pobox.com> | 2019-02-18 16:19:38 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2019-02-18 16:19:38 +0000 |
commit | 4d47580175918882dd827183569d6a50f460f00a (patch) | |
tree | d0835b5c34ecbbb74498941bcc6bb0ee1a510886 | |
parent | 2fd5e7b7562331be0150a89ea7b94be0bdbcc42b (diff) | |
download | busybox-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.c | 43 |
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 | ||