Fixed binary search: no more infinite loops when vendor is unknown.
[tangerine.git] / workbench / libs / partition / openrootpartition.c
blobb66cab671ea0da787c5ecbe1f33b55bdc1e8cc3d
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
5 */
7 #include <proto/exec.h>
8 #include <exec/memory.h>
10 #include "partition_intern.h"
11 #include "partition_support.h"
12 #include "platform.h"
14 /*****************************************************************************
16 NAME */
17 AROS_LH2(struct PartitionHandle *, OpenRootPartition,
19 /* SYNOPSIS */
20 AROS_LHA(CONST_STRPTR, Device, A1),
21 AROS_LHA(LONG, Unit, D1),
23 /* LOCATION */
24 struct Library *, PartitionBase, 5, Partition)
26 /* FUNCTION
27 Create a root handle by opening a trackdisk-compatible device.
29 INPUTS
30 Device - name of the block device
31 Unit - unit of the block device
33 RESULT
34 handle to the device
36 NOTES
38 EXAMPLE
40 BUGS
42 SEE ALSO
44 INTERNALS
46 HISTORY
47 21-02-02 first version
49 *****************************************************************************/
51 AROS_LIBFUNC_INIT
53 struct PartitionHandle *ph;
55 ph = AllocMem(sizeof(struct PartitionHandle), MEMF_PUBLIC | MEMF_CLEAR);
56 if (ph)
58 ph->bd = AllocMem(sizeof(struct PartitionBlockDevice), MEMF_PUBLIC);
59 if (ph->bd)
61 ph->bd->cmdread = CMD_READ;
62 ph->bd->cmdwrite = CMD_WRITE;
63 ph->bd->port = CreateMsgPort();
64 if (ph->bd->port)
66 ph->bd->ioreq = (struct IOExtTD *)CreateIORequest(ph->bd->port, sizeof(struct IOExtTD));
67 if (ph->bd->ioreq)
69 if (OpenDevice(Device, Unit, (struct IORequest *)ph->bd->ioreq, 0)==0)
71 if (getGeometry(PartitionBase, ph->bd->ioreq, &ph->dg)==0)
73 if (ph->dg.dg_DeviceType != DG_CDROM)
75 ph->de.de_SizeBlock = ph->dg.dg_SectorSize>>2;
76 ph->de.de_Surfaces = ph->dg.dg_Heads;
77 ph->de.de_SectorPerBlock = 1;
78 ph->de.de_BlocksPerTrack = ph->dg.dg_TrackSectors;
79 ph->de.de_HighCyl = ph->dg.dg_Cylinders-1;
80 ph->de.de_NumBuffers = 20;
81 ph->de.de_BufMemType = ph->dg.dg_BufMemType;
82 PartitionNsdCheck(PartitionBase, ph);
83 return ph;
87 DeleteIORequest((struct IORequest *)ph->bd->ioreq);
89 DeleteMsgPort(ph->bd->port);
91 FreeMem(ph->bd, sizeof(struct PartitionBlockDevice));
93 FreeMem(ph, sizeof(struct PartitionHandle));
94 ph = 0;
96 return 0;
97 AROS_LIBFUNC_EXIT