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		void SetParent(Partition *parent);
34		Partition *Parent() const;
35
36		bool IsFileSystem() const { return fIsFileSystem; }
37		bool IsPartitioningSystem() const { return fIsPartitioningSystem; }
38		const char *ModuleName() const { return fModuleName; }
39
40		int FD() const { return fFD; }
41
42	private:
43		status_t _Mount(file_system_module_info *module, Directory **_fileSystem);
44
45		int			fFD;
46		NodeList	fChildren;
47		Partition	*fParent;
48		bool		fIsFileSystem, fIsPartitioningSystem;
49		const char	*fModuleName;
50};
51
52}	// namespace boot
53
54// DiskDeviceTypes we need/support in the boot loader
55#define kPartitionTypeAmiga		"Amiga RDB"
56#define kPartitionTypeIntel		"Intel Partition Map"
57#define kPartitionTypeIntelExtended "Intel Extended Partition"
58	// Note: The naming of these two at least must be consistent with
59	// DiskDeviceTypes.cpp.
60#define kPartitionTypeApple		"Apple"
61
62#define kPartitionTypeBFS		"BFS Filesystem"
63#define kPartitionTypeAmigaFFS	"AmigaFFS Filesystem"
64#define kPartitionTypeBTRFS		"BTRFS Filesystem"
65#define kPartitionTypeEXFAT		"exFAT Filesystem"
66#define kPartitionTypeEXT2		"EXT2 Filesystem"
67#define kPartitionTypeEXT3		"EXT3 Filesystem"
68#define kPartitionTypeFAT12		"FAT12 Filesystem"
69#define kPartitionTypeFAT32		"FAT32 Filesystem"
70#define kPartitionTypeHFS		"HFS Filesystem"
71#define kPartitionTypeHFSPlus	"HFS+ Filesystem"
72#define kPartitionTypeISO9660	"ISO9660 Filesystem"
73#define kPartitionTypeReiser	"Reiser Filesystem"
74#define kPartitionTypeTarFS		"TAR Filesystem"
75#define kPartitionTypeUDF		"UDF Filesystem"
76
77// structure definitions as used in the boot loader
78struct partition_module_info;
79extern partition_module_info gAmigaPartitionModule;
80extern partition_module_info gApplePartitionModule;
81extern partition_module_info gEFIPartitionModule;
82extern partition_module_info gIntelPartitionMapModule;
83extern partition_module_info gIntelExtendedPartitionModule;
84
85// the file system module info is not a standard module info;
86// their modules are specifically written for the boot loader,
87// and hence, don't need to follow the standard module specs.
88
89struct file_system_module_info {
90	const char	*module_name;
91	const char	*pretty_name;
92	float		(*identify_file_system)(boot::Partition *device);
93	status_t	(*get_file_system)(boot::Partition *device, Directory **_root);
94};
95
96extern file_system_module_info gBFSFileSystemModule;
97extern file_system_module_info gFATFileSystemModule;
98extern file_system_module_info gHFSPlusFileSystemModule;
99extern file_system_module_info gAmigaFFSFileSystemModule;
100extern file_system_module_info gTarFileSystemModule;
101
102#endif	/* KERNEL_BOOT_PARTITIONS_H */
103