From d9341614476bfa002511be778085b26ebc95ffca Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 27 Feb 2020 19:04:05 -0800 Subject: [PATCH] Check for stat errors when getting file attributes on linux --- 4ed_search_list.cpp | 2 -- platform_linux/linux_4ed.cpp | 2 +- platform_linux/linux_4ed_functions.cpp | 29 ++++++++++++++++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/4ed_search_list.cpp b/4ed_search_list.cpp index 976872c4..9eecc551 100644 --- a/4ed_search_list.cpp +++ b/4ed_search_list.cpp @@ -42,11 +42,9 @@ get_full_path(Arena *arena, Path_Search_List *search_list, String_Const_u8 relat u8 *path_base = relative_base - node_size; block_copy(path_base, node->string.str, node_size); String_Const_u8 name = SCu8(path_base, opl); - printf("get_full_path: trying %.*s\n", string_expand(name)); File_Attributes attribs = system_quick_file_attributes(arena, name); if (attribs.size > 0){ result = name; - printf("hit\n"); break; } } diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 1a481880..c24a6a2a 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -353,7 +353,7 @@ linux_file_attributes_from_struct_stat(struct stat* file_stat) { result.size = file_stat->st_size; result.last_write_time = linux_ns_from_timespec(file_stat->st_mtim); result.flags = linux_convert_file_attribute_flags(file_stat->st_mode); - return result; + return(result); } internal void diff --git a/platform_linux/linux_4ed_functions.cpp b/platform_linux/linux_4ed_functions.cpp index 689d9c89..6f4145e1 100644 --- a/platform_linux/linux_4ed_functions.cpp +++ b/platform_linux/linux_4ed_functions.cpp @@ -132,11 +132,13 @@ system_get_file_list(Arena* arena, String_Const_u8 directory){ (*fip)->file_name = push_u8_stringf(arena, "%.*s", d->d_reclen, name); struct stat st; - if(fstatat(fd, name, &st, 0) == -1){ + if (fstatat(fd, name, &st, 0) == -1){ perror("fstatat"); } + else{ + (*fip)->attributes = linux_file_attributes_from_struct_stat(&st); + } - (*fip)->attributes = linux_file_attributes_from_struct_stat(&st); fip = &(*fip)->next; result.count++; } @@ -163,9 +165,14 @@ system_get_file_list(Arena* arena, String_Const_u8 directory){ internal File_Attributes system_quick_file_attributes(Arena* scratch, String_Const_u8 file_name){ //LINUX_FN_DEBUG("%.*s", (int)file_name.size, file_name.str); + Temp_Memory_Block temp(scratch); + file_name = push_string_copy(scratch, file_name); + File_Attributes result = {}; struct stat file_stat; - stat((const char*)file_name.str, &file_stat); - return linux_file_attributes_from_struct_stat(&file_stat); + if (stat((const char*)file_name.str, &file_stat) == 0){ + result = linux_file_attributes_from_struct_stat(&file_stat); + } + return(result); } internal b32 @@ -182,9 +189,12 @@ system_load_handle(Arena* scratch, char* file_name, Plat_Handle* out){ internal File_Attributes system_load_attributes(Plat_Handle handle){ LINUX_FN_DEBUG(); + File_Attributes result = {}; struct stat file_stat; - fstat(*(int*)&handle, &file_stat); - return linux_file_attributes_from_struct_stat(&file_stat); + if (fstat(*(int*)&handle, &file_stat) == 0){ + result = linux_file_attributes_from_struct_stat(&file_stat); + } + return(result); } internal b32 @@ -217,10 +227,11 @@ system_save_file(Arena* scratch, char* file_name, String_Const_u8 data){ int bytes_written = write(fd, data.str, data.size); if (bytes_written == -1) { perror("write"); - } else if(bytes_written == data.size) { + } else if (bytes_written == data.size) { struct stat file_stat; - fstat(fd, &file_stat); - return linux_file_attributes_from_struct_stat(&file_stat); + if (fstat(fd, &file_stat) == 0){ + result = linux_file_attributes_from_struct_stat(&file_stat); + } } } else { perror("open");