static int getFAT32VolumeDescription( BVRef bvr, char *str, long strMaxLen) { struct fat32_header { unsigned char code[3]; unsigned char oem_id[8]; unsigned char data[56]; unsigned long serial; unsigned char label[11]; unsigned char fsid[8]; unsigned char reserved[420]; unsigned short signature; } __attribute__((packed)); char *buf, *name; struct fat32_header *fat32_p; int label_len = sizeof(fat32_p->label); int error; buf = (char *)malloc(BPS); name = (char *)malloc(label_len + 1); fat32_p = (struct fat32_header *)buf; diskSeek(bvr, 0ULL); error = diskRead(bvr, (long)buf, BPS); if ( error ) return 0; if (fat32_p->signature != 0xaa55) return 0; if (strMaxLen < label_len) label_len = strMaxLen; strncpy(str, fat32_p->label, label_len); str[label_len] = '\0'; return 1; }
Byte* getDiskBlock (BlkNo blk) { int hash = blk%CACHESIZE; if (diskCacheMap[hash]==blk) return diskCache[hash]; if (diskCacheMap[hash]!=0) diskWrite(diskCacheMap[hash],diskCache[hash]); diskCacheMap[hash] = blk; diskRead(blk,diskCache[hash]); return diskCache[hash]; }
Byte* getDiskBlock (BlkNo blk) { int base=blk%CACHESIZE; int cursor=base; for (int i=0; i<CACHESIZE; i++) { cursor=(base+i)%CACHESIZE; if (diskCacheMap[cursor]==blk) return diskCache[cursor]; if (diskCacheMap[cursor]==0) break; } if (diskCacheMap[cursor]!=0){ cursor=base; diskWrite(diskCacheMap[cursor],diskCache[cursor]); } diskCacheMap[cursor] = blk; diskRead(blk,diskCache[cursor]); return diskCache[cursor]; }