compiler

Unnamed Compiled Systems Language Project
git clone http://frotz.net/git/compiler.git
Log | Files | Refs

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 }