summaryrefslogtreecommitdiffstats
path: root/sw/z80/kernel/include/filesystem.h
blob: 98c1e904d1d6e84d2738e541fc511329d648531f (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef __FILESYSTEM_H__
#define __FILESYSTEM_H__

#include "types.h"

#define FS_OFFSET 0x1000

#define FS_BLOCKS_SIZE 512
#define FS_BLOCKS_N     12

#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
{
    uint        magic :5;           /* identifier */
    uint        serial_port :3;     /* serial port id from serial.h */
    uint16_t    blk_size;           /* default is 512 bytes */
    uint16_t    imap_size;          /* size of the inode table in blocks */
    uint16_t    dmap_size;          /* size of the data blocks map in blocks */
};


struct fs_blk_entry
{
    uint16_t b_number;      /* block number */
    uint16_t data_size;     /* bytes used   */
};

typedef struct fs_inode
{

    uint16_t    i_number;       /* identifier */

    uint        i_mode :3;      /* inode mode (rwx) */
    uint        i_uid :3;       /* user (owner) id  */
    uint        i_type :2;      /* inode type */

    uint8_t     i_blocks;       /* number of blocks */
    struct fs_blk_entry   i_block[FS_BLOCKS_N];   /* direct blocks */
    
    uint16_t     parent;

} inode_t;

/* inode table structures */
/* i_number is derived from location */
struct fs_inode_entry
{
    uint8_t     str_len;
    char        name[24];
};

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

struct filesystem * fs_parse_superblock(struct filesystem *fs);

/* resolves an arbitrary path */
uint16_t fs_parse_path(const char *path);

/* gets inode from inumber */
inode_t * fs_get_inode(inode_t *buffer, uint16_t i_number);

inode_t * fs_new_inode(inode_t *inode, const char *name);

int fs_free_inode(const inode_t *inode);

void fs_chmod(inode_t *inode, uint8_t mode);

void fs_chown(inode_t *inode, uint8_t uid);

int fs_rename(inode_t *inode, const char *name);


#endif // __FILESYSTEM_H__