Most of our helpers which need to enter the pasta network namespace are
quite specialised. Add one which is rather general - it just open()s a
given file in the namespace context and returns the fd back to the main
namespace. This will have some future uses.
Signed-off-by: David Gibson
---
util.c | 39 +++++++++++++++++++++++++++++++++++++++
util.h | 1 +
2 files changed, 40 insertions(+)
diff --git a/util.c b/util.c
index a8f3b35..92ad375 100644
--- a/util.c
+++ b/util.c
@@ -364,6 +364,45 @@ bool ns_is_init(void)
return ret;
}
+struct open_in_ns_args {
+ const struct ctx *c;
+ int fd;
+ int err;
+ const char *path;
+ int flags;
+};
+
+static int do_open_in_ns(void *arg)
+{
+ struct open_in_ns_args *a = (struct open_in_ns_args *)arg;
+
+ ns_enter(a->c);
+
+ a->fd = open(a->path, a->flags);
+ a->err = errno;
+
+ return 0;
+}
+
+/**
+ * open_in_ns() - open() within the pasta namespace
+ * @c: Execution context
+ * @path: Path to open
+ * @flags: open() flags
+ *
+ * Return: fd of open()ed file or -1 on error, errno is set to indicate error
+ */
+int open_in_ns(const struct ctx *c, const char *path, int flags)
+{
+ struct open_in_ns_args arg = {
+ .c = c, .path = path, .flags = flags,
+ };
+
+ NS_CALL(do_open_in_ns, &arg);
+ errno = arg.err;
+ return arg.fd;
+}
+
/**
* pid_file() - Write PID to file, if requested to do so, and close it
* @fd: Open PID file descriptor, closed on exit, -1 to skip writing it
diff --git a/util.h b/util.h
index 9effc54..78a8fb2 100644
--- a/util.h
+++ b/util.h
@@ -219,6 +219,7 @@ int bitmap_isset(const uint8_t *map, int bit);
char *line_read(char *buf, size_t len, int fd);
void ns_enter(const struct ctx *c);
bool ns_is_init(void);
+int open_in_ns(const struct ctx *c, const char *path, int flags);
void write_pidfile(int fd, pid_t pid);
int __daemon(int pidfile_fd, int devnull_fd);
int fls(unsigned long x);
--
2.41.0