chiark / gitweb /
libvolume_id: add parameter 'size' to all probe functions
[elogind.git] / extras / volume_id / lib / netware.c
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
31 struct 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
81 int 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, 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 }