:: commit eeda20cb9223a8cf933935c3736a642c2b8189c4

mintsuki <mintsuki@protonmail.com> — 2022-01-28 07:35

parents: d1b94b206f

limine-install: Make it pure C11

diff --git a/GNUmakefile.in b/GNUmakefile.in
index 9785af08..218201e2 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -219,7 +219,7 @@ limine-install:
 
 .PHONY: clean
 clean: limine-bios-clean limine-uefi32-clean limine-uefi64-clean
-	rm -rf '$(call SHESCAPE,$(BINDIR))' '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp' '$(call SHESCAPE,$(BUILDDIR))/incbin'
+	rm -rf '$(call SHESCAPE,$(BINDIR))' '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp' '$(call SHESCAPE,$(BUILDDIR))/incbin/incbin'
 
 .PHONY: install-data
 install-data:
diff --git a/limine-install/inc.S b/limine-install/inc.S
deleted file mode 100644
index c28f3ca9..00000000
--- a/limine-install/inc.S
+++ /dev/null
@@ -1,33 +0,0 @@
-
-#if defined (__APPLE__)
-
-.data
-.global __binary_limine_hdd_bin_start
-__binary_limine_hdd_bin_start:
-    .incbin "limine-hdd.bin"
-.global __binary_limine_hdd_bin_end
-__binary_limine_hdd_bin_end:
-
-#elif defined (__MINGW32__)
-
-.section .data
-.global __binary_limine_hdd_bin_start
-__binary_limine_hdd_bin_start:
-    .incbin "limine-hdd.bin"
-.global __binary_limine_hdd_bin_end
-__binary_limine_hdd_bin_end:
-
-#elif defined (__linux__) || defined (__unix__)
-
-#if defined (__ELF__)
-.section .note.GNU-stack, "", %progbits
-#endif
-
-.section .data
-.global _binary_limine_hdd_bin_start
-_binary_limine_hdd_bin_start:
-    .incbin "limine-hdd.bin"
-.global _binary_limine_hdd_bin_end
-_binary_limine_hdd_bin_end:
-
-#endif
diff --git a/limine-install/limine-install.c b/limine-install/limine-install.c
index 4d67a59c..14cc700e 100644
--- a/limine-install/limine-install.c
+++ b/limine-install/limine-install.c
@@ -1,13 +1,3 @@
-#undef IS_WINDOWS
-#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
-#define IS_WINDOWS 1
-#endif
-
-#ifndef IS_WINDOWS
-#define _POSIX_C_SOURCE 200112L
-#define _FILE_OFFSET_BITS 64
-#endif
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
@@ -15,13 +5,29 @@
 #include <stdbool.h>
 #include <string.h>
 #include <inttypes.h>
+#include <limits.h>
+
+static int set_pos(FILE *stream, uint64_t pos) {
+    if (sizeof(long) >= 8) {
+        return fseek(stream, (long)pos, SEEK_SET);
+    }
+
+    long jump_size = (LONG_MAX / 2) + 1;
+    long last_jump = pos % jump_size;
+    uint64_t jumps = pos / jump_size;
 
-static inline int seek_(FILE *stream, int64_t offset, int whence) {
-#ifdef IS_WINDOWS
-    return _fseeki64(stream, offset, whence);
-#else
-    return fseeko(stream, offset, whence);
-#endif
+    rewind(stream);
+
+    for (uint64_t i = 0; i < jumps; i++) {
+        if (fseek(stream, jump_size, SEEK_CUR) != 0) {
+            return -1;
+        }
+    }
+    if (fseek(stream, last_jump, SEEK_CUR) != 0) {
+        return -1;
+    }
+
+    return 0;
 }
 
 #define DIV_ROUNDUP(a, b) (((a) + ((b) - 1)) / (b))
@@ -142,10 +148,8 @@ static bool device_init(void) {
         }
         cache = tmp;
 
-        if (seek_(device, 0, SEEK_SET) == -1) {
-            perror("ERROR");
-            return false;
-        }
+        rewind(device);
+
         size_t ret = fread(cache, guesses[i], 1, device);
         if (ret != 1) {
             continue;
@@ -168,7 +172,7 @@ static bool device_flush_cache(void) {
     if (cache_state == CACHE_CLEAN)
         return true;
 
-    if (seek_(device, cached_block * block_size, SEEK_SET) == -1) {
+    if (set_pos(device, cached_block * block_size) != 0) {
         perror("ERROR");
         return false;
     }
@@ -192,7 +196,7 @@ static bool device_cache_block(uint64_t block) {
             return false;
     }
 
-    if (seek_(device, block * block_size, SEEK_SET) == -1) {
+    if (set_pos(device, block * block_size) != 0) {
         perror("ERROR");
         return false;
     }
@@ -280,13 +284,6 @@ int main(int argc, char *argv[]) {
     size_t   bootloader_file_size = (size_t)_binary_limine_hdd_bin_size;
     uint8_t  orig_mbr[70], timestamp[6];
 
-#ifndef IS_WINDOWS
-    if (sizeof(off_t) != 8) {
-        fprintf(stderr, "ERROR: off_t type is not 64-bit.\n");
-        goto cleanup;
-    }
-#endif
-
     if (argc < 2) {
         printf("Usage: %s <device> [GPT partition index]\n", argv[0]);
         goto cleanup;
tab: 248 wrap: offon