1
0
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:
Stefan Metzmacher 2008-06-03 13:32:04 +02:00
parent 7f033ce4fb
commit 61bad69e2d
2 changed files with 32 additions and 20 deletions

View File

@ -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)));
}
}

View File

@ -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) {