From 8824f096e30ae6e28058e123cf8223703e3127e9 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 13 Dec 2023 12:13:16 +0100 Subject: [PATCH] host/limine: Add --print-datadir switch --- GNUmakefile.in | 2 +- host/limine.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/GNUmakefile.in b/GNUmakefile.in index b8a87218..d05aac61 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -124,7 +124,7 @@ override LIMINE_NO_BIOS := -DLIMINE_NO_BIOS $(call MKESCAPE,$(BINDIR))/limine: $(call MKESCAPE,$(BINDIR))/Makefile $(call MKESCAPE,$(SRCDIR))/host/limine.c endif $(SED) 's/%VERSION%/@PACKAGE_VERSION@/g;s/%COPYRIGHT%/@LIMINE_COPYRIGHT@/g' <'$(call SHESCAPE,$(SRCDIR))/host/limine.c' >'$(call SHESCAPE,$(BINDIR))/limine.c' - CPPFLAGS="$(CPPFLAGS) $(LIMINE_NO_BIOS)" $(MAKE) -C '$(call SHESCAPE,$(BINDIR))' limine + CPPFLAGS='$(CPPFLAGS) $(LIMINE_NO_BIOS) -DLIMINE_DATADIR=\"$(call SHESCAPE,$(datarootdir))/limine\"' $(MAKE) -C '$(call SHESCAPE,$(BINDIR))' limine $(call MKESCAPE,$(BINDIR))/Makefile: $(call MKESCAPE,$(SRCDIR))/host/Makefile $(call MKESCAPE,$(SRCDIR))/host/.gitignore mkdir -p '$(call SHESCAPE,$(BINDIR))' diff --git a/host/limine.c b/host/limine.c index 939d2cfc..9ecfff75 100644 --- a/host/limine.c +++ b/host/limine.c @@ -18,7 +18,7 @@ #include "limine-bios-hdd.h" #endif -static const char *program_name = NULL; +static char *program_name = NULL; static void perror_wrap(const char *fmt, ...) { int old_errno = errno; @@ -1157,7 +1157,46 @@ static int version(void) { static void general_usage(void) { printf("usage: %s \n", program_name); printf("\n"); - printf("Valid commands: help, version, bios-install, enroll-config\n"); + printf(" --print-datadir Print the directory containing the bootloader files\n"); + printf("\n"); + printf(" --version Print Limine version (like `version` command)\n"); + printf("\n"); + printf(" --help | -h Display this help message\n"); + printf("\n"); + printf("Commands: help, version, bios-install, enroll-config\n"); + printf("Use `--help` after specifying the command for command-specific help.\n"); +} + +static int print_datadir(void) { +#ifdef LIMINE_DATADIR + puts(LIMINE_DATADIR); + return EXIT_SUCCESS; +#else + if (program_name == NULL || strlen(program_name) == 0) { + goto fail; + } + + for (size_t i = strlen(program_name) - 1; ; i--) { +#if IS_WINDOWS + if (program_name[i] == '\\') +#else + if (program_name[i] == '/') +#endif + { + program_name[i + 1] = 0; + puts(program_name); + return EXIT_SUCCESS; + } + + if (i == 0) { + goto fail; + } + } + +fail: + fprintf(stderr, "%s: error: Could not determine datadir path.\n", program_name); + return EXIT_FAILURE; +#endif } int main(int argc, char *argv[]) { @@ -1182,6 +1221,8 @@ int main(int argc, char *argv[]) { #endif } else if (strcmp(argv[1], "enroll-config") == 0) { return enroll_config(argc - 1, &argv[1]); + } else if (strcmp(argv[1], "--print-datadir") == 0) { + return print_datadir(); } else if (strcmp(argv[1], "version") == 0 || strcmp(argv[1], "--version") == 0) { return version();