2 * volume_id - reads filesystem label and uuid
4 * Copyright (C) 2005-2007 Kay Sievers <kay.sievers@vrfy.org>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation version 2 of the License.
26 #include "libvolume_id.h"
27 #include "libvolume_id-private.h"
30 #define MINIX_SUPERBLOCK_OFFSET 0x400
32 #define MINIX_SUPER_MAGIC 0x137F
33 #define MINIX_SUPER_MAGIC2 0x138F
34 #define MINIX2_SUPER_MAGIC 0x2468
35 #define MINIX2_SUPER_MAGIC2 0x2478
36 #define MINIX3_SUPER_MAGIC 0x4d5a
38 struct minix_super_block
42 uint16_t s_imap_blocks;
43 uint16_t s_zmap_blocks;
44 uint16_t s_firstdatazone;
45 uint16_t s_log_zone_size;
52 struct minix3_super_block {
55 uint16_t s_imap_blocks;
56 uint16_t s_zmap_blocks;
57 uint16_t s_firstdatazone;
58 uint16_t s_log_zone_size;
65 uint8_t s_disk_version;
68 int volume_id_probe_minix(struct volume_id *id, uint64_t off, uint64_t size)
71 struct minix_super_block *ms;
72 struct minix3_super_block *m3s;
74 info("probing at offset 0x%llx\n", (unsigned long long) off);
76 buf = volume_id_get_buffer(id, off + MINIX_SUPERBLOCK_OFFSET, 0x200);
80 ms = (struct minix_super_block *) buf;
82 if (ms->s_magic == MINIX_SUPER_MAGIC ||
83 ms->s_magic == bswap_16(MINIX_SUPER_MAGIC)) {
84 strcpy(id->type_version, "1");
87 if (ms->s_magic == MINIX_SUPER_MAGIC2 ||
88 ms->s_magic == bswap_16(MINIX_SUPER_MAGIC2)) {
89 strcpy(id->type_version, "1");
92 if (ms->s_magic == MINIX2_SUPER_MAGIC ||
93 ms->s_magic == bswap_16(MINIX2_SUPER_MAGIC)) {
94 strcpy(id->type_version, "2");
97 if (ms->s_magic == MINIX2_SUPER_MAGIC2 ||
98 ms->s_magic == bswap_16(MINIX2_SUPER_MAGIC2)) {
99 strcpy(id->type_version, "2");
103 m3s = (struct minix3_super_block *) buf;
104 if (m3s->s_magic == MINIX3_SUPER_MAGIC ||
105 m3s->s_magic == bswap_16(MINIX3_SUPER_MAGIC)) {
106 strcpy(id->type_version, "3");
112 volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);