Skip to content
Snippets Groups Projects
Commit ef6375cb authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Merge branch 'lockf_impl' into 'master'

lockf implementation proposal

See merge request redox-os/relibc!396
parents a768852b bae8bb68
No related branches found
No related tags found
1 merge request!396lockf implementation proposal
Pipeline #12196 failed
...@@ -14,13 +14,13 @@ int open(const char* filename, int flags, ...) { ...@@ -14,13 +14,13 @@ int open(const char* filename, int flags, ...) {
return sys_open(filename, flags, mode); return sys_open(filename, flags, mode);
} }
int sys_fcntl(int fildes, int cmd, int args); int sys_fcntl(int fildes, int cmd, unsigned long long args);
int fcntl(int fildes, int cmd, ...) { int fcntl(int fildes, int cmd, ...) {
int args = 0; unsigned long long args = 0;
va_list ap; va_list ap;
va_start(ap, cmd); va_start(ap, cmd);
args = va_arg(ap, int); args = va_arg(ap, unsigned long long);
va_end(ap); va_end(ap);
return sys_fcntl(fildes, cmd, args); return sys_fcntl(fildes, cmd, args);
} }
...@@ -28,11 +28,17 @@ pub const F_RDLCK: c_int = 0; ...@@ -28,11 +28,17 @@ pub const F_RDLCK: c_int = 0;
pub const F_WRLCK: c_int = 1; pub const F_WRLCK: c_int = 1;
pub const F_UNLCK: c_int = 2; pub const F_UNLCK: c_int = 2;
pub const F_ULOCK: c_int = 0;
pub const F_LOCK: c_int = 1;
pub const F_TLOCK: c_int = 2;
pub const F_TEST: c_int = 3;
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn creat(path: *const c_char, mode: mode_t) -> c_int { pub unsafe extern "C" fn creat(path: *const c_char, mode: mode_t) -> c_int {
sys_open(path, O_WRONLY | O_CREAT | O_TRUNC, mode) sys_open(path, O_WRONLY | O_CREAT | O_TRUNC, mode)
} }
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy, Default)]
pub struct flock { pub struct flock {
pub l_type: c_short, pub l_type: c_short,
pub l_whence: c_short, pub l_whence: c_short,
...@@ -41,7 +47,7 @@ pub struct flock { ...@@ -41,7 +47,7 @@ pub struct flock {
pub l_pid: pid_t, pub l_pid: pid_t,
} }
#[no_mangle] #[no_mangle]
pub extern "C" fn sys_fcntl(fildes: c_int, cmd: c_int, arg: c_int) -> c_int { pub extern "C" fn sys_fcntl(fildes: c_int, cmd: c_int, arg: c_ulonglong) -> c_int {
Sys::fcntl(fildes, cmd, arg) Sys::fcntl(fildes, cmd, arg)
} }
......
...@@ -50,13 +50,13 @@ pub unsafe fn _fdopen(fd: c_int, mode: *const c_char) -> Option<*mut FILE> { ...@@ -50,13 +50,13 @@ pub unsafe fn _fdopen(fd: c_int, mode: *const c_char) -> Option<*mut FILE> {
} }
if !strchr(mode, b'e' as i32).is_null() { if !strchr(mode, b'e' as i32).is_null() {
sys_fcntl(fd, F_SETFD, FD_CLOEXEC); sys_fcntl(fd, F_SETFD, FD_CLOEXEC as c_ulonglong);
} }
if *mode == 'a' as i8 { if *mode == 'a' as i8 {
let f = sys_fcntl(fd, F_GETFL, 0); let f = sys_fcntl(fd, F_GETFL, 0);
if (f & O_APPEND) == 0 { if (f & O_APPEND) == 0 {
sys_fcntl(fd, F_SETFL, f | O_APPEND); sys_fcntl(fd, F_SETFL, (f | O_APPEND) as c_ulonglong);
} }
flags |= F_APP; flags |= F_APP;
} }
......
...@@ -505,7 +505,7 @@ pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) -> ...@@ -505,7 +505,7 @@ pub unsafe extern "C" fn fopen(filename: *const c_char, mode: *const c_char) ->
} }
if flags & fcntl::O_CLOEXEC > 0 { if flags & fcntl::O_CLOEXEC > 0 {
fcntl::sys_fcntl(fd, fcntl::F_SETFD, fcntl::FD_CLOEXEC); fcntl::sys_fcntl(fd, fcntl::F_SETFD, fcntl::FD_CLOEXEC as c_ulonglong);
} }
if let Some(f) = helpers::_fdopen(fd, mode) { if let Some(f) = helpers::_fdopen(fd, mode) {
...@@ -596,10 +596,10 @@ pub unsafe extern "C" fn freopen( ...@@ -596,10 +596,10 @@ pub unsafe extern "C" fn freopen(
if filename.is_null() { if filename.is_null() {
// Reopen stream in new mode // Reopen stream in new mode
if flags & fcntl::O_CLOEXEC > 0 { if flags & fcntl::O_CLOEXEC > 0 {
fcntl::sys_fcntl(*stream.file, fcntl::F_SETFD, fcntl::FD_CLOEXEC); fcntl::sys_fcntl(*stream.file, fcntl::F_SETFD, fcntl::FD_CLOEXEC as c_ulonglong);
} }
flags &= !(fcntl::O_CREAT | fcntl::O_EXCL | fcntl::O_CLOEXEC); flags &= !(fcntl::O_CREAT | fcntl::O_EXCL | fcntl::O_CLOEXEC);
if fcntl::sys_fcntl(*stream.file, fcntl::F_SETFL, flags) < 0 { if fcntl::sys_fcntl(*stream.file, fcntl::F_SETFL, flags as c_ulonglong) < 0 {
funlockfile(stream); funlockfile(stream);
fclose(stream); fclose(stream);
return ptr::null_mut(); return ptr::null_mut();
...@@ -615,7 +615,7 @@ pub unsafe extern "C" fn freopen( ...@@ -615,7 +615,7 @@ pub unsafe extern "C" fn freopen(
if *new.file == *stream.file { if *new.file == *stream.file {
new.file.fd = -1; new.file.fd = -1;
} else if Sys::dup2(*new.file, *stream.file) < 0 } else if Sys::dup2(*new.file, *stream.file) < 0
|| fcntl::sys_fcntl(*stream.file, fcntl::F_SETFL, flags & fcntl::O_CLOEXEC) < 0 || fcntl::sys_fcntl(*stream.file, fcntl::F_SETFL, (flags & fcntl::O_CLOEXEC) as c_ulonglong) < 0
{ {
funlockfile(stream); funlockfile(stream);
fclose(new); fclose(new);
......
...@@ -63,7 +63,7 @@ fn dup_write<T>(fd: c_int, name: &str, t: &T) -> syscall::Result<usize> { ...@@ -63,7 +63,7 @@ fn dup_write<T>(fd: c_int, name: &str, t: &T) -> syscall::Result<usize> {
pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> c_int { pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> c_int {
match request { match request {
FIONBIO => { FIONBIO => {
let mut flags = fcntl::sys_fcntl(fd, fcntl::F_GETFL, 0); let mut flags = fcntl::sys_fcntl(fd, fcntl::F_GETFL, 0usize);
if flags < 0 { if flags < 0 {
return -1; return -1;
} }
...@@ -72,7 +72,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> ...@@ -72,7 +72,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) ->
} else { } else {
flags | fcntl::O_NONBLOCK flags | fcntl::O_NONBLOCK
}; };
if fcntl::sys_fcntl(fd, fcntl::F_SETFL, flags) < 0 { if fcntl::sys_fcntl(fd, fcntl::F_SETFL, flags as c_ulonglong) < 0 {
-1 -1
} else { } else {
0 0
......
...@@ -451,9 +451,43 @@ pub unsafe extern "C" fn link(path1: *const c_char, path2: *const c_char) -> c_i ...@@ -451,9 +451,43 @@ pub unsafe extern "C" fn link(path1: *const c_char, path2: *const c_char) -> c_i
Sys::link(path1, path2) Sys::link(path1, path2)
} }
// #[no_mangle] #[no_mangle]
pub extern "C" fn lockf(fildes: c_int, function: c_int, size: off_t) -> c_int { pub unsafe extern "C" fn lockf(fildes: c_int, function: c_int, size: off_t) -> c_int {
unimplemented!(); let mut fl = fcntl::flock {
l_type: fcntl::F_WRLCK as c_short,
l_whence: SEEK_CUR as c_short,
l_start: 0,
l_len: size,
l_pid: -1,
};
match function {
fcntl::F_TEST => {
fl.l_type = fcntl::F_RDLCK as c_short;
if fcntl::sys_fcntl(fildes, fcntl::F_GETLK, &mut fl as *mut _ as c_ulonglong) < 0 {
return -1;
}
if fl.l_type == fcntl::F_UNLCK as c_short || fl.l_pid == getpid() {
return 0;
}
platform::errno = errno::EACCES;
return -1;
},
fcntl::F_ULOCK => {
fl.l_type = fcntl::F_UNLCK as c_short;
return fcntl::sys_fcntl(fildes, fcntl::F_SETLK, &mut fl as *mut _ as c_ulonglong);
},
fcntl::F_TLOCK => {
return fcntl::sys_fcntl(fildes, fcntl::F_SETLK, &mut fl as *mut _ as c_ulonglong);
},
fcntl::F_LOCK => {
return fcntl::sys_fcntl(fildes, fcntl::F_SETLKW, &mut fl as *mut _ as c_ulonglong);
},
_ => {
platform::errno = errno::EINVAL;
return -1;
},
};
} }
#[no_mangle] #[no_mangle]
......
...@@ -210,7 +210,7 @@ impl Pal for Sys { ...@@ -210,7 +210,7 @@ impl Pal for Sys {
res res
} }
fn fcntl(fildes: c_int, cmd: c_int, arg: c_int) -> c_int { fn fcntl(fildes: c_int, cmd: c_int, arg: c_ulonglong) -> c_int {
e(unsafe { syscall!(FCNTL, fildes, cmd, arg) }) as c_int e(unsafe { syscall!(FCNTL, fildes, cmd, arg) }) as c_int
} }
......
...@@ -67,7 +67,7 @@ pub trait Pal { ...@@ -67,7 +67,7 @@ pub trait Pal {
fn fstatvfs(fildes: c_int, buf: *mut statvfs) -> c_int; fn fstatvfs(fildes: c_int, buf: *mut statvfs) -> c_int;
fn fcntl(fildes: c_int, cmd: c_int, arg: c_int) -> c_int; fn fcntl(fildes: c_int, cmd: c_int, arg: c_ulonglong) -> c_int;
fn fork() -> pid_t; fn fork() -> pid_t;
......
...@@ -259,7 +259,7 @@ impl Pal for Sys { ...@@ -259,7 +259,7 @@ impl Pal for Sys {
e(syscall::fchown(fd as usize, owner as u32, group as u32)) as c_int e(syscall::fchown(fd as usize, owner as u32, group as u32)) as c_int
} }
fn fcntl(fd: c_int, cmd: c_int, args: c_int) -> c_int { fn fcntl(fd: c_int, cmd: c_int, args: c_ulonglong) -> c_int {
e(syscall::fcntl(fd as usize, cmd as usize, args as usize)) as c_int e(syscall::fcntl(fd as usize, cmd as usize, args as usize)) as c_int
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment