diff options
author | Chris Luke <chrisy@flirble.org> | 2018-06-12 22:45:06 -0400 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-06-13 08:01:33 +0000 |
commit | 6edd36070cbe5f1fb5e5804edb19f8c395ba07f2 (patch) | |
tree | 951fd43b8706ae67ddc0f8741bd1242ed14130bc /src | |
parent | 8a4a8c455aaa95a7ff15d8d46f52b24740d3ce88 (diff) |
cli: 'restart' should close open files (VPP-1068)
- On 'restart' close all registered files (except stdio) so that the
new process has a clean start; in particular, CLI sockets, API
sockets, tun/af_packet etc descriptors all need to close so they're
not left open but unused by the new VPP process. To do this we iterate
all the files registered for the polling mechanism and close() them.[1]
- While we're here, retain the original environment on 'restart';
several things make use of it.
[1] An alternative mechanism would be to mark all files with CLOEXEC
on opening; I think that is a little fragile for this fairly esoteric
use case.
Change-Id: I81b4e261c4d3c4e2948981231be899824dd4e69f
Signed-off-by: Chris Luke <chrisy@flirble.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/vlib/cli.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/vlib/cli.c b/src/vlib/cli.c index a85fa93906c..f684289ba75 100644 --- a/src/vlib/cli.c +++ b/src/vlib/cli.c @@ -38,6 +38,7 @@ */ #include <vlib/vlib.h> +#include <vlib/unix/unix.h> #include <vppinfra/cpu.h> #include <unistd.h> #include <ctype.h> @@ -905,9 +906,23 @@ static clib_error_t * restart_cmd_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { - char *newenviron[] = { NULL }; + clib_file_main_t *fm = &file_main; + clib_file_t *f; - execve (vm->name, (char **) vm->argv, newenviron); + /* environ(7) does not indicate a header for this */ + extern char **environ; + + /* Close all known open files */ + /* *INDENT-OFF* */ + pool_foreach(f, fm->file_pool, + ({ + if (f->file_descriptor > 2) + close(f->file_descriptor); + })); + /* *INDENT-ON* */ + + /* Exec ourself */ + execve (vm->name, (char **) vm->argv, environ); return 0; } |