diff --git a/conf.c b/conf.c index d1afea9..8477a6e 100644 --- a/conf.c +++ b/conf.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -574,73 +573,6 @@ static int conf_pasta_ns(int *netns_only, char *userns, char *netns, return 0; } -/** - * conf_ns_check() - Check if we can enter configured namespaces - * @arg: Execution context - * - * Return: 0 - */ -static int conf_ns_check(void *arg) -{ - struct ctx *c = (struct ctx *)arg; - - if ((!c->netns_only && setns(c->pasta_userns_fd, CLONE_NEWUSER)) || - setns(c->pasta_netns_fd, CLONE_NEWNET)) - c->pasta_userns_fd = c->pasta_netns_fd = -1; - - return 0; - -} - -/** - * conf_ns_open() - Open network, user namespaces descriptors from configuration - * @c: Execution context - * @userns: --userns argument, can be an empty string - * @netns: network namespace path - * - * Return: 0 on success, negative error code otherwise - */ -static int conf_ns_open(struct ctx *c, const char *userns, const char *netns) -{ - int ufd = -1, nfd = -1; - - nfd = open(netns, O_RDONLY | O_CLOEXEC); - if (nfd < 0) { - err("Couldn't open network namespace %s", netns); - return -ENOENT; - } - - if (!c->netns_only && *userns) { - ufd = open(userns, O_RDONLY | O_CLOEXEC); - if (ufd < 0) { - close(nfd); - err("Couldn't open user namespace %s", userns); - return -ENOENT; - } - } - - c->pasta_netns_fd = nfd; - c->pasta_userns_fd = ufd; - - NS_CALL(conf_ns_check, c); - - if (c->pasta_netns_fd < 0) { - err("Couldn't switch to pasta namespaces"); - return -ENOENT; - } - - if (!c->no_netns_quit) { - char buf[PATH_MAX]; - - strncpy(buf, netns, PATH_MAX); - strncpy(c->netns_base, basename(buf), PATH_MAX - 1); - strncpy(buf, netns, PATH_MAX); - strncpy(c->netns_dir, dirname(buf), PATH_MAX - 1); - } - - return 0; -} - /** * conf_ip4() - Verify or detect IPv4 support, get relevant addresses * @ifi: Host interface to attempt (0 to determine one) @@ -1598,9 +1530,7 @@ void conf(struct ctx *c, int argc, char **argv) if (c->mode == MODE_PASTA) { if (*netns) { - ret = conf_ns_open(c, userns, netns); - if (ret < 0) - usage(argv[0]); + pasta_open_ns(c, userns, netns); } else { pasta_start_ns(c, argc - optind, argv + optind); } diff --git a/pasta.c b/pasta.c index 0bdb655..0fd45e4 100644 --- a/pasta.c +++ b/pasta.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -101,6 +102,71 @@ netns: return 0; } +/** + * ns_check() - Check if we can enter configured namespaces + * @arg: Execution context + * + * Return: 0 + */ +static int ns_check(void *arg) +{ + struct ctx *c = (struct ctx *)arg; + + if ((!c->netns_only && setns(c->pasta_userns_fd, CLONE_NEWUSER)) || + setns(c->pasta_netns_fd, CLONE_NEWNET)) + c->pasta_userns_fd = c->pasta_netns_fd = -1; + + return 0; + +} + +/** + * pasta_open_ns() - Open network, user namespaces descriptors + * @c: Execution context + * @userns: --userns argument, can be an empty string + * @netns: network namespace path + * + * Return: 0 on success, negative error code otherwise + */ +void pasta_open_ns(struct ctx *c, const char *userns, const char *netns) +{ + int ufd = -1, nfd = -1; + + nfd = open(netns, O_RDONLY | O_CLOEXEC); + if (nfd < 0) { + err("Couldn't open network namespace %s", netns); + exit(EXIT_FAILURE); + } + + if (!c->netns_only && *userns) { + ufd = open(userns, O_RDONLY | O_CLOEXEC); + if (ufd < 0) { + close(nfd); + err("Couldn't open user namespace %s", userns); + exit(EXIT_FAILURE); + } + } + + c->pasta_netns_fd = nfd; + c->pasta_userns_fd = ufd; + + NS_CALL(ns_check, c); + + if (c->pasta_netns_fd < 0) { + err("Couldn't switch to pasta namespaces"); + exit(EXIT_FAILURE); + } + + if (!c->no_netns_quit) { + char buf[PATH_MAX] = { 0 }; + + strncpy(buf, netns, PATH_MAX - 1); + strncpy(c->netns_base, basename(buf), PATH_MAX - 1); + strncpy(buf, netns, PATH_MAX - 1); + strncpy(c->netns_dir, dirname(buf), PATH_MAX - 1); + } +} + /** * struct pasta_setup_ns_arg - Argument for pasta_setup_ns() * @c: Execution context diff --git a/pasta.h b/pasta.h index 19b2e54..a1937b2 100644 --- a/pasta.h +++ b/pasta.h @@ -6,6 +6,7 @@ #ifndef PASTA_H #define PASTA_H +void pasta_open_ns(struct ctx *c, const char *userns, const char *netns); void pasta_start_ns(struct ctx *c, int argc, char *argv[]); void pasta_ns_conf(struct ctx *c); void pasta_child_handler(int signal);