aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--conf.c72
-rw-r--r--pasta.c66
-rw-r--r--pasta.h1
3 files changed, 68 insertions, 71 deletions
diff --git a/conf.c b/conf.c
index d1afea9..8477a6e 100644
--- a/conf.c
+++ b/conf.c
@@ -20,7 +20,6 @@
#include <sched.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <libgen.h>
#include <limits.h>
#include <grp.h>
#include <pwd.h>
@@ -575,73 +574,6 @@ static int conf_pasta_ns(int *netns_only, char *userns, char *netns,
}
/**
- * 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)
* @ip4: IPv4 context (will be written)
@@ -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 <stdio.h>
#include <string.h>
#include <errno.h>
+#include <libgen.h>
#include <limits.h>
#include <stdlib.h>
#include <stdint.h>
@@ -102,6 +103,71 @@ netns:
}
/**
+ * 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
* @euid: Effective UID of caller
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);