Annotation of embedaddon/sudo/plugins/sudoers/boottime.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 2009-2011 Todd C. Miller <Todd.Miller@courtesan.com>
! 3: *
! 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.
! 7: *
! 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.
! 15: */
! 16:
! 17: #include <config.h>
! 18:
! 19: #include <sys/param.h>
! 20: #include <sys/types.h>
! 21: #include <sys/time.h>
! 22:
! 23: #include <stdio.h>
! 24: #ifdef STDC_HEADERS
! 25: # include <stdlib.h>
! 26: # include <stddef.h>
! 27: #else
! 28: # ifdef HAVE_STDLIB_H
! 29: # include <stdlib.h>
! 30: # endif
! 31: #endif /* STDC_HEADERS */
! 32: #ifdef HAVE_STRING_H
! 33: # if defined(HAVE_MEMORY_H) && !defined(STDC_HEADERS)
! 34: # include <memory.h>
! 35: # endif
! 36: # include <string.h>
! 37: #endif /* HAVE_STRING_H */
! 38: #ifdef HAVE_STRINGS_H
! 39: # include <strings.h>
! 40: #endif /* HAVE_STRINGS_H */
! 41: #include <limits.h>
! 42: #if TIME_WITH_SYS_TIME
! 43: # include <time.h>
! 44: #endif
! 45: #ifndef __linux__
! 46: # if defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
! 47: # include <sys/sysctl.h>
! 48: # elif defined(HAVE_GETUTXID)
! 49: # include <utmpx.h>
! 50: # elif defined(HAVE_GETUTID)
! 51: # include <utmp.h>
! 52: # endif
! 53: #endif /* !__linux__ */
! 54:
! 55: #include "missing.h"
! 56:
! 57: /*
! 58: * Fill in a struct timeval with the time the system booted.
! 59: * Returns 1 on success and 0 on failure.
! 60: */
! 61:
! 62: #if defined(__linux__)
! 63: int
! 64: get_boottime(struct timeval *tv)
! 65: {
! 66: char *line = NULL;
! 67: size_t linesize = 0;
! 68: ssize_t len;
! 69: FILE * fp;
! 70:
! 71: /* read btime from /proc/stat */
! 72: fp = fopen("/proc/stat", "r");
! 73: if (fp != NULL) {
! 74: while ((len = getline(&line, &linesize, fp)) != -1) {
! 75: if (strncmp(line, "btime ", 6) == 0) {
! 76: tv->tv_sec = atoi(line + 6);
! 77: tv->tv_usec = 0;
! 78: return 1;
! 79: }
! 80: }
! 81: fclose(fp);
! 82: free(line);
! 83: }
! 84:
! 85: return 0;
! 86: }
! 87:
! 88: #elif defined(HAVE_SYSCTL) && defined(KERN_BOOTTIME)
! 89:
! 90: int
! 91: get_boottime(struct timeval *tv)
! 92: {
! 93: size_t size;
! 94: int mib[2];
! 95:
! 96: mib[0] = CTL_KERN;
! 97: mib[1] = KERN_BOOTTIME;
! 98: size = sizeof(*tv);
! 99: if (sysctl(mib, 2, tv, &size, NULL, 0) != -1)
! 100: return 1;
! 101:
! 102: return 0;
! 103: }
! 104:
! 105: #elif defined(HAVE_GETUTXID)
! 106:
! 107: int
! 108: get_boottime(struct timeval *tv)
! 109: {
! 110: struct utmpx *ut, key;
! 111:
! 112: memset(&key, 0, sizeof(key));
! 113: key.ut_type = BOOT_TIME;
! 114: setutxent();
! 115: if ((ut = getutxid(&key)) != NULL) {
! 116: tv->tv_sec = ut->ut_tv.tv_sec;
! 117: tv->tv_usec = ut->ut_tv.tv_usec;
! 118: }
! 119: endutxent();
! 120: return ut != NULL;
! 121: }
! 122:
! 123: #elif defined(HAVE_GETUTID)
! 124:
! 125: int
! 126: get_boottime(struct timeval *tv)
! 127: {
! 128: struct utmp *ut, key;
! 129:
! 130: memset(&key, 0, sizeof(key));
! 131: key.ut_type = BOOT_TIME;
! 132: setutent();
! 133: if ((ut = getutid(&key)) != NULL) {
! 134: tv->tv_sec = ut->ut_time;
! 135: tv->tv_usec = 0;
! 136: }
! 137: endutent();
! 138: return ut != NULL;
! 139: }
! 140:
! 141: #else
! 142:
! 143: int
! 144: get_boottime(struct timeval *tv)
! 145: {
! 146: return 0;
! 147: }
! 148: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>