MBRの有無の判定

マスターブートレコード - Wikipedia


510バイトが 55, 511バイトが AAなので以下のような感じで
いいのだろうか ?

コード

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd;
    ssize_t size;
    off_t ret;
    unsigned short magic;

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

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

    ret = lseek(fd, 510, SEEK_CUR);
    if (ret < 0)
        perror("leek:");

    size = read(fd, &magic, 2);
    if (size < 0)
        perror("read:");

    if (magic == 0xAA55) {
        printf("%s has MBR!!\n", argv[1]);
    } else {
        printf("%s does not have MBR\n", argv[1]);
    }

    return 0;
}

テスト

% gcc -o mbr mbr.c
% sudo ./mbr /dev/sda
/dev/sda has MBR!!

それらしくはある。