summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRyo Nakamura <upa@haeena.net>2024-03-14 15:14:31 +0900
committerRyo Nakamura <upa@haeena.net>2024-03-16 00:12:14 +0900
commit07a6cbf039049d3be04c329ce6adad6d2b42744e (patch)
treef4ce3a73241011fb26857891cfcbcc3eeac7d522 /src
parent433f155cd3492388de11e1324be5292dcfabb24d (diff)
chmod after truncate and setutimes on the remote side.
When the source file permission is r--r--r--, truncate and setutimes AFTER chmod fail due to permission deined. So, do chmod after truncate and setutimes.
Diffstat (limited to 'src')
-rw-r--r--src/fileops.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/fileops.c b/src/fileops.c
index 5db7906..2c13436 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -323,12 +323,14 @@ int mscp_setstat(const char *path, struct stat *st, bool preserve_ts, sftp_sessi
ret = sftp_setstat(sftp, path, &attr);
sftp_err_to_errno(sftp);
} else {
- if ((ret = chmod(path, st->st_mode)) < 0)
- return ret;
if ((ret = truncate(path, st->st_size)) < 0)
return ret;
- if (preserve_ts)
- ret = setutimes(path, st->st_atim, st->st_mtim);
+ if (preserve_ts) {
+ if ((ret = setutimes(path, st->st_atim, st->st_mtim)) < 0)
+ return ret;
+ }
+ if ((ret = chmod(path, st->st_mode)) < 0)
+ return ret;
}
return ret;