7 #ifndef EXT_FILESYSTEM_INTERFACE_LS_H_
8 #define EXT_FILESYSTEM_INTERFACE_LS_H_
15 #include "../core/defines.h"
16 #include "../core/superblock.h"
17 #include "../core/inode.h"
18 #include "../core/methods.h"
30 void ls(
const char* path_to_fs_file,
const char* path_to_dir,
int output_fd) {
32 size_t buffer_size = 0;
33 int fd = open(path_to_fs_file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
35 fprintf(stderr,
"Can't open file. Abort!\n");
39 struct superblock superblock;
41 if (superblock.fs_info->magic != MAGIC) {
42 fprintf(stderr,
"Magic does not match. Abort!\n");
48 if (!superblock.reserved_inodes_mask[ROOT_INODE_ID]) {
49 fprintf(stderr,
"Root directory doesn't exist. Abort!\n");
57 if (inode_id == superblock.fs_info->inodes_count) {
58 buffered_write(&buffer, &buffer_size,
"Can't find directory. Abort!\n", strlen(
"Can't find directory. Abort!\n"));
60 send_data(output_fd, buffer, buffer_size);
68 if (
read_inode(fd, &inode, inode_id, &superblock) == -1) {
69 buffered_write(&buffer, &buffer_size,
"Can't read inode. Abort!\n", strlen(
"Can't read inode. Abort!\n"));
71 send_data(output_fd, buffer, buffer_size);
78 if (inode.inode_info->is_file) {
79 buffered_write(&buffer, &buffer_size,
"Trying to list file. Abort!\n", strlen(
"Trying to list file. Abort!\n"));
81 send_data(output_fd, buffer, buffer_size);
90 if (
read_block(fd, &block, inode.block_ids[0], &superblock) == -1) {
91 buffered_write(&buffer, &buffer_size,
"Can't read block. Abort!\n", strlen(
"Can't read block. Abort!\n"));
93 send_data(output_fd, buffer, buffer_size);
103 for (uint16_t record_id = 0; record_id < block.block_info->records_count;
105 buffered_write(&buffer, &buffer_size, block.block_records[record_id].path, strlen(block.block_records[record_id].path) *
sizeof(
char));
109 block.block_records[record_id].inode_id,
110 &superblock) == -1) {
111 buffered_write(&buffer, &buffer_size,
"Can't read inode. Abort!\n", strlen(
"Can't read inode. Abort!\n"));
113 send_data(output_fd, buffer, buffer_size);
120 if (inode.inode_info->is_file) {
121 buffered_write(&buffer, &buffer_size,
" -- file", strlen(
" -- file") *
sizeof(
char));
127 buffered_write(&buffer, &buffer_size,
"\n", strlen(
"\n") *
sizeof(
char));
131 if (buffer != NULL) {
132 send_data(output_fd, buffer, buffer_size);
143 #endif //EXT_FILESYSTEM_INTERFACE_LS_H_
void ls(const char *path_to_fs_file, const char *path_to_dir, int output_fd)
List directory.
void destroy_inode(struct inode *inode)
Destructor of inode.
void destroy_super_block(struct superblock *superblock)
Destructor of superblock.
ssize_t read_block(int fd, struct block *block, uint16_t block_id, const struct superblock *superblock)
Read block from memory.
Contains some useful methods.
ssize_t read_super_block(int fd, struct superblock *superblock)
Read sb from memory.
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
bool send_data(int sockd, char *data, size_t size)
void destruct_block(struct block *block)
Destructor of block.
uint16_t get_inode_id_of_dir(int fd, const char *path, const struct superblock *superblock)
Parse path and find inode of this dir.
int buffered_write(char **buffer, size_t *buffer_size, char *data, size_t size)
ssize_t read_inode(int fd, struct inode *inode, uint16_t inode_id, const struct superblock *superblock)
Read inode from memory.