mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
pvfs: use utimes() instead of utime() to get better timestamp resolution
Note: that libreplace always provides utimes() metze
This commit is contained in:
parent
7f033ce4fb
commit
61bad69e2d
@ -525,14 +525,14 @@ static int pvfs_handle_destructor(struct pvfs_file_handle *h)
|
||||
}
|
||||
|
||||
if (h->write_time.update_on_close) {
|
||||
struct utimbuf unix_times;
|
||||
struct timeval tv[2];
|
||||
|
||||
unix_times.actime = nt_time_to_unix(h->name->dos.access_time);
|
||||
unix_times.modtime = nt_time_to_unix(h->write_time.close_time);
|
||||
nttime_to_timeval(&tv[0], h->name->dos.access_time);
|
||||
nttime_to_timeval(&tv[1], h->write_time.close_time);
|
||||
|
||||
if (unix_times.actime != 0 || unix_times.modtime != 0) {
|
||||
if (utime(h->name->full_name, &unix_times) == -1) {
|
||||
DEBUG(0,("pvfs_close: utime() failed '%s' - %s\n",
|
||||
if (!timeval_is_zero(&tv[0]) || !timeval_is_zero(&tv[1])) {
|
||||
if (utimes(h->name->full_name, tv) == -1) {
|
||||
DEBUG(0,("pvfs_handle_destructor: utimes() failed '%s' - %s\n",
|
||||
h->name->full_name, strerror(errno)));
|
||||
}
|
||||
}
|
||||
|
@ -273,7 +273,6 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs,
|
||||
union smb_setfileinfo *info)
|
||||
{
|
||||
struct pvfs_state *pvfs = ntvfs->private_data;
|
||||
struct utimbuf unix_times;
|
||||
struct pvfs_file *f;
|
||||
struct pvfs_file_handle *h;
|
||||
struct pvfs_filename newstats;
|
||||
@ -437,21 +436,28 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs,
|
||||
}
|
||||
|
||||
/* possibly change the file timestamps */
|
||||
ZERO_STRUCT(unix_times);
|
||||
if (newstats.dos.create_time != h->name->dos.create_time) {
|
||||
change_mask |= FILE_NOTIFY_CHANGE_CREATION;
|
||||
}
|
||||
if (newstats.dos.access_time != h->name->dos.access_time) {
|
||||
unix_times.actime = nt_time_to_unix(newstats.dos.access_time);
|
||||
change_mask |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
|
||||
}
|
||||
if (newstats.dos.write_time != h->name->dos.write_time) {
|
||||
unix_times.modtime = nt_time_to_unix(newstats.dos.write_time);
|
||||
change_mask |= FILE_NOTIFY_CHANGE_LAST_WRITE;
|
||||
}
|
||||
if (unix_times.actime != 0 || unix_times.modtime != 0) {
|
||||
if (utime(h->name->full_name, &unix_times) == -1) {
|
||||
return pvfs_map_errno(pvfs, errno);
|
||||
if ((change_mask & FILE_NOTIFY_CHANGE_LAST_ACCESS) ||
|
||||
(change_mask & FILE_NOTIFY_CHANGE_LAST_WRITE)) {
|
||||
struct timeval tv[2];
|
||||
|
||||
nttime_to_timeval(&tv[0], newstats.dos.access_time);
|
||||
nttime_to_timeval(&tv[1], newstats.dos.write_time);
|
||||
|
||||
if (!timeval_is_zero(&tv[0]) || !timeval_is_zero(&tv[1])) {
|
||||
if (utimes(h->name->full_name, tv) == -1) {
|
||||
DEBUG(0,("pvfs_setfileinfo: utimes() failed '%s' - %s\n",
|
||||
h->name->full_name, strerror(errno)));
|
||||
return pvfs_map_errno(pvfs, errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (change_mask & FILE_NOTIFY_CHANGE_LAST_WRITE) {
|
||||
@ -594,7 +600,6 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
|
||||
struct pvfs_filename *name;
|
||||
struct pvfs_filename newstats;
|
||||
NTSTATUS status;
|
||||
struct utimbuf unix_times;
|
||||
uint32_t access_needed;
|
||||
uint32_t change_mask = 0;
|
||||
struct odb_lock *lck = NULL;
|
||||
@ -760,21 +765,28 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
|
||||
}
|
||||
|
||||
/* possibly change the file timestamps */
|
||||
ZERO_STRUCT(unix_times);
|
||||
if (newstats.dos.create_time != name->dos.create_time) {
|
||||
change_mask |= FILE_NOTIFY_CHANGE_CREATION;
|
||||
}
|
||||
if (newstats.dos.access_time != name->dos.access_time) {
|
||||
unix_times.actime = nt_time_to_unix(newstats.dos.access_time);
|
||||
change_mask |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
|
||||
}
|
||||
if (newstats.dos.write_time != name->dos.write_time) {
|
||||
unix_times.modtime = nt_time_to_unix(newstats.dos.write_time);
|
||||
change_mask |= FILE_NOTIFY_CHANGE_LAST_WRITE;
|
||||
}
|
||||
if (unix_times.actime != 0 || unix_times.modtime != 0) {
|
||||
if (utime(name->full_name, &unix_times) == -1) {
|
||||
return pvfs_map_errno(pvfs, errno);
|
||||
if ((change_mask & FILE_NOTIFY_CHANGE_LAST_ACCESS) ||
|
||||
(change_mask & FILE_NOTIFY_CHANGE_LAST_WRITE)) {
|
||||
struct timeval tv[2];
|
||||
|
||||
nttime_to_timeval(&tv[0], newstats.dos.access_time);
|
||||
nttime_to_timeval(&tv[1], newstats.dos.write_time);
|
||||
|
||||
if (!timeval_is_zero(&tv[0]) || !timeval_is_zero(&tv[1])) {
|
||||
if (utimes(name->full_name, tv) == -1) {
|
||||
DEBUG(0,("pvfs_setpathinfo: utimes() failed '%s' - %s\n",
|
||||
name->full_name, strerror(errno)));
|
||||
return pvfs_map_errno(pvfs, errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (change_mask & FILE_NOTIFY_CHANGE_LAST_WRITE) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user