io: implement stat'ing paths, files, and directory contents

This commit is contained in:
2025-02-14 22:06:24 +00:00
parent 61848aadd7
commit bf83831cee
9 changed files with 257 additions and 46 deletions

View File

@@ -44,7 +44,8 @@ static enum b_status status_from_win32_error(int error, enum b_status default_va
}
enum b_status b_directory_open(
struct b_directory *root, const struct b_path *path, struct b_directory **out)
struct b_directory *root, const struct b_path *path,
struct b_directory **out)
{
enum b_status status = B_SUCCESS;
@@ -65,7 +66,7 @@ enum b_status b_directory_open(
if (dir_handle == INVALID_HANDLE_VALUE) {
status = status_from_win32_error(GetLastError(), B_ERR_IO_FAILURE);
b_path_release(new_path);
return status;
@@ -74,14 +75,13 @@ enum b_status b_directory_open(
BY_HANDLE_FILE_INFORMATION dir_info;
if (!GetFileInformationByHandle(dir_handle, &dir_info)) {
status = status_from_win32_error(GetLastError(), B_ERR_IO_FAILURE);
CloseHandle(dir_handle);
b_path_release(new_path);
return status;
}
if (!(dir_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
CloseHandle(dir_handle);
b_path_release(new_path);
@@ -104,7 +104,8 @@ enum b_status b_directory_open(
return B_SUCCESS;
}
static struct iteration_state *get_iteration_state(struct z__b_directory_iterator *it)
static struct iteration_state *get_iteration_state(
struct z__b_directory_iterator *it)
{
b_queue_entry *last = b_queue_last(&it->state_stack);
@@ -115,7 +116,8 @@ static struct iteration_state *get_iteration_state(struct z__b_directory_iterato
return b_unbox(struct iteration_state, last, entry);
}
static struct iteration_state *push_iteration_state(struct z__b_directory_iterator *it)
static struct iteration_state *push_iteration_state(
struct z__b_directory_iterator *it)
{
struct iteration_state *state = malloc(sizeof *state);
if (!state) {
@@ -131,11 +133,11 @@ static struct iteration_state *push_iteration_state(struct z__b_directory_iterat
static void pop_iteration_state(struct z__b_directory_iterator *it)
{
struct iteration_state *state = get_iteration_state(it);
if (!state) {
return;
}
b_queue_pop_back(&it->state_stack);
FindClose(state->search);
free(state);
@@ -185,8 +187,7 @@ static bool move_into_directory(struct b_directory_iterator *it, const char *dir
dir_name_p,
};
struct b_path *dir_path
= b_path_join(parts, sizeof parts / sizeof *parts);
struct b_path *dir_path = b_path_join(parts, sizeof parts / sizeof *parts);
parts[0] = dir_path;
parts[1] = wildcard;
@@ -220,7 +221,8 @@ static bool move_into_directory(struct b_directory_iterator *it, const char *dir
return true;
}
static bool move_to_first_item(struct b_directory_iterator *it, const struct b_path *root_dir)
static bool move_to_first_item(
struct b_directory_iterator *it, const struct b_path *root_dir)
{
bool has_results = move_into_directory(it, b_path_ptr(root_dir));
@@ -255,7 +257,9 @@ static bool move_to_next_item(struct b_directory_iterator *it)
while (true) {
struct iteration_state *state = get_iteration_state(it->_z);
if (!state->child_search_complete && (state->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST)) {
if (!state->child_search_complete
&& (state->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST)) {
if (move_into_directory(it, state->data.cFileName)) {
return true;
}
@@ -267,7 +271,8 @@ static bool move_to_next_item(struct b_directory_iterator *it)
pop_iteration_state(it->_z);
state = get_iteration_state(it->_z);
if (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST && state != NULL) {
if (it->flags & B_DIRECTORY_ITERATE_PARENT_FIRST
&& state != NULL) {
state->child_search_complete = true;
continue;
}
@@ -307,7 +312,8 @@ static bool move_to_next_item(struct b_directory_iterator *it)
}
int b_directory_iterator_begin(
struct b_directory *directory, struct b_directory_iterator *it, enum b_directory_iterator_flags flags)
struct b_directory *directory, struct b_directory_iterator *it,
enum b_directory_iterator_flags flags)
{
if (b_directory_iterator_is_valid(it)) {
cleanup_iterator(it);
@@ -357,5 +363,4 @@ bool b_directory_iterator_is_valid(const struct b_directory_iterator *it)
static void directory_release(struct b_object *obj)
{
}
}