mirror of
https://github.com/limine-bootloader/limine
synced 2025-01-23 21:12:04 +03:00
fat32: Fix handling of non-lfn files
This commit is contained in:
parent
22ac79080e
commit
2e96f8fe6a
BIN
qloader2.bin
BIN
qloader2.bin
Binary file not shown.
@ -123,6 +123,26 @@ static void fat32_lfncpy(char* destination, const void* source, unsigned int siz
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fat32_filename_to_8_3(char *dest, const char *src) {
|
||||||
|
int i = 0, j = 0;
|
||||||
|
|
||||||
|
conv:
|
||||||
|
while (src[i] && src[i] != '.')
|
||||||
|
dest[j++] = toupper(src[i++]);
|
||||||
|
|
||||||
|
if (!src[i]) {
|
||||||
|
while (j < 8+3)
|
||||||
|
dest[j++] = ' ';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
while (j < 8)
|
||||||
|
dest[j++] = ' ';
|
||||||
|
|
||||||
|
goto conv;
|
||||||
|
}
|
||||||
|
|
||||||
static int fat32_open_in(struct fat32_context* context, struct fat32_directory_entry* directory, struct fat32_directory_entry* file, const char* name) {
|
static int fat32_open_in(struct fat32_context* context, struct fat32_directory_entry* directory, struct fat32_directory_entry* file, const char* name) {
|
||||||
int error;
|
int error;
|
||||||
uint32_t current_cluster_number = directory->cluster_num_high << 16 | directory->cluster_num_low;
|
uint32_t current_cluster_number = directory->cluster_num_high << 16 | directory->cluster_num_low;
|
||||||
@ -176,14 +196,21 @@ static int fat32_open_in(struct fat32_context* context, struct fat32_directory_e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((has_lfn && strcmp(current_lfn, name) == 0) || strncmp(directory_entries[i].file_name_and_ext, name, 8 + 3) == 0) {
|
if (has_lfn) {
|
||||||
*file = directory_entries[i];
|
if (!strcmp(current_lfn, name)) {
|
||||||
return 0;
|
*file = directory_entries[i];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
char fn[8+3];
|
||||||
|
fat32_filename_to_8_3(fn, name);
|
||||||
|
if (!strncmp(directory_entries[i].file_name_and_ext, fn, 8+3)) {
|
||||||
|
*file = directory_entries[i];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_lfn) {
|
has_lfn = false;
|
||||||
has_lfn = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,7 +219,7 @@ static int fat32_open_in(struct fat32_context* context, struct fat32_directory_e
|
|||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
} while (current_cluster_number >= 0x00000002 && current_cluster_number <= 0x0FFFFEF);
|
} while (current_cluster_number >= 0x00000002 && current_cluster_number <= 0x0FFFFFEF);
|
||||||
|
|
||||||
// file not found
|
// file not found
|
||||||
return -1;
|
return -1;
|
||||||
@ -330,7 +357,7 @@ int fat32_read(struct fat32_file_handle* file, void* buf, uint64_t loc, uint64_t
|
|||||||
print("fat32: failed to read cluster %x from map\n", current_cluster_number);
|
print("fat32: failed to read cluster %x from map\n", current_cluster_number);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
} while (current_cluster_number >= 0x00000002 && current_cluster_number <= 0x0FFFFEF);
|
} while (current_cluster_number >= 0x00000002 && current_cluster_number <= 0x0FFFFFEF);
|
||||||
|
|
||||||
print("fat32: read failed, unexpected end of cluster chain\n");
|
print("fat32: read failed, unexpected end of cluster chain\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2,6 +2,20 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <lib/libc.h>
|
#include <lib/libc.h>
|
||||||
|
|
||||||
|
int toupper(int c) {
|
||||||
|
if (c >= 'a' && c <= 'z') {
|
||||||
|
return c - 0x20;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tolower(int c) {
|
||||||
|
if (c >= 'A' && c <= 'Z') {
|
||||||
|
return c + 0x20;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
void *memcpy(void *dest, const void *src, size_t n) {
|
void *memcpy(void *dest, const void *src, size_t n) {
|
||||||
uint8_t *pdest = dest;
|
uint8_t *pdest = dest;
|
||||||
const uint8_t *psrc = src;
|
const uint8_t *psrc = src;
|
||||||
|
@ -3,10 +3,14 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
int toupper(int c);
|
||||||
|
int tolower(int c);
|
||||||
|
|
||||||
void *memset(void *, int, size_t);
|
void *memset(void *, int, size_t);
|
||||||
void *memcpy(void *, const void *, size_t);
|
void *memcpy(void *, const void *, size_t);
|
||||||
int memcmp(const void *, const void *, size_t);
|
int memcmp(const void *, const void *, size_t);
|
||||||
void *memmove(void *, const void *, size_t);
|
void *memmove(void *, const void *, size_t);
|
||||||
|
|
||||||
char *strcpy(char *, const char *);
|
char *strcpy(char *, const char *);
|
||||||
char *strncpy(char *, const char *, size_t);
|
char *strncpy(char *, const char *, size_t);
|
||||||
size_t strlen(const char *);
|
size_t strlen(const char *);
|
||||||
|
Loading…
Reference in New Issue
Block a user