Some platforms don't have personality.h in their C library, this change adds buildtime detection for the header and turns off the personality setting code in those cases.
Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- configure.ac | 4 ++-- src/lxc/conf.c | 7 ++++++- src/lxc/confile.c | 16 ++++++++++++++-- src/lxc/lxc_attach.c | 8 +++++++- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 4e4a6dd..2905aee 100644 --- a/configure.ac +++ b/configure.ac @@ -211,10 +211,10 @@ AM_CONDITIONAL([IS_BIONIC], [test "x$libc_type" = "xbionic"]) AC_CHECK_DECLS([PR_CAPBSET_DROP], [], [], [#include <sys/prctl.h>]) # Check for some headers -AC_CHECK_HEADERS([sys/signalfd.h sys/capability.h pty.h]) +AC_CHECK_HEADERS([sys/signalfd.h sys/personality.h sys/capability.h pty.h]) # Check for some functions -AC_CHECK_FUNCS([getline fgetln openpty]) +AC_CHECK_FUNCS([getline fgetln openpty setns pivot_root sethostname unshare]) # Check for some standard binaries AC_PROG_GCC_TRADITIONAL diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 25b75d7..2136feb 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -48,7 +48,6 @@ #include <sys/mount.h> #include <sys/mman.h> #include <sys/prctl.h> -#include <sys/personality.h> #include <arpa/inet.h> #include <fcntl.h> @@ -74,6 +73,10 @@ #include <sys/capability.h> #endif +#if HAVE_SYS_PERSONALITY_H +#include <sys/personality.h> +#endif + #include "lxcseccomp.h" lxc_log_define(lxc_conf, lxc); @@ -1195,6 +1198,7 @@ out: static int setup_personality(int persona) { + #if HAVE_SYS_PERSONALITY_H if (persona == -1) return 0; @@ -1204,6 +1208,7 @@ static int setup_personality(int persona) } INFO("set personality to '0x%x'", persona); + #endif return 0; } diff --git a/src/lxc/confile.c b/src/lxc/confile.c index a725b78..940f0a9 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -31,12 +31,12 @@ #include <sys/types.h> #include <sys/param.h> #include <sys/utsname.h> -#include <sys/personality.h> #include <arpa/inet.h> #include <netinet/in.h> #include <net/if.h> #include "parse.h" +#include "config.h" #include "confile.h" #include "utils.h" @@ -44,6 +44,10 @@ #include <lxc/conf.h> #include "network.h" +#if HAVE_SYS_PERSONALITY_H +#include <sys/personality.h> +#endif + lxc_log_define(lxc_confile, lxc); static int config_personality(const char *, const char *, struct lxc_conf *); @@ -1301,6 +1305,7 @@ int lxc_config_define_load(struct lxc_list *defines, struct lxc_conf *conf) signed long lxc_config_parse_arch(const char *arch) { + #if HAVE_SYS_PERSONALITY_H struct per_name { char *name; unsigned long per; @@ -1318,6 +1323,7 @@ signed long lxc_config_parse_arch(const char *arch) if (!strcmp(pername[i].name, arch)) return pername[i].per; } + #endif return -1; } @@ -1333,18 +1339,22 @@ static int lxc_get_conf_int(struct lxc_conf *c, char *retv, int inlen, int v) static int lxc_get_arch_entry(struct lxc_conf *c, char *retv, int inlen) { - int len, fulllen = 0; + int fulllen = 0; if (!retv) inlen = 0; else memset(retv, 0, inlen); + #if HAVE_SYS_PERSONALITY_H + int len = 0; + switch(c->personality) { case PER_LINUX32: strprint(retv, inlen, "x86"); break; case PER_LINUX: strprint(retv, inlen, "x86_64"); break; default: break; } + #endif return fulllen; } @@ -1664,11 +1674,13 @@ void write_config(FILE *fout, struct lxc_conf *c) fprintf(fout, "lxc.pts = %d\n", c->pts); if (c->ttydir) fprintf(fout, "lxc.devttydir = %s\n", c->ttydir); + #if HAVE_SYS_PERSONALITY_H switch(c->personality) { case PER_LINUX32: fprintf(fout, "lxc.arch = x86\n"); break; case PER_LINUX: fprintf(fout, "lxc.arch = x86_64\n"); break; default: break; } + #endif #if HAVE_APPARMOR if (c->aa_profile) fprintf(fout, "lxc.aa_profile = %s\n", c->aa_profile); diff --git a/src/lxc/lxc_attach.c b/src/lxc/lxc_attach.c index ba98d73..851a37a 100644 --- a/src/lxc/lxc_attach.c +++ b/src/lxc/lxc_attach.c @@ -29,19 +29,23 @@ #include <sys/param.h> #include <sys/types.h> #include <sys/wait.h> -#include <sys/personality.h> #include "attach.h" #include "commands.h" #include "arguments.h" #include "caps.h" #include "cgroup.h" +#include "config.h" #include "confile.h" #include "start.h" #include "sync.h" #include "log.h" #include "namespace.h" +#if HAVE_SYS_PERSONALITY_H +#include <sys/personality.h> +#endif + lxc_log_define(lxc_attach_ui, lxc); static const struct option my_longopts[] = { @@ -273,6 +277,7 @@ int main(int argc, char *argv[]) } } + #if HAVE_SYS_PERSONALITY_H if (new_personality < 0) new_personality = init_ctx->personality; @@ -281,6 +286,7 @@ int main(int argc, char *argv[]) strerror(errno)); return -1; } + #endif if (!elevated_privileges && lxc_attach_drop_privs(init_ctx)) { ERROR("could not drop privileges"); -- 1.8.0 ------------------------------------------------------------------------------ Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft MVPs and experts. ON SALE this month only -- learn more at: http://p.sf.net/sfu/learnmore_122712 _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel