Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список томов/разделов/смонтированных устройств, Как получить его? 
:(
    Опции темы
andrew_121
Дата 7.6.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Нашел. Вот разделил их по категориям. Просьба поправить меня, если какой-то тип ФС не в нужной ему категории.
Код

static const char* hd_fs[] = {
    "adfs",
    "affs",
    "autofs",
    "befs",
    "bfs",
    "binfmt_misc",
    "coda",
    "coh",
    "cramfs",
    "devfs",
    "devpts",
    "efs",
    "ext",
    "ext2/ext3",
    "ext2",
    "fat",
    "fusectl",
    "hpfs",
    "hugetlbfs",
    "jffs2",
    "jffs",
    "jfs",
    "lustre",
    "minix",
    "minix (30 char.)",
    "minix v2",
    "minix v2 (30 char.)",
    "msdos",
    "novell",
    "nfs",
    "nfsd",
    "ntfs",
    "openprom",
    "proc",
    "qnx4",
    "ramfs",
    "reiserfs",
    "romfs",
    "smb",
    "squashfs",
    "sysfs",
    "sysv2",
    "sysv4",
    "tmpfs",
    "ufs",
    "vfat"
    "vxfs",
    "xenix",
    "xfs",
    "xia"
};

static const char* cd_fs[] = {
    "iso9660",
    "isofs",
    "udf"
};

static const char* usb_fs[] = {
    "usbdevfs"
};



Добавлено @ 11:42
Цитата(MAKCim @  7.6.2009,  11:20 Найти цитируемый пост)
естественно

Ну подскажи smile 


Цитата(MAKCim @  7.6.2009,  11:20 Найти цитируемый пост)
мы можем узнать MAJOR номер файла устройства
а вот по MAJOR номеру можем узнать тип устройства

А это как? smile


Это сообщение отредактировал(а) andrew_121 - 7.6.2009, 12:03


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 7.6.2009, 13:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



andrew_121, 
как можно сопоставлять файловой системе тип устройства?
я могу iso образ к примеру прикрутить через loop или на instance ramfs

Цитата(andrew_121 @  7.6.2009,  11:39 Найти цитируемый пост)
Ну подскажи

что?

Цитата(andrew_121 @  7.6.2009,  11:39 Найти цитируемый пост)
А это как?

берем первую строку из /etc/mtab и делаем stat
по st_dev находим MAJOR номер и сравниваем с linux/major.h


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 7.6.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Цитата(MAKCim @  7.6.2009,  13:07 Найти цитируемый пост)
я могу iso образ к примеру прикрутить через loop или на instance ramfs

Да. Но стандартный юзер этого делать не станет smile 


Цитата(MAKCim @  7.6.2009,  13:07 Найти цитируемый пост)
берем первую строку из /etc/mtab и делаем stat
по st_dev находим MAJOR номер и сравниваем с linux/major.h

Это понятно. Но хочется без вызовов системных функций.

Кароче вот что у меня получилось. Жду критики/исправлений/дополнений.
Код

#include <fstream>
#include <cctype>
#include <string>
#include <vector>
#include <algorithm>

static const char* hd_fs[] = {
    "adfs",
    "affs",
    "autofs",
    "befs",
    "bfs",
    "binfmt_misc",
    "coda",
    "coh",
    "cramfs",
    "devfs",
    "devpts",
    "efs",
    "ext",
    "ext2/ext3",
    "ext2",
    "fat",
    "fusectl",
    "fuseblk",
    "hpfs",
    "hugetlbfs",
    "jffs2",
    "jffs",
    "jfs",
    "lustre",
    "minix",
    "minix (30 char.)",
    "minix v2",
    "minix v2 (30 char.)",
    "msdos",
    "novell",
    "nfs",
    "nfsd",
    "ntfs",
    "openprom",
    "proc",
    "qnx4",
    "ramfs",
    "reiserfs",
    "romfs",
    "smb",
    "squashfs",
    "sysfs",
    "sysv2",
    "sysv4",
    "tmpfs",
    "ufs",
    "vfat"
    "vxfs",
    "xenix",
    "xfs",
    "xia"
};

static const char* cd_fs[] = {
    "iso9660",
    "isofs",
    "udf"
};

static const char* usb_fs[] = {
    "usbdevfs"
};

/***************************************************************************/

template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator copy_if(    InputIterator first,
                                InputIterator last,
                                OutputIterator result,
                                Predicate pred
                            )
{
    InputIterator currentIn = first;
    OutputIterator currentOut = result;
    while (currentIn != last) {
        if (pred(*currentIn)) {
            *currentOut = *currentIn;
            ++currentOut;
            ++currentIn;
        } else {
            ++currentIn;
        }
    }
    
    return currentOut;
}

/***************************************************************************/

struct Drive {
    typedef enum _d_type {hdd, usb, cdrom} d_type;
    /**/
    Drive() {}
    Drive(const Drive& d) {
        device = d.device;
        mpoint = d.mpoint;
        type = d.type;
    }
    void reset() {
        device.clear();
        mpoint.clear();
    }
    std::string device;
    std::string mpoint;
    d_type type;
};

typedef std::vector<Drive> DriveList;

/***************************************************************************/

bool is_ignored_predicate(std::string::value_type v) {
    return (v != ' ' && v != '\t');
}

bool is_not_ignored_predicate(std::string::value_type v) {
    return !is_ignored_predicate(v);
}

/***************************************************************************/

bool parse_string(Drive* d, std::string& s) {
    if ( !(s.substr(0, 5) == "/dev/") ) return false;
    
    std::string type;
    std::string::iterator it1;
    std::string::iterator it2;
    
    it1 = s.begin();
    it2 = std::find_if(it1, s.end(), is_not_ignored_predicate);
    d->device.resize(it2-it1);
    std::copy(it1, it2, d->device.begin());
    
    it1 = std::find_if(it2, s.end(), is_ignored_predicate);
    it2 = std::find_if(it1, s.end(), is_not_ignored_predicate);
    d->mpoint.resize(it2-it1);
    std::copy(it1, it2, d->mpoint.begin());
    
    it1 = std::find_if(it2, s.end(), is_ignored_predicate);
    it2 = std::find_if(it1, s.end(), is_not_ignored_predicate);
    type.resize(it2-it1);
    std::copy(it1, it2, type.begin());

    /* HDD */    
    for ( const char** p = &hd_fs[0]; *p != hd_fs[sizeof(hd_fs)/sizeof(hd_fs[0])]; p++ ) {
        if ( type == *p ) {
            d->type = Drive::hdd;
            return true;
        }
    }
    /* USB */    
    for ( const char** p = &usb_fs[0]; *p != usb_fs[sizeof(usb_fs)/sizeof(usb_fs[0])]; p++ ) {
        if ( type == *p ) {
            d->type = Drive::usb;
            return true;
        }
    }
    /* CD-ROM*/    
    for ( const char** p = &cd_fs[0]; *p != cd_fs[sizeof(cd_fs)/sizeof(cd_fs[0])]; p++ ) {
        if ( type == *p ) {
            d->type = Drive::cdrom;
            return true;
        }
    }
    
    return false;
}

/***************************************************************************/

DriveList get_all_drives() {
    const char* fname = "/etc/mtab";
    std::string buf;
    Drive drive;
    DriveList list;
    
    std::ifstream in(fname);
    if ( !in ) { return list; }
    
    while ( !in.eof() ) {
        std::getline(in, buf, '\n');
        if ( buf.length() < 5 ) continue;

        std::copy(std::find_if(buf.begin(), buf.end(), is_ignored_predicate),
                    buf.end(),
                    buf.begin()
                    );

        if ( buf[0] == '#' ) continue;
        
        if ( parse_string(&drive, buf) ) {
            list.push_back(drive);
        }
        drive.reset();
    }
    
    return list;
}

/***************************************************************************/

template<Drive::d_type T> bool is_required_drive_type(const Drive& d) {
    return d.type == T;
}

template<Drive::d_type T> DriveList get_drives() {
    DriveList list = get_all_drives();
    DriveList::iterator it;
    it = copy_if(list.begin(), list.end(), list.begin(), is_required_drive_type<T>);
    list.resize(it-list.begin());
    
    return list;
}

/***************************************************************************/

int main(int argc, char** argv) {

    DriveList h = get_drives<Drive::hdd>();
    DriveList u = get_drives<Drive::usb>();
    DriveList c = get_drives<Drive::cdrom>();

    return 0;
}

/***************************************************************************/



Это сообщение отредактировал(а) andrew_121 - 7.6.2009, 13:41


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 7.6.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(andrew_121 @  7.6.2009,  13:40 Найти цитируемый пост)
Да. Но стандартный юзер этого делать не станет

это очень плохая аргументация
недетерминированность - это плохо


Цитата(andrew_121 @  7.6.2009,  13:40 Найти цитируемый пост)
Это понятно. Но хочется без вызовов системных функций.

ага
хочется мороженного без молока
open считается системной функцией? ;)


