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"
29 #define MINIX_SUPERBLOCK_OFFSET 0x400
31 #define MINIX_SUPER_MAGIC 0x137F
32 #define MINIX_SUPER_MAGIC2 0x138F
33 #define MINIX2_SUPER_MAGIC 0x2468
34 #define MINIX2_SUPER_MAGIC2 0x2478
35 #define MINIX3_SUPER_MAGIC 0x4d5a
37 struct minix_super_block
41 uint16_t s_imap_blocks;
42 uint16_t s_zmap_blocks;
43 uint16_t s_firstdatazone;
44 uint16_t s_log_zone_size;
51 struct minix3_super_block {
54 uint16_t s_imap_blocks;
55 uint16_t s_zmap_blocks;
56 uint16_t s_firstdatazone;
57 uint16_t s_log_zone_size;
64 uint8_t s_disk_version;
67 int volume_id_probe_minix(struct volume_id *id, uint64_t off, uint64_t size)
70 struct minix_super_block *ms;
71 struct minix3_super_block *m3s;
73 info("probing at offset 0x%llx", (unsigned long long) off);
75 buf = volume_id_get_buffer(id, off + MINIX_SUPERBLOCK_OFFSET, 0x200);
79 ms = (struct minix_super_block *) buf;
81 if (ms->s_magic == MINIX_SUPER_MAGIC ||
82 ms->s_magic == bswap_16(MINIX_SUPER_MAGIC)) {
83 strcpy(id->type_version, "1");
86 if (ms->s_magic == MINIX_SUPER_MAGIC2 ||
87 ms->s_magic == bswap_16(MINIX_SUPER_MAGIC2)) {
88 strcpy(id->type_version, "1");
91 if (ms->s_magic == MINIX2_SUPER_MAGIC ||
92 ms->s_magic == bswap_16(MINIX2_SUPER_MAGIC)) {
93 strcpy(id->type_version, "2");
96 if (ms->s_magic == MINIX2_SUPER_MAGIC2 ||
97 ms->s_magic == bswap_16(MINIX2_SUPER_MAGIC2)) {
98 strcpy(id->type_version, "2");
102 m3s = (struct minix3_super_block *) buf;
103 if (m3s->s_magic == MINIX3_SUPER_MAGIC ||
104 m3s->s_magic == bswap_16(MINIX3_SUPER_MAGIC)) {
105 strcpy(id->type_version, "3");
111 volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);