2 * volume_id - reads filesystem label and uuid
4 * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 //kbuild:### lib-$(CONFIG_FEATURE_VOLUMEID_MAC) += mac.o
24 //config:### config FEATURE_VOLUMEID_MAC
25 //config:### bool "mac filesystem"
26 //config:### default y
27 //config:### depends on VOLUMEID
32 #include "volume_id_internal.h"
34 struct mac_driver_desc
{
40 struct mac_partition
{
50 int FAST_FUNC
volume_id_probe_mac_partition_map(struct volume_id
*id
, uint64_t off
)
53 struct mac_driver_desc
*driver
;
54 struct mac_partition
*part
;
56 dbg("probing at offset 0x%llx", (unsigned long long) off
);
58 buf
= volume_id_get_buffer(id
, off
, 0x200);
62 part
= (struct mac_partition
*) buf
;
63 if (part
->signature
[0] == 'P' && part
->signature
[1] == 'M' /* "PM" */
64 && (memcmp(part
->type
, "Apple_partition_map", 19) == 0)
66 /* linux creates an own subdevice for the map
67 * just return the type if the drive header is missing */
68 // volume_id_set_usage(id, VOLUME_ID_PARTITIONTABLE);
69 // id->type = "mac_partition_map";
73 driver
= (struct mac_driver_desc
*) buf
;
74 if (driver
->signature
[0] == 'E' && driver
->signature
[1] == 'R') { /* "ER" */
75 /* we are on a main device, like a CD
76 * just try to probe the first partition from the map */
77 unsigned bsize
= be16_to_cpu(driver
->block_size
);
81 /* get first entry of partition table */
82 buf
= volume_id_get_buffer(id
, off
+ bsize
, 0x200);
86 part
= (struct mac_partition
*) buf
;
87 if (part
->signature
[0] != 'P' || part
->signature
[1] != 'M') /* not "PM" */
90 part_count
= be32_to_cpu(part
->map_count
);
91 dbg("expecting %d partition entries", part_count
);
93 if (id
->partitions
!= NULL
)
95 id
->partitions
= xzalloc(part_count
* sizeof(struct volume_id_partition
));
97 id
->partition_count
= part_count
;
99 for (i
= 0; i
< part_count
; i
++) {
103 buf
= volume_id_get_buffer(id
, off
+ ((i
+1) * bsize
), 0x200);
107 part
= (struct mac_partition
*) buf
;
108 if (part
->signature
[0] != 'P' || part
->signature
[1] != 'M') /* not "PM" */
111 poff
= be32_to_cpu(part
->start_block
) * bsize
;
112 plen
= be32_to_cpu(part
->block_count
) * bsize
;
113 dbg("found '%s' partition entry at 0x%llx, len 0x%llx",
114 part
->type
, (unsigned long long) poff
,
115 (unsigned long long) plen
);
117 // id->partitions[i].pt_off = poff;
118 // id->partitions[i].pt_len = plen;
120 // if (memcmp(part->type, "Apple_Free", 10) == 0) {
121 // volume_id_set_usage_part(&id->partitions[i], VOLUME_ID_UNUSED);
122 // } else if (memcmp(part->type, "Apple_partition_map", 19) == 0) {
123 // volume_id_set_usage_part(&id->partitions[i], VOLUME_ID_PARTITIONTABLE);
125 // volume_id_set_usage_part(&id->partitions[i], VOLUME_ID_UNPROBED);
128 // volume_id_set_usage(id, VOLUME_ID_PARTITIONTABLE);
129 // id->type = "mac_partition_map";