diff options
author | Nebuleon Fumika | 2013-05-17 23:12:43 -0400 |
---|---|---|
committer | Nebuleon Fumika | 2013-05-17 23:12:43 -0400 |
commit | fbe8c3fc9681b8f4d626c1cdcaa0405e67493494 (patch) | |
tree | c5a001c6836f300c426626cc2480832bea7d8eda | |
parent | 6b370ce35b215d600e0fa37f21bc3ce83dc52d09 (diff) | |
download | snesemu-fbe8c3fc9681b8f4d626c1cdcaa0405e67493494.tar.gz snesemu-fbe8c3fc9681b8f4d626c1cdcaa0405e67493494.tar.bz2 snesemu-fbe8c3fc9681b8f4d626c1cdcaa0405e67493494.zip |
sdk-modifications: Fix totally broken short-file-name (SFN) alias support which caused computers to report duplicate SFNs in directories, as well as corrupted file names and breakage with files that have no extension.
-rwxr-xr-x | sdk-modifications/libsrc/fs/directory.c | 38 | ||||
-rwxr-xr-x | sdk-modifications/libsrc/fs/fs_common.h | 23 |
2 files changed, 39 insertions, 22 deletions
diff --git a/sdk-modifications/libsrc/fs/directory.c b/sdk-modifications/libsrc/fs/directory.c index b30cccc..124daf8 100755 --- a/sdk-modifications/libsrc/fs/directory.c +++ b/sdk-modifications/libsrc/fs/directory.c @@ -135,7 +135,7 @@ bool _FAT_directory_isValidLfn (const char* name) { return true;
}
bool _FAT_directory_isValidAlias (const char* name) {
- return false;//disables this function to preserve file name casing
+ //return false;//disables this function to preserve file name casing
u32 i;
u32 nameLength;
@@ -159,7 +159,7 @@ bool _FAT_directory_isValidAlias (const char* name) { // Make sure the name doesn't contain any control codes
//if name isn't all capitals, then it is not a valid short name
for (i = 0; i < nameLength; i++) {
- if (name[i] < 0x5A && name[i]!=0x20) {
+ if (name[i] > 0x5A && name[i]!= 0x20) {
return false;
}
}
@@ -756,8 +756,38 @@ static bool _FAT_directory_entryExists (PARTITION* partition, const char* name, return false;
}
+//a fix for checking if a short file name is already in use.
+static bool _FAT_directory_entryExistsSFN (PARTITION* partition, const char* name, u32 dirCluster) {
+ DIR_ENTRY tempEntry;
+ bool foundFile;
+ char alias[MAX_ALIAS_LENGTH];
+ u32 dirnameLength;
+
+ dirnameLength = strnlen(name, MAX_FILENAME_LENGTH);
+
+ if (dirnameLength >= MAX_FILENAME_LENGTH) {
+ return false;
+ }
+ // Make sure the entry doesn't already exist
+ foundFile = _FAT_directory_getFirstEntry (partition, &tempEntry, dirCluster);
+
+ while (foundFile) { // It hasn't already found the file
+ if(!strcasecmp(name, tempEntry.d_name))
+ return true;
+
+ // Check if the alias matches
+ _FAT_directory_entryGetAlias (tempEntry.entryData, alias);
+ if ((dirnameLength == strnlen(alias, MAX_ALIAS_LENGTH))
+ && (strcasecmp(alias, name) == 0)) {
+ return true;
+ }
+ foundFile = _FAT_directory_getNextEntry (partition, &tempEntry);
+ }
+ return false;
+}
+
bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, u32 dirCluster) {
u32 entrySize;
u8 lfnEntry[DIR_ENTRY_DATA_SIZE];
@@ -833,7 +863,7 @@ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, u32 dirClu ++ j;
}
// Short filename
- strupr (entry->d_name);
+ strupr (entry->entryData);
}else {
// Long filename needed
//memset( entry->unicodeFilename, 0, 512 );
@@ -883,7 +913,7 @@ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, u32 dirClu i++;
alias[6] = '0' + ((i / 10) % 10); // 10's digit
alias[7] = '0' + (i % 10); // 1's digit
- } while (_FAT_directory_entryExists (partition, alias, dirCluster) && (i < 100));
+ } while (_FAT_directory_entryExistsSFN (partition, alias, dirCluster) && (i < 100));
if (i == 100) {
// Couldn't get a tail number
return false;
diff --git a/sdk-modifications/libsrc/fs/fs_common.h b/sdk-modifications/libsrc/fs/fs_common.h index ce1cfff..db47d9a 100755 --- a/sdk-modifications/libsrc/fs/fs_common.h +++ b/sdk-modifications/libsrc/fs/fs_common.h @@ -49,9 +49,10 @@ #define BYTES_PER_READ 512 -#ifndef NULL - #define NULL 0 -#endif +// MODIFICATION START [Neb] +// In libfat by Chishm, some types are #define'd here. In the DS2 SDK, +// these types are defined by another header. +#include "ds2_types.h" #ifndef bool #define bool int @@ -65,21 +66,7 @@ #define true 1 #endif -#ifndef u8 -#define u8 unsigned char -#endif - -#ifndef u16 -#define u16 unsigned short -#endif - -#ifndef u32 -#define u32 unsigned long -#endif - -#ifndef s32 -#define s32 long -#endif +// MODIFICATION END [Neb] struct _reent { |