소스 검색

add _chtimes

CiD- 3 년 전
부모
커밋
88de3a1c06
2개의 변경된 파일14개의 추가작업 그리고 2개의 파일을 삭제
  1. 8 2
      core/os/os2/file_linux.odin
  2. 6 0
      core/sys/unix/syscalls_linux.odin

+ 8 - 2
core/os/os2/file_linux.odin

@@ -27,6 +27,8 @@ _O_SYNC      :: 0o4010000
 _O_CLOEXEC   :: 0o2000000
 _O_PATH      :: 0o10000000
 
+_AT_FDCWD :: -100
+
 _open :: proc(name: string, flags: File_Flags, perm: File_Mode) -> (Handle, Error) {
 	cstr := strings.clone_to_cstring(name, context.temp_allocator)
 
@@ -250,8 +252,12 @@ _lchown :: proc(name: string, uid, gid: int) -> Error {
 }
 
 _chtimes :: proc(name: string, atime, mtime: time.Time) -> Error {
-	//TODO
-	return nil
+	name_cstr := strings.clone_to_cstring(name, context.temp_allocator)
+	times := [2]Unix_File_Time {
+		{ atime._nsec, 0 },
+		{ mtime._nsec, 0 },
+	}
+	return _ok_or_error(unix.sys_utimensat(_AT_FDCWD, name_cstr, &times, 0))
 }
 
 _exists :: proc(name: string) -> bool {

+ 6 - 0
core/sys/unix/syscalls_linux.odin

@@ -1779,6 +1779,12 @@ sys_fork :: proc() -> int {
 	}
 }
 
+// NOTE: Unsure about if this works directly on 32 bit archs. It may need 32 bit version of the time struct.
+//       As of Linux 5.1, there is a utimensat_time64 function.  Maybe use this in the future?
+sys_utimensat :: proc(dfd: int, path: cstring, times: rawptr, flags: int) -> int {
+	return int(intrinsics.syscall(SYS_utimensat, uintptr(dfd), uintptr(rawptr(path)), uintptr(times), uintptr(flags)))
+}
+
 get_errno :: proc(res: int) -> i32 {
 	if res < 0 && res > -4096 {
 		return i32(-res)