From 53f7f7fcf274e837ba49edc2213b191ef997d560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 23 Apr 2020 10:19:11 +0200 Subject: [PATCH] util-lib: add stub parser for --help, --version --- src/shared/meson.build | 2 + src/shared/service-util.c | 77 +++++++++++++++++++++++++++++++++++++++ src/shared/service-util.h | 7 ++++ 3 files changed, 86 insertions(+) create mode 100644 src/shared/service-util.c create mode 100644 src/shared/service-util.h diff --git a/src/shared/meson.build b/src/shared/meson.build index e608ea8a1d..32626490d7 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -184,6 +184,8 @@ shared_sources = files(''' securebits-util.h serialize.c serialize.h + service-util.c + service-util.h sleep-config.c sleep-config.h socket-netlink.c diff --git a/src/shared/service-util.c b/src/shared/service-util.c new file mode 100644 index 0000000000..7fea74d2d9 --- /dev/null +++ b/src/shared/service-util.c @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ + +#include +#include + +#include "alloc-util.h" +#include "pretty-print.h" +#include "service-util.h" +#include "terminal-util.h" +#include "util.h" + +static int help(const char *program_path, const char *service, const char *description) { + _cleanup_free_ char *link = NULL; + int r; + + r = terminal_urlify_man(service, "8", &link); + if (r < 0) + return log_oom(); + + printf("%s [OPTIONS...]\n\n" + "%s%s%s\n\n" + "This program takes no positional arguments.\n\n" + "%sOptions%s:\n" + " -h --help Show this help\n" + " --version Show package version\n" + "\nSee the %s for details.\n" + , program_path + , ansi_highlight(), description, ansi_normal() + , ansi_underline(), ansi_normal() + , link + ); + + return 0; /* No further action */ +} + +int service_parse_argv( + const char *service, + const char *description, + int argc, char *argv[]) { + + enum { + ARG_VERSION = 0x100, + }; + + static const struct option options[] = { + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, ARG_VERSION }, + {} + }; + + int c; + + assert(argc >= 0); + assert(argv); + + while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) + switch(c) { + + case 'h': + return help(argv[0], service, description); + + case ARG_VERSION: + return version(); + + case '?': + return -EINVAL; + + default: + assert_not_reached("Unknown option code."); + } + + if (optind < argc) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "This program takes no arguments."); + + return 1; /* Further action */ +} diff --git a/src/shared/service-util.h b/src/shared/service-util.h new file mode 100644 index 0000000000..f4868184f4 --- /dev/null +++ b/src/shared/service-util.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + +int service_parse_argv( + const char *service, + const char *description, + int argc, char *argv[]);