AquilaOS documentation
How it works, and its code
Loading...
Searching...
No Matches
dentry.c
Go to the documentation of this file.
1
5
6#include <core/panic.h>
7#include <minix.h>
8
19uint32_t minix_dentry_find(struct minix *desc, struct minix_inode *m_inode, const char *name)
20{
21 if (!S_ISDIR(m_inode->mode))
22 return 0;
23
24 size_t bs = desc->bs;
25 size_t nr_blocks = (m_inode->size + bs - 1) / bs;
26
27 char block[bs];
28
29 struct minix_dentry *dentry;
30
31 for (size_t i = 0; i < nr_blocks; ++i) {
32 minix_inode_block_read(desc, m_inode, i, block);
33
34 dentry = (struct minix_dentry *) block;
35
36 while ((char *) dentry < (char *) block + bs) {
37 char _name[desc->name_len+1];
38
39 memcpy(_name, dentry->name, desc->name_len);
40 _name[desc->name_len] = 0;
41
42 if (!strcmp((char *) _name, name))
43 goto found;
44
45 dentry = (struct minix_dentry *) ((char *) dentry + desc->dentry_size);
46 }
47 }
48
49 /* not found */
50 return 0;
51
52found:
53 return dentry->ino;
54}
55
68int minix_dentry_create(struct vnode *dir, const char *name, ino_t ino, mode_t mode)
69{
70 int err = 0;
71
72 if (!S_ISDIR(dir->mode))
73 return -ENOTDIR;
74
75 struct minix *desc = dir->p;
76
77 size_t len = strlen(name);
78
79 struct minix_inode m_inode;
80 if ((err = minix_inode_read(desc, dir->ino, &m_inode)))
81 return err;
82
83 size_t bs = desc->bs;
84 size_t nr_blocks = (m_inode.size + bs - 1) / bs;
85
86 char block[bs];
87
88 struct minix_dentry *dentry;
89
90 for (size_t i = 0; i < nr_blocks; ++i) {
91 minix_inode_block_read(desc, &m_inode, i, block);
92
93 dentry = (struct minix_dentry *) block;
94
95 while ((char *) dentry < (char *) block + bs) {
96 if (!dentry->ino) {
97 memset(dentry->name, 0, desc->name_len);
98 dentry->ino = ino;
99 memcpy(dentry->name, name, MIN(len, desc->name_len));
100 minix_inode_block_write(desc, &m_inode, dir->ino, i, block);
101
102 /* the directory grows if the entry is past its end; its
103 * vnode's size stays the inode's (a vnode synced with an
104 * older size would cut the new entry off) */
105 size_t new_size = i * bs + (size_t)((char *) dentry - block) + desc->dentry_size;
106 if (m_inode.size < new_size) {
107 m_inode.size = new_size;
108 dir->size = new_size;
109 return minix_inode_write(desc, dir->ino, &m_inode);
110 }
111
112 return 0;
113 }
114
115 dentry = (struct minix_dentry *) ((char *) dentry + desc->dentry_size);
116 }
117 }
118
119 /* every slot is taken: the directory grows by a block (which
120 * minix_inode_block_write() allocates), the entry at its start and
121 * the rest of the block free */
122 memset(block, 0, bs);
123
124 dentry = (struct minix_dentry *) block;
125 dentry->ino = ino;
126 memcpy(dentry->name, name, MIN(len, desc->name_len));
127
128 if ((err = minix_inode_block_write(desc, &m_inode, dir->ino, nr_blocks, block)))
129 return err;
130
131 m_inode.size = nr_blocks * bs + desc->dentry_size;
132 dir->size = m_inode.size;
133 return minix_inode_write(desc, dir->ino, &m_inode);
134}
#define MIN(a, b)
Definition system.h:11
void * memset(void *dst, int c, size_t n)
Sets n bytes to c.
Definition libc.c:23
void * memcpy(void *dst, const void *src, size_t n)
Copies n bytes; dst and src must not overlap.
Definition libc.c:11
uint32_t minix_dentry_find(struct minix *desc, struct minix_inode *m_inode, const char *name)
Finds the inode number of a name in a directory.
Definition dentry.c:19
int minix_dentry_create(struct vnode *dir, const char *name, ino_t ino, mode_t mode)
Adds an entry to a directory, in its first free slot.
Definition dentry.c:68
ssize_t minix_inode_block_write(struct minix *desc, struct minix_inode *inode, ino_t ino, size_t idx, void *buf)
Writes a zone of a file, allocating it and the indirect zones above it if they don't exist yet.
Definition inode.c:208
ssize_t minix_inode_block_read(struct minix *desc, struct minix_inode *m_inode, size_t idx, void *buf)
Reads a zone of a file.
Definition inode.c:141
int minix_inode_read(struct minix *desc, ino_t ino, struct minix_inode *ref)
Reads an inode from the disk.
Definition inode.c:31
int minix_inode_write(struct minix *desc, ino_t ino, struct minix_inode *ref)
Writes an inode to the disk.
Definition inode.c:63
unsigned int uint32_t
Definition stddef.h:22
__SIZE_TYPE__ size_t
Definition stddef.h:7
A directory entry, as it is on the disk: 0 as the inode number is an unused entry.
Definition minix.h:76
uint8_t name[0]
Definition minix.h:78
uint16_t ino
Definition minix.h:77
A minix v1 inode, as it is on the disk.
Definition minix.h:64
uint32_t size
Definition minix.h:67
uint16_t mode
Definition minix.h:65
A mounted minix filesystem.
Definition minix.h:82
size_t bs
Definition minix.h:101
size_t name_len
Definition minix.h:88
size_t dentry_size
Definition minix.h:87
A file in memory (a vnode): what its inode says, and the kernel's own state.
Definition vfs.h:113
ino_t ino
Definition vfs.h:114
size_t size
Definition vfs.h:115
void * p
the filesystem's own data
Definition vfs.h:130
mode_t mode
Definition vfs.h:118
uintptr_t ino_t
Definition types.h:23
uint32_t mode_t
Definition types.h:15