xref: /haiku/src/add-ons/kernel/file_systems/btrfs/Attribute.h (revision 13581b3d2a71545960b98fefebc5225b5bf29072)
1 /*
2  * Copyright 2019, Bharathi Ramana Joshi, joshibharathiramana@gmail.com.
3  * Copyright 2017, Chế Vũ Gia Hy, cvghy116@gmail.com.
4  * Copyright 2010-2011, Jérôme Duval, korli@users.berlios.de.
5  * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
6  * This file may be used under the terms of the MIT License.
7  */
8 #ifndef ATTRIBUTE_H
9 #define ATTRIBUTE_H
10 
11 
12 #include "CachedBlock.h"
13 #include "Inode.h"
14 
15 
16 struct attr_cookie {
17 	char	name[B_ATTR_NAME_LENGTH];
18 	uint32	type;
19 	int		open_mode;
20 	bool	create;
21 };
22 
23 
24 /** Attributes in btrfs use the same on-disk format as directories, in the
25  * XATTR_ITEM of the inode. Each attribute appears as a "file" there.
26  *
27  * Additionally, this class provides access to the non-extended attributes
28  * through the Stat method. These are stored dorectly in the base inode of
29  * the file.
30  */
31 class Attribute {
32 public:
33 			//! Constructs an Attribute object for the file inode
34 								Attribute(Inode* inode);
35 								Attribute(Inode* inode, attr_cookie* cookie);
36 								~Attribute();
37 
38 			//! Tests if operations specified by openMode can be performed on file *name
39 			status_t			CheckAccess(const char* name, int openMode);
40 
41 			status_t			Create(const char* name, type_code type,
42 									int openMode, attr_cookie** _cookie);
43 			//! Loads file attributes into cookie
44 			status_t			Open(const char* name, int openMode,
45 									attr_cookie** _cookie);
46 
47 			//! Get the stat from the attribute
48 			status_t			Stat(struct stat& stat);
49 
50 			//! Loads extended attributes of file into buffer
51 			status_t			Read(attr_cookie* cookie, off_t pos,
52 									uint8* buffer, size_t* _length);
53 private:
54 			//! Searches through the filesystem tree for the entry named *name
55 			status_t			_Lookup(const char* name, size_t nameLength,
56 									btrfs_dir_entry** entries = NULL,
57 									uint32* length = NULL);
58 			//! Searches through the entry array for the entry named *name
59 			status_t			_FindEntry(btrfs_dir_entry* entries,
60 									size_t length, const char* name,
61 									size_t nameLength,
62 									btrfs_dir_entry** _entry);
63 
64 			::Volume*			fVolume;
65 			Inode*				fInode;
66 			const char*			fName;
67 };
68 
69 #endif	// ATTRIBUTE_H
70 
71