From 09f990a7c835d75f67cfe696a35e8c46e67c612f Mon Sep 17 00:00:00 2001 From: "Robin H. Johnson" Date: Wed, 5 Jan 2011 22:03:43 -0800 Subject: Implement explicit selection of subsystem types. - Fixes bugs #347583, #349389, both of which were triggered by cgroups being detected as the LXC subsystem type. - Makes it much easier to select "prefix" type. - "rc -S" will now print a warning if you have not configured rc_sys in /etc/rc.conf - All other semantics of rc_sys are unchanged in this patch. Signed-off-by: Robin H. Johnson --- src/librc/librc.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'src/librc/librc.c') diff --git a/src/librc/librc.c b/src/librc/librc.c index fe9e1b6b..6d823434 100644 --- a/src/librc/librc.c +++ b/src/librc/librc.c @@ -199,7 +199,51 @@ file_regex(const char *file, const char *regex) #endif const char * -rc_sys(void) +rc_sys_v2(void) +{ +#define __STRING_SWITCH(x) { char* __string_switch = x; if(false) {} +#define __STRING_CASE(y) else if(strcmp(__string_switch,y) == 0) +#define __STRING_SWITCH_END() } + char* systype = rc_conf_value("rc_sys"); + /* New sys identification code */ + if(systype) { + char* s = systype; + // Convert to uppercase + while(s && *s) { + if(islower((unsigned char)*s)) + *s = toupper((unsigned char)*s); + s++; + } + // Now do detection + __STRING_SWITCH(systype) + __STRING_CASE(RC_SYS_PREFIX) { return RC_SYS_PREFIX; } +#ifdef __FreeBSD__ + __STRING_CASE(RC_SYS_JAIL) { return RC_SYS_JAIL; } +#endif /* __FreeBSD__ */ +#ifdef __NetBSD__ + __STRING_CASE(RC_SYS_XEN0) { return RC_SYS_XEN0; } + __STRING_CASE(RC_SYS_XENU) { return RC_SYS_XENU; } +#endif /* __NetBSD__ */ +#ifdef __linux__ + __STRING_CASE(RC_SYS_XEN0) { return RC_SYS_XEN0; } + __STRING_CASE(RC_SYS_XENU) { return RC_SYS_XENU; } + __STRING_CASE(RC_SYS_UML) { return RC_SYS_UML; } + __STRING_CASE(RC_SYS_VSERVER) { return RC_SYS_VSERVER; } + __STRING_CASE(RC_SYS_OPENVZ) { return RC_SYS_OPENVZ; } + __STRING_CASE(RC_SYS_LXC) { return RC_SYS_LXC; } +#endif /* __linux__ */ + __STRING_SWITCH_END() + } +#undef __STRING_SWITCH +#undef __STRING_CASE +#undef __STRING_SWITCH_END + return NULL; +} +librc_hidden_def(rc_sys_v2) + +/* Old sys identification code */ +const char * +rc_sys_v1(void) { #ifdef PREFIX return RC_SYS_PREFIX; @@ -243,6 +287,15 @@ rc_sys(void) return NULL; #endif /* PREFIX */ } +librc_hidden_def(rc_sys_v1) + +const char * +rc_sys(void) +{ + const char *s = rc_sys_v2(); + if(s) return s; + return rc_sys_v1(); +} librc_hidden_def(rc_sys) static const char * -- cgit v1.2.3