diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/unaam.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/unaam.c b/src/unaam.c new file mode 100644 index 0000000..7a4a853 --- /dev/null +++ b/src/unaam.c @@ -0,0 +1,84 @@ +#include <ctype.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/utsname.h> + +#include "io/read_file.h" +#include "util/option.h" + +static const char *usage_string = + "Gebruik: %s [OPTIES]...\n" + "\n" + "Toon systeem informatie\n" + "\n" + " -a Toon alle informatie\n" + " -s Toon kernnaam\n" + " -n Toon netwerk knooppunt gastheernaam\n" + " -r Toon kernuitgave\n" + " -v Toon kernversie\n" + " -m Toon machine harde-goederen-naam\n" + " -h Toon deze hulptekst\n" + " -V Toon versienummer\n"; + +struct options { + bool print_all; + + bool print_sysname; + bool print_nodename; + bool print_release; + bool print_version; + bool print_machine; +}; + +static void parse_options(int argc, char **argv, struct options *opts) { + const struct option_spec spec[] = { + {'a', OPTION_SETBOOL(&opts->print_all)}, + + {'s', OPTION_SETBOOL(&opts->print_sysname)}, + {'n', OPTION_SETBOOL(&opts->print_nodename)}, + {'r', OPTION_SETBOOL(&opts->print_release)}, + {'v', OPTION_SETBOOL(&opts->print_version)}, + {'m', OPTION_SETBOOL(&opts->print_machine)}, + + {'h', OPTION_HELPUSAGE(usage_string)}, + {'V', OPTION_VERSION()}, + OPTION_SPEC_END + }; + + option_parse(argc, argv, spec); +} + +int entry_unaam(int argc, char **argv) { + struct options opts = {0}; + parse_options(argc, argv, &opts); + + if (opts.print_all == false && + opts.print_sysname == false && + opts.print_nodename == false && + opts.print_release == false && + opts.print_version == false && + opts.print_machine == false) { + opts.print_sysname = true; + } + + struct utsname name; + uname(&name); // can't fail + + bool first = true; + +#define PRINT(typ) \ + if (opts.print_all || opts.print_ ## typ) { \ + printf("%s%s", first ? "" : " ", name.typ); \ + first = false; \ + } + + PRINT(sysname); + PRINT(nodename); + PRINT(release); + PRINT(version); + PRINT(machine); + printf("\n"); + + return 0; +} |