From 82889257ad3bde0e5b25bd78f3a5296f8343ef5b Mon Sep 17 00:00:00 2001 From: okuji Date: Fri, 10 Sep 1999 01:46:09 +0000 Subject: [PATCH] fix some bugs in biosdisk. --- ChangeLog | 8 ++++++++ grub/asmstub.c | 20 ++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 58dc16e58..e41b4f43e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +1999-09-10 OKUJI Yoshinori + + * grub/asmstub.c (_FILE_OFFSET_BITS): Defined. + (biosdisk) [!__linux__]: Pass the offset argument as off_t + instead of int to lseek, and compare the return value with + OFFSET. Reported by Pavel Roskin. + (grub_stage2) [!__linux__ && !__GNU__]: Print a warning message. + 1999-09-08 OKUJI Yoshinori * stage2/stage2.c (run_menu): If run_script is successfully diff --git a/grub/asmstub.c b/grub/asmstub.c index 5f744c946..f395085af 100644 --- a/grub/asmstub.c +++ b/grub/asmstub.c @@ -19,7 +19,9 @@ */ /* Try to use glibc's transparant LFS support. */ -#define _LARGEFILE_SOURCE 1 +#define _LARGEFILE_SOURCE 1 +/* lseek becomes synonymous with lseek64. */ +#define _FILE_OFFSET_BITS 64 /* Simulator entry point. */ int grub_stage2 (void); @@ -154,8 +156,10 @@ grub_stage2 (void) char buf[512]; #ifdef __linux__ char unit = 'a' + i; -#else +#elif defined(__GNU__) char unit = '0' + i; +#else +#warning "BIOS drives cannot be guessed in your operating system." #endif sprintf (name, "/dev/hd%c", unit); @@ -204,7 +208,7 @@ grub_stage2 (void) assert (name); #ifdef __linux__ sprintf (name, "/dev/sd%c", i + 'a'); -#else +#elif defined(__GNU__) sprintf (name, "/dev/sd%d", i); #endif device_map[num_hd++ + 0x80] = name; @@ -755,9 +759,13 @@ biosdisk (int subfunc, int drive, struct geometry *geometry, return -1; } #else - if (lseek (fd, sector * SECTOR_SIZE, SEEK_SET)) - return -1; -#endif /* __linux__ */ + { + off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; + + if (lseek (fd, offset, SEEK_SET) != offset) + return -1; + } +#endif buf = (char *) (segment << 4);