diff --git a/src/lxc/tools/arguments.c b/src/lxc/tools/arguments.c index f16b19562..585bb1492 100644 --- a/src/lxc/tools/arguments.c +++ b/src/lxc/tools/arguments.c @@ -35,6 +35,7 @@ #include "arguments.h" #include "utils.h" #include "version.h" +#include "namespace.h" static int build_shortopts(const struct option *a_options, char *a_shortopts, size_t a_size) @@ -289,3 +290,34 @@ int lxc_arguments_str_to_int(struct lxc_arguments *args, const char *str) return (int)val; } + +bool lxc_setup_shared_ns(struct lxc_arguments *args, struct lxc_container *c) +{ + int i; + + for (i = 0; i < LXC_NS_MAX; i++) { + const char *key, *value; + + value = args->share_ns[i]; + if (!value) + continue; + + if (i == LXC_NS_NET) + key = "lxc.namespace.net"; + else if (i == LXC_NS_IPC) + key = "lxc.namespace.ipc"; + else if (i == LXC_NS_UTS) + key = "lxc.namespace.uts"; + else if (i == LXC_NS_PID) + key = "lxc.namespace.pid"; + else + continue; + + if (!c->set_config_item(c, key, value)) { + fprintf(stderr, "failed to set %s\n", key); + return false; + } + } + + return true; +} diff --git a/src/lxc/tools/arguments.h b/src/lxc/tools/arguments.h index b07caf42b..bfaa665de 100644 --- a/src/lxc/tools/arguments.h +++ b/src/lxc/tools/arguments.h @@ -29,6 +29,7 @@ #include #include #include +#include struct lxc_arguments; @@ -160,6 +161,11 @@ struct lxc_arguments { #define OPT_VERSION OPT_USAGE - 1 #define OPT_RCFILE OPT_USAGE - 2 +#define OPT_SHARE_NET OPT_USAGE + 1 +#define OPT_SHARE_IPC OPT_USAGE + 2 +#define OPT_SHARE_UTS OPT_USAGE + 3 +#define OPT_SHARE_PID OPT_USAGE + 4 + extern int lxc_arguments_parse(struct lxc_arguments *args, int argc, char *const argv[]); @@ -170,4 +176,6 @@ extern int lxc_arguments_str_to_int(struct lxc_arguments *args, if (!(arg)->quiet) \ fprintf(stderr, "%s: " fmt "\n", (arg)->progname, ##args) +extern bool lxc_setup_shared_ns(struct lxc_arguments *args, struct lxc_container *c); + #endif /* __LXC_ARGUMENTS_H */ diff --git a/src/lxc/tools/lxc_execute.c b/src/lxc/tools/lxc_execute.c index 9af00886c..4b4120030 100644 --- a/src/lxc/tools/lxc_execute.c +++ b/src/lxc/tools/lxc_execute.c @@ -63,6 +63,10 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg) case 'g': if (lxc_safe_uint(arg, &args->gid) < 0) return -1; + case OPT_SHARE_NET: args->share_ns[LXC_NS_NET] = arg; break; + case OPT_SHARE_IPC: args->share_ns[LXC_NS_IPC] = arg; break; + case OPT_SHARE_UTS: args->share_ns[LXC_NS_UTS] = arg; break; + case OPT_SHARE_PID: args->share_ns[LXC_NS_PID] = arg; break; } return 0; } @@ -73,6 +77,10 @@ static const struct option my_longopts[] = { {"define", required_argument, 0, 's'}, {"uid", required_argument, 0, 'u'}, {"gid", required_argument, 0, 'g'}, + {"share-net", required_argument, 0, OPT_SHARE_NET}, + {"share-ipc", required_argument, 0, OPT_SHARE_IPC}, + {"share-uts", required_argument, 0, OPT_SHARE_UTS}, + {"share-pid", required_argument, 0, OPT_SHARE_PID}, LXC_COMMON_OPTIONS }; @@ -183,6 +191,11 @@ int main(int argc, char *argv[]) if (my_args.gid) c->lxc_conf->init_gid = my_args.gid; + if (!lxc_setup_shared_ns(&my_args, c)) { + lxc_container_put(c); + exit(EXIT_FAILURE); + } + c->daemonize = my_args.daemonize == 1; bret = c->start(c, 1, my_args.argv); ret = c->error_num; diff --git a/src/lxc/tools/lxc_start.c b/src/lxc/tools/lxc_start.c index 7584b59f4..2909458a8 100644 --- a/src/lxc/tools/lxc_start.c +++ b/src/lxc/tools/lxc_start.c @@ -50,11 +50,6 @@ #include "confile.h" #include "arguments.h" -#define OPT_SHARE_NET OPT_USAGE + 1 -#define OPT_SHARE_IPC OPT_USAGE + 2 -#define OPT_SHARE_UTS OPT_USAGE + 3 -#define OPT_SHARE_PID OPT_USAGE + 4 - static struct lxc_list defines; static int ensure_path(char **confpath, const char *path) @@ -152,7 +147,6 @@ Options :\n\ int main(int argc, char *argv[]) { - int i; struct lxc_conf *conf; struct lxc_log log; const char *lxcpath; @@ -284,27 +278,8 @@ int main(int argc, char *argv[]) } } - for (i = 0; i < LXC_NS_MAX; i++) { - const char *key, *value; - - value = my_args.share_ns[i]; - if (!value) - continue; - - if (i == LXC_NS_NET) - key = "lxc.namespace.net"; - else if (i == LXC_NS_IPC) - key = "lxc.namespace.ipc"; - else if (i == LXC_NS_UTS) - key = "lxc.namespace.uts"; - else if (i == LXC_NS_PID) - key = "lxc.namespace.pid"; - else - continue; - - if (!c->set_config_item(c, key, value)) - goto out; - } + if (!lxc_setup_shared_ns(&my_args, c)) + goto out; if (!my_args.daemonize) { c->want_daemonize(c, false);