We parse --fd twice: once in isolate_initial() just to avoid clobbering
the passed in fd. Then we parse it "for real" in conf(), to set c->fd_tap
and other configuration variables.
Change this, so that we return the value parsed early from
isolate_initial() and set c->fd_tap from that. This doesn't accomplish
much immediately, but will make some further cleanups possible.
Signed-off-by: David Gibson
---
conf.c | 2 +-
isolation.c | 6 +++++-
isolation.h | 2 +-
passt.c | 2 +-
4 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/conf.c b/conf.c
index 5b6cc2be..b3211e54 100644
--- a/conf.c
+++ b/conf.c
@@ -1593,7 +1593,7 @@ void conf(struct ctx *c, int argc, char **argv)
c->fd_control_listen = c->fd_control = -1;
break;
case 'F':
- c->fd_tap = conf_tap_fd(optarg);
+ /* --fd was parsed early and c->fd_tap set in main() */
c->one_off = true;
*c->sock_path = 0;
break;
diff --git a/isolation.c b/isolation.c
index ea85fdba..c9dfefa8 100644
--- a/isolation.c
+++ b/isolation.c
@@ -257,8 +257,10 @@ void isolate_initial(void)
*
* Should:
* - close all open files except for standard streams and the one from --fd
+ *
+ * Return: fd number from --fd, or -1 if not specified
*/
-void isolate_fds(int argc, char **argv)
+int isolate_fds(int argc, char **argv)
{
const struct option optfd[] = { { "fd", required_argument, NULL, 'F' },
{ 0 }, };
@@ -296,6 +298,8 @@ void isolate_fds(int argc, char **argv)
die_perror("Failed to close files leaked by parent");
}
}
+
+ return fd;
}
/**
diff --git a/isolation.h b/isolation.h
index e1b1bc5d..ec470388 100644
--- a/isolation.h
+++ b/isolation.h
@@ -11,7 +11,7 @@
#include
void isolate_initial(void);
-void isolate_fds(int argc, char **argv);
+int isolate_fds(int argc, char **argv);
void isolate_user(const struct ctx *c, uid_t uid, gid_t gid, bool use_userns,
const char *userns);
int isolate_prefork(const struct ctx *c);
diff --git a/passt.c b/passt.c
index ce20cedb..e930df43 100644
--- a/passt.c
+++ b/passt.c
@@ -342,7 +342,7 @@ int main(int argc, char **argv)
arch_avx2_exec(argv);
isolate_initial();
- isolate_fds(argc, argv);
+ c->fd_tap = isolate_fds(argc, argv);
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
--
2.55.0