Example #1
0
File: disk.c Project: aosm/boot
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];
}