summaryrefslogtreecommitdiffstats
path: root/sw/z80/kernel/include/filesystem.h
blob: 6505d5ecbb93b2e1ba47cb8b944a02c3db4bbb31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#ifndef __FILESYSTEM_H__
#define __FILESYSTEM_H__

#include "types.h"

#define FS_OFFSET 0x1000

#define FS_BLOCK_SIZE   512
#define FS_BLOCKS_N     12
/* #define FS_IBLOCKS_N     1 */

#define INODE_TYPE_FILE 0
#define INODE_TYPE_DIR  1
#define INODE_TYPE_LINK 2

typedef struct time_s
{
    uint16_t time;
    uint16_t date;
} time_t;


/* on-disk structures */
struct fs_superblock
{
    uint8_t     magic;
    uint16_t    blk_size;   /* default is 512 bytes */
    uint16_t    imap_size;  /* size of the inode bitmap in blocks */
    uint16_t    dmap_size;  /* size of the data blocks map in blocks */
};


struct fs_blk
{
    uint    size;
};

typedef struct fs_inode
{
    uint        i_used :1; // inode is free
    uint        i_mode :3; // inode mode (rwx)

    uint8_t     i_uid;     // user (owner) id
    uint16_t    i_number;  // identifier

    uint16_t    i_blocks;  // number of blocks

    struct fs_blk   i_block[FS_BLOCKS_N];   // direct blocks
/*    struct fs_blk   i_iblock[FS_IBLOCKS_N]; // indirect blocks */
    
    inode_t     *parent;
} inode_t;

/* inode table structures */
struct fs_inode_entry
{
    uint16_t    i_number;
    uint8_t     str_len;
    char        name[24];
};

/* filesystem struct for the operating system */
struct filesystem
{
    size_t size;
    size_t fsize;
    inode_t *mntpt;
};

void fs_parse_superblock(struct filesystem *fs);

void fs_write_imap();
void fs_write_dmap();

/* void fs_ */

#endif // __FILESYSTEM_H__