Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 6be4142 in mainline for uspace/dist/src/bithenge/fat.bh


Ignore:
Timestamp:
2012-08-12T04:53:47Z (9 years ago)
Author:
Sean Bartell <wingedtachikoma@…>
Branches:
lfn, master
Children:
1b6b76d
Parents:
0153c87
Message:

Bithenge: print transform errors; fixes and fat.bh improvements

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/dist/src/bithenge/fat.bh

    r0153c87 r6be4142  
    2727# FAT filesystem script.
    2828# Largely based on https://en.wikipedia.org/wiki/File_Allocation_Table
     29# Currently only FAT12 and FAT16 are supported.
    2930
    3031transform u8 = uint8;
     
    3233transform u32 = uint32le;
    3334
     35transform fat_attributes = struct {
     36        .read_only <- bit;
     37        .hidden <- bit;
     38        .system <- bit;
     39        .volume_label <- bit;
     40        .subdirectory <- bit;
     41        .archive <- bit;
     42        .device <- bit;
     43        .reserved <- bit;
     44} <- bits_le <- known_length(1);
     45
    3446transform fat_dir_entry(disk) = struct {
    3547        .filename <- known_length(8);
    3648        .extension <- known_length(3);
    37         .attrs <- u8;
     49        .attrs <- fat_attributes;
    3850        .flags <- u8;
    3951        .ctime_fine <- u8;
     
    7991        };
    8092
    81         .num_sectors <- if (.bpb331.ignore) {
    82                 (.num_sectors_16)
    83         } else {
    84                 (.bpb331.num_sectors_32)
    85         };
    86 
    87         .first_root_sector <- (.num_reserved_sectors + .num_fats * .sectors_per_fat);
    88         .first_data_sector <- (.first_root_sector +
    89             (.num_root_entries * 32 + .bytes_per_sector - 1) //
    90             .bytes_per_sector);
    91         .num_clusters <- (2 + (.num_sectors - .first_data_sector) // .sectors_per_cluster);
    92         .bits <- if (.num_clusters < 4085) { (12) }
    93             else { if (.num_clusters < 65525) { (16) } else { (32) } };
    94 
    95         .fats <- partial(.num_reserved_sectors * .bytes_per_sector) {
    96                 repeat(.num_fats) {
    97                         fat_table(.bits, .num_clusters) <-
    98                                 known_length(.sectors_per_fat * .bytes_per_sector)
    99                 }
    100         } <- (disk);
    101 
    102         .root <- partial(.first_root_sector * .bytes_per_sector) {
    103                 repeat(.num_root_entries) { fat_dir_entry(disk) } } <- (disk);
     93        .drive_number <- u8;
     94        .chkdsk_flags <- u8;
     95        .extended_boot_signature <- u8;
     96        if (.extended_boot_signature == 41) {
     97                .volume_id <- u32;
     98                .volume_label <- ascii <- known_length(11);
     99                .type <- ascii <- known_length(8);
     100        }
    104101
    105102        .boot_signature <- (disk[510,2]); # b"\x55\xaa"; TODO: what if .bytes_per_sector < 512?
    106103};
    107104
    108 transform fat_filesystem = partial { fat_super(in) };
     105transform fat_filesystem_tree(disk) = struct {
     106        .super <- partial{fat_super(disk)} <- (disk);
     107
     108        .num_sectors <- if (.super.bpb331.ignore) {
     109                (.super.num_sectors_16)
     110        } else {
     111                (.super.bpb331.num_sectors_32)
     112        };
     113
     114        .first_root_sector <- (.super.num_reserved_sectors + .super.num_fats * .super.sectors_per_fat);
     115        .first_data_sector <- (.first_root_sector +
     116            (.super.num_root_entries * 32 + .super.bytes_per_sector - 1) //
     117            .super.bytes_per_sector);
     118        .num_clusters <- (2 + (.num_sectors - .first_data_sector) // .super.sectors_per_cluster);
     119        .bits <- if (.num_clusters < 4085) { (12) }
     120            else { if (.num_clusters < 65525) { (16) } else { (32) } };
     121
     122        .fats <- partial(.super.num_reserved_sectors * .super.bytes_per_sector) {
     123                repeat(.super.num_fats) {
     124                        fat_table(.bits, .num_clusters) <-
     125                                known_length(.super.sectors_per_fat * .super.bytes_per_sector)
     126                }
     127        } <- (disk);
     128
     129        .root <- partial(.first_root_sector * .super.bytes_per_sector) {
     130                repeat(.super.num_root_entries) { fat_dir_entry(disk) } } <- (disk);
     131};
     132
     133transform fat_filesystem = partial {fat_filesystem_tree(in)};
    109134
    110135transform main = fat_filesystem;
Note: See TracChangeset for help on using the changeset viewer.