Цитата(andrew_121 @  7.6.2009,  13:40 Найти цитируемый пост)
Жду критики/исправлений/дополнений.

1. C++
2. 
Код

#!/usr/bin/python
import re
import sys
fs_types = {"hd_fs": (), "cd_fs": (), "usb_fs": ()}
filter(lambda x: x != False, map(lambda s: re.split("\s+", s)[2] in fs_types[sys.argv[1]] and s[:s.find(" ")], open("/etc/mtab")))

к вопросу о краткости
3. замечание об универсальности


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 7.6.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Цитата(MAKCim @  7.6.2009,  14:17 Найти цитируемый пост)
это очень плохая аргументация
недетерминированность - это плохо

Согласен. Буду править.



Цитата(MAKCim @  7.6.2009,  14:17 Найти цитируемый пост)
1. C++

Согласен. Но мне для проги написанной на Кут.  smile 



Цитата(MAKCim @  7.6.2009,  14:17 Найти цитируемый пост)
3. замечание об универсальности

Не понял...?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 7.6.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(andrew_121 @  7.6.2009,  14:37 Найти цитируемый пост)
Не понял...? 


Цитата(andrew_121 @  7.6.2009,  13:40 Найти цитируемый пост)
Да. Но стандартный юзер этого делать не станет

