summaryrefslogtreecommitdiff
path: root/src/binfmt
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-04-23 16:36:45 +0200
committerLennart Poettering <lennart@poettering.net>2020-04-23 17:14:45 +0200
commit846acb6798a63f35162f58e1146d1a1f40849e86 (patch)
tree4a12d9a7dad0e240dff1300f1a0dc8e03d7beaff /src/binfmt
parentf3670df13e144c2f81bf6f9a0bea581e6d555bdd (diff)
downloadsystemd-846acb6798a63f35162f58e1146d1a1f40849e86.tar.gz
binfmt: also unregister binfmt entries from unit
We unregister binfmt_misc twice during shutdown with this change: 1. A previous commit added support for doing that in the final shutdown phase, i.e. when we do the aggressive umount loop. This is the robust thing to do, in case the earlier ("clean") shutdown phase didn't work for some reason. 2. This commit adds support for doing that when systemd-binfmt.service is stopped. This is a good idea so that people can order mounts before the service if they want to register binaries from such mounts, as in that case we'll undo the registration on shutdown again, before unmounting those mounts. And all that, just because of that weird "F" flag the kernel introduced that can pin files... Fixes: #14981
Diffstat (limited to 'src/binfmt')
-rw-r--r--src/binfmt/binfmt.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c
index 5e812e89a5..06aee22dc0 100644
--- a/src/binfmt/binfmt.c
+++ b/src/binfmt/binfmt.c
@@ -10,6 +10,7 @@
#include <sys/types.h>
#include "alloc-util.h"
+#include "binfmt-util.h"
#include "conf-files.h"
#include "def.h"
#include "fd-util.h"
@@ -24,6 +25,7 @@
static bool arg_cat_config = false;
static PagerFlags arg_pager_flags = 0;
+static bool arg_unregister = false;
static int delete_rule(const char *rule) {
_cleanup_free_ char *x = NULL, *fn = NULL;
@@ -115,6 +117,7 @@ static int help(void) {
" --version Show package version\n"
" --cat-config Show configuration files\n"
" --no-pager Do not pipe output into a pager\n"
+ " --unregister Unregister all existing entries\n"
"\nSee the %s for details.\n"
, program_invocation_short_name
, link
@@ -128,6 +131,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_VERSION = 0x100,
ARG_CAT_CONFIG,
ARG_NO_PAGER,
+ ARG_UNREGISTER,
};
static const struct option options[] = {
@@ -135,6 +139,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "version", no_argument, NULL, ARG_VERSION },
{ "cat-config", no_argument, NULL, ARG_CAT_CONFIG },
{ "no-pager", no_argument, NULL, ARG_NO_PAGER },
+ { "unregister", no_argument, NULL, ARG_UNREGISTER },
{}
};
@@ -161,6 +166,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_pager_flags |= PAGER_DISABLE;
break;
+ case ARG_UNREGISTER:
+ arg_unregister = true;
+ break;
+
case '?':
return -EINVAL;
@@ -168,9 +177,9 @@ static int parse_argv(int argc, char *argv[]) {
assert_not_reached("Unhandled option");
}
- if (arg_cat_config && argc > optind)
+ if ((arg_unregister || arg_cat_config) && argc > optind)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Positional arguments are not allowed with --cat-config");
+ "Positional arguments are not allowed with --cat-config or --unregister");
return 1;
}
@@ -188,6 +197,9 @@ static int run(int argc, char *argv[]) {
r = 0;
+ if (arg_unregister)
+ return disable_binfmt();
+
if (argc > optind) {
int i;