1/*
2 * Copyright 2020 Suhel Mehta, mehtasuhel@gmail.com
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6
7#ifndef DIRECTORYITERATOR_H
8#define DIRECTORYITERATOR_H
9
10
11#include "ufs2.h"
12
13
14class Inode;
15
16#define	MAXNAMELEN	255
17
18struct dir {
19	u_int32_t	next_ino;
20	u_int16_t	reclen;
21	u_int8_t	type;
22	u_int8_t	namlen;
23	char		name[MAXNAMELEN + 1];
24};
25
26struct dir_info {
27	u_int32_t	dot_ino;
28	int16_t		dot_reclen;
29	u_int8_t	dot_type;
30	u_int8_t	dot_namelen;
31	char		dot_name[4];
32	u_int32_t	dotdot_ino;
33	int16_t		dotdot_reclen;
34	u_int8_t	dotdot_type;
35	u_int8_t	dotdot_namelen;
36	char		dotdot_name[4];
37};
38
39class DirectoryIterator {
40public:
41								DirectoryIterator(Inode* inode);
42								~DirectoryIterator();
43
44			status_t			InitCheck();
45			status_t			Rewind();
46			status_t			Lookup(const char* name, ino_t* id);
47			status_t			GetNext(char* name, size_t* _nameLength,
48										ino_t* _id);
49			status_t			_GetNext(const char* name, size_t* _nameLength,
50										ino_t* _id, int64_t* offset);
51			dir*				DirectContent() { return direct; }
52			dir_info*			DirectInfo() { return direct_info; }
53
54private:
55			int 				fCountDir;
56			int64				fOffset;
57			cluster_t			fCluster;
58			Inode* 				fInode;
59			dir*				direct;
60			dir_info*			direct_info;
61
62};
63
64
65#endif	// DIRECTORYITERATOR_H
66