Select Git revision
read_dir.c 1.83 KiB
#include <libgen.h>
#include <minix.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage :\n");
fprintf(stderr, "\t./%s <image file> <inode n°>\n", basename(argv[0]));
exit(EXIT_FAILURE);
}
struct minix_inode inode = {0};
int inode_nb = atoi(argv[2]);
unmarshal_inode(&inode, inode_nb, argv[1]);
int nb_blocks_used = (inode.i_size / BLOCK_SIZE) + 1;
if (inode.i_size > BLOCK_SIZE && inode.i_size % BLOCK_SIZE != 0) {
nb_blocks_used++;
}
for (int i = 0; i < nb_blocks_used; i++) {
ssize_t phys_num = bmap(&inode, argv[1], i);
if (phys_num == -1) {
fprintf(stderr, "bmap has failed...\n");
exit(EXIT_FAILURE);
}
char buf[BLOCK_SIZE + 1] = {0};
if (read_data_block(buf, argv[1], phys_num) == -1) {
fprintf(stderr, "read_data_block has failed...\n");
exit(EXIT_FAILURE);
}
struct minix_dir_entry dir_entry = {0};
for (size_t j = 0; j < BLOCK_SIZE / sizeof(struct minix_dir_entry);
j++) {
memcpy(&dir_entry, &buf[j * sizeof(struct minix_dir_entry)],
sizeof(struct minix_dir_entry));
if (!S_ISDIR(inode.i_mode)) {
fprintf(stderr,
"Inode isn't associated to a directory, cannot read "
"the contents associated with the given inode (n°%d)\n",
inode_nb);
exit(EXIT_FAILURE);
}
if (strlen(dir_entry.name) != 0) {
fprintf(stdout, "Directory entry : %s\t(Inode n°%d)\n",
dir_entry.name, dir_entry.inode);
}
}
}
return EXIT_SUCCESS;
}