diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2007-04-28 23:45:49 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2007-04-28 23:45:49 +0200 |
commit | 6ed3edfb6901d76d0ad91e992aee41e42e816516 (patch) | |
tree | d80090bb713965d1a5b211db2f1d450ff8e73a2c /extras/volume_id | |
parent | e18e6d79996edeeb07e122f3582a688c3ef4f6b9 (diff) |
volume_id: minix version 3 support
Diffstat (limited to 'extras/volume_id')
-rw-r--r-- | extras/volume_id/lib/minix.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/extras/volume_id/lib/minix.c b/extras/volume_id/lib/minix.c index dffc52a4d8..64945067e8 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 <kay.sievers@vrfy.org> + * Copyright (C) 2005-2007 Kay Sievers <kay.sievers@vrfy.org> * * 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, 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: |