1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-28 01:58:17 +03:00

lib: add nt_time_to_full_timespec()

BUG: https://bugzilla.samba.org/show_bug.cgi?id=7771

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Ralph Boehme 2019-12-05 15:00:19 +01:00 committed by Jeremy Allison
parent 7c1d895735
commit af142df467
2 changed files with 42 additions and 0 deletions

View File

@ -1039,3 +1039,44 @@ NTTIME full_timespec_to_nt_time(const struct timespec *ts)
return d;
}
/**
* Like nt_time_to_unix_timespec() but allowing negative tv_sec values and
* returning NTTIME=0 and -1 as struct timespec {.tv_nsec = SAMBA_UTIME_OMIT}.
*
* See also: is_omit_timespec().
**/
struct timespec nt_time_to_full_timespec(NTTIME nt)
{
int64_t d;
struct timespec ret;
if ((nt == 0) || (nt == (int64_t)-1)) {
return (struct timespec){.tv_nsec = SAMBA_UTIME_OMIT};
}
d = (int64_t)nt;
/* d is now in 100ns units, since jan 1st 1601".
Save off the ns fraction. */
/*
* Take the last seven decimal digits and multiply by 100.
* to convert from 100ns units to 1ns units.
*/
ret.tv_nsec = (long) ((d % (1000 * 1000 * 10)) * 100);
/* Convert to seconds */
d /= 1000*1000*10;
/* Now adjust by 369 years to make the secs since 1970 */
d -= TIME_FIXUP_CONSTANT_INT;
if (d >= (int64_t)TIME_T_MAX) {
ret.tv_sec = TIME_T_MAX;
ret.tv_nsec = 0;
return ret;
}
ret.tv_sec = (time_t)d;
return ret;
}

View File

@ -342,5 +342,6 @@ NTTIME unix_timespec_to_nt_time(struct timespec ts);
bool is_omit_timespec(const struct timespec *ts);
struct timespec make_omit_timespec(void);
NTTIME full_timespec_to_nt_time(const struct timespec *ts);
struct timespec nt_time_to_full_timespec(NTTIME nt);
#endif /* _SAMBA_TIME_H_ */