Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/fs/ext2fs/ext2_dir.h
39483 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2009 Aditya Sarawgi
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
#ifndef _FS_EXT2FS_EXT2_DIR_H_
30
#define _FS_EXT2FS_EXT2_DIR_H_
31
32
/*
33
* Structure of a directory entry
34
*/
35
#define EXT2FS_MAXNAMLEN 255
36
37
struct ext2fs_direct {
38
uint32_t e2d_ino; /* inode number of entry */
39
uint16_t e2d_reclen; /* length of this record */
40
uint16_t e2d_namlen; /* length of string in e2d_name */
41
char e2d_name[EXT2FS_MAXNAMLEN];/* name with length<=EXT2FS_MAXNAMLEN */
42
};
43
44
enum slotstatus {
45
NONE,
46
COMPACT,
47
FOUND
48
};
49
50
struct ext2fs_searchslot {
51
enum slotstatus slotstatus;
52
doff_t slotoffset; /* offset of area with free space */
53
int slotsize; /* size of area at slotoffset */
54
int slotfreespace; /* amount of space free in slot */
55
int slotneeded; /* sizeof the entry we are seeking */
56
};
57
58
/*
59
* The new version of the directory entry. Since EXT2 structures are
60
* stored in intel byte order, and the name_len field could never be
61
* bigger than 255 chars, it's safe to reclaim the extra byte for the
62
* file_type field.
63
*/
64
struct ext2fs_direct_2 {
65
uint32_t e2d_ino; /* inode number of entry */
66
uint16_t e2d_reclen; /* length of this record */
67
uint8_t e2d_namlen; /* length of string in e2d_name */
68
uint8_t e2d_type; /* file type */
69
char e2d_name[EXT2FS_MAXNAMLEN]; /* name with
70
* length<=EXT2FS_MAXNAMLEN */
71
};
72
73
struct ext2fs_direct_tail {
74
uint32_t e2dt_reserved_zero1; /* pretend to be unused */
75
uint16_t e2dt_rec_len; /* 12 */
76
uint8_t e2dt_reserved_zero2; /* zero name length */
77
uint8_t e2dt_reserved_ft; /* 0xDE, fake file type */
78
uint32_t e2dt_checksum; /* crc32c(uuid+inum+dirblock) */
79
};
80
81
#define EXT2_FT_DIR_CSUM 0xDE
82
83
#define EXT2_DIRENT_TAIL(data, blocksize) \
84
((struct ext2fs_direct_tail *)(((char *)(data)) + \
85
(blocksize) - sizeof(struct ext2fs_direct_tail)))
86
87
/*
88
* Maximal count of links to a file
89
*/
90
#define EXT4_LINK_MAX 65000
91
92
/*
93
* Ext2 directory file types. Only the low 3 bits are used. The
94
* other bits are reserved for now.
95
*/
96
#define EXT2_FT_UNKNOWN 0
97
#define EXT2_FT_REG_FILE 1
98
#define EXT2_FT_DIR 2
99
#define EXT2_FT_CHRDEV 3
100
#define EXT2_FT_BLKDEV 4
101
#define EXT2_FT_FIFO 5
102
#define EXT2_FT_SOCK 6
103
#define EXT2_FT_SYMLINK 7
104
#define EXT2_FT_MAX 8
105
106
/*
107
* EXT2_DIR_PAD defines the directory entries boundaries
108
*
109
* NOTE: It must be a multiple of 4
110
*/
111
#define EXT2_DIR_PAD 4
112
#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
113
#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
114
~EXT2_DIR_ROUND)
115
#endif /* !_FS_EXT2FS_EXT2_DIR_H_ */
116
117