1/* 2 * volume_id - reads filesystem label and uuid 3 * 4 * Copyright (C) 2006 Kay Sievers <kay.sievers@vrfy.org> 5 * 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. 9 */ 10 11#ifndef _GNU_SOURCE 12#define _GNU_SOURCE 1 13#endif 14 15#ifdef HAVE_CONFIG_H 16# include <config.h> 17#endif 18 19#include <stdio.h> 20#include <stdlib.h> 21#include <unistd.h> 22#include <string.h> 23#include <errno.h> 24#include <ctype.h> 25 26#include "libvolume_id.h" 27#include "util.h" 28 29#define NW_SUPERBLOCK_OFFSET 0x1000 30 31struct netware_super_block { 32 uint8_t SBH_Signature[4]; 33 uint16_t SBH_VersionMajor; 34 uint16_t SBH_VersionMinor; 35 uint16_t SBH_VersionMediaMajor; 36 uint16_t SBH_VersionMediaMinor; 37 uint32_t SBH_ItemsMoved; 38 uint8_t SBH_InternalID[16]; 39 uint32_t SBH_PackedSize; 40 uint32_t SBH_Checksum; 41 uint32_t supersyncid; 42 int64_t superlocation[4]; 43 uint32_t physSizeUsed; 44 uint32_t sizeUsed; 45 uint32_t superTimeStamp; 46 uint32_t reserved0[1]; 47 int64_t SBH_LoggedPoolDataBlk; 48 int64_t SBH_PoolDataBlk; 49 uint8_t SBH_OldInternalID[16]; 50 uint32_t SBH_PoolToLVStartUTC; 51 uint32_t SBH_PoolToLVEndUTC; 52 uint16_t SBH_VersionMediaMajorCreate; 53 uint16_t SBH_VersionMediaMinorCreate; 54 uint32_t SBH_BlocksMoved; 55 uint32_t SBH_TempBTSpBlk; 56 uint32_t SBH_TempFTSpBlk; 57 uint32_t SBH_TempFTSpBlk1; 58 uint32_t SBH_TempFTSpBlk2; 59 uint32_t nssMagicNumber; 60 uint32_t poolClassID; 61 uint32_t poolID; 62 uint32_t createTime; 63 int64_t SBH_LoggedVolumeDataBlk; 64 int64_t SBH_VolumeDataBlk; 65 int64_t SBH_SystemBeastBlkNum; 66 uint64_t totalblocks; 67 uint16_t SBH_Name[64]; 68 uint8_t SBH_VolumeID[16]; 69 uint8_t SBH_PoolID[16]; 70 uint8_t SBH_PoolInternalID[16]; 71 uint64_t SBH_Lsn; 72 uint32_t SBH_SS_Enabled; 73 uint32_t SBH_SS_CreateTime; 74 uint8_t SBH_SS_OriginalPoolID[16]; 75 uint8_t SBH_SS_OriginalVolumeID[16]; 76 uint8_t SBH_SS_Guid[16]; 77 uint16_t SBH_SS_OriginalName[64]; 78 uint32_t reserved2[64-(2+46)]; 79} PACKED; 80 81int volume_id_probe_netware(struct volume_id *id, uint64_t off, uint64_t size) 82{ 83 struct netware_super_block *nw; 84 85 info("probing at offset 0x%llx", (unsigned long long) off); 86 87 nw = (struct netware_super_block *) volume_id_get_buffer(id, off + NW_SUPERBLOCK_OFFSET, 0x200); 88 if (nw == NULL) 89 return -1; 90 91 if (memcmp(nw->SBH_Signature, "SPB5", 4) != 0) 92 return -1; 93 94 volume_id_set_uuid(id, nw->SBH_PoolID, 0, UUID_DCE); 95 96 snprintf(id->type_version, sizeof(id->type_version)-1, "%u.%02u", 97 le16_to_cpu(nw->SBH_VersionMediaMajor), le16_to_cpu(nw->SBH_VersionMediaMinor)); 98 99 volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); 100 id->type = "nss"; 101 102 return 0; 103} 104