X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fvolume_id%2Flib%2Fminix.c;h=64945067e84c91b9971bc9f18d0dd822d1b10e62;hp=c5e16e783b39fd3ebccca09027aa58fcb19dc8c0;hb=6ed3edfb6901d76d0ad91e992aee41e42e816516;hpb=f7dd3a57a40282f1c3fb9ad90a30d58b31b64ff8 diff --git a/extras/volume_id/lib/minix.c b/extras/volume_id/lib/minix.c index c5e16e783..64945067e 100644 --- a/extras/volume_id/lib/minix.c +++ b/extras/volume_id/lib/minix.c @@ -1,7 +1,7 @@ /* * volume_id - reads filesystem label and uuid * - * Copyright (C) 2005 Kay Sievers + * Copyright (C) 2005-2007 Kay Sievers * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -26,6 +26,14 @@ #include "libvolume_id.h" #include "util.h" +#define MINIX_SUPERBLOCK_OFFSET 0x400 + +#define MINIX_SUPER_MAGIC 0x137F +#define MINIX_SUPER_MAGIC2 0x138F +#define MINIX2_SUPER_MAGIC 0x2468 +#define MINIX2_SUPER_MAGIC2 0x2478 +#define MINIX3_SUPER_MAGIC 0x4d5a + struct minix_super_block { uint16_t s_ninodes; @@ -40,38 +48,63 @@ struct minix_super_block uint32_t s_zones; } PACKED; -#define MINIX_SUPERBLOCK_OFFSET 0x400 +struct minix3_super_block { + uint32_t s_ninodes; + uint16_t s_pad0; + uint16_t s_imap_blocks; + uint16_t s_zmap_blocks; + uint16_t s_firstdatazone; + uint16_t s_log_zone_size; + uint16_t s_pad1; + uint32_t s_max_size; + uint32_t s_zones; + uint16_t s_magic; + uint16_t s_pad2; + uint16_t s_blocksize; + uint8_t s_disk_version; +} PACKED; -int volume_id_probe_minix(struct volume_id *id, uint64_t off) +int volume_id_probe_minix(struct volume_id *id, uint64_t off, uint64_t size) { + uint8_t *buf; struct minix_super_block *ms; + struct minix3_super_block *m3s; info("probing at offset 0x%llx", (unsigned long long) off); - ms = (struct minix_super_block *) volume_id_get_buffer(id, off + MINIX_SUPERBLOCK_OFFSET, 0x200); - if (ms == NULL) + buf = volume_id_get_buffer(id, off + MINIX_SUPERBLOCK_OFFSET, 0x200); + if (buf == NULL) return -1; - if (le16_to_cpu(ms->s_magic) == 0x137f) { + ms = (struct minix_super_block *) buf; + + if (ms->s_magic == MINIX_SUPER_MAGIC || + ms->s_magic == bswap_16(MINIX_SUPER_MAGIC)) { strcpy(id->type_version, "1"); goto found; } - - if (le16_to_cpu(ms->s_magic) == 0x1387) { + if (ms->s_magic == MINIX_SUPER_MAGIC2 || + ms->s_magic == bswap_16(MINIX_SUPER_MAGIC2)) { strcpy(id->type_version, "1"); goto found; } - - if (le16_to_cpu(ms->s_magic) == 0x2468) { + if (ms->s_magic == MINIX2_SUPER_MAGIC || + ms->s_magic == bswap_16(MINIX2_SUPER_MAGIC)) { strcpy(id->type_version, "2"); goto found; } - - if (le16_to_cpu(ms->s_magic) == 0x2478) { + if (ms->s_magic == MINIX2_SUPER_MAGIC2 || + ms->s_magic == bswap_16(MINIX2_SUPER_MAGIC2)) { strcpy(id->type_version, "2"); goto found; } + m3s = (struct minix3_super_block *) buf; + if (m3s->s_magic == MINIX3_SUPER_MAGIC || + m3s->s_magic == bswap_16(MINIX3_SUPER_MAGIC)) { + strcpy(id->type_version, "3"); + goto found; + } goto exit; found: