A few I/O related fixes
This commit is contained in:
@@ -30,8 +30,7 @@ pub unsafe fn parse_mode_flags(mode_str: *const c_char) -> i32 {
|
||||
}
|
||||
if (*mode_str) == b'w' as i8 {
|
||||
flags |= O_TRUNC;
|
||||
}
|
||||
if (*mode_str) != b'a' as i8 {
|
||||
} else if (*mode_str) == b'a' as i8 {
|
||||
flags |= O_APPEND;
|
||||
}
|
||||
|
||||
|
||||
+15
-3
@@ -376,13 +376,19 @@ pub extern "C" fn fgets(s: *mut c_char, n: c_int, stream: &mut FILE) -> *mut c_c
|
||||
idiff += 1;
|
||||
len -= 1;
|
||||
if st[pos] == b'\n' || st[pos] as i8 == stream.buf_char {
|
||||
stream.read = Some((rpos + idiff, rend));
|
||||
break 'outer;
|
||||
}
|
||||
}
|
||||
stream.read = Some((rpos + idiff, rend));
|
||||
if rend - rpos == 0 {
|
||||
len -= stream.read(&mut st[((n - len) as usize)..]) as i32;
|
||||
break;
|
||||
match stream.read(&mut st[((n - len) as usize)..]) as i32 {
|
||||
0 if idiff == 0 => return ptr::null_mut(),
|
||||
n => {
|
||||
len -= n.max(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if len <= 1 {
|
||||
break;
|
||||
@@ -426,7 +432,13 @@ pub extern "C" fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FI
|
||||
|
||||
let flags = unsafe { helpers::parse_mode_flags(mode) };
|
||||
|
||||
let fd = fcntl::sys_open(filename, flags, 0o666);
|
||||
let new_mode = if flags & fcntl::O_CREAT == fcntl::O_CREAT {
|
||||
0o666
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
let fd = fcntl::sys_open(filename, flags, new_mode);
|
||||
if fd < 0 {
|
||||
return ptr::null_mut();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user