From: Michael Tremer Date: Fri, 9 Jun 2023 04:58:39 +0000 (+0000) Subject: networkd: Parse command line arguments X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3138451ba526d9ada4e74cffccd10c5807c9bc8e;p=network.git networkd: Parse command line arguments Signed-off-by: Michael Tremer --- diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index 749a70b8..31fda8ec 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -19,6 +19,8 @@ #############################################################################*/ #include +#include +#include #include #include @@ -36,6 +38,7 @@ #include "logging.h" #include "ports.h" #include "stats-collector.h" +#include "string.h" #include "zone.h" #include "zones.h" @@ -45,6 +48,7 @@ struct nw_daemon { int nrefs; + char config_path[PATH_MAX]; nw_config* config; // Event Loop @@ -91,6 +95,40 @@ static int __nw_daemon_reload(sd_event_source* source, const struct signalfd_sig return 0; } +static int nw_daemon_parse_argv(nw_daemon* daemon, int argc, char* argv[]) { + enum { + ARG_CONFIG, + }; + int r; + + static const struct option options[] = { + { "config", required_argument, NULL, ARG_CONFIG }, + { NULL }, + }; + int c; + + for (;;) { + c = getopt_long(argc, argv, "", options, NULL); + if (c < 0) + break; + + switch (c) { + case ARG_CONFIG: + r = nw_string_set(daemon->config_path, optarg); + if (r < 0) + return r; + + break; + + // Abort on any unrecognised option + default: + return -EINVAL; + } + } + + return 0; +} + static int nw_daemon_setup_loop(nw_daemon* daemon) { int r; @@ -398,7 +436,7 @@ static int nw_daemon_setup(nw_daemon* daemon) { return 0; } -int nw_daemon_create(nw_daemon** daemon) { +int nw_daemon_create(nw_daemon** daemon, int argc, char* argv[]) { int r; nw_daemon* d = calloc(1, sizeof(*d)); @@ -408,6 +446,11 @@ int nw_daemon_create(nw_daemon** daemon) { // Initialize reference counter d->nrefs = 1; + // Parse command line arguments + r = nw_daemon_parse_argv(d, argc, argv); + if (r) + goto ERROR; + // Setup the daemon r = nw_daemon_setup(d); if (r) diff --git a/src/networkd/daemon.h b/src/networkd/daemon.h index 74e19e69..8653af38 100644 --- a/src/networkd/daemon.h +++ b/src/networkd/daemon.h @@ -33,7 +33,7 @@ typedef struct nw_daemon nw_daemon; #include "zone.h" #include "zones.h" -int nw_daemon_create(nw_daemon** daemon); +int nw_daemon_create(nw_daemon** daemon, int argc, char* argv[]); nw_daemon* nw_daemon_ref(nw_daemon* daemon); nw_daemon* nw_daemon_unref(nw_daemon* daemon); diff --git a/src/networkd/main.c b/src/networkd/main.c index c8b9a791..f5f09f5a 100644 --- a/src/networkd/main.c +++ b/src/networkd/main.c @@ -222,7 +222,7 @@ int main(int argc, char** argv) { return r; // Create the daemon - r = nw_daemon_create(&daemon); + r = nw_daemon_create(&daemon, argc, argv); if (r) return r;