]>
git.cameronkatri.com Git - apple_cmds.git/blob - diskdev_cmds/fdisk.tproj/part.c
2 * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
26 * Copyright (c) 1997 Tobias Weingartner
27 * All rights reserved.
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by Tobias Weingartner.
40 * 4. The name of the author may not be used to endorse or promote products
41 * derived from this software without specific prior written permission.
43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
44 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
45 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
46 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
47 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
48 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
52 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60 #include <sys/fcntl.h>
61 #include <sys/types.h>
63 #include <machine/param.h>
69 static const struct part_type
{
74 { 0x00, "unused ", "unused"},
75 { 0x01, "DOS FAT-12 ", "Primary DOS with 12 bit FAT"},
76 { 0x02, "XENIX / ", "XENIX / filesystem"},
77 { 0x03, "XENIX /usr ", "XENIX /usr filesystem"},
78 { 0x04, "DOS FAT-16 ", "Primary DOS with 16 bit FAT"},
79 { 0x05, "Extended DOS", "Extended DOS"},
80 { 0x06, "DOS > 32MB ", "Primary 'big' DOS (> 32MB)"},
81 { 0x07, "HPFS/QNX/AUX", "OS/2 HPFS, QNX-2 or Advanced UNIX"},
82 { 0x08, "AIX fs ", "AIX filesystem"},
83 { 0x09, "AIX/Coherent", "AIX boot partition or Coherent"},
84 { 0x0A, "OS/2 Bootmgr", "OS/2 Boot Manager or OPUS"},
85 { 0x0B, "Win95 FAT-32", "Primary Win95 w/ 32-bit FAT"},
86 { 0x0C, "Win95 FAT32L", "Primary Win95 w/ 32-bit FAT LBA-mapped"},
87 { 0x0E, "DOS FAT-16 ", "Primary DOS w/ 16-bit FAT, CHS-mapped"},
88 { 0x0F, "Extended LBA", "Extended DOS LBA-mapped"},
89 { 0x10, "OPUS ", "OPUS"},
90 { 0x11, "OS/2 hidden ", "OS/2 BM: hidden DOS 12-bit FAT"},
91 { 0x12, "Compaq Diag.", "Compaq Diagnostics"},
92 { 0x14, "OS/2 hidden ", "OS/2 BM: hidden DOS 16-bit FAT <32M or Novell DOS 7.0 bug"},
93 { 0x16, "OS/2 hidden ", "OS/2 BM: hidden DOS 16-bit FAT >=32M"},
94 { 0x17, "OS/2 hidden ", "OS/2 BM: hidden IFS"},
95 { 0x18, "AST swap ", "AST Windows swapfile"},
96 { 0x19, "Willowtech ", "Willowtech Photon coS"},
97 { 0x20, "Willowsoft ", "Willowsoft OFS1"},
98 { 0x24, "NEC DOS ", "NEC DOS"},
99 { 0x38, "Theos ", "Theos"},
100 { 0x39, "Plan 9 ", "Plan 9"},
101 { 0x40, "VENIX 286 ", "VENIX 286 or LynxOS"},
102 { 0x41, "Lin/Minux DR", "Linux/MINIX (sharing disk with DRDOS) or Personal RISC boot"},
103 { 0x42, "LinuxSwap DR", "SFS or Linux swap (sharing disk with DRDOS)"},
104 { 0x43, "Linux DR ", "Linux native (sharing disk with DRDOS)"},
105 { 0x4D, "QNX 4.2 Pri ", "QNX 4.2 Primary"},
106 { 0x4E, "QNX 4.2 Sec ", "QNX 4.2 Secondary"},
107 { 0x4F, "QNX 4.2 Ter ", "QNX 4.2 Tertiary"},
108 { 0x50, "DM ", "DM (disk manager)"},
109 { 0x51, "DM ", "DM6 Aux1 (or Novell)"},
110 { 0x52, "CP/M or SysV", "CP/M or Microport SysV/AT"},
111 { 0x53, "DM ", "DM6 Aux3"},
112 { 0x54, "Ontrack ", "Ontrack"},
113 { 0x55, "EZ-Drive ", "EZ-Drive (disk manager)"},
114 { 0x56, "Golden Bow ", "Golden Bow (disk manager)"},
115 { 0x5C, "Priam ", "Priam Edisk (disk manager)"},
116 { 0x61, "SpeedStor ", "SpeedStor"},
117 { 0x63, "ISC, HURD, *", "ISC, System V/386, GNU HURD or Mach"},
118 { 0x64, "Netware 2.xx", "Novell Netware 2.xx"},
119 { 0x65, "Netware 3.xx", "Novell Netware 3.xx"},
120 { 0x66, "Netware 386 ", "Novell 386 Netware"},
121 { 0x67, "Novell ", "Novell"},
122 { 0x68, "Novell ", "Novell"},
123 { 0x69, "Novell ", "Novell"},
124 { 0x70, "DiskSecure ", "DiskSecure Multi-Boot"},
125 { 0x75, "PCIX ", "PCIX"},
126 { 0x80, "Minix (old) ", "Minix 1.1 ... 1.4a"},
127 { 0x81, "Minix (new) ", "Minix 1.4b ... 1.5.10"},
128 { 0x82, "Linux swap ", "Linux swap"},
129 { 0x83, "Linux files*", "Linux filesystem"},
130 { 0x93, "Amoeba file*", "Amoeba filesystem"},
131 { 0x94, "Amoeba BBT ", "Amoeba bad block table"},
132 { 0x84, "OS/2 hidden ", "OS/2 hidden C: drive"},
133 { 0x85, "Linux ext. ", "Linux extended"},
134 { 0x86, "NT FAT VS ", "NT FAT volume set"},
135 { 0x87, "NTFS VS ", "NTFS volume set or HPFS mirrored"},
136 { 0x93, "Amoeba FS ", "Amoeba filesystem"},
137 { 0x94, "Amoeba BBT ", "Amoeba bad block table"},
138 { 0x99, "Mylex ", "Mylex EISA SCSI"},
139 { 0x9F, "BSDI ", "BSDI BSD/OS"},
140 { 0xA0, "NotebookSave", "Phoenix NoteBIOS save-to-disk"},
141 { 0xA5, "FreeBSD ", "FreeBSD"},
142 { 0xA6, "OpenBSD ", "OpenBSD"},
143 { 0xA7, "NEXTSTEP ", "NEXTSTEP"},
144 { 0xA8, "Darwin UFS ", "Darwin UFS partition"},
145 { 0xA9, "NetBSD ", "NetBSD"},
146 { 0xAB, "Darwin Boot ", "Darwin boot partition"},
147 { 0xAF, "HFS+ ", "Darwin HFS+ partition"},
148 { 0xB7, "BSDI filesy*", "BSDI BSD/386 filesystem"},
149 { 0xB8, "BSDI swap ", "BSDI BSD/386 swap"},
150 { 0xC0, "CTOS ", "CTOS"},
151 { 0xC1, "DRDOSs FAT12", "DRDOS/sec (FAT-12)"},
152 { 0xC4, "DRDOSs < 32M", "DRDOS/sec (FAT-16, < 32M)"},
153 { 0xC6, "DRDOSs >=32M", "DRDOS/sec (FAT-16, >= 32M)"},
154 { 0xC7, "HPFS Disbled", "Syrinx (Cyrnix?) or HPFS disabled"},
155 { 0xDB, "CPM/C.DOS/C*", "Concurrent CPM or C.DOS or CTOS"},
156 { 0xE1, "SpeedStor ", "DOS access or SpeedStor 12-bit FAT extended partition"},
157 { 0xE3, "SpeedStor ", "DOS R/O or SpeedStor or Storage Dimensions"},
158 { 0xE4, "SpeedStor ", "SpeedStor 16-bit FAT extended partition < 1024 cyl."},
159 { 0xEB, "BeOS/i386 ", "BeOS for Intel"},
160 { 0xF1, "SpeedStor ", "SpeedStor or Storage Dimensions"},
161 { 0xF2, "DOS 3.3+ Sec", "DOS 3.3+ Secondary"},
162 { 0xF4, "SpeedStor ", "SpeedStor >1024 cyl. or LANstep or IBM PS/2 IML"},
163 { 0xFF, "Xenix BBT ", "Xenix Bad Block Table"},
171 idrows
= ((sizeof(part_types
)/sizeof(struct part_type
))+3)/4;
173 printf("Choose from the following Partition id values:\n");
174 for (i
= 0; i
< idrows
; i
++) {
175 printf("%02X %s %02X %s %02X %s"
176 , part_types
[i
].type
, part_types
[i
].sname
177 , part_types
[i
+idrows
].type
, part_types
[i
+idrows
].sname
178 , part_types
[i
+idrows
*2].type
, part_types
[i
+idrows
*2].sname
180 if ((i
+idrows
*3) < (sizeof(part_types
)/sizeof(struct part_type
))) {
182 , part_types
[i
+idrows
*3].type
, part_types
[i
+idrows
*3].sname
);
193 static char unknown
[] = "<Unknown ID>";
196 for (i
= 0; i
< sizeof(part_types
)/sizeof(struct part_type
); i
++) {
197 if (part_types
[i
].type
== id
)
198 return (part_types
[i
].sname
);
205 PRT_parse(disk
, prt
, offset
, reloff
, partn
, pn
)
213 unsigned char *p
= prt
;
219 partn
->ssect
= (*p
) & 0x3F;
220 partn
->scyl
= ((*p
<< 2) & 0xFF00) | (*(p
+1));
225 partn
->esect
= (*p
) & 0x3F;
226 partn
->ecyl
= ((*p
<< 2) & 0xFF00) | (*(p
+1));
229 if ((partn
->id
== DOSPTYP_EXTEND
) || (partn
->id
== DOSPTYP_EXTENDL
))
234 partn
->bs
= getlong(p
) + off
;
235 partn
->ns
= getlong(p
+4);
238 /* Zero out entry if not used */
239 if (partn
->id
== DOSPTYP_UNUSED
) {
240 memset(partn
, 0, sizeof(*partn
));
248 if ( (partn
->shead
> 255) ||
249 (partn
->ssect
>63) ||
250 (partn
->scyl
> 1023) ||
251 (partn
->ehead
>255) ||
252 (partn
->esect
>63) ||
253 (partn
->ecyl
> 1023) )
260 PRT_make(partn
, offset
, reloff
, prt
)
266 unsigned char *p
= prt
;
270 tmp
.shead
= partn
->shead
;
271 tmp
.ssect
= partn
->ssect
;
272 tmp
.scyl
= (partn
->scyl
> 1023)? 1023: partn
->scyl
;
273 tmp
.ehead
= partn
->ehead
;
274 tmp
.esect
= partn
->esect
;
275 tmp
.ecyl
= (partn
->ecyl
> 1023)? 1023: partn
->ecyl
;
276 if (!PRT_check_chs(partn
) && PRT_check_chs(&tmp
)) {
277 partn
->shead
= tmp
.shead
;
278 partn
->ssect
= tmp
.ssect
;
279 partn
->scyl
= tmp
.scyl
;
280 partn
->ehead
= tmp
.ehead
;
281 partn
->esect
= tmp
.esect
;
282 partn
->ecyl
= tmp
.ecyl
;
283 printf("Cylinder values are modified to fit in CHS.\n");
285 if ((partn
->id
== DOSPTYP_EXTEND
) || (partn
->id
== DOSPTYP_EXTENDL
))
290 if (PRT_check_chs(partn
)) {
291 *p
++ = partn
->flag
& 0xFF;
293 *p
++ = partn
->shead
& 0xFF;
294 *p
++ = (partn
->ssect
& 0x3F) | ((partn
->scyl
& 0x300) >> 2);
295 *p
++ = partn
->scyl
& 0xFF;
297 *p
++ = partn
->id
& 0xFF;
299 *p
++ = partn
->ehead
& 0xFF;
300 *p
++ = (partn
->esect
& 0x3F) | ((partn
->ecyl
& 0x300) >> 2);
301 *p
++ = partn
->ecyl
& 0xFF;
303 /* should this really keep flag, id and set others to 0xff? */
304 *p
++ = partn
->flag
& 0xFF;
308 *p
++ = partn
->id
& 0xFF;
312 printf("Warning CHS values out of bounds only saving LBA values\n");
315 putlong(p
, partn
->bs
- off
);
316 putlong(p
+4, partn
->ns
);
320 PRT_print(num
, partn
)
326 printf(" Starting Ending\n");
327 printf(" #: id cyl hd sec - cyl hd sec [ start - size]\n");
328 printf("------------------------------------------------------------------------\n");
330 printf("%c%1d: %.2X %4u %3u %3u - %4u %3u %3u [%10u - %10u] %s\n",
331 (partn
->flag
== 0x80)?'*':' ',
333 partn
->scyl
, partn
->shead
, partn
->ssect
,
334 partn
->ecyl
, partn
->ehead
, partn
->esect
,
335 partn
->bs
, partn
->ns
,
336 PRT_ascii_id(partn
->id
));
341 PRT_fix_BN(disk
, part
, pn
)
350 /* Zero out entry if not used */
351 if (part
->id
== DOSPTYP_UNUSED
) {
352 memset(part
, 0, sizeof(*part
));
357 spt
= disk
->real
->sectors
;
358 tpc
= disk
->real
->heads
;
361 start
+= part
->scyl
* spc
;
362 start
+= part
->shead
* spt
;
363 start
+= part
->ssect
- 1;
365 end
+= part
->ecyl
* spc
;
366 end
+= part
->ehead
* spt
;
367 end
+= part
->esect
- 1;
369 /* XXX - Should handle this... */
371 warn("Start of partition #%d after end!", pn
);
374 part
->ns
= (end
- start
) + 1;
378 PRT_fix_CHS(disk
, part
, pn
)
387 /* Zero out entry if not used */
388 if (part
->id
== DOSPTYP_UNUSED
) {
389 memset(part
, 0, sizeof(*part
));
394 spt
= disk
->real
->sectors
;
395 tpc
= disk
->real
->heads
;
401 /* Figure out "real" starting CHS values */
402 cyl
= (start
/ spc
); start
-= (cyl
* spc
);
403 head
= (start
/ spt
); start
-= (head
* spt
);
415 /* use fake geometry to trigger LBA mode */