Add the last socket functions on linux; leave unimplemented on redox

This commit is contained in:
jD91mZM2
2018-07-11 12:49:50 +02:00
parent 6d923cbd0b
commit 55e618d8c0
3 changed files with 92 additions and 9 deletions
+39 -2
View File
@@ -124,7 +124,7 @@ pub fn getgid() -> gid_t {
}
pub unsafe fn getpeername(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int {
e(unsafe { syscall!(GETPEERNAME, socket, address, address_len) }) as c_int
e(syscall!(GETPEERNAME, socket, address, address_len)) as c_int
}
pub fn getpgid(pid: pid_t) -> pid_t {
@@ -140,7 +140,17 @@ pub fn getppid() -> pid_t {
}
pub unsafe fn getsockname(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int {
e(unsafe { syscall!(GETSOCKNAME, socket, address, address_len) }) as c_int
e(syscall!(GETSOCKNAME, socket, address, address_len)) as c_int
}
pub fn getsockopt(
socket: c_int,
level: c_int,
option_name: c_int,
option_value: *mut c_void,
option_len: *mut socklen_t,
) -> c_int {
e(unsafe { syscall!(GETSOCKOPT, socket, level, option_name, option_value, option_len) }) as c_int
}
pub fn getuid() -> uid_t {
@@ -159,6 +169,10 @@ pub fn link(path1: *const c_char, path2: *const c_char) -> c_int {
e(unsafe { syscall!(LINKAT, AT_FDCWD, path1, AT_FDCWD, path2, 0) }) as c_int
}
pub fn listen(socket: c_int, backlog: c_int) -> c_int {
e(unsafe { syscall!(LISTEN, socket, backlog) }) as c_int
}
pub fn lseek(fildes: c_int, offset: off_t, whence: c_int) -> off_t {
e(unsafe { syscall!(LSEEK, fildes, offset, whence) }) as off_t
}
@@ -243,6 +257,20 @@ pub fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
e(unsafe { syscall!(SETREUID, ruid, euid) }) as c_int
}
pub fn setsockopt(
socket: c_int,
level: c_int,
option_name: c_int,
option_value: *const c_void,
option_len: socklen_t,
) -> c_int {
e(unsafe { syscall!(SETSOCKOPT, socket, level, option_name, option_value, option_len) }) as c_int
}
pub fn shutdown(socket: c_int, how: c_int) -> c_int {
e(unsafe { syscall!(SHUTDOWN, socket, how) }) as c_int
}
pub fn stat(file: *const c_char, buf: *mut stat) -> c_int {
e(unsafe { syscall!(NEWFSTATAT, AT_FDCWD, file, buf, 0) }) as c_int
}
@@ -251,6 +279,15 @@ pub fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
e(unsafe { syscall!(SOCKET, domain, kind, protocol) }) as c_int
}
pub fn socketpair(
domain: c_int,
kind: c_int,
protocol: c_int,
socket_vector: *mut c_int,
) -> c_int {
e(unsafe { syscall!(SOCKETPAIR, domain, kind, protocol, socket_vector) }) as c_int
}
pub fn uname(utsname: usize) -> c_int {
e(unsafe { syscall!(UNAME, utsname, 0) }) as c_int
}
+46
View File
@@ -1,5 +1,6 @@
//! sys/socket implementation, following http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html
use core::fmt::Write;
use core::mem;
use core::ptr;
use core::slice;
@@ -331,6 +332,18 @@ pub unsafe fn getsockname(socket: c_int, address: *mut sockaddr, address_len: *m
e(inner_get_name(true, socket, address, address_len)) as c_int
}
pub fn getsockopt(
socket: c_int,
level: c_int,
option_name: c_int,
option_value: *mut c_void,
option_len: *mut socklen_t,
) -> c_int {
let _ = write!(::FileWriter(2), "unimplemented: getsockopt({}, {}, {}, {:p}, {:p})",
socket, level, option_name, option_value, option_len);
-1
}
pub fn getuid() -> uid_t {
e(syscall::getuid()) as pid_t
}
@@ -349,6 +362,11 @@ pub fn link(path1: *const c_char, path2: *const c_char) -> c_int {
e(unsafe { syscall::link(path1.as_ptr(), path2.as_ptr()) }) as c_int
}
pub fn listen(socket: c_int, backlog: c_int) -> c_int {
// TODO
0
}
pub fn lseek(fd: c_int, offset: off_t, whence: c_int) -> off_t {
e(syscall::lseek(
fd as usize,
@@ -499,6 +517,23 @@ pub fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
e(syscall::setreuid(ruid as usize, euid as usize)) as c_int
}
pub fn setsockopt(
socket: c_int,
level: c_int,
option_name: c_int,
option_value: *const c_void,
option_len: socklen_t,
) -> c_int {
let _ = write!(::FileWriter(2), "unimplemented: setsockopt({}, {}, {}, {:p}, {})",
socket, level, option_name, option_value, option_len);
-1
}
pub fn shutdown(socket: c_int, how: c_int) -> c_int {
let _ = write!(::FileWriter(2), "unimplemented: shutdown({}, {})", socket, how);
-1
}
pub fn stat(path: *const c_char, buf: *mut stat) -> c_int {
let path = unsafe { c_str(path) };
match syscall::open(path, O_RDONLY) {
@@ -543,6 +578,17 @@ pub unsafe fn socket(domain: c_int, mut kind: c_int, protocol: c_int) -> c_int {
}
}
pub fn socketpair(
domain: c_int,
kind: c_int,
protocol: c_int,
socket_vector: *mut c_int,
) -> c_int {
let _ = write!(::FileWriter(2), "unimplemented: socketpair({}, {}, {}, {:p})",
domain, kind, protocol, socket_vector);
-1
}
pub fn unlink(path: *const c_char) -> c_int {
let path = unsafe { c_str(path) };
e(syscall::unlink(path)) as c_int
+7 -7
View File
@@ -75,12 +75,12 @@ pub unsafe extern "C" fn getsockopt(
option_value: *mut c_void,
option_len: *mut socklen_t,
) -> c_int {
unimplemented!();
platform::getsockopt(socket, level, option_name, option_value, option_len)
}
#[no_mangle]
pub unsafe extern "C" fn listen(socket: c_int, backlog: c_int) -> c_int {
unimplemented!();
platform::listen(socket, backlog)
}
#[no_mangle]
@@ -156,12 +156,12 @@ pub unsafe extern "C" fn setsockopt(
option_value: *const c_void,
option_len: socklen_t,
) -> c_int {
unimplemented!();
platform::setsockopt(socket, level, option_name, option_value, option_len)
}
#[no_mangle]
pub unsafe extern "C" fn shutdown(socket: c_int, how: c_int) -> c_int {
unimplemented!();
platform::shutdown(socket, how)
}
#[no_mangle]
@@ -172,9 +172,9 @@ pub unsafe extern "C" fn socket(domain: c_int, kind: c_int, protocol: c_int) ->
#[no_mangle]
pub unsafe extern "C" fn socketpair(
domain: c_int,
_type: c_int,
kind: c_int,
protocol: c_int,
socket_vector: [c_int; 2],
socket_vector: *mut c_int,
) -> c_int {
unimplemented!();
platform::socketpair(domain, kind, protocol, socket_vector)
}