1/*
2 * Copyright 2003-2007, Axel D��rfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef KERNEL_BOOT_PARTITIONS_H
6#define KERNEL_BOOT_PARTITIONS_H
7
8
9#include <boot/vfs.h>
10#include <disk_device_manager.h>
11
12
13struct file_system_module_info;
14
15namespace boot {
16
17class Partition : public Node, public partition_data {
18	public:
19		Partition(int deviceFD);
20		virtual ~Partition();
21
22		virtual ssize_t ReadAt(void *cookie, off_t offset, void *buffer, size_t bufferSize);
23		virtual ssize_t WriteAt(void *cookie, off_t offset, const void *buffer, size_t bufferSize);
24
25		virtual off_t Size() const;
26		virtual int32 Type() const;
27
28		Partition *AddChild();
29
30		status_t Mount(Directory **_fileSystem = NULL, bool isBootDevice = false);
31		status_t Scan(bool mountFileSystems, bool isBootDevice = false);
32
33		static Partition *Lookup(partition_id id, NodeList *list = NULL);
34
35		void SetParent(Partition *parent);
36		Partition *Parent() const;
37
38		bool IsFileSystem() const { return fIsFileSystem; }
39		bool IsPartitioningSystem() const { return fIsPartitioningSystem; }
40		const char *ModuleName() const { return fModuleName; }
41
42		int FD() const { return fFD; }
43
44	private:
45		status_t _Mount(file_system_module_info *module, Directory **_fileSystem);
46
47		int			fFD;
48		NodeList	fChildren;
49		Partition	*fParent;
50		bool		fIsFileSystem, fIsPartitioningSystem;
51		const char	*fModuleName;
52};
53
54}	// namespace boot
55
56// DiskDeviceTypes we need/support in the boot loader
57#define kPartitionTypeAmiga		"Amiga RDB"
58#define kPartitionTypeIntel		"Intel Partition Map"
59#define kPartitionTypeIntelExtended "Intel Extended Partition"
60	// Note: The naming of these two at least must be consistent with
61	// DiskDeviceTypes.cpp.
62#define kPartitionTypeApple		"Apple"
63
64#define kPartitionTypeBFS		"BFS Filesystem"
65#define kPartitionTypeAmigaFFS	"AmigaFFS Filesystem"
66#define kPartitionTypeBTRFS		"BTRFS Filesystem"
67#define kPartitionTypeEXFAT		"exFAT Filesystem"
68#define kPartitionTypeEXT2		"EXT2 Filesystem"
69#define kPartitionTypeEXT3		"EXT3 Filesystem"
70#define kPartitionTypeFAT12		"FAT12 Filesystem"
71#define kPartitionTypeFAT32		"FAT32 Filesystem"
72#define kPartitionTypeHFS		"HFS Filesystem"
73#define kPartitionTypeHFSPlus	"HFS+ Filesystem"
74#define kPartitionTypeISO9660	"ISO9660 Filesystem"
75#define kPartitionTypeReiser	"Reiser Filesystem"
76#define kPartitionTypeTarFS		"TAR Filesystem"
77#define kPartitionTypeUDF		"UDF Filesystem"
78
79// structure definitions as used in the boot loader
80struct partition_module_info;
81extern partition_module_info gAmigaPartitionModule;
82extern partition_module_info gApplePartitionModule;
83extern partition_module_info gEFIPartitionModule;
84extern partition_module_info gIntelPartitionMapModule;
85extern partition_module_info gIntelExtendedPartitionModule;
86
87// the file system module info is not a standard module info;
88// their modules are specifically written for the boot loader,
89// and hence, don't need to follow the standard module specs.
90
91struct file_system_module_info {
92	const char	*module_name;
93	const char	*pretty_name;
94	float		(*identify_file_system)(boot::Partition *device);
95	status_t	(*get_file_system)(boot::Partition *device, Directory **_root);
96};
97
98extern file_system_module_info gBFSFileSystemModule;
99extern file_system_module_info gFATFileSystemModule;
100extern file_system_module_info gHFSPlusFileSystemModule;
101extern file_system_module_info gAmigaFFSFileSystemModule;
102extern file_system_module_info gTarFileSystemModule;
103
104#endif	/* KERNEL_BOOT_PARTITIONS_H */
105