-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdirectoryentry.h
More file actions
executable file
·73 lines (57 loc) · 2.75 KB
/
directoryentry.h
File metadata and controls
executable file
·73 lines (57 loc) · 2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef DIRECTORYENTRY_H
#define DIRECTORYENTRY_H
// Um diretório é um arquivo que contém uma lista de entradas. Cada entrada
// contém um número de inode e um nome de arquivo. Quando um processo usa um
// nome de caminho, o código do kernel procura nos diretórios para encontrar
// o número do inode correspondente. Após o nome ter sido convertido em um
// número de inode, o inode é carregado na memória e usado por solicitações
// subsequentes.
// Constantes usadas em alguns dos campos de entrada do diretório.
#define NAME_LEN 24 // Tamanho do nome em Bytes
#define UNKNOWN 0xE5 // Tipo de Arquivo Desconhecido
#define FT_REG_FILE 0x01 // Arquivo
#define FT_DIR 0x02 // Diretório
#include <stdint.h>
#include <string>
#include <cstring>
// Essa estrutura representa uma entrada de diretório. Observe que o campo
// "nome" é na verdade comprimento variável no disco; para os fins desta
// estrutura, assumiremos o pior caso de NAME_LEN bytes.
// TAMANHO DE CADA DENTRY/DIRECTORY ENTRY == 32 bytes
typedef struct dentry {
dentry();
void setName(std::string file_name);
// O número de inode de 32 bits do arquivo referido por esta entrada
// de diretório. Se o número do inode for zero, é o inode reservado para o root
uint32_t inode;
//Tamanho da dentry == 0x20 == 32, ocupa até 2 bytes
uint16_t entry_len;
// Variável não sinalizada de 8 bits, indicando quantos bytes de dados de
// caracteres estão no nome.
uint8_t name_len;
// Variável não sinalizada de 8 bits, indicando o tipo do arquivo. Pode ser
// qualquer um dos seguintes:
//
// EXT2_FT_UNKNOWN 0xE5 Unknown File Type
// EXT2_FT_REG_FILE 0x01 Regular File
// EXT2_FT_DIR 0x02 Directory File
uint8_t file_type;
// O próprio nome do arquivo. Os nomes dos arquivos serão preenchidos
// caracteres (ou seja, valor 0) para que sempre haja um múltiplo de 4
// caracteres em uma entrada de diretório. Mas apenas os primeiros
// caracteres "name_len" fazem parte do nome do arquivo e você não pode
// confiar na existência de um caractere NULL na entrada (por exemplo,
// se o nome do arquivo for realmente um múltiplo perfeito de 4).
uint8_t file_name[NAME_LEN];
} __attribute__((__packed__)) dentry;
dentry::dentry() {
this->inode = 0;
this->entry_len = 0;
this->name_len = 0;
this->file_type = UNKNOWN;
std::fill_n(this->file_name, NAME_LEN, NULL);
}
void dentry::setName(std::string file_name){
std::memcpy(this->file_name, file_name.data(), file_name.size() > (NAME_LEN-1) ? (NAME_LEN-1) : file_name.size());
}
#endif // DIRECTORYENTRY_H