#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;
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) {
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;
}
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;
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);
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;
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) {
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;
}
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);