в этом неуниверсальность


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
andrew_121
Дата 7.6.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Ааа...
Буду развивать...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
_GRIN_
Дата 3.7.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



andrew_121, если на твоей машине есть демоны udev, dbus и hal (как полагаю на 95% nix* систем), то я советую посмотреть в сторону  hal-a. Всё делаю через него, включая различные уведомления об измененеии какого-либо параметра интересующего меня железа. Ссылочка на спецификацию: http://people.freedesktop.org/~david/hal-spec/hal-spec.html


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
andrew_121
Дата 4.7.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



_GRIN_, Дело в том, что сей код, был так задуман.
За ссылочку спасибо. Попрасвещаюсь.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Cheloveck
Дата 8.7.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



По чистой случайности сейчас занимался тем же самым. Вот пример использования HAL
Код

extern "C" {
#include <dbus/dbus.h>
#include <libhal.h>
#include <libhal-storage.h>
}

#include <iostream>

int main(int argc, char *argv[])
{
    (void)argc; // unused parametr.
    (void)argv; // unused parametr.

    DBusError error;
    DBusConnection *connection;
    LibHalContext *context;

    dbus_error_init( &error );

    connection = dbus_bus_get( DBUS_BUS_SYSTEM, &error );
    if( !connection )
    {
        std::cerr << "Error dbus_bus_get: " << error.name << ": " <<
            error.message << std::endl;
        dbus_error_free( &error );
        return 1;
    }

    context = libhal_ctx_new();
    if( !context )
    {
        std::cerr << "Error: can not create LibHalContext\n";
        dbus_error_free( &error );
        return 2;
    }

    if( !libhal_ctx_set_dbus_connection( context, connection ) )
    {
        std::cerr << "Error: can not set dbus connection\n";
        dbus_error_free( &error );
        libhal_ctx_free( context );
        return 3;
    }

    if( !libhal_ctx_init( context, &error ) )
    {
        std::cerr << "Error: can not init libhal\n";
        dbus_error_free( &error );
        libhal_ctx_free( context );
        dbus_connection_unref( connection );
    }

    char **devices;
    char **volumes;
    int num_devices;
    int num_volumes;
    LibHalDrive *drive;
    LibHalVolume *volume;

    devices = libhal_get_all_devices( context, &num_devices, &error );

    for( int i = 0; i < num_devices; i++ )
    {
        drive = libhal_drive_from_udi( context, devices[i] );
        if( !drive )
            continue;

        const char * device_file = libhal_drive_get_device_file( drive );
        if( device_file )
            std::cout << "Drive: " <<  device_file<< std::endl;

        std::cout << "Size: " << libhal_drive_get_size( drive ) <<
            std::endl;

        const char * scheme = libhal_drive_get_partition_scheme( drive );
        if( scheme )
            std::cout << "Partition scheme: " << scheme << std::endl;

        volumes = libhal_drive_find_all_volumes( context, drive, &num_volumes );
        if( volumes )
        {
            for( int j = 0; j < num_volumes; j++ )
            {
                volume = libhal_volume_from_udi( context, volumes[j] );
                if( !volume )
                    continue;

                const char * volume_device_file =
                    libhal_volume_get_device_file( volume );
                if( volume_device_file )
                    std::cout << "Volume: " << volume_device_file << std::endl;

                const char * mount_point =
                    libhal_volume_get_mount_point( volume );
                if( mount_point )
                std::cout << "Mount point: " << mount_point << std::endl;

                std::cout << std::endl;
            }
            libhal_free_string_array( volumes );
        }

        libhal_drive_free( drive );
        std::cout << "-----------------------\n\n";
    }

    libhal_free_string_array( devices );
    libhal_ctx_shutdown( context, &error );
    dbus_connection_unref( connection );
    libhal_ctx_free( context );
    dbus_error_free( &error );


    return 0;
}


