X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fbinfmt%2Fbinfmt.c;h=089b7754a431b6cc4e9cff611b7ad0f06fa80b9e;hb=5ad65d628facbce5219ac2749bc835ab92ca6c39;hp=f8c97b5ca54869da0a170697b4e0631e0df53e50;hpb=fabe5c0e5fce730aa66e10a9c4f9fdd443d7aeda;p=elogind.git diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c index f8c97b5ca..089b7754a 100644 --- a/src/binfmt/binfmt.c +++ b/src/binfmt/binfmt.c @@ -33,16 +33,10 @@ #include "strv.h" #include "util.h" #include "conf-files.h" +#include "fileio.h" +#include "build.h" -static const char conf_file_dirs[] = - "/etc/binfmt.d\0" - "/run/binfmt.d\0" - "/usr/local/lib/binfmt.d\0" - "/usr/lib/binfmt.d\0" -#ifdef HAVE_SPLIT_USR - "/lib/binfmt.d\0" -#endif - ; +static const char conf_file_dirs[] = CONF_DIRS_NULSTR("binfmt"); static int delete_rule(const char *rule) { _cleanup_free_ char *x = NULL, *fn = NULL; @@ -61,7 +55,7 @@ static int delete_rule(const char *rule) { if (!fn) return log_oom(); - return write_one_line_file(fn, "-1"); + return write_string_file(fn, "-1"); } static int apply_rule(const char *rule) { @@ -69,11 +63,9 @@ static int apply_rule(const char *rule) { delete_rule(rule); - r = write_one_line_file("/proc/sys/fs/binfmt_misc/register", rule); - if (r < 0) { - log_error("Failed to add binary format: %s", strerror(-r)); - return r; - } + r = write_string_file("/proc/sys/fs/binfmt_misc/register", rule); + if (r < 0) + return log_error_errno(r, "Failed to add binary format: %m"); return 0; } @@ -84,16 +76,15 @@ static int apply_file(const char *path, bool ignore_enoent) { assert(path); - r = search_and_fopen_nulstr(path, "re", conf_file_dirs, &f); + r = search_and_fopen_nulstr(path, "re", NULL, conf_file_dirs, &f); if (r < 0) { if (ignore_enoent && r == -ENOENT) return 0; - log_error("Failed to open file '%s', ignoring: %s", path, strerror(-r)); - return r; + return log_error_errno(r, "Failed to open file '%s', ignoring: %m", path); } - log_debug("apply: %s\n", path); + log_debug("apply: %s", path); for (;;) { char l[LINE_MAX], *p; int k; @@ -102,14 +93,14 @@ static int apply_file(const char *path, bool ignore_enoent) { if (feof(f)) break; - log_error("Failed to read file '%s', ignoring: %m", path); + log_error_errno(errno, "Failed to read file '%s', ignoring: %m", path); return -errno; } p = strstrip(l); if (!*p) continue; - if (strchr(COMMENTS, *p)) + if (strchr(COMMENTS "\n", *p)) continue; k = apply_rule(p); @@ -120,21 +111,24 @@ static int apply_file(const char *path, bool ignore_enoent) { return r; } -static int help(void) { - +static void help(void) { printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n" "Registers binary formats.\n\n" - " -h --help Show this help\n", - program_invocation_short_name); - - return 0; + " -h --help Show this help\n" + " --version Show package version\n" + , program_invocation_short_name); } static int parse_argv(int argc, char *argv[]) { + enum { + ARG_VERSION = 0x100, + }; + static const struct option options[] = { { "help", no_argument, NULL, 'h' }, - { NULL, 0, NULL, 0 } + { "version", no_argument, NULL, ARG_VERSION }, + {} }; int c; @@ -142,7 +136,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) switch (c) { @@ -150,14 +144,17 @@ static int parse_argv(int argc, char *argv[]) { help(); return 0; + case ARG_VERSION: + puts(PACKAGE_STRING); + puts(SYSTEMD_FEATURES); + return 0; + case '?': return -EINVAL; default: - log_error("Unknown option code %c", c); - return -EINVAL; + assert_not_reached("Unhandled option"); } - } return 1; } @@ -191,12 +188,12 @@ int main(int argc, char *argv[]) { r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs); if (r < 0) { - log_error("Failed to enumerate binfmt.d files: %s", strerror(-r)); + log_error_errno(r, "Failed to enumerate binfmt.d files: %m"); goto finish; } /* Flush out all rules */ - write_one_line_file("/proc/sys/fs/binfmt_misc/status", "-1"); + write_string_file("/proc/sys/fs/binfmt_misc/status", "-1"); STRV_FOREACH(f, files) { k = apply_file(*f, true);