Browse Source

Implement the truncate function

Xavier L'Heureux 5 years ago
parent
commit
64f93fe6e0
2 changed files with 17 additions and 3 deletions
  1. 13 3
      src/header/unistd/mod.rs
  2. 4 0
      tests/unistd/ftruncate.c

+ 13 - 3
src/header/unistd/mod.rs

@@ -4,7 +4,7 @@ use core::{convert::TryFrom, mem, ptr, slice};
 
 use crate::{
     c_str::CStr,
-    header::{errno, limits, stdlib::getenv, sys_ioctl, sys_time, termios, time::timespec},
+    header::{errno, limits, fcntl::sys::O_WRONLY, stdlib::getenv, sys_ioctl, sys_time, termios, time::timespec},
     platform::{self, types::*, Pal, Sys},
 };
 use alloc::collections::LinkedList;
@@ -647,9 +647,19 @@ pub extern "C" fn tcsetpgrp(fd: c_int, pgrp: pid_t) -> c_int {
     pgrp
 }
 
-// #[no_mangle]
+#[no_mangle]
 pub extern "C" fn truncate(path: *const c_char, length: off_t) -> c_int {
-    unimplemented!();
+    let file = unsafe { CStr::from_ptr(path) };
+    let fd = Sys::open(file, O_WRONLY, 0);
+    if fd < 0 {
+        return -1;
+    }
+
+    let res = ftruncate(fd, length);
+
+    Sys::close(fd);
+
+    res
 }
 
 #[no_mangle]

+ 4 - 0
tests/unistd/ftruncate.c

@@ -17,4 +17,8 @@ int main(void) {
     int c = close(fd);
     ERROR_IF(close, c, == -1);
     UNEXP_IF(close, c, != 0);
+
+    status = truncate("ftruncate.out", 100);
+    ERROR_IF(truncate, status, == -1);
+    UNEXP_IF(truncate, status, != 0);
 }