2 Copyright © 1995-2009, The AROS Development Team. All rights reserved.
9 #include <proto/exec.h>
10 #include <proto/partition.h>
12 #include <devices/hardblocks.h>
13 #include <exec/memory.h>
14 #include <exec/types.h>
15 #include <libraries/partition.h>
17 #include "partition_support.h"
28 struct RigidDiskBlock rdb
;
29 UBYTE rdbblock
; /* the block rdb was read from */
30 struct List badblocklist
;
31 struct List fsheaderlist
;
36 struct BadBlockBlock bbb
;
41 struct FileSysHeaderBlock fhb
;
42 struct LoadSegBlock
*filesystem
; /* the FS in LSEG blocks */
43 ULONG fsblocks
; /* nr of LSEG blocks for FS */
46 static ULONG
calcChkSum(ULONG
*ptr
, ULONG size
)
53 sum
+= AROS_BE2LONG(*ptr
);
59 LONG PartitionRDBCheckPartitionTable
61 struct Library
*PartitionBase
,
62 struct PartitionHandle
*root
66 UBYTE space
[root
->de
.de_SizeBlock
<<2];
67 struct RigidDiskBlock
*rdb
= (struct RigidDiskBlock
*)space
;
69 for (i
=0;i
<RDB_LOCATION_LIMIT
; i
++)
71 if (readBlock(PartitionBase
, root
, i
, rdb
) != 0)
73 if (rdb
->rdb_ID
== AROS_BE2LONG(IDNAME_RIGIDDISK
))
76 if (i
!= RDB_LOCATION_LIMIT
)
78 if (calcChkSum((ULONG
*)rdb
, AROS_BE2LONG(rdb
->rdb_SummedLongs
))==0)
84 void CopyBE2HostDosEnvec(LONG
*src
, SIPTR
*dst
, ULONG size
) {
89 *dst
++ = AROS_BE2LONG(*src
);
95 void CopyHost2BEDosEnvec(SIPTR
*src
, ULONG
*dst
, ULONG size
) {
101 *dst
++ = AROS_LONG2BE(*src
);
108 struct BadBlockNode
*PartitionRDBNewBadBlock
110 struct Library
*PartitionBase
,
111 struct PartitionHandle
*root
,
112 struct BadBlockBlock
*buffer
115 struct BadBlockNode
*bn
;
118 (AROS_BE2LONG(buffer
->bbb_ID
) == IDNAME_BADBLOCK
) &&
119 (calcChkSum((ULONG
*)buffer
, AROS_BE2LONG(buffer
->bbb_SummedLongs
))==0)
122 bn
= AllocMem(sizeof(struct BadBlockNode
), MEMF_PUBLIC
| MEMF_CLEAR
);
125 CopyMem(buffer
, &bn
->bbb
, sizeof(struct BadBlockBlock
));
132 struct PartitionHandle
*PartitionRDBNewHandle
134 struct Library
*PartitionBase
,
135 struct PartitionHandle
*root
,
136 struct PartitionBlock
*buffer
139 struct PartitionBlock
*pblock
;
140 struct PartitionHandle
*ph
;
143 (AROS_BE2LONG(buffer
->pb_ID
) == IDNAME_PARTITION
) &&
144 (calcChkSum((ULONG
*)buffer
, AROS_BE2LONG(buffer
->pb_SummedLongs
))==0)
147 ph
= AllocMem(sizeof(struct PartitionHandle
), MEMF_PUBLIC
| MEMF_CLEAR
);
150 ph
->ln
.ln_Name
= AllocVec(32, MEMF_PUBLIC
| MEMF_CLEAR
);
153 pblock
= AllocMem(sizeof(struct PartitionBlock
), MEMF_PUBLIC
);
156 CopyMem(buffer
, pblock
, sizeof(struct PartitionBlock
));
160 CopyMem(pblock
->pb_DriveName
+1, ph
->ln
.ln_Name
, pblock
->pb_DriveName
[0]);
161 ph
->ln
.ln_Name
[pblock
->pb_DriveName
[0]]=0;
162 CopyBE2HostDosEnvec(pblock
->pb_Environment
, (SIPTR
*)&ph
->de
, AROS_BE2LONG(((struct DosEnvec
*)pblock
->pb_Environment
)->de_TableSize
)+1);
163 ph
->dg
.dg_DeviceType
= DG_DIRECT_ACCESS
;
164 ph
->dg
.dg_SectorSize
= ph
->de
.de_SizeBlock
<<2;
165 ph
->dg
.dg_Heads
= ph
->de
.de_Surfaces
;
166 ph
->dg
.dg_TrackSectors
= ph
->de
.de_BlocksPerTrack
;
167 ph
->dg
.dg_Cylinders
= ph
->de
.de_HighCyl
- ph
->de
.de_LowCyl
+ 1;
168 ph
->dg
.dg_BufMemType
= ph
->de
.de_BufMemType
;
171 FreeVec(ph
->ln
.ln_Name
);
173 FreeMem(ph
, sizeof(struct PartitionHandle
));
179 struct FileSysNode
*PartitionRDBNewFileSys
181 struct Library
*PartitionBase
,
182 struct PartitionHandle
*root
,
183 struct FileSysHeaderBlock
*buffer
186 struct FileSysNode
*fn
;
189 (AROS_BE2LONG(buffer
->fhb_ID
) == IDNAME_FILESYSHEADER
) &&
190 (calcChkSum((ULONG
*)buffer
, AROS_BE2LONG(buffer
->fhb_SummedLongs
))==0)
193 fn
= AllocMem(sizeof(struct FileSysNode
), MEMF_PUBLIC
| MEMF_CLEAR
);
196 CopyMem(buffer
, &fn
->fhb
, sizeof(struct FileSysHeaderBlock
));
203 ULONG PartitionRDBCalcFSSize
205 struct Library
*PartitionBase
,
206 struct PartitionHandle
*root
,
207 struct FileSysNode
*fn
,
208 struct LoadSegBlock
*buffer
215 block
= AROS_BE2LONG(fn
->fhb
.fhb_SegListBlocks
);
216 while (block
!= (ULONG
)-1)
219 if (readBlock(PartitionBase
, root
, block
, buffer
) !=0)
222 (AROS_BE2LONG(buffer
->lsb_ID
) != IDNAME_LOADSEG
) ||
223 (calcChkSum((ULONG
*)buffer
, AROS_BE2LONG(buffer
->lsb_SummedLongs
)))
226 block
= AROS_BE2LONG(buffer
->lsb_Next
);
231 void PartitionRDBReadFileSys
233 struct Library
*PartitionBase
,
234 struct PartitionHandle
*root
,
235 struct FileSysNode
*fn
,
236 struct LoadSegBlock
*buffer
242 size
= PartitionRDBCalcFSSize(PartitionBase
, root
, fn
, buffer
);
246 fn
->filesystem
= AllocVec(size
*512, MEMF_PUBLIC
);
250 block
= AROS_BE2LONG(fn
->fhb
.fhb_SegListBlocks
);
251 while (block
!= (ULONG
)-1)
253 if (readBlock(PartitionBase
, root
, block
, &fn
->filesystem
[size
]) !=0)
255 block
= AROS_BE2LONG(fn
->filesystem
[size
].lsb_Next
);
262 LONG PartitionRDBOpenPartitionTable
264 struct Library
*PartitionBase
,
265 struct PartitionHandle
*root
268 UBYTE buffer
[root
->de
.de_SizeBlock
<< 2];
269 struct RDBData
*data
;
272 data
= AllocMem(sizeof(struct RDBData
), MEMF_PUBLIC
);
275 for (i
=0;i
<RDB_LOCATION_LIMIT
; i
++)
277 if (readBlock(PartitionBase
, root
, i
, buffer
) != 0)
279 CopyMem(buffer
, &data
->rdb
, sizeof(struct RigidDiskBlock
));
280 if (data
->rdb
.rdb_ID
== AROS_BE2LONG(IDNAME_RIGIDDISK
))
283 if (i
!= RDB_LOCATION_LIMIT
)
288 NEWLIST(&root
->table
->list
);
289 NEWLIST(&data
->badblocklist
);
290 NEWLIST(&data
->fsheaderlist
);
291 root
->table
->data
= data
;
292 /* take the values of the rdb instead of TD_GEOMETRY */
293 root
->dg
.dg_SectorSize
= AROS_BE2LONG(data
->rdb
.rdb_BlockBytes
);
294 root
->dg
.dg_Cylinders
= AROS_BE2LONG(data
->rdb
.rdb_Cylinders
);
295 root
->dg
.dg_TrackSectors
= AROS_BE2LONG(data
->rdb
.rdb_Sectors
);
296 root
->dg
.dg_Heads
= AROS_BE2LONG(data
->rdb
.rdb_Heads
);
297 /* read bad blocks */
298 block
= AROS_BE2LONG(data
->rdb
.rdb_BadBlockList
);
299 while (block
!= (ULONG
)-1)
301 struct BadBlockNode
*bn
;
303 if (readBlock(PartitionBase
, root
, block
, buffer
)==0)
305 bn
= PartitionRDBNewBadBlock(PartitionBase
, root
, (struct BadBlockBlock
*)buffer
);
308 AddTail(&data
->badblocklist
, &bn
->ln
);
309 block
= AROS_BE2LONG(bn
->bbb
.bbb_Next
);
317 /* read partition blocks */
318 block
= AROS_BE2LONG(data
->rdb
.rdb_PartitionList
);
319 while (block
!= (ULONG
)-1)
321 struct PartitionHandle
*ph
;
322 if (readBlock(PartitionBase
, root
, block
, buffer
)==0)
324 ph
= PartitionRDBNewHandle(PartitionBase
, root
, (struct PartitionBlock
*)buffer
);
327 AddTail(&root
->table
->list
, &ph
->ln
);
328 block
= AROS_BE2LONG(((struct PartitionBlock
*)ph
->data
)->pb_Next
);
336 /* read filesystem blocks */
337 block
= AROS_BE2LONG(data
->rdb
.rdb_FileSysHeaderList
);
338 while (block
!= (ULONG
)-1)
340 struct FileSysNode
*fn
;
342 if (readBlock(PartitionBase
, root
, block
, buffer
)==0)
344 fn
= PartitionRDBNewFileSys(PartitionBase
, root
, (struct FileSysHeaderBlock
*)buffer
);
347 AddTail(&data
->fsheaderlist
, &fn
->ln
);
348 PartitionRDBReadFileSys(PartitionBase
, root
, fn
, (struct LoadSegBlock
*)buffer
);
349 block
= AROS_BE2LONG(fn
->fhb
.fhb_Next
);
359 FreeMem(data
, sizeof(struct RDBData
));
364 void PartitionRDBFreeHandle
366 struct Library
*PartitionBase
,
367 struct PartitionHandle
*ph
370 ClosePartitionTable(ph
);
372 FreeMem(ph
->data
, sizeof(struct PartitionBlock
));
373 FreeVec(ph
->ln
.ln_Name
);
374 FreeMem(ph
, sizeof(struct PartitionHandle
));
377 void PartitionRDBClosePartitionTable
379 struct Library
*PartitionBase
,
380 struct PartitionHandle
*root
383 struct PartitionHandle
*ph
;
384 struct BadBlockNode
*bn
;
385 struct FileSysNode
*fn
;
386 struct RDBData
*data
;
388 while ((ph
= (struct PartitionHandle
*)RemTail(&root
->table
->list
)))
389 PartitionRDBFreeHandle(PartitionBase
, ph
);
390 data
= (struct RDBData
*)root
->table
->data
;
391 while ((bn
= (struct BadBlockNode
*)RemTail(&data
->badblocklist
)))
392 FreeMem(bn
, sizeof(struct BadBlockNode
));
393 while ((fn
= (struct FileSysNode
*)RemTail(&data
->fsheaderlist
)))
396 FreeVec(fn
->filesystem
);
397 FreeMem(fn
, sizeof(struct FileSysNode
));
399 FreeMem(data
, sizeof(struct RDBData
));
402 ULONG PartitionRDBWriteFileSys
404 struct Library
*PartitionBase
,
405 struct PartitionHandle
*root
,
406 struct FileSysNode
*fn
,
415 while (size
!= fn
->fsblocks
)
417 fn
->filesystem
[size
].lsb_Next
= (size
+1) != fn
->fsblocks
? AROS_LONG2BE(block
+1) : (ULONG
)-1;
418 fn
->filesystem
[size
].lsb_ChkSum
= 0;
419 fn
->filesystem
[size
].lsb_ChkSum
= AROS_LONG2BE(0-calcChkSum((ULONG
*)&fn
->filesystem
[size
], AROS_LONG2BE(fn
->filesystem
[size
].lsb_SummedLongs
)));
421 if (writeBlock(PartitionBase
, root
, block
++, &fn
->filesystem
[size
]) != 0)
424 kprintf("RDB-write: block=%ld, type=LSEG\n", block
);
433 LONG PartitionRDBWritePartitionTable
435 struct Library
*PartitionBase
,
436 struct PartitionHandle
*root
439 UBYTE buffer
[root
->de
.de_SizeBlock
<< 2];
440 struct RDBData
*data
;
441 struct PartitionHandle
*ph
;
442 struct PartitionBlock
*pblock
;
443 struct BadBlockNode
*bn
;
444 struct FileSysNode
*fn
;
447 data
= root
->table
->data
;
448 block
= data
->rdbblock
+1; /* RDB will be written at the end */
449 fillMem((UBYTE
*)buffer
, root
->de
.de_SizeBlock
<< 2, 0);
451 /* write bad blocks */
452 bn
= (struct BadBlockNode
*)data
->badblocklist
.lh_Head
;
454 data
->rdb
.rdb_BadBlockList
= block
;
456 data
->rdb
.rdb_BadBlockList
= (ULONG
)-1;
457 while (bn
->ln
.ln_Succ
)
459 bn
->bbb
.bbb_Next
= bn
->ln
.ln_Succ
->ln_Succ
? AROS_LONG2BE(block
+1) : (ULONG
)-1;
460 bn
->bbb
.bbb_ChkSum
= 0;
461 bn
->bbb
.bbb_ChkSum
= AROS_LONG2BE(0-calcChkSum((ULONG
*)&bn
->bbb
, AROS_BE2LONG(bn
->bbb
.bbb_SummedLongs
)));
462 CopyMem(&bn
->bbb
, buffer
, sizeof(struct BadBlockBlock
));
464 writeBlock(PartitionBase
, root
, block
++, buffer
);
466 kprintf("RDB-write: block=%ld, type=BADB\n", block
);
470 bn
= (struct BadBlockNode
*)bn
->ln
.ln_Succ
;
473 /* write partition blocks */
474 ph
= (struct PartitionHandle
*)root
->table
->list
.lh_Head
;
476 data
->rdb
.rdb_PartitionList
= AROS_LONG2BE(block
);
478 data
->rdb
.rdb_PartitionList
= (ULONG
)-1;
479 while (ph
->ln
.ln_Succ
)
481 pblock
= (struct PartitionBlock
*)ph
->data
;
482 pblock
->pb_Next
= ph
->ln
.ln_Succ
->ln_Succ
? AROS_LONG2BE(block
+1) : (ULONG
)-1;
483 pblock
->pb_ChkSum
= 0;
484 pblock
->pb_ChkSum
= AROS_LONG2BE(0-calcChkSum((ULONG
*)pblock
, AROS_BE2LONG(pblock
->pb_SummedLongs
)));
485 CopyMem(pblock
, buffer
, sizeof(struct PartitionBlock
));
487 writeBlock(PartitionBase
, root
, block
++, buffer
);
489 kprintf("RDB-write: block=%ld, type=PART\n", block
);
492 ph
= (struct PartitionHandle
*)ph
->ln
.ln_Succ
;
495 /* write filesystem blocks */
496 fn
= (struct FileSysNode
*)data
->fsheaderlist
.lh_Head
;
498 data
->rdb
.rdb_FileSysHeaderList
= AROS_LONG2BE(block
);
500 data
->rdb
.rdb_FileSysHeaderList
= (ULONG
)-1;
501 while (fn
->ln
.ln_Succ
)
506 block
++; /* header block will be written later */
507 fn
->fhb
.fhb_SegListBlocks
= AROS_LONG2BE(block
);
508 /* write filesystem LSEG blocks */
509 block
= PartitionRDBWriteFileSys(PartitionBase
, root
, fn
, block
);
510 fn
->fhb
.fhb_Next
= fn
->ln
.ln_Succ
->ln_Succ
? AROS_LONG2BE(block
) : (ULONG
)-1;
511 fn
->fhb
.fhb_ChkSum
= 0;
512 CopyMem(&fn
->fhb
, buffer
, sizeof(struct FileSysHeaderBlock
));
513 ((struct FileSysHeaderBlock
*)buffer
)->fhb_ChkSum
= AROS_LONG2BE(0-calcChkSum((ULONG
*)buffer
, AROS_BE2LONG(fn
->fhb
.fhb_SummedLongs
)));
515 writeBlock(PartitionBase
, root
, fshblock
, buffer
);
517 kprintf("RDB-write: block=%ld, type=FSHD\n", fshblock
);
519 fn
= (struct FileSysNode
*)fn
->ln
.ln_Succ
;
521 data
->rdb
.rdb_HighRDSKBlock
= AROS_LONG2BE(block
-1);
522 data
->rdb
.rdb_ChkSum
= 0;
523 data
->rdb
.rdb_ChkSum
= AROS_LONG2BE(0-calcChkSum((ULONG
*)&data
->rdb
, AROS_BE2LONG(data
->rdb
.rdb_SummedLongs
)));
524 CopyMem(&data
->rdb
, buffer
, sizeof(struct RigidDiskBlock
));
526 writeBlock(PartitionBase
, root
, data
->rdbblock
, buffer
);
528 kprintf("RDB-write: block=%ld, type=RDSK\n", data
->rdbblock
);
533 LONG PartitionRDBCreatePartitionTable
535 struct Library
*PartitionBase
,
536 struct PartitionHandle
*ph
539 struct RDBData
*data
;
542 data
= AllocMem(sizeof(struct RDBData
), MEMF_PUBLIC
| MEMF_CLEAR
);
545 ph
->table
->data
= data
;
546 data
->rdb
.rdb_ID
= AROS_LONG2BE(IDNAME_RIGIDDISK
);
547 data
->rdb
.rdb_SummedLongs
= AROS_LONG2BE(sizeof(struct RigidDiskBlock
)/4);
548 data
->rdb
.rdb_BlockBytes
= AROS_LONG2BE(ph
->dg
.dg_SectorSize
);
549 data
->rdb
.rdb_BadBlockList
= (ULONG
)-1;
550 data
->rdb
.rdb_PartitionList
= (ULONG
)-1;
551 data
->rdb
.rdb_FileSysHeaderList
= (ULONG
)-1;
552 data
->rdb
.rdb_DriveInit
= (ULONG
)-1;
554 data
->rdb
.rdb_Reserved1
[i
] = (ULONG
)-1;
555 data
->rdb
.rdb_Cylinders
= AROS_LONG2BE(ph
->dg
.dg_Cylinders
);
556 data
->rdb
.rdb_Sectors
= AROS_LONG2BE(ph
->dg
.dg_TrackSectors
);
557 data
->rdb
.rdb_Heads
= AROS_LONG2BE(ph
->dg
.dg_Heads
);
559 data
->rdb
.rdb_Park
= data
->rdb
.rdb_Cylinders
;
560 data
->rdb
.rdb_WritePreComp
= data
->rdb
.rdb_Cylinders
;
561 data
->rdb
.rdb_ReducedWrite
= data
->rdb
.rdb_Cylinders
;
564 data
->rdb
.rdb_RDBBlocksLo
= AROS_LONG2BE(1); /* leave a block for PC */
565 data
->rdb
.rdb_RDBBlocksHi
= AROS_LONG2BE((ph
->dg
.dg_Heads
*ph
->dg
.dg_TrackSectors
*2)-1); /* two cylinders */
566 data
->rdb
.rdb_LoCylinder
= AROS_LONG2BE(2);
567 data
->rdb
.rdb_HiCylinder
= AROS_LONG2BE(ph
->dg
.dg_Cylinders
-1);
568 data
->rdb
.rdb_CylBlocks
= AROS_LONG2BE(ph
->dg
.dg_Heads
*ph
->dg
.dg_TrackSectors
);
569 /* AutoParkSeconds */
573 /* ControllerVendor */
574 /* ControllerProduct */
575 /* ControllerRevision */
578 NEWLIST(&data
->badblocklist
);
579 NEWLIST(&data
->fsheaderlist
);
580 NEWLIST(&ph
->table
->list
);
586 LONG PartitionRDBGetPartitionTableAttrs
588 struct Library
*PartitionBase
,
589 struct PartitionHandle
*root
,
590 struct TagItem
*taglist
594 while (taglist
[0].ti_Tag
!= TAG_DONE
)
597 switch (taglist
[0].ti_Tag
)
600 *((LONG
*)taglist
[0].ti_Data
) = root
->table
->type
;
603 *((LONG
*)taglist
[0].ti_Data
) =
604 root
->de
.de_Surfaces
*root
->de
.de_BlocksPerTrack
*2; /* 2 cylinders */
612 LONG PartitionRDBSetPartitionTableAttrs
614 struct Library
*PartitionBase
,
615 struct PartitionHandle
*root
,
616 struct TagItem
*taglist
620 while (taglist
[0].ti_Tag
!= TAG_DONE
)
623 switch (taglist
[0].ti_Tag
)
631 LONG PartitionRDBGetPartitionAttrs
633 struct Library
*PartitionBase
,
634 struct PartitionHandle
*ph
,
635 struct TagItem
*taglist
639 while (taglist
[0].ti_Tag
!= TAG_DONE
)
641 struct PartitionBlock
*data
= (struct PartitionBlock
*)ph
->data
;
643 switch (taglist
[0].ti_Tag
)
647 struct DriveGeometry
*dg
= (struct DriveGeometry
*)taglist
[0].ti_Data
;
648 CopyMem(&ph
->dg
, dg
, sizeof(struct DriveGeometry
));
652 CopyMem(&ph
->de
, (struct DosEnvec
*)taglist
[0].ti_Data
, sizeof(struct DosEnvec
));
656 struct PartitionType
*ptype
=(struct PartitionType
*)taglist
[0].ti_Data
;
657 ULONG dt
= AROS_LONG2BE(ph
->de
.de_DosType
);
659 CopyMem(&dt
, ptype
->id
, 4);
664 CopyMem(ph
->ln
.ln_Name
, (UBYTE
*)taglist
[0].ti_Data
, 32);
667 *((LONG
*)taglist
[0].ti_Data
) = (AROS_BE2LONG(data
->pb_Flags
) & PBFF_BOOTABLE
) ? TRUE
: FALSE
;
670 *((LONG
*)taglist
[0].ti_Data
) = (AROS_BE2LONG(data
->pb_Flags
) & PBFF_NOMOUNT
) ? FALSE
: TRUE
;
678 LONG PartitionRDBSetPartitionAttrs
680 struct Library
*PartitionBase
,
681 struct PartitionHandle
*ph
,
682 struct TagItem
*taglist
686 while (taglist
[0].ti_Tag
!= TAG_DONE
)
688 struct PartitionBlock
*data
= (struct PartitionBlock
*)ph
->data
;
690 switch (taglist
[0].ti_Tag
)
694 struct DosEnvec
*de
= (struct DosEnvec
*)taglist
[0].ti_Data
;
696 CopyMem(de
, &ph
->de
, (de
->de_TableSize
+1)*sizeof(IPTR
));
697 CopyHost2BEDosEnvec((SIPTR
*)de
, data
->pb_Environment
, de
->de_TableSize
+1);
702 struct PartitionType
*ptype
=(struct PartitionType
*)taglist
[0].ti_Data
;
705 CopyMem(ptype
->id
, &dt
, 4);
706 ph
->de
.de_DosType
= AROS_BE2LONG(dt
);
707 data
->pb_Environment
[DE_DOSTYPE
] = dt
;
712 STRPTR name
= (STRPTR
)taglist
[0].ti_Data
;
713 ULONG len
= strlen(name
);
715 CopyMem(name
, ph
->ln
.ln_Name
, len
+1);
716 CopyMem(name
, data
->pb_DriveName
+1, len
);
717 data
->pb_DriveName
[len
+1] = 0;
718 data
->pb_DriveName
[0] = len
;
722 if (taglist
[0].ti_Data
)
723 data
->pb_Flags
= AROS_LONG2BE(AROS_BE2LONG(data
->pb_Flags
) | PBFF_BOOTABLE
);
725 data
->pb_Flags
= AROS_LONG2BE(AROS_BE2LONG(data
->pb_Flags
) & ~PBFF_BOOTABLE
);
728 if (taglist
[0].ti_Data
)
729 data
->pb_Flags
= AROS_LONG2BE(AROS_BE2LONG(data
->pb_Flags
) & ~PBFF_NOMOUNT
);
731 data
->pb_Flags
= AROS_LONG2BE(AROS_BE2LONG(data
->pb_Flags
) | PBFF_NOMOUNT
);
739 struct PartitionHandle
*PartitionRDBAddPartition
741 struct Library
*PartitionBase
,
742 struct PartitionHandle
*root
,
743 struct TagItem
*taglist
747 if (findTagItem(PT_DOSENVEC
, taglist
) != NULL
)
749 struct PartitionBlock
*pblock
;
750 struct PartitionHandle
*ph
;
751 struct PartitionHandle
*oph
;
753 ph
= AllocMem(sizeof(struct PartitionHandle
), MEMF_PUBLIC
| MEMF_CLEAR
);
756 ph
->ln
.ln_Name
= AllocVec(32, MEMF_PUBLIC
| MEMF_CLEAR
);
759 pblock
= AllocMem(sizeof(struct PartitionBlock
), MEMF_PUBLIC
| MEMF_CLEAR
);
765 pblock
->pb_ID
= AROS_LONG2BE(IDNAME_PARTITION
);
766 pblock
->pb_SummedLongs
= AROS_LONG2BE(sizeof(struct PartitionBlock
)/4);
767 PartitionRDBSetPartitionAttrs(PartitionBase
, ph
, taglist
);
768 oph
= (struct PartitionHandle
*)root
->table
->list
.lh_Head
;
769 while (oph
->ln
.ln_Succ
)
771 if (ph
->de
.de_LowCyl
<oph
->de
.de_LowCyl
)
773 oph
= (struct PartitionHandle
*)oph
->ln
.ln_Succ
;
777 oph
= (struct PartitionHandle
*)oph
->ln
.ln_Pred
;
780 Insert(&root
->table
->list
, &ph
->ln
, &oph
->ln
);
783 AddHead(&root
->table
->list
, &ph
->ln
);
786 AddTail(&root
->table
->list
, &ph
->ln
);
787 if (findTagItem(PT_DOSENVEC
, taglist
) == NULL
)
789 ph
->dg
.dg_DeviceType
= DG_DIRECT_ACCESS
;
790 ph
->dg
.dg_SectorSize
= ph
->de
.de_SizeBlock
<<2;
791 ph
->dg
.dg_Heads
= ph
->de
.de_Surfaces
;
792 ph
->dg
.dg_TrackSectors
= ph
->de
.de_BlocksPerTrack
;
793 ph
->dg
.dg_Cylinders
= ph
->de
.de_HighCyl
- ph
->de
.de_LowCyl
+ 1;
794 ph
->dg
.dg_BufMemType
= ph
->de
.de_BufMemType
;
798 FreeVec(ph
->ln
.ln_Name
);
800 FreeMem(ph
, sizeof(struct PartitionHandle
));
806 void PartitionRDBDeletePartition
808 struct Library
*PartitionBase
,
809 struct PartitionHandle
*ph
813 PartitionRDBFreeHandle(PartitionBase
, ph
);
816 struct PartitionAttribute PartitionRDBPartitionTableAttrs
[]=
818 {PTTA_TYPE
, PLAM_READ
},
819 {PTTA_RESERVED
, PLAM_READ
},
823 struct PartitionAttribute
*PartitionRDBQueryPartitionTableAttrs(struct Library
*PartitionBase
)
825 return PartitionRDBPartitionTableAttrs
;
828 struct PartitionAttribute PartitionRDBPartitionAttrs
[]=
830 #warning "TODO: implement write"
831 {PTA_GEOMETRY
, PLAM_READ
},
832 {PTA_DOSENVEC
, PLAM_READ
| PLAM_WRITE
},
833 {PTA_TYPE
, PLAM_READ
| PLAM_WRITE
},
834 {PTA_NAME
, PLAM_READ
| PLAM_WRITE
},
835 {PTA_BOOTABLE
, PLAM_READ
| PLAM_WRITE
},
836 {PTA_AUTOMOUNT
, PLAM_READ
| PLAM_WRITE
},
840 struct PartitionAttribute
*PartitionRDBQueryPartitionAttrs(struct Library
*PartitionBase
)
842 return PartitionRDBPartitionAttrs
;
845 ULONG PartitionRDBDestroyPartitionTable
847 struct Library
*PartitionBase
,
848 struct PartitionHandle
*root
851 struct RDBData
*data
;
852 UBYTE buffer
[root
->de
.de_SizeBlock
<< 2];
854 data
= root
->table
->data
;
855 CopyMem(&data
->rdb
, buffer
, sizeof(struct RigidDiskBlock
));
856 ((struct RigidDiskBlock
*)buffer
)->rdb_ID
= 0;
857 if (writeBlock(PartitionBase
, root
, data
->rdbblock
, buffer
))
862 struct PTFunctionTable PartitionRDB
=
866 PartitionRDBCheckPartitionTable
,
867 PartitionRDBOpenPartitionTable
,
868 PartitionRDBClosePartitionTable
,
869 PartitionRDBWritePartitionTable
,
870 PartitionRDBCreatePartitionTable
,
871 PartitionRDBAddPartition
,
872 PartitionRDBDeletePartition
,
873 PartitionRDBGetPartitionTableAttrs
,
874 PartitionRDBSetPartitionTableAttrs
,
875 PartitionRDBGetPartitionAttrs
,
876 PartitionRDBSetPartitionAttrs
,
877 PartitionRDBQueryPartitionTableAttrs
,
878 PartitionRDBQueryPartitionAttrs
,
879 PartitionRDBDestroyPartitionTable