デバイスが READ Onlyかどうかの判定

Linuxでは ioctlの BLKROGETコマンドを使うと read onlyか
どうかが得られるようである。(Readonlyでマウントしたかどうか
ではなく、デバイスレベルで Readonlyかどうかという話です)

コード

#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <linux/fs.h>

int main(int argc, char *argv[])
{
    int fd, ret;
    int readonly;

    if (argc < 2) {
        printf("Usage: %s devpath\n", argv[0]);
        return 1;
    }

    fd = open(argv[1], O_RDONLY);
    if (fd < 0) {
        perror("read:");
    }

    ret = ioctl(fd, BLKROGET, &readonly);
    if (ret != 0) {
        perror("ioctl(BLKROGET)");
    }

    printf("@@ %s is %s\n", argv[1], readonly ? "readonly" : "not readonly");

    close(fd);

    return 0;
}

テスト

Write Protect無効の SDカード
% sudo ./a.out /dev/mmcblk0
@@ /dev/mmcblk0 is not readonly
Write Protect有効の SDカード
% sudo ./a.out /dev/mmcblk0
@@ /dev/mmcblk0 is readonly

ちゃんと反映されるようです。