aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications
diff options
context:
space:
mode:
authorNebuleon Fumika2013-05-17 23:12:43 -0400
committerNebuleon Fumika2013-05-17 23:12:43 -0400
commitfbe8c3fc9681b8f4d626c1cdcaa0405e67493494 (patch)
treec5a001c6836f300c426626cc2480832bea7d8eda /sdk-modifications
parent6b370ce35b215d600e0fa37f21bc3ce83dc52d09 (diff)
downloadsnesemu-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.
Diffstat (limited to 'sdk-modifications')
-rwxr-xr-xsdk-modifications/libsrc/fs/directory.c38
-rwxr-xr-xsdk-modifications/libsrc/fs/fs_common.h23
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
{