Wpis z mikrobloga

Mirki z #programowanie #linux #embedded #jezykc

Potrzebuję w programie napisanym w języku C wykryć że karta pamięci się zyebała. Mówiąc prościej wykryć kiedy została zamontowana w trybie read only.

Próbowałem za pomocą takiej funkcji:
https://linux.die.net/man/2/statvfs

int statvfs(const char *path, struct statvfs *buf);
W uzyskanej strukturze jest pole unsigned long fflag
i sprawdzając flagę ST
RDONLY nic się nie dzieje. tzn taki kod:

struct statvfs vfs;
statvfs("/dev/mmcblk0p1", &vfs);
if(vfs.f_flag & ST_RDONLY != 0) {
perror("SDcard read only!");
}

Nie zgłasza mi błędu mimo że w /proc/mounts mam kartę zamontowaną tak(read only):

/dev/mmcblk0p1 /mnt/sdcard vfat ro,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro 0 0
Ma ktoś jakieś z tym doświadczenia? Albo pomysły?
  • 11
@Alkreni:

Pewnie to robiłeś, ale wypisujesz sobie vfs.f_flag? Czy jest takie samo w przypadku awarii i poprawnego działania?

Dobra. Już mam. Jak podam ścieżkę do urządzenia czyli /dev/mmcblk0p1 to zawsze zwróci mi to samo czyli ta flaga nie będzie ustawiona.

Jak podam ścieżkę montowania czyli /mnt/sdcard to działa tak jak powinno. Czyli wypisuje błąd jeśli pliki na karcie są read-only

Dzięki mirku za próbę pomocy
@PanBaklazan: Wyłączenie zasilania podczas zapisu. Można naprawić programem fsck.
W zależności od tego czy to duży desktopowy Linux - tam jest automatyczna obsługa wielu typów systemu plików będzie to polecenie:

fsck -a /dev/mmcblk0p1

-a to opcja automatycznej naprawy.

Najpierw odmontuj kartę poleceniem umount.