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