io: implement stat'ing paths, files, and directory contents
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user