1 #ifndef _LINUX_TIME_H
2 #define _LINUX_TIME_H
3
4 #include <asm/param.h>
5 #include <linux/types.h>
6
7 #ifndef _STRUCT_TIMESPEC
8 #define _STRUCT_TIMESPEC
9 struct timespec {
10 time_t tv_sec; /* seconds */
11 long tv_nsec; /* nanoseconds */
12 };
13 #endif /* _STRUCT_TIMESPEC */
14
15 #ifdef __KERNEL__
16
17 /*
18 * Change timeval to jiffies, trying to avoid the
19 * most obvious overflows..
20 *
21 * And some not so obvious.
22 *
23 * Note that we don't want to return MAX_LONG, because
24 * for various timeout reasons we often end up having
25 * to wait "jiffies+1" in order to guarantee that we wait
26 * at _least_ "jiffies" - so "jiffies+1" had better still
27 * be positive.
28 */
29 #define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
30
31 static __inline__ unsigned long
timespec_to_jiffies(struct timespec * value)32 timespec_to_jiffies(struct timespec *value)
33 {
34 unsigned long sec = value->tv_sec;
35 long nsec = value->tv_nsec;
36
37 if (sec >= (MAX_JIFFY_OFFSET / HZ))
38 return MAX_JIFFY_OFFSET;
39 nsec += 1000000000L / HZ - 1;
40 nsec /= 1000000000L / HZ;
41 return HZ * sec + nsec;
42 }
43
44 static __inline__ void
jiffies_to_timespec(unsigned long jiffies,struct timespec * value)45 jiffies_to_timespec(unsigned long jiffies, struct timespec *value)
46 {
47 value->tv_nsec = (jiffies % HZ) * (1000000000L / HZ);
48 value->tv_sec = jiffies / HZ;
49 }
50
51
52 /* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
53 * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
54 * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
55 *
56 * [For the Julian calendar (which was used in Russia before 1917,
57 * Britain & colonies before 1752, anywhere else before 1582,
58 * and is still in use by some communities) leave out the
59 * -year/100+year/400 terms, and add 10.]
60 *
61 * This algorithm was first published by Gauss (I think).
62 *
63 * WARNING: this function will overflow on 2106-02-07 06:28:16 on
64 * machines were long is 32-bit! (However, as time_t is signed, we
65 * will already get problems at other places on 2038-01-19 03:14:08)
66 */
67 static inline unsigned long
mktime(unsigned int year,unsigned int mon,unsigned int day,unsigned int hour,unsigned int min,unsigned int sec)68 mktime (unsigned int year, unsigned int mon,
69 unsigned int day, unsigned int hour,
70 unsigned int min, unsigned int sec)
71 {
72 if (0 >= (int) (mon -= 2)) { /* 1..12 -> 11,12,1..10 */
73 mon += 12; /* Puts Feb last since it has leap day */
74 year -= 1;
75 }
76
77 return (((
78 (unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
79 year*365 - 719499
80 )*24 + hour /* now have hours */
81 )*60 + min /* now have minutes */
82 )*60 + sec; /* finally seconds */
83 }
84
85 #endif /* __KERNEL__ */
86
87
88 struct timeval {
89 time_t tv_sec; /* seconds */
90 suseconds_t tv_usec; /* microseconds */
91 };
92
93 struct timezone {
94 int tz_minuteswest; /* minutes west of Greenwich */
95 int tz_dsttime; /* type of dst correction */
96 };
97
98 #define NFDBITS __NFDBITS
99
100 #ifdef __KERNEL__
101 extern void do_gettimeofday(struct timeval *tv);
102 extern void do_settimeofday(struct timeval *tv);
103 #endif
104
105 #define FD_SETSIZE __FD_SETSIZE
106 #define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
107 #define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
108 #define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
109 #define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
110
111 /*
112 * Names of the interval timers, and structure
113 * defining a timer setting.
114 */
115 #define ITIMER_REAL 0
116 #define ITIMER_VIRTUAL 1
117 #define ITIMER_PROF 2
118
119 struct itimerspec {
120 struct timespec it_interval; /* timer period */
121 struct timespec it_value; /* timer expiration */
122 };
123
124 struct itimerval {
125 struct timeval it_interval; /* timer interval */
126 struct timeval it_value; /* current value */
127 };
128
129 #endif
130