]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/time-util.h
selinux: use raw variants of security_compute_create and setfscreatecon
[thirdparty/systemd.git] / src / basic / time-util.h
CommitLineData
9a98c7a1
LP
1#pragma once
2
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
cb0dac05 22#include <inttypes.h>
11c3a366
TA
23#include <stdbool.h>
24#include <stddef.h>
25#include <stdint.h>
7c67c79c
HV
26#include <stdio.h>
27#include <time.h>
9a98c7a1
LP
28
29typedef uint64_t usec_t;
30typedef uint64_t nsec_t;
31
ccd06097
ZJS
32#define NSEC_FMT "%" PRIu64
33#define USEC_FMT "%" PRIu64
34
9a98c7a1
LP
35#include "macro.h"
36
37typedef struct dual_timestamp {
38 usec_t realtime;
39 usec_t monotonic;
40} dual_timestamp;
41
3a43da28
KS
42#define USEC_INFINITY ((usec_t) -1)
43#define NSEC_INFINITY ((nsec_t) -1)
44
45#define MSEC_PER_SEC 1000ULL
609e002e
LP
46#define USEC_PER_SEC ((usec_t) 1000000ULL)
47#define USEC_PER_MSEC ((usec_t) 1000ULL)
3a43da28
KS
48#define NSEC_PER_SEC ((nsec_t) 1000000000ULL)
49#define NSEC_PER_MSEC ((nsec_t) 1000000ULL)
50#define NSEC_PER_USEC ((nsec_t) 1000ULL)
609e002e
LP
51
52#define USEC_PER_MINUTE ((usec_t) (60ULL*USEC_PER_SEC))
3a43da28 53#define NSEC_PER_MINUTE ((nsec_t) (60ULL*NSEC_PER_SEC))
609e002e 54#define USEC_PER_HOUR ((usec_t) (60ULL*USEC_PER_MINUTE))
3a43da28 55#define NSEC_PER_HOUR ((nsec_t) (60ULL*NSEC_PER_MINUTE))
609e002e 56#define USEC_PER_DAY ((usec_t) (24ULL*USEC_PER_HOUR))
3a43da28 57#define NSEC_PER_DAY ((nsec_t) (24ULL*NSEC_PER_HOUR))
609e002e 58#define USEC_PER_WEEK ((usec_t) (7ULL*USEC_PER_DAY))
3a43da28 59#define NSEC_PER_WEEK ((nsec_t) (7ULL*NSEC_PER_DAY))
609e002e 60#define USEC_PER_MONTH ((usec_t) (2629800ULL*USEC_PER_SEC))
3a43da28 61#define NSEC_PER_MONTH ((nsec_t) (2629800ULL*NSEC_PER_SEC))
609e002e 62#define USEC_PER_YEAR ((usec_t) (31557600ULL*USEC_PER_SEC))
3a43da28 63#define NSEC_PER_YEAR ((nsec_t) (31557600ULL*NSEC_PER_SEC))
9a98c7a1 64
f0d7b0fc 65#define FORMAT_TIMESTAMP_MAX ((4*4+1)+11+9+4+1) /* weekdays can be unicode */
c3f84106 66#define FORMAT_TIMESTAMP_WIDTH 28 /* when outputting, assume this width */
9185c8e6 67#define FORMAT_TIMESTAMP_RELATIVE_MAX 256
9a98c7a1
LP
68#define FORMAT_TIMESPAN_MAX 64
69
2d60169d 70#define TIME_T_MAX (time_t)((UINTMAX_C(1) << ((sizeof(time_t) << 3) - 1)) - 1)
e4746b57 71
86caf095 72#define DUAL_TIMESTAMP_NULL ((struct dual_timestamp) { 0ULL, 0ULL })
842129f5 73
9a98c7a1 74usec_t now(clockid_t clock);
45d7a8bb 75nsec_t now_nsec(clockid_t clock);
9a98c7a1
LP
76
77dual_timestamp* dual_timestamp_get(dual_timestamp *ts);
78dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u);
cae0c5e0 79dual_timestamp* dual_timestamp_from_monotonic(dual_timestamp *ts, usec_t u);
fbe55073 80dual_timestamp* dual_timestamp_from_boottime_or_monotonic(dual_timestamp *ts, usec_t u);
9a98c7a1 81
966204e0 82static inline bool dual_timestamp_is_set(dual_timestamp *ts) {
3a43da28
KS
83 return ((ts->realtime > 0 && ts->realtime != USEC_INFINITY) ||
84 (ts->monotonic > 0 && ts->monotonic != USEC_INFINITY));
966204e0 85}
9a98c7a1 86
44a6b1b6 87usec_t timespec_load(const struct timespec *ts) _pure_;
9a98c7a1
LP
88struct timespec *timespec_store(struct timespec *ts, usec_t u);
89
44a6b1b6 90usec_t timeval_load(const struct timeval *tv) _pure_;
9a98c7a1
LP
91struct timeval *timeval_store(struct timeval *tv, usec_t u);
92
93char *format_timestamp(char *buf, size_t l, usec_t t);
5ab99e07
LP
94char *format_timestamp_utc(char *buf, size_t l, usec_t t);
95char *format_timestamp_us(char *buf, size_t l, usec_t t);
96char *format_timestamp_us_utc(char *buf, size_t l, usec_t t);
bbb8486e 97char *format_timestamp_relative(char *buf, size_t l, usec_t t);
2fa4092c 98char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);
9a98c7a1
LP
99
100void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t);
e911de99 101int dual_timestamp_deserialize(const char *value, dual_timestamp *t);
b895a735 102int timestamp_deserialize(const char *value, usec_t *timestamp);
9a98c7a1
LP
103
104int parse_timestamp(const char *t, usec_t *usec);
105
7f602784 106int parse_sec(const char *t, usec_t *usec);
519cffec 107int parse_time(const char *t, usec_t *usec, usec_t default_unit);
9a98c7a1 108int parse_nsec(const char *t, nsec_t *nsec);
03cc26dd
LP
109
110bool ntp_synced(void);
75683450
LP
111
112int get_timezones(char ***l);
113bool timezone_is_valid(const char *name);
77ff2de9
TG
114
115clockid_t clock_boottime_or_monotonic(void);
babc21fd 116
a8b62610
MS
117#define xstrftime(buf, fmt, tm) \
118 assert_message_se(strftime(buf, ELEMENTSOF(buf), fmt, tm) > 0, \
119 "xstrftime: " #buf "[] must be big enough")
5c904ba5
LP
120
121int get_timezone(char **timezone);
7c67c79c
HV
122
123time_t mktime_or_timegm(struct tm *tm, bool utc);
124struct tm *localtime_or_gmtime_r(const time_t *t, struct tm *tm, bool utc);
87b8ce69
SS
125
126unsigned long usec_to_jiffies(usec_t usec);
53f555b6
LP
127
128static inline usec_t usec_add(usec_t a, usec_t b) {
129 usec_t c;
130
131 /* Adds two time values, and makes sure USEC_INFINITY as input results as USEC_INFINITY in output, and doesn't
132 * overflow. */
133
134 c = a + b;
135 if (c < a || c < b) /* overflow check */
136 return USEC_INFINITY;
137
138 return c;
139}
5d634ca8
AK
140
141static inline usec_t usec_sub(usec_t timestamp, int64_t delta) {
142 if (delta < 0)
04a1d84c 143 return usec_add(timestamp, (usec_t) (-delta));
5d634ca8 144
04a1d84c
LP
145 if (timestamp == USEC_INFINITY) /* Make sure infinity doesn't degrade */
146 return USEC_INFINITY;
147
148 if (timestamp < (usec_t) delta)
149 return 0;
150
151 return timestamp - delta;
5d634ca8 152}