From 3f2585770384586977483ec4c4b38fe4c3e5fc45 Mon Sep 17 00:00:00 2001 From: Alice Frosi Date: Mon, 17 Jul 2023 13:05:18 +0200 Subject: cooker: add flags with getopts --- cooker/main.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 6 deletions(-) (limited to 'cooker/main.c') diff --git a/cooker/main.c b/cooker/main.c index a1e5f7f..85c4746 100644 --- a/cooker/main.c +++ b/cooker/main.c @@ -6,14 +6,90 @@ * * Copyright 2023 Red Hat GmbH * Author: Stefano Brivio + * Alice Frosi */ +#define _GNU_SOURCE +#include + #include "parson.h" #include "cooker.h" #include "gluten.h" #include "parse.h" #include "filter.h" +/* Cooker options */ +static struct option options[] = { + { "input", required_argument, NULL, 'i' }, + { "gluten", required_argument, NULL, 'g' }, + { "filter", required_argument, NULL, 'f' }, + { "scmp-profile", required_argument, NULL, 'p' }, +}; + +struct arguments { + char *input_file; + char *gluten_file; + char *filter_file; + char *scmp_profile_file; +}; + +static void usage() +{ + printf("seitan-cooker: generate the BPF filters or seccomp profile and the action byte code for seitan\n" + "Example: setain-cooker -i -g -f \n" + "Usage:\n" + "\t-i, --input:\tJSON input file\n" + "\t-g, --gluten:\tBytecode file for seitan action\n" + "\t-f, --filter:\tBPF filter file (cannot be used together with scmp-profile)\n" + "\t-p, --scmp-profile:\tSeccomp profile file (cannot be used together with filter)\n"); + exit(EXIT_FAILURE); +} + +static void parse(int argc, char **argv, struct arguments *arguments) +{ + int option_index = 0; + int oc; + if (arguments == NULL) + usage(); + while ((oc = getopt_long(argc, argv, ":i:g:f:p:", options, + &option_index)) != -1) { + switch (oc) { + case 'i': + arguments->input_file = optarg; + break; + case 'g': + arguments->gluten_file = optarg; + break; + case 'f': + arguments->filter_file = optarg; + break; + case 'p': + arguments->scmp_profile_file = optarg; + break; + default: + usage(); + } + } + if (arguments->input_file == NULL) { + err("missing input file"); + usage(); + } + if (arguments->filter_file != NULL && + arguments->scmp_profile_file != NULL) { + err("the filter and scmp-profile options cannot be used together"); + usage(); + } + if (arguments->filter_file == NULL && + arguments->scmp_profile_file == NULL) { + err("select one of the options between filter and scmp-profile"); + usage(); + } + if (arguments->gluten_file == NULL) { + err("missing gluten file"); + usage(); + } +} + /** * main() - Entry point for cooker * @argc: Argument count @@ -23,18 +99,17 @@ */ int main(int argc, char **argv) { + struct arguments arguments = { 0 }; struct gluten_ctx g = { 0 }; - /* TODO: Options and usage */ - if (argc != 4) - die("%s INPUT GLUTEN BPF", argv[0]); + parse(argc, argv, &arguments); gluten_init(&g); - parse_file(&g, argv[1]); + parse_file(&g, arguments.input_file); - gluten_write(&g, argv[2]); - filter_write(argv[3]); + gluten_write(&g, arguments.gluten_file); + filter_write(arguments.filter_file); return 0; } -- cgit v1.2.3