1/*
2 * Copyright 2002-2012, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _ENTRY_H
6#define _ENTRY_H
7
8
9#include <sys/types.h>
10#include <sys/stat.h>
11#include <SupportDefs.h>
12
13#include <Statable.h>
14
15
16class BDirectory;
17class BPath;
18
19
20struct entry_ref {
21								entry_ref();
22								entry_ref(dev_t dev, ino_t dir,
23									const char* name);
24								entry_ref(const entry_ref& ref);
25								~entry_ref();
26
27			status_t			set_name(const char* name);
28
29			bool				operator==(const entry_ref& ref) const;
30			bool				operator!=(const entry_ref& ref) const;
31			entry_ref&			operator=(const entry_ref& ref);
32
33			dev_t				device;
34			ino_t				directory;
35			char*				name;
36};
37
38
39class BEntry : public BStatable {
40public:
41								BEntry();
42								BEntry(const BDirectory* dir, const char* path,
43									bool traverse = false);
44								BEntry(const entry_ref* ref,
45									bool traverse = false);
46								BEntry(const char* path, bool traverse = false);
47								BEntry(const BEntry& entry);
48	virtual						~BEntry();
49
50			status_t			InitCheck() const;
51			bool				Exists() const;
52
53			const char*			Name() const;
54
55	virtual status_t			GetStat(struct stat* stat) const;
56
57			status_t			SetTo(const BDirectory* dir, const char* path,
58								   bool traverse = false);
59			status_t			SetTo(const entry_ref* ref,
60									bool traverse = false);
61			status_t			SetTo(const char* path, bool traverse = false);
62			void				Unset();
63
64			status_t			GetRef(entry_ref* ref) const;
65			status_t			GetPath(BPath* path) const;
66			status_t			GetParent(BEntry* entry) const;
67			status_t			GetParent(BDirectory* dir) const;
68			status_t			GetName(char* buffer) const;
69
70			status_t			Rename(const char* path, bool clobber = false);
71			status_t			MoveTo(BDirectory* dir, const char* path = NULL,
72									bool clobber = false);
73			status_t			Remove();
74
75			bool				operator==(const BEntry& item) const;
76			bool				operator!=(const BEntry& item) const;
77
78			BEntry&				operator=(const BEntry& item);
79
80private:
81			friend class BDirectory;
82			friend class BFile;
83			friend class BNode;
84			friend class BSymLink;
85
86	virtual	void				_PennyEntry1();
87	virtual	void				_PennyEntry2();
88	virtual	void				_PennyEntry3();
89	virtual	void				_PennyEntry4();
90	virtual	void				_PennyEntry5();
91	virtual	void				_PennyEntry6();
92
93	// BEntry implementation of BStatable::set_stat()
94	virtual	status_t			set_stat(struct stat& stat, uint32 what);
95			status_t			_SetTo(int dir, const char* path,
96									bool traverse);
97			status_t			_SetName(const char* name);
98
99			status_t			_Rename(BEntry& target, bool clobber);
100
101			void				_Dump(const char* name = NULL);
102
103			status_t			_GetStat(struct stat* stat) const;
104	virtual status_t			_GetStat(struct stat_beos* stat) const;
105
106private:
107			int					fDirFd;
108			char*				fName;
109			status_t			fCStatus;
110
111			uint32				_reserved[4];
112};
113
114
115status_t get_ref_for_path(const char* path, entry_ref* ref);
116bool operator<(const entry_ref& a, const entry_ref& b);
117
118
119#endif	// _ENTRY_H
120