aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2022-05-22 10:06:30 +0100
committerRon Yorston <rmy@pobox.com>2022-05-22 10:06:30 +0100
commitb68bda6482aed55d13b5bb622f60bc63ea930472 (patch)
tree08f53fae2891215705ef47974be7b06bc305f9b9
parentbd584ee9d76ca4353fcd5af87a4f413316d3a552 (diff)
downloadbusybox-w32-b68bda6482aed55d13b5bb622f60bc63ea930472.tar.gz
busybox-w32-b68bda6482aed55d13b5bb622f60bc63ea930472.tar.bz2
busybox-w32-b68bda6482aed55d13b5bb622f60bc63ea930472.zip
win32: code shrink directory tests
Add a function to check if a file is a directory and use it in various places. Replace some uses of S_ISDIR() with a test of the Windows file attributes. Saves 32-48 bytes.
-rw-r--r--win32/mingw.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/win32/mingw.c b/win32/mingw.c
index bea800435..bf9b75a7f 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -220,6 +220,7 @@ static int get_dev_fd(const char *filename)
220 return -1; 220 return -1;
221} 221}
222 222
223static int mingw_is_directory(const char *path);
223#undef open 224#undef open
224int mingw_open (const char *filename, int oflags, ...) 225int mingw_open (const char *filename, int oflags, ...)
225{ 226{
@@ -247,8 +248,7 @@ int mingw_open (const char *filename, int oflags, ...)
247 update_special_fd(dev, fd); 248 update_special_fd(dev, fd);
248 } 249 }
249 else if ((oflags & O_ACCMODE) != O_RDONLY && errno == EACCES) { 250 else if ((oflags & O_ACCMODE) != O_RDONLY && errno == EACCES) {
250 DWORD attrs = GetFileAttributes(filename); 251 if (mingw_is_directory(filename))
251 if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY))
252 errno = EISDIR; 252 errno = EISDIR;
253 } 253 }
254 return fd; 254 return fd;
@@ -355,7 +355,7 @@ static inline mode_t file_attr_to_st_mode(DWORD attr)
355 return fMode; 355 return fMode;
356} 356}
357 357
358static inline int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata) 358static int get_file_attr(const char *fname, WIN32_FILE_ATTRIBUTE_DATA *fdata)
359{ 359{
360 size_t len; 360 size_t len;
361 361
@@ -592,6 +592,14 @@ static DWORD is_symlink(const char *pathname)
592 return 0; 592 return 0;
593} 593}
594 594
595static int mingw_is_directory(const char *path)
596{
597 WIN32_FILE_ATTRIBUTE_DATA fdata;
598
599 return get_file_attr(path, &fdata) == 0 &&
600 (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
601}
602
595#if ENABLE_FEATURE_EXTRA_FILE_DATA 603#if ENABLE_FEATURE_EXTRA_FILE_DATA
596static int count_subdirs(const char *pathname) 604static int count_subdirs(const char *pathname)
597{ 605{
@@ -669,7 +677,7 @@ static int do_lstat(int follow, const char *file_name, struct mingw_stat *buf)
669 buf->st_mtim = filetime_to_timespec(&(fdata.ftLastWriteTime)); 677 buf->st_mtim = filetime_to_timespec(&(fdata.ftLastWriteTime));
670 buf->st_ctim = filetime_to_timespec(&(fdata.ftCreationTime)); 678 buf->st_ctim = filetime_to_timespec(&(fdata.ftCreationTime));
671 } 679 }
672 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : 1; 680 buf->st_nlink = (buf->st_attr & FILE_ATTRIBUTE_DIRECTORY) ? 2 : 1;
673 681
674#if ENABLE_FEATURE_EXTRA_FILE_DATA 682#if ENABLE_FEATURE_EXTRA_FILE_DATA
675 flags = FILE_FLAG_BACKUP_SEMANTICS; 683 flags = FILE_FLAG_BACKUP_SEMANTICS;
@@ -682,7 +690,7 @@ static int do_lstat(int follow, const char *file_name, struct mingw_stat *buf)
682 buf->st_dev = hdata.dwVolumeSerialNumber; 690 buf->st_dev = hdata.dwVolumeSerialNumber;
683 buf->st_ino = hdata.nFileIndexLow | 691 buf->st_ino = hdata.nFileIndexLow |
684 (((ino_t)hdata.nFileIndexHigh)<<32); 692 (((ino_t)hdata.nFileIndexHigh)<<32);
685 buf->st_nlink = S_ISDIR(buf->st_mode) ? 693 buf->st_nlink = (buf->st_attr & FILE_ATTRIBUTE_DIRECTORY) ?
686 count_subdirs(file_name) : 694 count_subdirs(file_name) :
687 hdata.nNumberOfLinks; 695 hdata.nNumberOfLinks;
688 } 696 }
@@ -700,7 +708,7 @@ static int do_lstat(int follow, const char *file_name, struct mingw_stat *buf)
700 /* Get actual size of compressed/sparse files */ 708 /* Get actual size of compressed/sparse files */
701 low = GetCompressedFileSize(file_name, &high); 709 low = GetCompressedFileSize(file_name, &high);
702 if ((low == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) || 710 if ((low == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) ||
703 S_ISDIR(buf->st_mode)) { 711 (buf->st_attr & FILE_ATTRIBUTE_DIRECTORY)) {
704 size = buf->st_size; 712 size = buf->st_size;
705 } 713 }
706 else { 714 else {
@@ -782,13 +790,14 @@ int mingw_fstat(int fd, struct mingw_stat *buf)
782 buf->st_dev = fdata.dwVolumeSerialNumber; 790 buf->st_dev = fdata.dwVolumeSerialNumber;
783 buf->st_ino = fdata.nFileIndexLow | 791 buf->st_ino = fdata.nFileIndexLow |
784 (((uint64_t)fdata.nFileIndexHigh)<<32); 792 (((uint64_t)fdata.nFileIndexHigh)<<32);
785 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : fdata.nNumberOfLinks; 793 buf->st_nlink = (buf->st_attr & FILE_ATTRIBUTE_DIRECTORY) ?
794 2 : fdata.nNumberOfLinks;
786#endif 795#endif
787 success: 796 success:
788#if !ENABLE_FEATURE_EXTRA_FILE_DATA 797#if !ENABLE_FEATURE_EXTRA_FILE_DATA
789 buf->st_dev = 0; 798 buf->st_dev = 0;
790 buf->st_ino = 0; 799 buf->st_ino = 0;
791 buf->st_nlink = S_ISDIR(buf->st_mode) ? 2 : 1; 800 buf->st_nlink = (buf->st_attr & FILE_ATTRIBUTE_DIRECTORY) ? 2 : 1;
792#endif 801#endif
793 buf->st_rdev = 0; 802 buf->st_rdev = 0;
794 buf->st_uid = DEFAULT_UID; 803 buf->st_uid = DEFAULT_UID;
@@ -1256,7 +1265,6 @@ int link(const char *oldpath, const char *newpath)
1256int symlink(const char *target, const char *linkpath) 1265int symlink(const char *target, const char *linkpath)
1257{ 1266{
1258 DWORD flag = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE; 1267 DWORD flag = SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE;
1259 struct stat st;
1260 DECLARE_PROC_ADDR(BOOLEAN, CreateSymbolicLinkA, LPCSTR, LPCSTR, DWORD); 1268 DECLARE_PROC_ADDR(BOOLEAN, CreateSymbolicLinkA, LPCSTR, LPCSTR, DWORD);
1261 char *targ, *relative = NULL; 1269 char *targ, *relative = NULL;
1262 1270
@@ -1271,7 +1279,7 @@ int symlink(const char *target, const char *linkpath)
1271 (int)(name - linkpath), linkpath, target); 1279 (int)(name - linkpath), linkpath, target);
1272 } 1280 }
1273 1281
1274 if (stat(relative ?: target, &st) != -1 && S_ISDIR(st.st_mode)) 1282 if (mingw_is_directory(relative ?: target))
1275 flag |= SYMBOLIC_LINK_FLAG_DIRECTORY; 1283 flag |= SYMBOLIC_LINK_FLAG_DIRECTORY;
1276 free(relative); 1284 free(relative);
1277 1285
@@ -1638,12 +1646,8 @@ int mingw_chdir(const char *dirname)
1638#undef chmod 1646#undef chmod
1639int mingw_chmod(const char *path, int mode) 1647int mingw_chmod(const char *path, int mode)
1640{ 1648{
1641 WIN32_FILE_ATTRIBUTE_DATA fdata; 1649 if (mingw_is_directory(path))
1642
1643 if ( get_file_attr(path, &fdata) == 0 &&
1644 fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
1645 mode |= 0222; 1650 mode |= 0222;
1646 }
1647 1651
1648 return chmod(path, mode); 1652 return chmod(path, mode);
1649} 1653}