diff options
author | Sami Kerola | 2014-04-23 23:59:29 +0200 |
---|---|---|
committer | Sami Kerola | 2014-05-04 12:42:03 +0200 |
commit | 929f939e6aa49952881d44706e4249ca7d644578 (patch) | |
tree | 0d7b7b9d6a897a941eb949d8eaf21efb91084ad7 /lib | |
parent | uuidd: remove timeout from systemd service file (diff) | |
download | kernel-qcow2-util-linux-929f939e6aa49952881d44706e4249ca7d644578.tar.gz kernel-qcow2-util-linux-929f939e6aa49952881d44706e4249ca7d644578.tar.xz kernel-qcow2-util-linux-929f939e6aa49952881d44706e4249ca7d644578.zip |
dmesg: move get_boot_time() to lib/timeutils
In future the last(1) will use get_boot_time() as well.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/timeutils.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/timeutils.c b/lib/timeutils.c index 7fe62187d..c1b632e0a 100644 --- a/lib/timeutils.c +++ b/lib/timeutils.c @@ -21,9 +21,12 @@ #include <assert.h> #include <ctype.h> #include <string.h> +#include <sys/sysinfo.h> +#include <sys/time.h> #include <time.h> #include "c.h" +#include "nls.h" #include "strutils.h" #include "timeutils.h" @@ -336,3 +339,29 @@ int parse_timestamp(const char *t, usec_t *usec) return 0; } + +int get_boot_time(struct timeval *boot_time) +{ + struct timespec hires_uptime; + struct timeval lores_uptime, now; + struct sysinfo info; + + if (gettimeofday(&now, NULL) != 0) { + warn(_("gettimeofday failed")); + return -errno; + } +#ifdef CLOCK_BOOTTIME + if (clock_gettime(CLOCK_BOOTTIME, &hires_uptime) == 0) { + TIMESPEC_TO_TIMEVAL(&lores_uptime, &hires_uptime); + timersub(&now, &lores_uptime, boot_time); + return 0; + } +#endif + /* fallback */ + if (sysinfo(&info) != 0) + warn(_("sysinfo failed")); + + boot_time->tv_sec = now.tv_sec - info.uptime; + boot_time->tv_usec = 0; + return 0; +} |