summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSami Kerola2014-04-23 23:59:29 +0200
committerSami Kerola2014-05-04 12:42:03 +0200
commit929f939e6aa49952881d44706e4249ca7d644578 (patch)
tree0d7b7b9d6a897a941eb949d8eaf21efb91084ad7 /lib
parentuuidd: remove timeout from systemd service file (diff)
downloadkernel-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.c29
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;
+}