aboutsummaryrefslogtreecommitdiff
path: root/inode.h
blob: 7eee890c6b847caf07f89a906dde94c8cf414089 (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
#ifndef _INODE_H
#define _INODE_H

#define _GNU_SOURCE
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/statvfs.h>

#include <time.h>

/* Define los tipos que pueden ser los inodos. */
enum {
    I_FILE = 0,
    I_DIR = 1,
};

/*
 * {4} size
 * {4} tipo (necesario para llegar a 32)
 * {2} mode
 * {2} uid
 * {2} gid
 * {12} atime,ctime, mtime
 * {2} indirect
 * {4} nlinks
 *
 * total 32 bytes
 */
struct _inode_t {
    uint32_t size; /* TamaƱo del inodo */
    uint32_t type; /* tipo */

    uint16_t mode; /* acceso */
    uint16_t uid;
    uint16_t gid;

    uint32_t atime;
    uint32_t ctime;
    uint32_t mtime;

    uint16_t indirect;

    uint32_t nlinks;
} __attribute__((packed));

/* Sinonimo ? */
typedef struct _inode_t inode;

/* Asociacion de nombre y numero de inodo
 * 32 bytes tambien */
struct _direntry_t {
    uint32_t inum;
    char name[26];
    uint16_t symlink;
} __attribute__((packed));

typedef struct _direntry_t direntry;

/* Consigue un numero de inodo a partir de un path */
int16_t get_inode_from_path(const char *disk_mem, char *path, int16_t current);

/* Funciones del filesystem */
int inode_getattr(inode *i, ino_t inum, struct stat *stbuf);
int inode_chown(inode *i, uid_t uid, gid_t gid);
int inode_chmod (inode *i, mode_t mode);
int inode_utime(inode *i, const struct timespec tv[2]);
mode_t inode_get_mode (inode *i);

/* Consigue un nuevo inodo, devolviendo su numero y alocandolo */
uint16_t inode_allocate_block(const char *disk_mem);
/* Libera un bloque pasado por parametro */
void inode_free_block(const char *disk_mem, uint16_t pos);

void direntry_clean(direntry *dentry);
#endif