:: commit 8824f096e30ae6e28058e123cf8223703e3127e9

mintsuki <mintsuki@protonmail.com> — 2023-12-13 11:13

parents: d7692741a4

host/limine: Add --print-datadir switch

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 <command> <args...>\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();
tab: 248 wrap: offon