Browse Source

set the correct allocators and ignore the previous and parent directory in readdir.

DanielGavin 4 years ago
parent
commit
0f11c47579
2 changed files with 25 additions and 12 deletions
  1. 11 7
      core/os/dir_linux.odin
  2. 14 5
      core/os/stat_linux.odin

+ 11 - 7
core/os/dir_linux.odin

@@ -28,7 +28,7 @@ read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []F
 		size = 100;
 		size = 100;
 	}
 	}
 
 
-	dfi := make([dynamic]File_Info, 0, size);
+	dfi := make([dynamic]File_Info, 0, size, allocator);
 
 
 	for {
 	for {
 		entry: Dirent;
 		entry: Dirent;
@@ -36,7 +36,7 @@ read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []F
 		entry, err, end_of_stream = _readdir(dirp);
 		entry, err, end_of_stream = _readdir(dirp);
 		if err != ERROR_NONE {
 		if err != ERROR_NONE {
 			for fi_ in dfi {
 			for fi_ in dfi {
-				file_info_delete(fi_);
+				file_info_delete(fi_, allocator);
 			}
 			}
 			delete(dfi);
 			delete(dfi);
 			return;
 			return;
@@ -45,15 +45,19 @@ read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []F
 		}
 		}
 
 
 		fi_: File_Info;
 		fi_: File_Info;
-		
 		filename := cast(string)(transmute(cstring)mem.Raw_Cstring{ data = &entry.name[0] });
 		filename := cast(string)(transmute(cstring)mem.Raw_Cstring{ data = &entry.name[0] });
-		fullpath := strings.join( []string{ dirpath, filename }, "/" );
-		defer delete(fullpath);
 
 
-		fi_, err = stat(fullpath);
+		if filename == "." || filename == ".." {
+			continue;
+		}
+
+		fullpath := strings.join( []string{ dirpath, filename }, "/", context.temp_allocator);
+		defer delete(fullpath, context.temp_allocator);
+
+		fi_, err = stat(fullpath, allocator);
 		if err != ERROR_NONE {
 		if err != ERROR_NONE {
 			for fi__ in dfi {
 			for fi__ in dfi {
-				file_info_delete(fi__);
+				file_info_delete(fi__, allocator);
 			}
 			}
 			delete(dfi);
 			delete(dfi);
 			return;
 			return;

+ 14 - 5
core/os/stat_linux.odin

@@ -63,14 +63,17 @@ _fill_file_info_from_stat :: proc(fi: ^File_Info, s: Stat) {
 	fi.mode = cast(File_Mode)s.mode;
 	fi.mode = cast(File_Mode)s.mode;
 	fi.is_dir = S_ISDIR(s.mode);
 	fi.is_dir = S_ISDIR(s.mode);
 
 
-	// NOTE(laleksic, 2021-01-21): Not really creation time, but closest we can get (maybe better to leave it 0?) 
-	fi.creation_time = _make_time_from_unix_file_time(s.status_change); 
-	
+	// NOTE(laleksic, 2021-01-21): Not really creation time, but closest we can get (maybe better to leave it 0?)
+	fi.creation_time = _make_time_from_unix_file_time(s.status_change);
+
 	fi.modification_time = _make_time_from_unix_file_time(s.modified);
 	fi.modification_time = _make_time_from_unix_file_time(s.modified);
 	fi.access_time = _make_time_from_unix_file_time(s.last_access);
 	fi.access_time = _make_time_from_unix_file_time(s.last_access);
 }
 }
 
 
 lstat :: proc(name: string, allocator := context.allocator) -> (fi: File_Info, err: Errno) {
 lstat :: proc(name: string, allocator := context.allocator) -> (fi: File_Info, err: Errno) {
+
+	context.allocator = allocator;
+
 	s: Stat;
 	s: Stat;
 	s, err = _lstat(name);
 	s, err = _lstat(name);
 	if err != ERROR_NONE {
 	if err != ERROR_NONE {
@@ -80,12 +83,15 @@ lstat :: proc(name: string, allocator := context.allocator) -> (fi: File_Info, e
 	fi.fullpath, err = absolute_path_from_relative(name);
 	fi.fullpath, err = absolute_path_from_relative(name);
 	if err != ERROR_NONE {
 	if err != ERROR_NONE {
 		return;
 		return;
-	}	
+	}
 	fi.name = path.base(fi.fullpath);
 	fi.name = path.base(fi.fullpath);
 	return fi, ERROR_NONE;
 	return fi, ERROR_NONE;
 }
 }
 
 
 stat :: proc(name: string, allocator := context.allocator) -> (fi: File_Info, err: Errno) {
 stat :: proc(name: string, allocator := context.allocator) -> (fi: File_Info, err: Errno) {
+
+	context.allocator = allocator;
+
 	s: Stat;
 	s: Stat;
 	s, err = _stat(name);
 	s, err = _stat(name);
 	if err != ERROR_NONE {
 	if err != ERROR_NONE {
@@ -101,6 +107,9 @@ stat :: proc(name: string, allocator := context.allocator) -> (fi: File_Info, er
 }
 }
 
 
 fstat :: proc(fd: Handle, allocator := context.allocator) -> (fi: File_Info, err: Errno) {
 fstat :: proc(fd: Handle, allocator := context.allocator) -> (fi: File_Info, err: Errno) {
+
+	context.allocator = allocator;
+
 	s: Stat;
 	s: Stat;
 	s, err = _fstat(fd);
 	s, err = _fstat(fd);
 	if err != ERROR_NONE {
 	if err != ERROR_NONE {
@@ -110,7 +119,7 @@ fstat :: proc(fd: Handle, allocator := context.allocator) -> (fi: File_Info, err
 	fi.fullpath, err = absolute_path_from_handle(fd);
 	fi.fullpath, err = absolute_path_from_handle(fd);
 	if err != ERROR_NONE {
 	if err != ERROR_NONE {
 		return;
 		return;
-	}	
+	}
 	fi.name = path.base(fi.fullpath);
 	fi.name = path.base(fi.fullpath);
 	return fi, ERROR_NONE;
 	return fi, ERROR_NONE;
 }
 }