static void print_kind(int filekind, u8 size, int size_known) { char buf[256], *kindname; if (filekind == 0) kindname = "Regular file"; else if (filekind == 1) kindname = "Block device"; else if (filekind == 2) kindname = "Character device"; else kindname = "Unknown kind"; if (size_known) { format_size_verbose(buf, size); print_line(0, "%s, size %s", kindname, buf); } else { print_line(0, "%s, unknown size", kindname); } }
void detect_linux_lvm2(SECTION *section, int level) { unsigned char *buf; int at, i; char s[256]; u8 labelsector; u4 labeloffset; u8 pvsize, mdoffset, mdsize; int mda_version; for (at = 0; at < 4; at++) { if (get_buffer(section, at * 512, 512, (void **)&buf) < 512) continue; /* check signature */ if (memcmp(buf, "LABELONE", 8) != 0) continue; labelsector = get_le_quad(buf + 8); labeloffset = get_le_long(buf + 20); if (memcmp(buf + 24, "LVM2 001", 8) != 0) { get_string(buf + 24, 8, s); print_line(level, "LABELONE label at sector %d, unknown type \"%s\"", at, s); return; } print_line(level, "Linux LVM2 volume, version 001"); print_line(level + 1, "LABELONE label at sector %d", at); if (labeloffset >= 512 || labelsector > 256 || labelsector != at) { print_line(level + 1, "LABELONE data inconsistent, aborting analysis"); return; } /* "UUID" of this physical volume */ format_uuid_lvm(buf + labeloffset, s); print_line(level + 1, "PV UUID %s", s); /* raw volume size */ pvsize = get_le_quad(buf + labeloffset + 32); format_size_verbose(s, pvsize); print_line(level + 1, "Volume size %s", s); /* find first metadata area in list */ mdoffset = 0; for (i = 0; i < 16; i++) if (get_le_quad(buf + labeloffset + 40 + i * 16) == 0) { i++; mdoffset = get_le_quad(buf + labeloffset + 40 + i * 16); mdsize = get_le_quad(buf + labeloffset + 40 + i * 16 + 8); break; } if (mdoffset == 0) return; if (get_buffer(section, mdoffset, mdsize, (void **)&buf) < mdsize) return; if (memcmp(buf + 4, " LVM2 x[5A%r0N*>", 16) != 0) return; mda_version = get_le_long(buf + 20); print_line(level + 1, "Meta-data version %d", mda_version); /* TODO: parse the metadata area (big task...) */ return; } }