]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/time-util.h
sd-event: add support for CLOCK_BOOTTIME
[thirdparty/systemd.git] / src / shared / 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
609e002e
LP
40#define MSEC_PER_SEC ((usec_t) 1000ULL)
41#define USEC_PER_SEC ((usec_t) 1000000ULL)
42#define USEC_PER_MSEC ((usec_t) 1000ULL)
43#define NSEC_PER_SEC ((usec_t) 1000000000ULL)
44#define NSEC_PER_MSEC ((usec_t) 1000000ULL)
45#define NSEC_PER_USEC ((usec_t) 1000ULL)
46
47#define USEC_PER_MINUTE ((usec_t) (60ULL*USEC_PER_SEC))
48#define NSEC_PER_MINUTE ((usec_t) (60ULL*NSEC_PER_SEC))
49#define USEC_PER_HOUR ((usec_t) (60ULL*USEC_PER_MINUTE))
50#define NSEC_PER_HOUR ((usec_t) (60ULL*NSEC_PER_MINUTE))
51#define USEC_PER_DAY ((usec_t) (24ULL*USEC_PER_HOUR))
52#define NSEC_PER_DAY ((usec_t) (24ULL*NSEC_PER_HOUR))
53#define USEC_PER_WEEK ((usec_t) (7ULL*USEC_PER_DAY))
54#define NSEC_PER_WEEK ((usec_t) (7ULL*NSEC_PER_DAY))
55#define USEC_PER_MONTH ((usec_t) (2629800ULL*USEC_PER_SEC))
56#define NSEC_PER_MONTH ((usec_t) (2629800ULL*NSEC_PER_SEC))
57#define USEC_PER_YEAR ((usec_t) (31557600ULL*USEC_PER_SEC))
58#define NSEC_PER_YEAR ((usec_t) (31557600ULL*NSEC_PER_SEC))
9a98c7a1 59
f0d7b0fc 60#define FORMAT_TIMESTAMP_MAX ((4*4+1)+11+9+4+1) /* weekdays can be unicode */
c3f84106 61#define FORMAT_TIMESTAMP_WIDTH 28 /* when outputting, assume this width */
9185c8e6 62#define FORMAT_TIMESTAMP_RELATIVE_MAX 256
9a98c7a1
LP
63#define FORMAT_TIMESPAN_MAX 64
64
842129f5
LP
65#define DUAL_TIMESTAMP_NULL ((struct dual_timestamp) { 0, 0 })
66
9a98c7a1
LP
67usec_t now(clockid_t clock);
68
69dual_timestamp* dual_timestamp_get(dual_timestamp *ts);
70dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u);
cae0c5e0 71dual_timestamp* dual_timestamp_from_monotonic(dual_timestamp *ts, usec_t u);
9a98c7a1 72
966204e0
LP
73static inline bool dual_timestamp_is_set(dual_timestamp *ts) {
74 return ((ts->realtime > 0 && ts->realtime != (usec_t) -1) ||
75 (ts->monotonic > 0 && ts->monotonic != (usec_t) -1));
76}
9a98c7a1 77
44a6b1b6 78usec_t timespec_load(const struct timespec *ts) _pure_;
9a98c7a1
LP
79struct timespec *timespec_store(struct timespec *ts, usec_t u);
80
44a6b1b6 81usec_t timeval_load(const struct timeval *tv) _pure_;
9a98c7a1
LP
82struct timeval *timeval_store(struct timeval *tv, usec_t u);
83
84char *format_timestamp(char *buf, size_t l, usec_t t);
f02d8367 85char *format_timestamp_us(char *buf, size_t l, usec_t t);
bbb8486e 86char *format_timestamp_relative(char *buf, size_t l, usec_t t);
2fa4092c 87char *format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy);
9a98c7a1
LP
88
89void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t);
90void dual_timestamp_deserialize(const char *value, dual_timestamp *t);
91
92int parse_timestamp(const char *t, usec_t *usec);
93
7f602784 94int parse_sec(const char *t, usec_t *usec);
9a98c7a1 95int parse_nsec(const char *t, nsec_t *nsec);
03cc26dd
LP
96
97bool ntp_synced(void);
75683450
LP
98
99int get_timezones(char ***l);
100bool timezone_is_valid(const char *name);