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:
parent
7c1d895735
commit
af142df467
@ -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;
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user