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
|