2
* Copyright (c) 2009-2011 Todd C. Miller <Todd.Miller@courtesan.com>
4
* Permission to use, copy, modify, and distribute this software for any
5
* purpose with or without fee is hereby granted, provided that the above
6
* copyright notice and this permission notice appear in all copies.
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
#include <sys/param.h>
20
#include <sys/types.h>
31
#endif /* STDC_HEADERS */
33
# if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
37
#endif /* HAVE_STRING_H */
40
#endif /* HAVE_STRINGS_H */
42
#if TIME_WITH_SYS_TIME
46
# if defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
47
# include <sys/sysctl.h>
48
# elif defined(HAVE_GETUTXID)
50
# elif defined(HAVE_GETUTID)
53
#endif /* !__linux__ */
58
* Fill in a struct timeval with the time the system booted.
59
* Returns 1 on success and 0 on failure.
62
#if defined(__linux__)
64
get_boottime(struct timeval *tv)
71
/* read btime from /proc/stat */
72
fp = fopen("/proc/stat", "r");
74
while ((len = getline(&line, &linesize, fp)) != -1) {
75
if (strncmp(line, "btime ", 6) == 0) {
76
tv->tv_sec = atoi(line + 6);
88
#elif defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
91
get_boottime(struct timeval *tv)
97
mib[1] = KERN_BOOTTIME;
99
if (sysctl(mib, 2, tv, &size, NULL, 0) != -1)
105
#elif defined(HAVE_GETUTXID)
108
get_boottime(struct timeval *tv)
110
struct utmpx *ut, key;
112
memset(&key, 0, sizeof(key));
113
key.ut_type = BOOT_TIME;
115
if ((ut = getutxid(&key)) != NULL) {
116
tv->tv_sec = ut->ut_tv.tv_sec;
117
tv->tv_usec = ut->ut_tv.tv_usec;
123
#elif defined(HAVE_GETUTID)
126
get_boottime(struct timeval *tv)
128
struct utmp *ut, key;
130
memset(&key, 0, sizeof(key));
131
key.ut_type = BOOT_TIME;
133
if ((ut = getutid(&key)) != NULL) {
134
tv->tv_sec = ut->ut_time;
144
get_boottime(struct timeval *tv)