]> git.cameronkatri.com Git - apple_cmds.git/blob - diskdev_cmds/fdisk.tproj/auto.c
diskdev_cmds: Fix BINDIRs
[apple_cmds.git] / diskdev_cmds / fdisk.tproj / auto.c
1 /*
2 * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 /*
25 * Auto partitioning code.
26 */
27
28 #include <stdio.h>
29 #include <ctype.h>
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <string.h>
33 #include <err.h>
34 #include "disk.h"
35 #include "mbr.h"
36 #include "auto.h"
37
38 int AUTO_boothfs __P((disk_t *, mbr_t *));
39 int AUTO_hfs __P((disk_t *, mbr_t *));
40 int AUTO_dos __P((disk_t *, mbr_t *));
41 int AUTO_raid __P((disk_t *, mbr_t *));
42
43 /* The default style is the first one in the list */
44 struct _auto_style {
45 char *style_name;
46 int (*style_fn)(disk_t *, mbr_t *);
47 char *description;
48 } style_fns[] = {
49 {"boothfs", AUTO_boothfs, "8Mb boot plus HFS+ root partition"},
50 {"hfs", AUTO_hfs, "Entire disk as one HFS+ partition"},
51 {"dos", AUTO_dos, "Entire disk as one DOS partition"},
52 {"raid", AUTO_raid, "Entire disk as one 0xAC partition"},
53 {0,0}
54 };
55
56 void
57 AUTO_print_styles(FILE *f)
58 {
59 struct _auto_style *fp;
60 int i;
61
62 for (i=0, fp = &style_fns[0]; fp->style_name != NULL; i++, fp++) {
63 fprintf(f, " %-10s %s%s\n", fp->style_name, fp->description, (i==0) ? " (default)" : "");
64 }
65 }
66
67
68 int
69 AUTO_init(disk_t *disk, char *style, mbr_t *mbr)
70 {
71 struct _auto_style *fp;
72
73 for (fp = &style_fns[0]; fp->style_name != NULL; fp++) {
74 /* If style is NULL, use the first (default) style */
75 if (style == NULL || strcasecmp(style, fp->style_name) == 0) {
76 return (*fp->style_fn)(disk, mbr);
77 }
78 }
79 warnx("No such auto-partition style %s", style);
80 return AUTO_ERR;
81 }
82
83
84 static int
85 use_whole_disk(disk_t *disk, unsigned char id, mbr_t *mbr)
86 {
87 MBR_clear(mbr);
88 mbr->part[0].id = id;
89 mbr->part[0].bs = 63;
90 mbr->part[0].ns = disk->real->size - 63;
91 PRT_fix_CHS(disk, &mbr->part[0], 0);
92 return AUTO_OK;
93 }
94
95 /* DOS style: one partition for the whole disk */
96 int
97 AUTO_dos(disk_t *disk, mbr_t *mbr)
98 {
99 int cc;
100 cc = use_whole_disk(disk, 0x0C, mbr);
101 if (cc == AUTO_OK) {
102 mbr->part[0].flag = DOSACTIVE;
103 }
104 return cc;
105 }
106
107 /* HFS style: one partition for the whole disk */
108 int
109 AUTO_hfs(disk_t *disk, mbr_t *mbr)
110 {
111 int cc;
112 cc = use_whole_disk(disk, 0xAF, mbr);
113 if (cc == AUTO_OK) {
114 mbr->part[0].flag = DOSACTIVE;
115 }
116 return cc;
117 }
118
119 /* One boot partition, one HFS+ root partition */
120 int
121 AUTO_boothfs (disk_t *disk, mbr_t *mbr)
122 {
123 /* Check disk size. */
124 if (disk->real->size < 16 * 2048) {
125 errx(1, "Disk size must be greater than 16Mb");
126 return AUTO_ERR;
127 }
128
129 MBR_clear(mbr);
130
131 /* 8MB boot partition */
132 mbr->part[0].id = 0xAB;
133 mbr->part[0].bs = 63;
134 mbr->part[0].ns = 8 * 1024 * 2;
135 mbr->part[0].flag = DOSACTIVE;
136 PRT_fix_CHS(disk, &mbr->part[0], 0);
137
138 /* Rest of the disk for rooting */
139 mbr->part[1].id = 0xAF;
140 mbr->part[1].bs = (mbr->part[0].bs + mbr->part[0].ns);
141 mbr->part[1].ns = disk->real->size - mbr->part[0].ns - 63;
142 PRT_fix_CHS(disk, &mbr->part[1], 1);
143
144 return AUTO_OK;
145 }
146
147
148
149 /* RAID style: one 0xAC partition for the whole disk */
150 int
151 AUTO_raid(disk_t *disk, mbr_t *mbr)
152 {
153 return use_whole_disk(disk, 0xAC, mbr);
154 }
155