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;
