LINUX.ORG.RU

[kernel] Как определить включена ли защита от записи на флешке?

 


0

0

На некоторых флешках (и SD-карточках) есть переключатель защиты от записи. При подключении флешки к компьютеру в системном логе появляется запись "Write Protect is off/On", то есть ядро умеет определять положение этого переключателя. Мне в своей программе это тоже нужно уметь определять. Нашёл место где это делается:<linux sources>/drivers/scsi/sd.c. Это делает функция sd_read_write_protect_flag() и потом сохраняет флаг в структуру scsi_disk. Смотрел в сторону sysfs, procfs, ioctl для scsi generic, но тут такой информации не нашёл. Может кто подскажет как извлечь нужную мне инфу в userspace?


Может подойдет ioctl(,BLKROGET,) Только нужно подключить соотв. заголовочный файл. Также можно самому составить команду scsi через ioctl(,SG_IO,)

Chumka ★★★
()
Ответ на: комментарий от Chumka

>Может подойдет ioctl(,BLKROGET,) Только нужно подключить соотв. заголовочный файл.

Идея понравилась, но не работает. Это даже лучше чем идти через scsi, т.к. можно использовать одно решение для SD-карточек и флешек. В настоящий момент могу проверить только на SD-карточке с lock'ом. Флешки с защёлкой в ближайшие дни мне не видать.

Вот написал тест:

#include <sys/ioctl.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fs.h>

int main(int argc, char **argv)
{
    int a,fd;
    
    fd=open("/dev/mmcblk0", O_RDONLY);
    if (fd==-1)
    {
	printf("error opening dev file\n");
	return 1;
    }
    if (ioctl(fd, BLKROGET, &a)==0)
    {
	printf("%d\n", a);
	return 0;
    }
    else
    {
	printf("error ioctl call\n");
	return 2;
    }
}

Независимо от положения защёлки всегда печатает 0. Ещё заметил, что автомаунтер в GNOME с задачей определения режима записи/чтения справляется.

gogi
() автор топика
Ответ на: комментарий от devinull

>А не достаточно того, что в mtab она прописывается как ro? 
Да вроде прописыватеся. Но парсить каждый раз mtab быдлокодисто как-то.

gogi
() автор топика

Посмотри в /sys/class/block/$DEVICENAME/ro. Правда я не знаю - то ли это что нужно, так как нет в наличии девайсов с переключателем защиты от записи, и cat /sys/class/block/*/ro выдаёт одни нули.

Deleted
()
Ответ на: комментарий от Deleted

>Посмотри в /sys/class/block/$DEVICENAME/ro
Посмотрел на нескольких машинах - не везде есть этот файл (хотя каталог может присутствовать). И даже более того, /sys/class/block/ может отсутствовать. Наверное это зависит от конфига ядра. Зато всегда есть /sys/block/$DEVICENAME, но ro там кажется не бывает.
Вобщем буду разбираться с блочными устройствами в конфиге.

gogi
() автор топика
Ответ на: комментарий от gogi

> Наверное это зависит от конфига ядра.

Содержимое /sys ещё часто меняется от версии к версии.

Deleted
()
Ответ на: комментарий от Deleted

Сейчас проверил /sys/class/block/mmcblk0/ro - у меня тоже всегда нули выдаёт. Так что не то.

gogi
() автор топика
Ответ на: комментарий от gogi

>Да вроде прописыватеся. Но парсить каждый раз mtab быдлокодисто как-то.

Дыкть всё уже украдено до нас: getmntent и hasmntopt должны помочь.

Zenom ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.