DCMD_FSYS_MOUNTED_AT, DCMD_FSYS_MOUNTED_BY, DCMD_FSYS_MOUNTED_ON

Получение информации монтирования

Прототип:

#include <sys/dcmd_blk.h>
#define DCMD_FSYS_MOUNTED_ON __DIOF( _DCMD_FSYS, 16, char[256] )
#define DCMD_FSYS_MOUNTED_AT __DIOF( _DCMD_FSYS, 17, char[256] )
#define DCMD_FSYS_MOUNTED_BY __DIOF( _DCMD_FSYS, 18, char[256] )

Аргументы:

filedes
Файловый дескриптор открытого устройства.
dcmd
DCMD_FSYS_MOUNTED_AT, DCMD_FSYS_MOUNTED_BY или DCMD_FSYS_MOUNTED_ON.
dev_data_ptr
Указатель на char[256].
n_bytes
Размер буфера.
dev_info_ptr
NULL.

Описание:

Команда используется в сочетании с вызовом devctl(), а все перечисленные аргументы являются его типовыми параметрами. Данные команды позволяют получить символьные строки, характеризующие отношение файловой системы, ассоциированной с filedes, с другими файловыми системами:

DCMD_FSYS_MOUNTED_ON
Устройство, поверх которого смонтирована файловая система. Отвечает на вопрос: кто раньше меня в иерархии?
DCMD_FSYS_MOUNTED_BY
Точка монтирования устройства, если она существует. Отвечает на вопрос: кто позже меня в иерархии?
DCMD_FSYS_MOUNTED_AT
Отвечает на вопрос: Где я и кто владелец?

Исходящие данные:

Отсутствуют.

Входящие данные:

Ассоциированный с командой путь.

Коды ошибок:

Функция devctl() может вернуть дополнительный код ошибки, относительно описанных на странице функции:

ENODEV
Запись не существует.

Примеры:

Рассмотрим раздел файловой системы /dev/hd0t79, находящийся на устройстве /dev/hd0, смонтированный в каталог / и имеющий директорию /tmp. Рассмотрим применение различных команд к этим путям:

Команда /dev/hd0t79 / /tmp
DCMD_FSYS_MOUNTED_ON /dev/hd0 /dev/hd0t79 /dev/hd0t79
DCMD_FSYS_MOUNTED_BY /
DCMD_FSYS_MOUNTED_AT /dev/hd0t79 / /

Ошибка ENODEV может быть возвращена, например, в следующих случаях:

Команда DCMD_FSYS_MOUNTED_ON используется утилитой mount для получения точек монтирования. Рассмотрим упрощенный код, иллюстрирующий её логику работы. Менеджер процессов создаёт и обслуживает префикс /proc/mount, обходя которую можно получить перечень актуальных точек монтирования:

#include <string.h>
#include <nbutil.h>
#include <dirent.h>
#include <sys/ftype.h>
#include <sys/dcmd_blk.h>
void scan( char *path, size_t pathsize, int size )
{
DIR *dp;
struct dirent *dent;
size_t len = strlen( path );
if ( !(dp = opendir( path )) )
return;
while ( (dent = readdir( dp )) )
{
int ret, nd, pid, chid, handle;
size_t ftype;
char on[PATH_MAX],
ft[16];
struct stat st;
if ( (strcmp( dent->d_name, "." ) == 0) || (strcmp( dent->d_name, ".." ) == 0) ||
(len + strlen( dent->d_name ) + 1 > pathsize /* path too long */) )
continue;
ret = sscanf( dent->d_name, "%d,%d,%d,%d,%zu", &nd, &pid, &chid, &handle, &ftype );
ft[0] = on[0] = '\0';
path[len] = '/';
strcpy( &path[len + 1], dent->d_name );
memset( &st, 0, sizeof( st ) );
if ( (stat( path, &st ) == -1) || (ftype == _FTYPE_MOUNT) || (ret != 5) )
{
if ( (ret != 5) && (S_ISDIR( st.st_mode )) )
scan( path, pathsize, size );
continue;
}
if ( S_ISDIR( st.st_mode ) && ftype == _FTYPE_ANY )
{
struct statvfs stvfs;
int fd;
if ( (fd = open( path, O_RDONLY )) == -1 )
continue;
else {
devctl( fd, DCMD_FSYS_MOUNTED_ON, on, PATH_MAX, 0 );
ret = fstatvfs( fd, &stvfs );
close( fd );
if ( ret == -1 )
continue;
strcpy( ft, stvfs.f_basetype );
}
} else
continue;
path[len] = '\0';
printf( "%12s ", (*(path + size) == '\0') ? "/" : path + size );
if ( ft[0] )
printf( "%10s ", ft );
else
printf( "%10zu ", ftype );
printf( "%s\n", (on[0]) ? on : "none" );
}
}
void main()
{
char buffer[PATH_MAX];
strcpy( buffer, "/proc/mount" );
printf( "%12s %10s %s\n", "Mount point", "FS type", "Device" );
scan( buffer, PATH_MAX, strlen( buffer ) );
}

Результат работы этого кода будет иметь следующий вид:

Mount point FS type Device / qnx6 /net/EA3af59d.net.intra/dev/hd0t177 /tmp qnx4 /net/EA3af59d.net.intra/dev/ram0

Тематические ссылки:

devctl()




Предыдущий раздел: перейти