]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/time-util.h
core: add unit_dbus_interface_from_type() to unit-name.h
[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
24#include <stdio.h>
cb0dac05 25#include <inttypes.h>
9a98c7a1
LP
26
27typedef uint64_t usec_t;
28typedef uint64_t nsec_t;
29
ccd06097
ZJS
30#define NSEC_FMT "%" PRIu64
31#define USEC_FMT "%" PRIu64
32
9a98c7a1
LP
33#include "macro.h"
34
35typedef struct dual_timestamp {
36 usec_t realtime;
37 usec_t monotonic;
38} dual_timestamp;
39
3a43da28
KS
40#define USEC_INFINITY ((usec_t) -1)
41#define NSEC_INFINITY ((nsec_t) -1)
42
43#define MSEC_PER_SEC 1000ULL
609e002e
LP
44#define USEC_PER_SEC ((usec_t) 1000000ULL)
45#define USEC_PER_MSEC ((usec_t) 1000ULL)
3a43da28
KS
46#define NSEC_PER_SEC ((nsec_t) 1000000000ULL)
47#define NSEC_PER_MSEC ((nsec_t) 1000000ULL)
48#define NSEC_PER_USEC ((nsec_t) 1000ULL)
609e002e
LP
49
50#define USEC_PER_MINUTE ((usec_t) (60ULL*USEC_PER_SEC))
3a43da28 51#define NSEC_PER_MINUTE ((nsec_t) (60ULL*NSEC_PER_SEC))
609e002e 52#define USEC_PER_HOUR ((usec_t) (60ULL*USEC_PER_MINUTE))
3a43da28 53#define NSEC_PER_HOUR ((nsec_t) (60ULL*NSEC_PER_MINUTE))
609e002e 54#define USEC_PER_DAY ((usec_t) (24ULL*USEC_PER_HOUR))
3a43da28 55#define NSEC_PER_DAY ((nsec_t) (24ULL*NSEC_PER_HOUR))
609e002e 56#define USEC_PER_WEEK ((usec_t) (7ULL*USEC_PER_DAY))
3a43da28 57#define NSEC_PER_WEEK ((nsec_t) (7ULL*NSEC_PER_DAY))
609e002e 58#define USEC_PER_MONTH ((usec_t) (2629800ULL*USEC_PER_SEC))
3a43da28 59#define NSEC_PER_MONTH ((nsec_t) (2629800ULL*NSEC_PER_SEC))
609e002e 60#define USEC_PER_YEAR ((usec_t) (31557600ULL*USEC_PER_SEC))
3a43da28 61#define NSEC_PER_YEAR ((nsec_t) (31557600ULL*NSEC_PER_SEC))
9a98c7a1 62
f0d7b0fc 63#define FORMAT_TIMESTAMP_MAX ((4*4+1)+11+9+4+1) /* weekdays can be unicode */
c3f84106 64#define FORMAT_TIMESTAMP_WIDTH 28 /* when outputting, assume this width */
9185c8e6 65#define FORMAT_TIMESTAMP_RELATIVE_MAX 256
9a98c7a1
LP
66#define FORMAT_TIMESPAN_MAX 64
67
e4746b57
RC
68#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
69
86caf095 70#define DUAL_TIMESTAMP_NULL ((struct dual_timestamp) { 0ULL, 0ULL })
842129f5 71
9a98c7a1
LP
72usec_t now(clockid_t clock);
73
74dual_timestamp* dual_timestamp_get(dual_timestamp *ts);
75dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u);
cae0c5e0 76dual_timestamp* dual_timestamp_from_monotonic(dual_timestamp *ts, usec_t u);
fbe55073 77dual_timestamp* dual_timestamp_from_boottime_or_monotonic(dual_timestamp *ts, usec_t u);
9a98c7a1 78
966204e0 79static inline bool dual_timestamp_is_set(dual_timestamp *ts) {
3a43da28
KS
80 return ((ts->realtime > 0 && ts->realtime != USEC_INFINITY) ||
81 (ts->monotonic > 0 && ts->monotonic != USEC_INFINITY));
966204e0 82}
9a98c7a1 83
44a6b1b6 84usec_t timespec_load(const struct timespec *ts) _pure_;
9a98c7a1
LP
85struct timespec *timespec_store(struct timespec *ts, usec_t u);
86
44a6b1b6 87usec_t timeval_load(const struct timeval *tv) _pure_;
9a98c7a1
LP
88struct timeval *timeval_store(struct timeval *tv, usec_t u);
89
90char *format_timestamp(char *buf, size_t l, usec_t t);
5ab99e07
LP
91char *format_timestamp_utc(char *buf, size_t l, usec_t t);
92char *format_timestamp_us(char *buf, size_t l, usec_t t);
93char *format_timestamp_us_utc(char *buf, size_t l, usec_t t);
bbb8486e 94char *format_timestamp_relative(char *buf, size_t l, usec_t t);
2fa4092c 95char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);
9a98c7a1
LP
96
97void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t);
e911de99 98int dual_timestamp_deserialize(const char *value, dual_timestamp *t);
9a98c7a1
LP
99
100int parse_timestamp(const char *t, usec_t *usec);
101
7f602784 102int parse_sec(const char *t, usec_t *usec);
9a98c7a1 103int parse_nsec(const char *t, nsec_t *nsec);
03cc26dd
LP
104
105bool ntp_synced(void);
75683450
LP
106
107int get_timezones(char ***l);
108bool timezone_is_valid(const char *name);
77ff2de9
TG
109
110clockid_t clock_boottime_or_monotonic(void);
babc21fd
LP
111
112#define xstrftime(buf, fmt, tm) assert_se(strftime(buf, ELEMENTSOF(buf), fmt, tm) > 0)