Ext
 All Files Functions
inode.c
1 
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <errno.h>
7 #include <string.h>
8 #include "inode.h"
9 #include "../../utils/utils.h"
10 #include "descriptors_table.h"
11 
12 size_t sizeof_inode(const struct superblock* superblock) {
13  return sizeof(struct inode_info)
14  + sizeof(uint16_t) * superblock->fs_info->blocks_count_in_inode;
15 }
16 
17 size_t calculate_offset(const struct superblock* superblock,
18  uint16_t inode_id) {
19  return sizeof_superblock(superblock) + sizeof_descriptors_table(superblock)
20  + inode_id * sizeof_inode(superblock);
21 }
22 
23 void init_inode_arrays(struct inode* inode,
24  const struct superblock* superblock) {
25  inode->block_ids =
26  (uint16_t*) calloc(superblock->fs_info->blocks_count_in_inode,
27  sizeof(uint16_t));
28 }
29 
30 void init_inode_info(struct inode* inode) {
31  inode->inode_info = (struct inode_info*) calloc(1, sizeof(struct inode_info));
32 }
33 
34 void init_inode(struct inode* inode,
35  uint16_t id,
36  bool is_file,
37  const struct superblock* superblock) {
38  init_inode_info(inode);
39  inode->inode_info->id = id;
40  inode->inode_info->is_file = is_file;
41  inode->inode_info->blocks_count = 0;
42  init_inode_arrays(inode, superblock);
43 }
44 void destroy_inode(struct inode* inode) {
45  free(inode->inode_info);
46  free(inode->block_ids);
47 }
48 
49 ssize_t read_inode(int fd,
50  struct inode* inode,
51  uint16_t inode_id,
52  const struct superblock* superblock) {
53  init_inode_info(inode);
54  lseek(fd,
55  calculate_offset(superblock, inode_id),
56  SEEK_SET);
57 
58  ssize_t total_read =
59  read_while(fd, (char*) inode->inode_info, sizeof(struct inode_info));
60 
61  if (total_read == -1) {
62  fprintf(stderr, "%s", strerror(errno));
63  free(inode->inode_info);
64  return -1;
65  }
66 
67  init_inode_arrays(inode, superblock);
68 
69  ssize_t readed = read_while(fd,
70  (char*) inode->block_ids,
71  sizeof(uint16_t)
72  * superblock->fs_info->blocks_count_in_inode);
73 
74  if (readed == -1) {
75  fprintf(stderr, "%s", strerror(errno));
76  destroy_inode(inode);
77  return -1;
78  }
79 
80  return total_read + readed;
81 }
82 
83 ssize_t write_inode(int fd,
84  struct inode* inode,
85  const struct superblock* superblock) {
86  lseek(fd,
87  calculate_offset(superblock, inode->inode_info->id),
88  SEEK_SET);
89 
90  ssize_t total_written = write_while(fd,
91  (const char*) inode->inode_info,
92  sizeof(struct inode_info));
93  if (total_written == -1) {
94  fprintf(stderr, "%s", strerror(errno));
95  return -1;
96  }
97 
98  ssize_t written = write_while(fd,
99  (const char*) inode->block_ids,
100  sizeof(uint16_t)
101  * superblock->fs_info->blocks_count_in_inode);
102 
103  if (written == -1) {
104  fprintf(stderr, "%s", strerror(errno));
105  return -1;
106  }
107 
108  return total_written + written;
109 }
110 
111 uint16_t sizeof_inodes_block(const struct superblock* superblock) {
112  return superblock->fs_info->inodes_count * sizeof_inode(superblock);
113 }
ssize_t write_inode(int fd, struct inode *inode, const struct superblock *superblock)
Write inode from memory.
Definition: inode.c:83
void destroy_inode(struct inode *inode)
Destructor of inode.
Definition: inode.c:44
int read_while(int fd, char *buffer, size_t to_read)
Properly reading from memory.
Definition: utils.c:23
Contains descriptors_table struct and its methods.
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
Definition: utils.c:38
uint16_t sizeof_inodes_block(const struct superblock *superblock)
Calculate size of block of all inodes.
Definition: inode.c:111
uint16_t sizeof_descriptors_table(const struct superblock *superblock)
Sizeof descriptors_table.
size_t sizeof_superblock(const struct superblock *superblock)
Definition: superblock.c:23
Contains inode struct and its methods.
void init_inode(struct inode *inode, uint16_t id, bool is_file, const struct superblock *superblock)
Constructor of inode.
Definition: inode.c:34
ssize_t read_inode(int fd, struct inode *inode, uint16_t inode_id, const struct superblock *superblock)
Read inode from memory.
Definition: inode.c:49
size_t sizeof_inode(const struct superblock *superblock)
Count size of inode in bytes.
Definition: inode.c:12