Share stat() Calls in Uses of UTIL_chmod()
diff --git a/programs/fileio.c b/programs/fileio.c
index 7d58a11..e289f9a 100644
--- a/programs/fileio.c
+++ b/programs/fileio.c
@@ -502,14 +502,21 @@
* @result : Unlink `fileName`, even if it's read-only */
static int FIO_remove(const char* path)
{
- if (!UTIL_isRegularFile(path)) {
- DISPLAYLEVEL(2, "zstd: Refusing to remove non-regular file %s \n", path);
+ stat_t statbuf;
+ if (!UTIL_stat(path, &statbuf)) {
+ DISPLAYLEVEL(2, "zstd: Failed to stat %s while trying to remove it\n", path);
+ return 0;
+ }
+ if (!UTIL_isRegularFileStat(&statbuf)) {
+ DISPLAYLEVEL(2, "zstd: Refusing to remove non-regular file %s\n", path);
return 0;
}
#if defined(_WIN32) || defined(WIN32)
/* windows doesn't allow remove read-only files,
* so try to make it writable first */
- UTIL_chmod(path, NULL, _S_IWRITE);
+ if (!(statbuf.mode & _S_IWRITE)) {
+ UTIL_chmod(path, &statbuf, _S_IWRITE);
+ }
#endif
return remove(path);
}
diff --git a/programs/util.c b/programs/util.c
index fd4d7a6..9f9f45d 100644
--- a/programs/util.c
+++ b/programs/util.c
@@ -157,7 +157,8 @@
{
int res = 0;
- if (!UTIL_isRegularFile(filename))
+ stat_t curStatBuf;
+ if (!UTIL_stat(filename, &curStatBuf) || !UTIL_isRegularFileStat(&curStatBuf))
return -1;
/* set access and modification times */
@@ -185,7 +186,7 @@
res += chown(filename, statbuf->st_uid, statbuf->st_gid); /* Copy ownership */
#endif
- res += UTIL_chmod(filename, NULL, statbuf->st_mode & 07777); /* Copy file permissions */
+ res += UTIL_chmod(filename, &curStatBuf, statbuf->st_mode & 07777); /* Copy file permissions */
errno = 0;
return -res; /* number of errors is returned */