1/*
2**	mac_label.h: defines Macintosh partition maps and label
3**
4**	Taken from "mkisofs 1.05 PLUS" by Andy Polyakov <appro@fy.chalmers.se>
5**	(see http://fy.chalmers.se/~appro/mkisofs_plus.html for details)
6**
7**	Much of this is already defined in the libhfs code, but to keep
8**	things simple we stick with these.
9*/
10
11#ifndef __MAC_LABEL__
12#define __MAC_LABEL__
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/* Driver Descriptor Map */
19#define sbSigMagic	"ER"
20struct MacLabel {
21	unsigned char	sbSig[2];	/* unique value for SCSI block 0 */
22	unsigned char	sbBlkSize[2];	/* block size of device */
23	unsigned char	sbBlkCount[4];	/* number of blocks on device */
24	unsigned char	sbDevType[2];	/* device type */
25	unsigned char	sbDevId[2];	/* device id */
26	unsigned char	sbData[4];	/* not used */
27	unsigned char	sbDrvrCount[2];	/* driver descriptor count */
28	unsigned char	ddBlock[4];	/* 1st driver's starting block */
29	unsigned char	ddSize[2];	/* size of 1st driver (512-byte blks) */
30	unsigned char	ddType[2];	/* system type (1 for Mac+) */
31	unsigned char	ddPad[486];	/* ARRAY[0..242] OF INTEGER; not used */
32};
33typedef struct MacLabel MacLabel;
34
35#define IS_MAC_LABEL(d)		(((MacLabel*)(d))->sbSig[0]=='E'&&((MacLabel*)(d))->sbSig[1]=='R')
36
37/* Partition Map Entry */
38#define pmSigMagic	"PM"
39
40#define pmPartType_1	"Apple_partition_map"
41#	define pmPartName_11	"Apple"
42
43#define pmPartType_2	"Apple_Driver"
44#define pmPartType_21	"Apple_Driver43"
45
46#define pmPartType_3	"Apple_UNIX_SVR2"
47#	define pmPartName_31	"A/UX Root"
48#	define pmPartName_32	"A/UX Usr"
49#	define pmPartName_33	"Random A/UX fs"
50#	define pmPartName_34	"Swap"
51
52#define pmPartType_4	"Apple_HFS"
53#	define pmPartName_41	"MacOS"
54
55#define pmPartType_5	"Apple_Free"
56#	define pmPartName_51	"Extra"
57
58#define PM2	2
59#define PM4	4
60
61struct MacPart {
62	unsigned char	pmSig[2];	/* unique value for map entry blk */
63	unsigned char	pmSigPad[2];	/* currently unused */
64	unsigned char	pmMapBlkCnt[4];	/* # of blks in partition map */
65	unsigned char	pmPyPartStart[4];/* physical start blk of partition */
66	unsigned char	pmPartBlkCnt[4];/* # of blks in this partition */
67	unsigned char	pmPartName[32];	/* ASCII partition name */
68	unsigned char	pmPartType[32];	/* ASCII partition type */
69	unsigned char	pmLgDataStart[4];/* log. # of partition's 1st data blk */
70	unsigned char	pmDataCnt[4];	/* # of blks in partition's data area */
71	unsigned char	pmPartStatus[4];/* bit field for partition status */
72	unsigned char	pmLgBootStart[4];/* log. blk of partition's boot code */
73	unsigned char	pmBootSize[4];	/* number of bytes in boot code */
74	unsigned char	pmBootAddr[4];	/* memory load address of boot code */
75	unsigned char	pmBootAddr2[4];	/* currently unused */
76	unsigned char	pmBootEntry[4];	/* entry point of boot code */
77	unsigned char	pmBootEntry2[4];/* currently unused */
78	unsigned char	pmBootCksum[4];	/* checksum of boot code */
79	unsigned char	pmProcessor[16];/* ASCII for the processor type */
80	unsigned char	pmPad[376];	/* ARRAY[0..187] OF INTEGER; not used */
81};
82typedef struct MacPart MacPart;
83
84#define IS_MAC_PART(d)		(((MacPart*)(d))->pmSig[0]=='P'&&((MacPart*)(d))->pmSig[1]=='M')
85
86#define PM_STAT_VALID		0x01	/* Set if a valid partition map entry */
87#define PM_STAT_ALLOC		0x02	/* Set if partition is already allocated; clear if available */
88#define PM_STAT_INUSE		0x04	/* Set if partition is in use; may be cleared after a system reset */
89#define PM_STAT_BOOTABLE	0x08	/* Set if partition contains valid boot information */
90#define PM_STAT_READABLE	0x10	/* Set if partition allows reading */
91#define PM_STAT_WRITABLE	0x20	/* Set if partition allows writing */
92#define PM_STAT_BOOT_PIC	0x40	/* Set if boot code is position-independent */
93#define PM_STAT_UNUSED		0x80	/* Unused */
94#define PM_STAT_DEFAULT		PM_STAT_VALID|PM_STAT_ALLOC|PM_STAT_READABLE|PM_STAT_WRITABLE
95
96typedef struct {
97	char *name;			/* Partition name */
98	char *type;			/* Partition type */
99	int   ntype;			/* Partition type (numeric) */
100	int   start;			/* start extent (SECTOR_SIZE blocks) */
101	int   size;			/* extents (SECTOR_SIZE blocks) */
102} mac_partition_table;
103
104/* from libhfs */
105#define HFS_BB_SIGWORD		0x4c4b
106
107/* borrowed from write.c - we just need parts of this */
108
109#ifdef __cplusplus
110}
111#endif
112
113#endif /* __MAC_LABEL__ */
114