diff options
Diffstat (limited to 'src/tcsd/platform.c')
| -rw-r--r-- | src/tcsd/platform.c | 134 | 
1 files changed, 134 insertions, 0 deletions
| diff --git a/src/tcsd/platform.c b/src/tcsd/platform.c new file mode 100644 index 0000000..c7a1c80 --- /dev/null +++ b/src/tcsd/platform.c @@ -0,0 +1,134 @@ + +/* + * 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 <sys/param.h> +#include <sys/sysctl.h> +#include <err.h> +#elif (defined (__linux) || defined (linux) || defined(__GLIBC__)) +#include <utmp.h> +#elif (defined (SOLARIS)) +#include <utmpx.h> +#endif + +#include <sys/time.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#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 | 
