1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

Second part of fix for 6529 - Offline files conflict with Vista and Office 2003.

ext4 may be able to store ns timestamps, but the only API to *set* timestamps
takes usec, not nsec. Round to usec on set requests.
Jeremy.
This commit is contained in:
Jeremy Allison 2009-08-24 12:30:05 -07:00
parent e829ca560d
commit 87d30a1968
3 changed files with 22 additions and 0 deletions

View File

@ -1045,6 +1045,7 @@ struct timespec timespec_min(const struct timespec *ts1,
const struct timespec *ts2); const struct timespec *ts2);
int timespec_compare(const struct timespec *ts1, const struct timespec *ts2); int timespec_compare(const struct timespec *ts1, const struct timespec *ts2);
void round_timespec(struct timespec *ts); void round_timespec(struct timespec *ts);
void round_timespec_to_usec(struct timespec *ts);
struct timespec interpret_long_date(const char *p); struct timespec interpret_long_date(const char *p);
void cli_put_dos_date(struct cli_state *cli, char *buf, int offset, time_t unixdate); void cli_put_dos_date(struct cli_state *cli, char *buf, int offset, time_t unixdate);
void cli_put_dos_date2(struct cli_state *cli, char *buf, int offset, time_t unixdate); void cli_put_dos_date2(struct cli_state *cli, char *buf, int offset, time_t unixdate);

View File

@ -478,6 +478,16 @@ void round_timespec(struct timespec *ts)
ts->tv_nsec = 0; ts->tv_nsec = 0;
} }
/****************************************************************************
Round a timespec to usec value.
****************************************************************************/
void round_timespec_to_usec(struct timespec *ts)
{
struct timeval tv = convert_timespec_to_timeval(*ts);
*ts = convert_timeval_to_timespec(tv);
}
/**************************************************************************** /****************************************************************************
Interprets an nt time into a unix struct timespec. Interprets an nt time into a unix struct timespec.
Differs from nt_time_to_unix in that an 8 byte value of 0xffffffffffffffff Differs from nt_time_to_unix in that an 8 byte value of 0xffffffffffffffff

View File

@ -5409,6 +5409,17 @@ NTSTATUS smb_set_file_time(connection_struct *conn,
round_timespec(&ft->ctime); round_timespec(&ft->ctime);
round_timespec(&ft->atime); round_timespec(&ft->atime);
round_timespec(&ft->mtime); round_timespec(&ft->mtime);
} else {
/* The highest resolution timestamp
* setting function available in POSIX
* is utimes(), which uses usec resolution,
* not nsec resolution. So we must round to
* usec, then back to nsec. JRA.
*/
round_timespec_to_usec(&ft->create_time);
round_timespec_to_usec(&ft->ctime);
round_timespec_to_usec(&ft->atime);
round_timespec_to_usec(&ft->mtime);
} }
DEBUG(5,("smb_set_filetime: actime: %s\n ", DEBUG(5,("smb_set_filetime: actime: %s\n ",