aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-08-02 13:15:40 +1000
committerStefano Brivio <sbrivio@redhat.com>2023-08-04 01:18:02 +0200
commit6920adda0dce8cc9fb585da658dd983833c2a928 (patch)
tree3edc7bf9b3ca068da5276249a93e6d0a9a3a70ea
parentb15ce5b6ceb0ba0cbb91d460c5a745a14c2050df (diff)
downloadpasst-6920adda0dce8cc9fb585da658dd983833c2a928.tar
passt-6920adda0dce8cc9fb585da658dd983833c2a928.tar.gz
passt-6920adda0dce8cc9fb585da658dd983833c2a928.tar.bz2
passt-6920adda0dce8cc9fb585da658dd983833c2a928.tar.lz
passt-6920adda0dce8cc9fb585da658dd983833c2a928.tar.xz
passt-6920adda0dce8cc9fb585da658dd983833c2a928.tar.zst
passt-6920adda0dce8cc9fb585da658dd983833c2a928.zip
util: Make ns_enter() a void function and report setns() errors
ns_enter() returns an integer... but it's always zero. If we actually fail the function doesn't return. Therefore it makes more sense for this to be a function returning void, and we can remove the cases where we pointlessly checked its return value. In addition ns_enter() is usually called from an ephemeral thread created by NS_CALL(). That means that the exit(EXIT_FAILURE) there usually won't be reported (since NS_CALL() doesn't wait() for the thread). So, use die() instead to print out some information in the unlikely event that our setns() here does fail. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--conf.c3
-rw-r--r--tap.c4
-rw-r--r--udp.c6
-rw-r--r--util.c8
-rw-r--r--util.h2
5 files changed, 10 insertions, 13 deletions
diff --git a/conf.c b/conf.c
index 78eaf2d..a0622d2 100644
--- a/conf.c
+++ b/conf.c
@@ -101,9 +101,10 @@ static int get_bound_ports_ns(void *arg)
struct get_bound_ports_ns_arg *a = (struct get_bound_ports_ns_arg *)arg;
struct ctx *c = a->c;
- if (!c->pasta_netns_fd || ns_enter(c))
+ if (!c->pasta_netns_fd)
return 0;
+ ns_enter(c);
get_bound_ports(c, 1, a->proto);
return 0;
diff --git a/tap.c b/tap.c
index a6a73d3..0f90cab 100644
--- a/tap.c
+++ b/tap.c
@@ -1182,9 +1182,9 @@ static int tap_ns_tun(void *arg)
struct ctx *c = (struct ctx *)arg;
memcpy(ifr.ifr_name, c->pasta_ifn, IFNAMSIZ);
+ ns_enter(c);
- if (ns_enter(c) ||
- (tun_ns_fd = open("/dev/net/tun", flags)) < 0 ||
+ if ((tun_ns_fd = open("/dev/net/tun", flags)) < 0 ||
ioctl(tun_ns_fd, TUNSETIFF, &ifr) ||
!(c->pasta_ifi = if_nametoindex(c->pasta_ifn))) {
if (tun_ns_fd != -1)
diff --git a/udp.c b/udp.c
index f749f5f..5a852fb 100644
--- a/udp.c
+++ b/udp.c
@@ -473,8 +473,7 @@ static int udp_splice_new_ns(void *arg)
a = (struct udp_splice_new_ns_arg *)arg;
- if (ns_enter(a->c))
- return 0;
+ ns_enter(a->c);
a->s = udp_splice_new(a->c, a->v6, a->src, true);
@@ -1064,8 +1063,7 @@ int udp_sock_init_ns(void *arg)
struct ctx *c = (struct ctx *)arg;
unsigned dst;
- if (ns_enter(c))
- return 0;
+ ns_enter(c);
for (dst = 0; dst < NUM_PORTS; dst++) {
if (!bitmap_isset(c->udp.fwd_out.f.map, dst))
diff --git a/util.c b/util.c
index b9f4e7d..019c56c 100644
--- a/util.c
+++ b/util.c
@@ -378,16 +378,14 @@ void procfs_scan_listen(struct ctx *c, uint8_t proto, int ip_version, int ns,
* ns_enter() - Enter configured user (unless already joined) and network ns
* @c: Execution context
*
- * Return: 0, won't return on failure
+ * Won't return on failure
*
* #syscalls:pasta setns
*/
-int ns_enter(const struct ctx *c)
+void ns_enter(const struct ctx *c)
{
if (setns(c->pasta_netns_fd, CLONE_NEWNET))
- exit(EXIT_FAILURE);
-
- return 0;
+ die("setns() failed entering netns: %s", strerror(errno));
}
/**
diff --git a/util.h b/util.h
index 26892aa..23dcad5 100644
--- a/util.h
+++ b/util.h
@@ -216,7 +216,7 @@ int bitmap_isset(const uint8_t *map, int bit);
char *line_read(char *buf, size_t len, int fd);
void procfs_scan_listen(struct ctx *c, uint8_t proto, int ip_version, int ns,
uint8_t *map, uint8_t *exclude);
-int ns_enter(const struct ctx *c);
+void ns_enter(const struct ctx *c);
bool ns_is_init(void);
void write_pidfile(int fd, pid_t pid);
int __daemon(int pidfile_fd, int devnull_fd);