Return to boottime.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / sudoers |
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