fputs(_(" -s, --syscall syscall to block\n"), out);
fputs(_(" -i, --ioctl ioctl to block\n"), out);
fputs(_(" -l, --list list known syscalls\n"), out);
- fputs(_(" -d, --dump dump seccomp bytecode\n"), out);
+ fputs(_(" -d, --dump[=<file>] dump seccomp bytecode\n"), out);
fputs(USAGE_SEPARATOR, out);
fprintf(out, USAGE_HELP_OPTIONS(25));
{
int c;
size_t i;
- bool dump = false;
+ FILE *dump = NULL;
static const struct option longopts[] = {
{ "syscall", required_argument, NULL, 's' },
{ "ioctl", required_argument, NULL, 'i' },
{ "list", no_argument, NULL, 'l' },
{ "list-ioctl", no_argument, NULL, 'm' },
- { "dump", no_argument, NULL, 'd' },
+ { "dump", optional_argument, NULL, 'd' },
{ "version", no_argument, NULL, 'V' },
{ "help", no_argument, NULL, 'h' },
{ 0 }
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- while ((c = getopt_long (argc, argv, "+Vhs:i:lmd", longopts, NULL)) != -1) {
+ while ((c = getopt_long (argc, argv, "+Vhs:i:lmd::", longopts, NULL)) != -1) {
switch (c) {
case 's':
blocked = parse_block(optarg, ENOSYS, syscalls, ARRAY_SIZE(syscalls));
printf("%5ld %s\n", ioctls[i].number, ioctls[i].name);
return EXIT_SUCCESS;
case 'd':
- dump = true;
+ if (optarg) {
+ dump = fopen(optarg, "w");
+ if (!dump)
+ err(EXIT_FAILURE, _("Could not open %s"), optarg);
+ } else {
+ dump = stdout;
+ }
break;
case 'V':
print_version(EXIT_SUCCESS);
INSTR(BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW));
if (dump) {
- if (write_all(STDOUT_FILENO, filter, (f - filter) * sizeof(filter[0])))
+ if (fwrite_all(filter, (f - filter) * sizeof(filter[0]), 1, dump))
err(EXIT_FAILURE, _("Could not dump seccomp filter"));
return EXIT_SUCCESS;
}