chiark / gitweb /
volume_id: remove deprecated functions and bump major version
[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 "libvolume_id-private.h"
28 #include "util.h"
29
30 #define NW_SUPERBLOCK_OFFSET                    0x1000
31
32 struct netware_super_block {
33         uint8_t         SBH_Signature[4];
34         uint16_t        SBH_VersionMajor;
35         uint16_t        SBH_VersionMinor;
36         uint16_t        SBH_VersionMediaMajor;
37         uint16_t        SBH_VersionMediaMinor;
38         uint32_t        SBH_ItemsMoved;
39         uint8_t         SBH_InternalID[16];
40         uint32_t        SBH_PackedSize;
41         uint32_t        SBH_Checksum;
42         uint32_t        supersyncid;
43         int64_t         superlocation[4];
44         uint32_t        physSizeUsed;
45         uint32_t        sizeUsed;
46         uint32_t        superTimeStamp;
47         uint32_t        reserved0[1];
48         int64_t         SBH_LoggedPoolDataBlk;
49         int64_t         SBH_PoolDataBlk;
50         uint8_t         SBH_OldInternalID[16];
51         uint32_t        SBH_PoolToLVStartUTC;
52         uint32_t        SBH_PoolToLVEndUTC;
53         uint16_t        SBH_VersionMediaMajorCreate;
54         uint16_t        SBH_VersionMediaMinorCreate;
55         uint32_t        SBH_BlocksMoved;
56         uint32_t        SBH_TempBTSpBlk;
57         uint32_t        SBH_TempFTSpBlk;
58         uint32_t        SBH_TempFTSpBlk1;
59         uint32_t        SBH_TempFTSpBlk2;
60         uint32_t        nssMagicNumber;
61         uint32_t        poolClassID;
62         uint32_t        poolID;
63         uint32_t        createTime;
64         int64_t         SBH_LoggedVolumeDataBlk;
65         int64_t         SBH_VolumeDataBlk;
66         int64_t         SBH_SystemBeastBlkNum;
67         uint64_t        totalblocks;
68         uint16_t        SBH_Name[64];
69         uint8_t         SBH_VolumeID[16];
70         uint8_t         SBH_PoolID[16];
71         uint8_t         SBH_PoolInternalID[16];
72         uint64_t        SBH_Lsn;
73         uint32_t        SBH_SS_Enabled;
74         uint32_t        SBH_SS_CreateTime;
75         uint8_t         SBH_SS_OriginalPoolID[16];
76         uint8_t         SBH_SS_OriginalVolumeID[16];
77         uint8_t         SBH_SS_Guid[16];
78         uint16_t        SBH_SS_OriginalName[64];
79         uint32_t        reserved2[64-(2+46)];
80 } PACKED;
81
82 int volume_id_probe_netware(struct volume_id *id, uint64_t off, uint64_t size)
83 {
84         struct netware_super_block *nw;
85
86         info("probing at offset 0x%llx\n", (unsigned long long) off);
87
88         nw = (struct netware_super_block *) volume_id_get_buffer(id, off + NW_SUPERBLOCK_OFFSET, 0x200);
89         if (nw == NULL)
90                 return -1;
91
92         if (memcmp(nw->SBH_Signature, "SPB5", 4) != 0)
93                 return -1;
94
95         volume_id_set_uuid(id, nw->SBH_PoolID, 0, UUID_DCE);
96
97         snprintf(id->type_version, sizeof(id->type_version)-1, "%u.%02u",
98                  le16_to_cpu(nw->SBH_VersionMediaMajor), le16_to_cpu(nw->SBH_VersionMediaMinor));
99
100         volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
101         id->type = "nss";
102
103         return 0;
104 }