чтение растрового изображения linux inode

Я собираюсь получить растровые изображения inode Linux с помощью C++. Я использую этот код, чтобы сначала получить суперблок:

    #include <cstdlib>
    #include <linux/ext2_fs.h>
    #include <linux/fs.h>
    #include <iostream>
    #include <stdio.h>
    #include <fstream>
    #include <fcntl.h>
    #include <linux/fs.h>

    using namespace std;

    /*
     * 
     */

    int main() {
        int fd;
        char boot[1024];
        struct ext2_super_block super_block;

        fd = open("/dev/sda1", O_RDONLY);
    /* Reads the boot section and the superblock */
    read(fd, boot, 1024);
    read(fd, &super_block, sizeof (struct ext2_super_block));

    /* Prints the Magic Number */
    printf("%x\n", super_block.s_magic);

    close(fd);

    return 0;
}

но каждый раз, когда я запускаю его, я получаю сообщение об ошибке:

In file included from main.cpp:2:0:
/usr/include/linux/ext2_fs.h:181:18: error: ‘S_ISDIR’ was not declared in this scope
/usr/include/linux/ext2_fs.h:183:23: error: ‘S_ISREG’ was not declared in this scope

Я не смог найти хороший пример или учебник для этого. Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ:
Я включил <linux/stat.h>, но все равно получаю ту же ошибку.


person hamedkh    schedule 20.12.2012    source источник
comment
Вы не можете прочитать linux inode table: таких вещей нет, так как каждая файловая система имеет свой формат (ext2,3,4/reiserfs/xfs/btrfs/и т.д.)   -  person Yann Droneaud    schedule 20.12.2012
comment
Кстати, для чтения ext2, ext3 или ext4 вы можете использовать функции, предоставляемые libext2fs из пакета e2fsprogs.   -  person Yann Droneaud    schedule 20.12.2012
comment
Кто поможет мне использовать этот пакет?   -  person hamedkh    schedule 20.12.2012
comment
вы можете взглянуть на github.com/mandriva-management-console/pulse-imaging-client/   -  person Yann Droneaud    schedule 20.12.2012


Ответы (2)


#grep -rw S_ISREG /usr/src/linux/include
/usr/src/linux/include/linux/fs.h:  if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
/usr/src/linux/include/linux/fs.h.~1~:  if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
/usr/src/linux/include/linux/stat.h:#define S_ISREG(m)  (((m) & S_IFMT) == S_IFREG)

Таким образом, вы должны найти stat.h в дереве исходных текстов вашего ядра и включить его.

person zed_0xff    schedule 20.12.2012
comment
как я могу это использовать... не могли бы вы мне помочь? я включил ‹stat.h› в свой проект, но все равно получаю ошибки - person hamedkh; 20.12.2012
comment
‹linux/stat.h› будет работать, только если вы передадите -I/path/to/your/linux/kernel/sources своему компилятору - person zed_0xff; 20.12.2012
comment
Должен ли я включить его в свой проект или в файл ext2_fs.h? - person hamedkh; 20.12.2012
comment
Я включаю его как в основной проект, так и в файл ext2_fs.h, но все равно получаю ту же ошибку. - person hamedkh; 20.12.2012

Исходный код Linux «stat.h» — это не тот же файл, что и в C-библиотеке. Просто у них одно и то же имя. Вам нужно будет установить свой путь включения, чтобы найти правильный stat.h (вам могут понадобиться ОБА, в зависимости от того, что вы пытаетесь сделать).

person Mats Petersson    schedule 20.12.2012
comment
не могли бы вы дать мне образец исходного кода для чтения растровых изображений суперблока и инода? - person hamedkh; 20.12.2012