mirror of
https://github.com/wiiu-env/libfat.git
synced 2024-11-01 00:05:06 +01:00
added fatGetVolumeLabel (rodries)
This commit is contained in:
parent
9f7c3edc44
commit
a8ed97403b
@ -92,6 +92,11 @@ If there are open files, it will attempt to synchronise them to disc.
|
|||||||
*/
|
*/
|
||||||
extern void fatUnmount (const char* name);
|
extern void fatUnmount (const char* name);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get Volume Label
|
||||||
|
*/
|
||||||
|
extern void fatGetVolumeLabel (const char* name, char *label);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -67,12 +67,18 @@ cacheSize specifies the number of pages to allocate for the cache.
|
|||||||
This will not startup the disc, so you need to call interface->startup(); first.
|
This will not startup the disc, so you need to call interface->startup(); first.
|
||||||
*/
|
*/
|
||||||
extern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage);
|
extern bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSector, uint32_t cacheSize, uint32_t SectorsPerPage);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Unmount the partition specified by name.
|
Unmount the partition specified by name.
|
||||||
If there are open files, it will attempt to synchronise them to disc.
|
If there are open files, it will attempt to synchronise them to disc.
|
||||||
*/
|
*/
|
||||||
extern void fatUnmount (const char* name);
|
extern void fatUnmount (const char* name);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get Volume Label
|
||||||
|
*/
|
||||||
|
extern void fatGetVolumeLabel (const char* name, char *label);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -329,7 +329,8 @@ bool _FAT_directory_getNextEntry (PARTITION* partition, DIR_ENTRY* entry) {
|
|||||||
}
|
}
|
||||||
lfn[lfnPos] = '\0'; // Set end of lfn to null character
|
lfn[lfnPos] = '\0'; // Set end of lfn to null character
|
||||||
lfnChkSum = entryData[LFN_offset_checkSum];
|
lfnChkSum = entryData[LFN_offset_checkSum];
|
||||||
} if (lfnChkSum != entryData[LFN_offset_checkSum]) {
|
}
|
||||||
|
if (lfnChkSum != entryData[LFN_offset_checkSum]) {
|
||||||
lfnExists = false;
|
lfnExists = false;
|
||||||
}
|
}
|
||||||
if (lfnExists) {
|
if (lfnExists) {
|
||||||
@ -417,6 +418,49 @@ bool _FAT_directory_getRootEntry (PARTITION* partition, DIR_ENTRY* entry) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label) {
|
||||||
|
DIR_ENTRY entry;
|
||||||
|
DIR_ENTRY_POSITION entryEnd;
|
||||||
|
uint8_t entryData[DIR_ENTRY_DATA_SIZE];
|
||||||
|
int i;
|
||||||
|
bool end;
|
||||||
|
|
||||||
|
_FAT_directory_getRootEntry(partition, &entry);
|
||||||
|
|
||||||
|
entryEnd = entry.dataEnd;
|
||||||
|
|
||||||
|
// Make sure we are using the correct root directory, in case of FAT32
|
||||||
|
if (entryEnd.cluster == FAT16_ROOT_DIR_CLUSTER) {
|
||||||
|
entryEnd.cluster = partition->rootDirCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
label[0]='\0';
|
||||||
|
label[11]='\0';
|
||||||
|
end = false;
|
||||||
|
//this entry should be among the first 3 entries in the root directory table, if not, then system can have trouble displaying the right volume label
|
||||||
|
while(!end) {
|
||||||
|
if (_FAT_directory_incrementDirEntryPosition (partition, &entryEnd, false) == false) {
|
||||||
|
end = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!_FAT_cache_readPartialSector (partition->cache, entryData,
|
||||||
|
_FAT_fat_clusterToSector(partition, entryEnd.cluster) + entryEnd.sector,
|
||||||
|
entryEnd.offset * DIR_ENTRY_DATA_SIZE, DIR_ENTRY_DATA_SIZE))
|
||||||
|
{ //error reading
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((entryData[DIR_ENTRY_attributes] == ATTRIB_VOL)) {
|
||||||
|
for (i = 0; i < 11; i++) {
|
||||||
|
label[i] = entryData[DIR_ENTRY_name + i];
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if (entryData[0] == DIR_ENTRY_LAST) {
|
||||||
|
end = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) {
|
bool _FAT_directory_entryFromPosition (PARTITION* partition, DIR_ENTRY* entry) {
|
||||||
DIR_ENTRY_POSITION entryStart = entry->dataStart;
|
DIR_ENTRY_POSITION entryStart = entry->dataStart;
|
||||||
DIR_ENTRY_POSITION entryEnd = entry->dataEnd;
|
DIR_ENTRY_POSITION entryEnd = entry->dataEnd;
|
||||||
|
@ -170,4 +170,9 @@ Fill in a stat struct based on a file entry
|
|||||||
*/
|
*/
|
||||||
void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st);
|
void _FAT_directory_entryStat (PARTITION* partition, DIR_ENTRY* entry, struct stat *st);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get volume label
|
||||||
|
*/
|
||||||
|
bool _FAT_directory_getVolumeLabel (PARTITION* partition, char *label);
|
||||||
|
|
||||||
#endif // _DIRECTORY_H
|
#endif // _DIRECTORY_H
|
||||||
|
@ -69,12 +69,14 @@ bool fatMount (const char* name, const DISC_INTERFACE* interface, sec_t startSec
|
|||||||
devoptab_t* devops;
|
devoptab_t* devops;
|
||||||
char* nameCopy;
|
char* nameCopy;
|
||||||
|
|
||||||
|
if(!name || !interface)
|
||||||
|
return false;
|
||||||
|
|
||||||
if(!interface->startup())
|
if(!interface->startup())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(!interface->isInserted()) {
|
if(!interface->isInserted())
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
devops = _FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1);
|
devops = _FAT_mem_allocate (sizeof(devoptab_t) + strlen(name) + 1);
|
||||||
if (!devops) {
|
if (!devops) {
|
||||||
@ -109,6 +111,9 @@ void fatUnmount (const char* name) {
|
|||||||
devoptab_t *devops;
|
devoptab_t *devops;
|
||||||
PARTITION* partition;
|
PARTITION* partition;
|
||||||
|
|
||||||
|
if(!name)
|
||||||
|
return;
|
||||||
|
|
||||||
devops = (devoptab_t*)GetDeviceOpTab (name);
|
devops = (devoptab_t*)GetDeviceOpTab (name);
|
||||||
if (!devops) {
|
if (!devops) {
|
||||||
return;
|
return;
|
||||||
@ -188,4 +193,49 @@ bool fatInitDefault (void) {
|
|||||||
return fatInit (DEFAULT_CACHE_PAGES, true);
|
return fatInit (DEFAULT_CACHE_PAGES, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fatGetVolumeLabel (const char* name, char *label) {
|
||||||
|
devoptab_t *devops;
|
||||||
|
PARTITION* partition;
|
||||||
|
char *buf;
|
||||||
|
int namelen,i;
|
||||||
|
|
||||||
|
if(!name || !label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
namelen = strlen(name);
|
||||||
|
buf=(char*)malloc(sizeof(char)*namelen+2);
|
||||||
|
strcpy(buf,name);
|
||||||
|
|
||||||
|
if (name[namelen-1] == '/') {
|
||||||
|
buf[namelen-1]='\0';
|
||||||
|
namelen--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name[namelen-1] != ':') {
|
||||||
|
buf[namelen]=':';
|
||||||
|
buf[namelen+1]='\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
devops = (devoptab_t*)GetDeviceOpTab(buf);
|
||||||
|
|
||||||
|
for(i=0;buf[i]!='\0' && buf[i]!=':';i++);
|
||||||
|
if (!devops || strncasecmp(buf,devops->name,i)) {
|
||||||
|
free(buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
// Perform a quick check to make sure we're dealing with a libfat controlled device
|
||||||
|
if (devops->open_r != dotab_fat.open_r) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
partition = (PARTITION*)devops->deviceData;
|
||||||
|
|
||||||
|
if(!_FAT_directory_getVolumeLabel(partition, label)) {
|
||||||
|
strncpy(label,partition->label,11);
|
||||||
|
label[11]='\0';
|
||||||
|
}
|
||||||
|
if(!strncmp(label, "NO NAME", 7)) label[0]='\0';
|
||||||
|
}
|
||||||
|
@ -206,6 +206,12 @@ PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cach
|
|||||||
// Init the partition lock
|
// Init the partition lock
|
||||||
_FAT_lock_init(&partition->lock);
|
_FAT_lock_init(&partition->lock);
|
||||||
|
|
||||||
|
if (!memcmp(sectorBuffer + BPB_FAT16_fileSysType, FAT_SIG, sizeof(FAT_SIG)))
|
||||||
|
strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT16_volumeLabel), 11);
|
||||||
|
else
|
||||||
|
strncpy(partition->label, (char*)(sectorBuffer + BPB_FAT32_volumeLabel), 11);
|
||||||
|
partition->label[11] = '\0';
|
||||||
|
|
||||||
// Set partition's disc interface
|
// Set partition's disc interface
|
||||||
partition->disc = disc;
|
partition->disc = disc;
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ typedef struct {
|
|||||||
struct _FILE_STRUCT* firstOpenFile; // The start of a linked list of files
|
struct _FILE_STRUCT* firstOpenFile; // The start of a linked list of files
|
||||||
mutex_t lock; // A lock for partition operations
|
mutex_t lock; // A lock for partition operations
|
||||||
bool readOnly; // If this is set, then do not try writing to the disc
|
bool readOnly; // If this is set, then do not try writing to the disc
|
||||||
|
char label[12]; // Volume label
|
||||||
} PARTITION;
|
} PARTITION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user