Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_TIME_H
0003 #define _LINUX_TIME_H
0004 
0005 # include <linux/cache.h>
0006 # include <linux/math64.h>
0007 # include <linux/time64.h>
0008 
0009 extern struct timezone sys_tz;
0010 
0011 int get_timespec64(struct timespec64 *ts,
0012         const struct __kernel_timespec __user *uts);
0013 int put_timespec64(const struct timespec64 *ts,
0014         struct __kernel_timespec __user *uts);
0015 int get_itimerspec64(struct itimerspec64 *it,
0016             const struct __kernel_itimerspec __user *uit);
0017 int put_itimerspec64(const struct itimerspec64 *it,
0018             struct __kernel_itimerspec __user *uit);
0019 
0020 extern time64_t mktime64(const unsigned int year, const unsigned int mon,
0021             const unsigned int day, const unsigned int hour,
0022             const unsigned int min, const unsigned int sec);
0023 
0024 #ifdef CONFIG_POSIX_TIMERS
0025 extern void clear_itimer(void);
0026 #else
0027 static inline void clear_itimer(void) {}
0028 #endif
0029 
0030 extern long do_utimes(int dfd, const char __user *filename, struct timespec64 *times, int flags);
0031 
0032 /*
0033  * Similar to the struct tm in userspace <time.h>, but it needs to be here so
0034  * that the kernel source is self contained.
0035  */
0036 struct tm {
0037     /*
0038      * the number of seconds after the minute, normally in the range
0039      * 0 to 59, but can be up to 60 to allow for leap seconds
0040      */
0041     int tm_sec;
0042     /* the number of minutes after the hour, in the range 0 to 59*/
0043     int tm_min;
0044     /* the number of hours past midnight, in the range 0 to 23 */
0045     int tm_hour;
0046     /* the day of the month, in the range 1 to 31 */
0047     int tm_mday;
0048     /* the number of months since January, in the range 0 to 11 */
0049     int tm_mon;
0050     /* the number of years since 1900 */
0051     long tm_year;
0052     /* the number of days since Sunday, in the range 0 to 6 */
0053     int tm_wday;
0054     /* the number of days since January 1, in the range 0 to 365 */
0055     int tm_yday;
0056 };
0057 
0058 void time64_to_tm(time64_t totalsecs, int offset, struct tm *result);
0059 
0060 # include <linux/time32.h>
0061 
0062 static inline bool itimerspec64_valid(const struct itimerspec64 *its)
0063 {
0064     if (!timespec64_valid(&(its->it_interval)) ||
0065         !timespec64_valid(&(its->it_value)))
0066         return false;
0067 
0068     return true;
0069 }
0070 
0071 /**
0072  * time_after32 - compare two 32-bit relative times
0073  * @a:  the time which may be after @b
0074  * @b:  the time which may be before @a
0075  *
0076  * time_after32(a, b) returns true if the time @a is after time @b.
0077  * time_before32(b, a) returns true if the time @b is before time @a.
0078  *
0079  * Similar to time_after(), compare two 32-bit timestamps for relative
0080  * times.  This is useful for comparing 32-bit seconds values that can't
0081  * be converted to 64-bit values (e.g. due to disk format or wire protocol
0082  * issues) when it is known that the times are less than 68 years apart.
0083  */
0084 #define time_after32(a, b)  ((s32)((u32)(b) - (u32)(a)) < 0)
0085 #define time_before32(b, a) time_after32(a, b)
0086 
0087 /**
0088  * time_between32 - check if a 32-bit timestamp is within a given time range
0089  * @t:  the time which may be within [l,h]
0090  * @l:  the lower bound of the range
0091  * @h:  the higher bound of the range
0092  *
0093  * time_before32(t, l, h) returns true if @l <= @t <= @h. All operands are
0094  * treated as 32-bit integers.
0095  *
0096  * Equivalent to !(time_before32(@t, @l) || time_after32(@t, @h)).
0097  */
0098 #define time_between32(t, l, h) ((u32)(h) - (u32)(l) >= (u32)(t) - (u32)(l))
0099 
0100 # include <vdso/time.h>
0101 
0102 #endif