fs.c (1753B)
1 // Copyright 2020, Brian Swetland <swetland@frotz.net> 2 // Licensed under the Apache License, Version 2.0. 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <unistd.h> 7 #include <fcntl.h> 8 9 #include "fs.h" 10 11 int read_sector(int fd, uint32_t sector, void* buffer) { 12 if (sector % 29) { 13 fprintf(stderr, "invalid sector $%u\n", sector); 14 } 15 sector = (sector / 29) - 1; 16 if (pread(fd, buffer, 1024, 1024 * sector) != 1024) { 17 fprintf(stderr, "cannot read sector #%u\n", sector); 18 return -1; 19 } else { 20 return 0; 21 } 22 } 23 24 char* fixfn(char* fn) { 25 for (int i = 0; i < 32; i++) { 26 if ((fn[i] < ' ') || (fn[i] > 127)) fn[i] = '.'; 27 } 28 fn[31] = 0; 29 return fn; 30 } 31 32 int dump_dir(int fd, uint32_t sector) { 33 ofs_dir_page dp; 34 ofs_file f; 35 if (read_sector(fd, sector, &dp)) return -1; 36 if (dp.mark != OFS_DIR_MARK) { 37 fprintf(stderr, "dir page @%u bad mark 0x%08x\n", sector, dp.mark); 38 return -1; 39 } 40 printf(" m=%u p0=%u\n", dp.m, dp.p0); 41 if (dp.p0) dump_dir(fd, dp.p0); 42 for (int e = 0; e < 24; e++) { 43 printf("e[%02d] fn='%s' adr=%u p=%u\n", e, 44 dp.e[e].filename, dp.e[e].adr, dp.e[e].p); 45 if (dp.e[e].p) dump_dir(fd, dp.e[e].p); 46 #if 0 47 if (read_sector(fd, dp.e[e].adr, &f)) return -1; 48 if (f.mark != OFS_FILE_MARK) { 49 fprintf(stderr, "file sector @%u bad mark 0x%08x\n", 50 dp.e[e].adr, f.mark); 51 return -1; 52 } 53 printf(" aleng=%u bleng=%u date=%u\n", 54 f.aleng, f.bleng, f.date); 55 printf(" sectors ["); 56 for (int s = 0; s < 64; s++) { 57 if (f.sector[s]) printf(" %u", f.sector[s]); 58 } 59 printf(" ]\n"); 60 #endif 61 } 62 return 0; 63 } 64 65 int main(int argc, char** argv) { 66 int fd; 67 if (argc != 2) return -1; 68 if ((fd = open(argv[1], O_RDONLY)) < 0) { 69 fprintf(stderr, "cannot open '%s'\n", argv[1]); 70 return -1; 71 } 72 73 dump_dir(fd, 29); 74 }