/* * Licensed Materials - Property of IBM * * trousers - An open source TCG Software Stack * * (C) Copyright International Business Machines Corp. 2004, 2005 * */ #if (defined (__FreeBSD__) || defined (__OpenBSD__)) #include #include #include #elif (defined (__linux) || defined (linux) || defined(__GLIBC__)) #include #elif (defined (SOLARIS)) #include #endif #include #include #include #include #include "trousers/tss.h" #include "trousers_types.h" #include "tcs_tsp.h" #include "tcs_int_literals.h" #include "capabilities.h" #include "tcsps.h" #include "tcslog.h" #if (defined (__linux) || defined (linux) || defined(__GLIBC__)) MUTEX_DECLARE_INIT(utmp_lock); char platform_get_runlevel() { char runlevel; struct utmp ut, save, *next = NULL; struct timeval tv; int flag = 0, counter = 0; MUTEX_LOCK(utmp_lock); memset(&ut, 0, sizeof(struct utmp)); memset(&save, 0, sizeof(struct utmp)); memset(&tv, 0, sizeof(struct timeval)); ut.ut_type = RUN_LVL; next = getutid(&ut); while (next != NULL) { if (next->ut_tv.tv_sec > tv.tv_sec) { memcpy(&save, next, sizeof(*next)); flag = 1; } else if (next->ut_tv.tv_sec == tv.tv_sec) { if (next->ut_tv.tv_usec > tv.tv_usec) { memcpy(&save, next, sizeof(*next)); flag = 1; } } counter++; next = getutid(&ut); } if (flag) { //printf("prev_runlevel=%c, runlevel=%c\n", save.ut_pid / 256, save.ut_pid % 256); runlevel = save.ut_pid % 256; } else { //printf("unknown\n"); runlevel = 'u'; } MUTEX_UNLOCK(utmp_lock); return runlevel; } #elif (defined (__FreeBSD__) || defined (__OpenBSD__)) char platform_get_runlevel() { int mib[2], rlevel = -1; size_t len; mib[0] = CTL_KERN; mib[1] = KERN_SECURELVL; len = sizeof(rlevel); if (sysctl(mib,2,&rlevel,&len, NULL,0) == -1) { err(1,"Could not get runlevel"); return 'u'; } #if defined (__OpenBSD__) if (rlevel == 0) #else if (rlevel == -1) #endif return 's'; return rlevel + '0'; } #elif (defined (SOLARIS)) MUTEX_DECLARE_INIT(utmp_lock); char platform_get_runlevel() { char runlevel; struct utmpx ut, *utp = NULL; MUTEX_LOCK(utmp_lock); memset(&ut, 0, sizeof(ut)); ut.ut_type = RUN_LVL; setutxent(); utp = getutxid(&ut); if (utp->ut_type == RUN_LVL && sscanf(utp->ut_line, "run-level %c", &runlevel) != 1) runlevel = 'u'; endutxent(); MUTEX_UNLOCK(utmp_lock); return runlevel; } #endif