~ubuntu-branches/ubuntu/trusty/util-linux/trusty-proposed

« back to all changes in this revision

Viewing changes to shlibs/blkid/src/superblocks/hpfs.c

  • Committer: Package Import Robot
  • Author(s): LaMont Jones
  • Date: 2011-11-03 15:38:23 UTC
  • mto: (4.5.5 sid) (1.6.4)
  • mto: This revision was merged to the branch mainline in revision 85.
  • Revision ID: package-import@ubuntu.com-20111103153823-10sx16jprzxlhkqf
ImportĀ upstreamĀ versionĀ 2.20.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
3
 
 *
4
 
 * Inspired by libvolume_id by
5
 
 *     Kay Sievers <kay.sievers@vrfy.org>
6
 
 *
7
 
 * This file may be redistributed under the terms of the
8
 
 * GNU Lesser General Public License.
9
 
 */
10
 
#include <stdio.h>
11
 
#include <stdlib.h>
12
 
#include <unistd.h>
13
 
#include <string.h>
14
 
#include <stdint.h>
15
 
 
16
 
#include "superblocks.h"
17
 
 
18
 
struct hpfs_boot_block
19
 
{
20
 
        uint8_t         jmp[3];
21
 
        uint8_t         oem_id[8];
22
 
        uint8_t         bytes_per_sector[2];
23
 
        uint8_t         sectors_per_cluster;
24
 
        uint8_t         n_reserved_sectors[2];
25
 
        uint8_t         n_fats;
26
 
        uint8_t         n_rootdir_entries[2];
27
 
        uint8_t         n_sectors_s[2];
28
 
        uint8_t         media_byte;
29
 
        uint16_t        sectors_per_fat;
30
 
        uint16_t        sectors_per_track;
31
 
        uint16_t        heads_per_cyl;
32
 
        uint32_t        n_hidden_sectors;
33
 
        uint32_t        n_sectors_l;
34
 
        uint8_t         drive_number;
35
 
        uint8_t         mbz;
36
 
        uint8_t         sig_28h;
37
 
        uint8_t         vol_serno[4];
38
 
        uint8_t         vol_label[11];
39
 
        uint8_t         sig_hpfs[8];
40
 
        uint8_t         pad[448];
41
 
        uint8_t         magic[2];
42
 
} __attribute__((packed));
43
 
 
44
 
struct hpfs_super_block
45
 
{
46
 
        uint8_t         magic[4];
47
 
        uint8_t         magic1[4];
48
 
        uint8_t         version;
49
 
} __attribute__((packed));
50
 
 
51
 
struct hpfs_spare_super
52
 
{
53
 
        uint8_t         magic[4];
54
 
        uint8_t         magic1[4];
55
 
} __attribute__((packed));
56
 
 
57
 
 
58
 
#define HPFS_SB_OFFSET                  0x2000
59
 
#define HPFS_SBSPARE_OFFSET             0x2200
60
 
 
61
 
static int probe_hpfs(blkid_probe pr, const struct blkid_idmag *mag)
62
 
{
63
 
        struct hpfs_super_block *hs;
64
 
        struct hpfs_spare_super *hss;
65
 
        struct hpfs_boot_block *hbb;
66
 
        uint8_t version;
67
 
 
68
 
        /* super block */
69
 
        hs = blkid_probe_get_sb(pr, mag, struct hpfs_super_block);
70
 
        if (!hs)
71
 
                return -1;
72
 
        version = hs->version;
73
 
 
74
 
        /* spare super block */
75
 
        hss = (struct hpfs_spare_super *)
76
 
                        blkid_probe_get_buffer(pr,
77
 
                                HPFS_SBSPARE_OFFSET,
78
 
                                sizeof(struct hpfs_spare_super));
79
 
        if (!hss)
80
 
                return -1;
81
 
        if (memcmp(hss->magic, "\x49\x18\x91\xf9", 4) != 0)
82
 
                return -1;
83
 
 
84
 
        /* boot block (with UUID and LABEL) */
85
 
        hbb = (struct hpfs_boot_block *)
86
 
                        blkid_probe_get_buffer(pr,
87
 
                                0,
88
 
                                sizeof(struct hpfs_boot_block));
89
 
        if (!hbb)
90
 
                return -1;
91
 
        if (memcmp(hbb->magic, "\x55\xaa", 2) == 0 &&
92
 
            memcmp(hbb->sig_hpfs, "HPFS", 4) == 0 &&
93
 
            hbb->sig_28h == 0x28) {
94
 
                blkid_probe_set_label(pr, hbb->vol_label, sizeof(hbb->vol_label));
95
 
                blkid_probe_sprintf_uuid(pr,
96
 
                                hbb->vol_serno, sizeof(hbb->vol_serno),
97
 
                                "%02X%02X-%02X%02X",
98
 
                                hbb->vol_serno[3], hbb->vol_serno[2],
99
 
                                hbb->vol_serno[1], hbb->vol_serno[0]);
100
 
        }
101
 
        blkid_probe_sprintf_version(pr, "%u", version);
102
 
 
103
 
        return 0;
104
 
}
105
 
 
106
 
const struct blkid_idinfo hpfs_idinfo =
107
 
{
108
 
        .name           = "hpfs",
109
 
        .usage          = BLKID_USAGE_FILESYSTEM,
110
 
        .probefunc      = probe_hpfs,
111
 
        .magics         =
112
 
        {
113
 
                {
114
 
                  .magic = "\x49\xe8\x95\xf9",
115
 
                  .len = 4,
116
 
                  .kboff = (HPFS_SB_OFFSET >> 10)
117
 
                },
118
 
                { NULL }
119
 
        }
120
 
};
121
 
 
122