Это я тут сам разбирался, поэтому не всё красиво, но работает правильно!
У меня показывает так
Код

Drive: /dev/sde
Size: 0
-----------------------

Drive: /dev/sdd
Size: 0
-----------------------

Drive: /dev/sdc
Size: 0
-----------------------

Drive: /dev/sdf
Size: 0
-----------------------

Drive: /dev/scd0
Size: 0
-----------------------

Drive: /dev/sdb
Size: 500106780160
Partition scheme: mbr
Volume: /dev/sdb1
Mount point: /home/sergey/server

-----------------------

Drive: /dev/sda
Size: 500106780160
Partition scheme: mbr
Volume: /dev/sda7
Mount point: /home/sergey/docs

Volume: /dev/sda6
Mount point: /home

Volume: /dev/sda5

Volume: /dev/sda2

Volume: /dev/sda1
Mount point: /

-----------------------

Drive: /dev/fd0
Size: 0
-----------------------


Там можно получить аналогичным способом любую информацию о дисках, разделах... да собственно обо всех устройствах.


--------------------
user posted image
PM Jabber   Вверх
andrew_121
Дата 9.7.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Cheloveck, Это понятно. Но сей код мне нужен для пользовательской программы написанной на Qt. Нет смысла привязывать ее к Hal.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Cheloveck
Дата 9.7.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



andrew_121, моя программа тоже на Qt, но к HAL я всё же решил привязать, ибо удобно))


--------------------
user posted image
PM Jabber   Вверх
andrew_121
Дата 9.7.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Cheloveck, Идеология Qt - кроссплатформенность! Hal ее нарушает.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.