Skip to content
Snippets Groups Projects
Select Git revision
  • fbf3d54caac6b4f180c596f1f2957d5588b78d75
  • master default protected
2 results

read_dir.c

Blame
  • user avatar
    iliya authored
    fbf3d54c
    History
    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;
    }