]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/boottime: add a new file
authorKarel Zak <kzak@redhat.com>
Tue, 6 May 2014 18:27:10 +0000 (20:27 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 6 May 2014 18:27:10 +0000 (20:27 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
lib/boottime.c [new file with mode: 0644]

diff --git a/lib/boottime.c b/lib/boottime.c
new file mode 100644 (file)
index 0000000..335570c
--- /dev/null
@@ -0,0 +1,34 @@
+
+#include <time.h>
+#include <sys/sysinfo.h>
+#include <sys/time.h>
+
+#include "c.h"
+#include "nls.h"
+#include "boottime.h"
+
+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;
+}