xref: /haiku/src/add-ons/kernel/file_systems/ext2/Attribute.h (revision db1b905e370e63d8f5abf215351765fb08c4758a)
1*db1b905eSJérôme Duval /*
2*db1b905eSJérôme Duval  * Copyright 2010, Jérôme Duval, korli@users.berlios.de.
3*db1b905eSJérôme Duval  * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
4*db1b905eSJérôme Duval  * This file may be used under the terms of the MIT License.
5*db1b905eSJérôme Duval  */
6*db1b905eSJérôme Duval #ifndef ATTRIBUTE_H
7*db1b905eSJérôme Duval #define ATTRIBUTE_H
8*db1b905eSJérôme Duval 
9*db1b905eSJérôme Duval 
10*db1b905eSJérôme Duval #include "CachedBlock.h"
11*db1b905eSJérôme Duval #include "Inode.h"
12*db1b905eSJérôme Duval 
13*db1b905eSJérôme Duval 
14*db1b905eSJérôme Duval struct attr_cookie {
15*db1b905eSJérôme Duval 	char	name[B_ATTR_NAME_LENGTH];
16*db1b905eSJérôme Duval 	uint32	type;
17*db1b905eSJérôme Duval 	int		open_mode;
18*db1b905eSJérôme Duval 	bool	create;
19*db1b905eSJérôme Duval };
20*db1b905eSJérôme Duval 
21*db1b905eSJérôme Duval 
22*db1b905eSJérôme Duval class Attribute {
23*db1b905eSJérôme Duval public:
24*db1b905eSJérôme Duval 							Attribute(Inode* inode);
25*db1b905eSJérôme Duval 							Attribute(Inode* inode, attr_cookie* cookie);
26*db1b905eSJérôme Duval 							~Attribute();
27*db1b905eSJérôme Duval 
28*db1b905eSJérôme Duval 			status_t		InitCheck();
29*db1b905eSJérôme Duval 			status_t		CheckAccess(const char* name, int openMode);
30*db1b905eSJérôme Duval 
31*db1b905eSJérôme Duval 			status_t		Find(const char* name);
32*db1b905eSJérôme Duval 			status_t		Find(int32 index);
33*db1b905eSJérôme Duval 			status_t		GetName(char* name, size_t* _nameLength);
34*db1b905eSJérôme Duval 			void			Put();
35*db1b905eSJérôme Duval 
36*db1b905eSJérôme Duval 			status_t		Create(const char* name, type_code type,
37*db1b905eSJérôme Duval 								int openMode, attr_cookie** _cookie);
38*db1b905eSJérôme Duval 			status_t		Open(const char* name, int openMode,
39*db1b905eSJérôme Duval 								attr_cookie** _cookie);
40*db1b905eSJérôme Duval 
41*db1b905eSJérôme Duval 			status_t		Stat(struct stat& stat);
42*db1b905eSJérôme Duval 
43*db1b905eSJérôme Duval 			status_t		Read(attr_cookie* cookie, off_t pos, uint8* buffer,
44*db1b905eSJérôme Duval 								size_t* _length);
45*db1b905eSJérôme Duval 			status_t		Write(Transaction& transaction, attr_cookie* cookie,
46*db1b905eSJérôme Duval 								off_t pos, const uint8* buffer,
47*db1b905eSJérôme Duval 								size_t* _length, bool* _created);
48*db1b905eSJérôme Duval 
49*db1b905eSJérôme Duval private:
50*db1b905eSJérôme Duval 			status_t		_Truncate();
51*db1b905eSJérôme Duval 			status_t		_Find(const char* name, int32 index);
52*db1b905eSJérôme Duval 			status_t		_FindAttributeBody(const uint8* start, const uint8* end,
53*db1b905eSJérôme Duval 								const char* name, int32 index, int32 *count,
54*db1b905eSJérôme Duval 								ext2_xattr_entry** entry);
55*db1b905eSJérôme Duval 			status_t		_FindAttributeBlock(const uint8* start, const uint8* end,
56*db1b905eSJérôme Duval 								const char* name, int32 index, int32 *count,
57*db1b905eSJérôme Duval 								ext2_xattr_entry** entry);
58*db1b905eSJérôme Duval 			status_t 		_FindAttribute(const uint8* start, const uint8* end,
59*db1b905eSJérôme Duval 								const char* name, int32 index, int32 *count,
60*db1b905eSJérôme Duval 								ext2_xattr_entry** entry);
61*db1b905eSJérôme Duval 			status_t		_PrefixedName(ext2_xattr_entry* entry, char* _name,
62*db1b905eSJérôme Duval 								size_t* _nameLength);
63*db1b905eSJérôme Duval 
64*db1b905eSJérôme Duval 			::Volume*		fVolume;
65*db1b905eSJérôme Duval 			CachedBlock		fBlock;
66*db1b905eSJérôme Duval 			Inode*			fInode;
67*db1b905eSJérôme Duval 			ext2_xattr_entry* fBodyEntry;
68*db1b905eSJérôme Duval 			ext2_xattr_entry* fBlockEntry;
69*db1b905eSJérôme Duval 			const char*		fName;
70*db1b905eSJérôme Duval };
71*db1b905eSJérôme Duval 
72*db1b905eSJérôme Duval #endif	// ATTRIBUTE_H
73