From d0695eff700ab3749ad7247f1cf1923702dedf10 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 19 May 2026 14:06:12 +0100 Subject: [PATCH 1/4] Add socket rules --- rules/socket/ir_unsafe.json | 378 ++++++++++++++++++++++++++++++++ rules/socket/src.cpp | 24 ++ rules/socket/tgt_unsafe.rs | 24 ++ tests/unit/out/unsafe/socket.rs | 102 +++++++++ tests/unit/socket.c | 43 ++++ 5 files changed, 571 insertions(+) create mode 100644 tests/unit/out/unsafe/socket.rs create mode 100644 tests/unit/socket.c diff --git a/rules/socket/ir_unsafe.json b/rules/socket/ir_unsafe.json index c37b5314..d5af4452 100644 --- a/rules/socket/ir_unsafe.json +++ b/rules/socket/ir_unsafe.json @@ -9,6 +9,128 @@ "type": "i32" } }, + "f10": { + "body": [ + { + "text": "libc::send(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": " as usize, " + }, + { + "placeholder": { + "arg": 3, + "access": "read" + } + }, + { + "text": ") as i64" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "*const ::libc::c_void", + "is_unsafe_pointer": true + }, + "a2": { + "type": "u64" + }, + "a3": { + "type": "i32" + } + }, + "return_type": { + "type": "i64" + } + }, + "f11": { + "body": [ + { + "text": "libc::socketpair(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 3, + "access": "read" + } + }, + { + "text": ")" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "i32" + }, + "a2": { + "type": "i32" + }, + "a3": { + "type": "*mut i32", + "is_unsafe_pointer": true + } + }, + "return_type": { + "type": "i32" + } + }, "f2": { "body": [ { @@ -50,5 +172,261 @@ "type": "i32" }, "target_os": "linux" + }, + "f6": { + "body": [ + { + "text": "libc::socket(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": ")" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "i32" + }, + "a2": { + "type": "i32" + } + }, + "return_type": { + "type": "i32" + } + }, + "f7": { + "body": [ + { + "text": "libc::setsockopt(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 3, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 4, + "access": "read" + } + }, + { + "text": ")" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "i32" + }, + "a2": { + "type": "i32" + }, + "a3": { + "type": "*const ::libc::c_void", + "is_unsafe_pointer": true + }, + "a4": { + "type": "u32" + } + }, + "return_type": { + "type": "i32" + } + }, + "f8": { + "body": [ + { + "text": "libc::getsockopt(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 3, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 4, + "access": "read" + } + }, + { + "text": ")" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "i32" + }, + "a2": { + "type": "i32" + }, + "a3": { + "type": "*mut ::libc::c_void", + "is_unsafe_pointer": true + }, + "a4": { + "type": "*mut u32", + "is_unsafe_pointer": true + } + }, + "return_type": { + "type": "i32" + } + }, + "f9": { + "body": [ + { + "text": "libc::recv(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": " as usize, " + }, + { + "placeholder": { + "arg": 3, + "access": "read" + } + }, + { + "text": ") as i64" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "*mut ::libc::c_void", + "is_unsafe_pointer": true + }, + "a2": { + "type": "u64" + }, + "a3": { + "type": "i32" + } + }, + "return_type": { + "type": "i64" + } } } diff --git a/rules/socket/src.cpp b/rules/socket/src.cpp index b49b50d4..3a511c15 100644 --- a/rules/socket/src.cpp +++ b/rules/socket/src.cpp @@ -22,3 +22,27 @@ int f5() { return SOCK_NONBLOCK; } #endif + +int f6(int domain, int type, int protocol) { + return socket(domain, type, protocol); +} + +int f7(int sockfd, int level, int optname, const void *optval, socklen_t optlen) { + return setsockopt(sockfd, level, optname, optval, optlen); +} + +int f8(int sockfd, int level, int optname, void *optval, socklen_t *optlen) { + return getsockopt(sockfd, level, optname, optval, optlen); +} + +ssize_t f9(int sockfd, void *buf, size_t len, int flags) { + return recv(sockfd, buf, len, flags); +} + +ssize_t f10(int sockfd, const void *buf, size_t len, int flags) { + return send(sockfd, buf, len, flags); +} + +int f11(int domain, int type, int protocol, int sv[2]) { + return socketpair(domain, type, protocol, sv); +} diff --git a/rules/socket/tgt_unsafe.rs b/rules/socket/tgt_unsafe.rs index f39b4c40..d07d4b2b 100644 --- a/rules/socket/tgt_unsafe.rs +++ b/rules/socket/tgt_unsafe.rs @@ -19,3 +19,27 @@ unsafe fn f4() -> i32 { unsafe fn f5() -> i32 { libc::SOCK_NONBLOCK } + +unsafe fn f6(a0: i32, a1: i32, a2: i32) -> i32 { + libc::socket(a0, a1, a2) +} + +unsafe fn f7(a0: i32, a1: i32, a2: i32, a3: *const ::libc::c_void, a4: u32) -> i32 { + libc::setsockopt(a0, a1, a2, a3, a4) +} + +unsafe fn f8(a0: i32, a1: i32, a2: i32, a3: *mut ::libc::c_void, a4: *mut u32) -> i32 { + libc::getsockopt(a0, a1, a2, a3, a4) +} + +unsafe fn f9(a0: i32, a1: *mut ::libc::c_void, a2: u64, a3: i32) -> i64 { + libc::recv(a0, a1, a2 as usize, a3) as i64 +} + +unsafe fn f10(a0: i32, a1: *const ::libc::c_void, a2: u64, a3: i32) -> i64 { + libc::send(a0, a1, a2 as usize, a3) as i64 +} + +unsafe fn f11(a0: i32, a1: i32, a2: i32, a3: *mut i32) -> i32 { + libc::socketpair(a0, a1, a2, a3) +} diff --git a/tests/unit/out/unsafe/socket.rs b/tests/unit/out/unsafe/socket.rs new file mode 100644 index 00000000..04699e10 --- /dev/null +++ b/tests/unit/out/unsafe/socket.rs @@ -0,0 +1,102 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub unsafe fn test_socket_0() { + let mut s: i32 = libc::socket(2, libc::SOCK_STREAM, 0); + assert!(((((s) >= (0)) as i32) != 0)); + assert!(((((libc::close(s)) == (0)) as i32) != 0)); +} +pub unsafe fn test_setsockopt_getsockopt_1() { + let mut s: i32 = libc::socket(2, libc::SOCK_STREAM, 0); + assert!(((((s) >= (0)) as i32) != 0)); + let mut set: i32 = 1; + assert!( + ((((libc::setsockopt( + s, + 1, + 2, + ((&mut set as *mut i32) as *const i32 as *const ::libc::c_void), + (::std::mem::size_of::() as u64 as u32) + )) == (0)) as i32) + != 0) + ); + let mut got: i32 = 0; + let mut len: u32 = (::std::mem::size_of::() as u64 as u32); + assert!( + ((((libc::getsockopt( + s, + 1, + 2, + ((&mut got as *mut i32) as *mut i32 as *mut ::libc::c_void), + (&mut len as *mut u32) + )) == (0)) as i32) + != 0) + ); + assert!(((((got) != (0)) as i32) != 0)); + assert!(((((libc::close(s)) == (0)) as i32) != 0)); +} +pub unsafe fn test_send_recv_2() { + let mut fds: [i32; 2] = [0_i32; 2]; + assert!(((((libc::socketpair(1, libc::SOCK_STREAM, 0, fds.as_mut_ptr())) == (0)) as i32) != 0)); + let mut msg: *const u8 = (b"hello\0".as_ptr().cast_mut()).cast_const(); + assert!( + ((((libc::send( + fds[(0) as usize], + (msg as *const u8 as *const ::libc::c_void), + 5_u64 as usize, + 0 + ) as i64) + == (5_i64)) as i32) + != 0) + ); + let mut buf: [u8; 8] = [0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8]; + assert!( + ((((libc::recv( + fds[(1) as usize], + (buf.as_mut_ptr() as *mut u8 as *mut ::libc::c_void), + 8_u64 as usize, + 0 + ) as i64) + == (5_i64)) as i32) + != 0) + ); + assert!( + (((({ + let sa = core::slice::from_raw_parts( + (buf.as_mut_ptr() as *const u8 as *const ::libc::c_void) as *const u8, + 5_u64 as usize, + ); + let sb = core::slice::from_raw_parts( + (msg as *const u8 as *const ::libc::c_void) as *const u8, + 5_u64 as usize, + ); + let mut diff = 0_i32; + for (x, y) in sa.iter().zip(sb.iter()) { + if x != y { + diff = (*x as i32) - (*y as i32); + break; + } + } + diff + }) == (0)) as i32) + != 0) + ); + assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); +} +pub fn main() { + unsafe { + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + (unsafe { test_socket_0() }); + (unsafe { test_setsockopt_getsockopt_1() }); + (unsafe { test_send_recv_2() }); + return 0; +} diff --git a/tests/unit/socket.c b/tests/unit/socket.c new file mode 100644 index 00000000..5c267638 --- /dev/null +++ b/tests/unit/socket.c @@ -0,0 +1,43 @@ +// no-compile: refcount +#include +#include +#include +#include +#include + +static void test_socket(void) { + int s = socket(AF_INET, SOCK_STREAM, 0); + assert(s >= 0); + assert(close(s) == 0); +} + +static void test_setsockopt_getsockopt(void) { + int s = socket(AF_INET, SOCK_STREAM, 0); + assert(s >= 0); + int set = 1; + assert(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(set)) == 0); + int got = 0; + socklen_t len = sizeof(got); + assert(getsockopt(s, SOL_SOCKET, SO_REUSEADDR, &got, &len) == 0); + assert(got != 0); + assert(close(s) == 0); +} + +static void test_send_recv(void) { + int fds[2]; + assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0); + const char *msg = "hello"; + assert(send(fds[0], msg, 5, 0) == 5); + char buf[8] = {0}; + assert(recv(fds[1], buf, 8, 0) == 5); + assert(memcmp(buf, msg, 5) == 0); + assert(close(fds[0]) == 0); + assert(close(fds[1]) == 0); +} + +int main(void) { + test_socket(); + test_setsockopt_getsockopt(); + test_send_recv(); + return 0; +} From 60a885e0675f25156d5c3c2c43def3927e717662 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 19 May 2026 14:10:10 +0100 Subject: [PATCH 2/4] Add poll and select rules --- rules/poll/ir_unsafe.json | 51 ++++++++++++++++ rules/poll/src.cpp | 8 +++ rules/poll/tgt_unsafe.rs | 6 ++ rules/select/ir_unsafe.json | 78 ++++++++++++++++++++++++ rules/select/src.cpp | 9 +++ rules/select/tgt_unsafe.rs | 12 ++++ tests/unit/out/unsafe/poll.rs | 103 ++++++++++++++++++++++++++++++++ tests/unit/out/unsafe/select.rs | 74 +++++++++++++++++++++++ tests/unit/poll.c | 73 ++++++++++++++++++++++ tests/unit/select.c | 41 +++++++++++++ 10 files changed, 455 insertions(+) create mode 100644 rules/poll/ir_unsafe.json create mode 100644 rules/poll/src.cpp create mode 100644 rules/poll/tgt_unsafe.rs create mode 100644 rules/select/ir_unsafe.json create mode 100644 rules/select/src.cpp create mode 100644 rules/select/tgt_unsafe.rs create mode 100644 tests/unit/out/unsafe/poll.rs create mode 100644 tests/unit/out/unsafe/select.rs create mode 100644 tests/unit/poll.c create mode 100644 tests/unit/select.c diff --git a/rules/poll/ir_unsafe.json b/rules/poll/ir_unsafe.json new file mode 100644 index 00000000..121c8fce --- /dev/null +++ b/rules/poll/ir_unsafe.json @@ -0,0 +1,51 @@ +{ + "f1": { + "body": [ + { + "text": "libc::poll(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": " as ::libc::nfds_t, " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": ")" + } + ], + "params": { + "a0": { + "type": "*mut ::libc::pollfd", + "is_unsafe_pointer": true + }, + "a1": { + "type": "u64" + }, + "a2": { + "type": "i32" + } + }, + "return_type": { + "type": "i32" + } + } +} diff --git a/rules/poll/src.cpp b/rules/poll/src.cpp new file mode 100644 index 00000000..06deebd6 --- /dev/null +++ b/rules/poll/src.cpp @@ -0,0 +1,8 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +int f1(struct pollfd *fds, nfds_t nfds, int timeout) { + return poll(fds, nfds, timeout); +} diff --git a/rules/poll/tgt_unsafe.rs b/rules/poll/tgt_unsafe.rs new file mode 100644 index 00000000..34ded1fd --- /dev/null +++ b/rules/poll/tgt_unsafe.rs @@ -0,0 +1,6 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +unsafe fn f1(a0: *mut ::libc::pollfd, a1: u64, a2: i32) -> i32 { + libc::poll(a0, a1 as ::libc::nfds_t, a2) +} diff --git a/rules/select/ir_unsafe.json b/rules/select/ir_unsafe.json new file mode 100644 index 00000000..23b58098 --- /dev/null +++ b/rules/select/ir_unsafe.json @@ -0,0 +1,78 @@ +{ + "f1": { + "body": [ + { + "text": "libc::select(" + }, + { + "placeholder": { + "arg": 0, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 1, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 2, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 3, + "access": "read" + } + }, + { + "text": ", " + }, + { + "placeholder": { + "arg": 4, + "access": "read" + } + }, + { + "text": ")" + } + ], + "params": { + "a0": { + "type": "i32" + }, + "a1": { + "type": "*mut ::libc::fd_set", + "is_unsafe_pointer": true + }, + "a2": { + "type": "*mut ::libc::fd_set", + "is_unsafe_pointer": true + }, + "a3": { + "type": "*mut ::libc::fd_set", + "is_unsafe_pointer": true + }, + "a4": { + "type": "*mut ::libc::timeval", + "is_unsafe_pointer": true + } + }, + "return_type": { + "type": "i32" + } + } +} diff --git a/rules/select/src.cpp b/rules/select/src.cpp new file mode 100644 index 00000000..6994faec --- /dev/null +++ b/rules/select/src.cpp @@ -0,0 +1,9 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +#include + +int f1(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + struct timeval *timeout) { + return select(nfds, readfds, writefds, exceptfds, timeout); +} diff --git a/rules/select/tgt_unsafe.rs b/rules/select/tgt_unsafe.rs new file mode 100644 index 00000000..b7580f28 --- /dev/null +++ b/rules/select/tgt_unsafe.rs @@ -0,0 +1,12 @@ +// Copyright (c) 2022-present INESC-ID. +// Distributed under the MIT license that can be found in the LICENSE file. + +unsafe fn f1( + a0: i32, + a1: *mut ::libc::fd_set, + a2: *mut ::libc::fd_set, + a3: *mut ::libc::fd_set, + a4: *mut ::libc::timeval, +) -> i32 { + libc::select(a0, a1, a2, a3, a4) +} diff --git a/tests/unit/out/unsafe/poll.rs b/tests/unit/out/unsafe/poll.rs new file mode 100644 index 00000000..9357b5cb --- /dev/null +++ b/tests/unit/out/unsafe/poll.rs @@ -0,0 +1,103 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub unsafe fn test_poll_timeout_0() { + let mut fds: [i32; 2] = [0_i32; 2]; + assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); + let mut pfd: pollfd = std::mem::zeroed::(); + pfd.fd = fds[(0) as usize]; + pfd.events = 1_i16; + pfd.revents = 0_i16; + assert!( + ((((libc::poll((&mut pfd as *mut pollfd), 1_u64 as ::libc::nfds_t, 10)) == (0)) as i32) + != 0) + ); + assert!(((((pfd.revents as i32) == (0)) as i32) != 0)); + assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); +} +pub unsafe fn test_poll_readable_1() { + let mut fds: [i32; 2] = [0_i32; 2]; + assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); + assert!( + ((((libc::write( + fds[(1) as usize], + (b"x\0".as_ptr().cast_mut() as *const u8 as *const ::libc::c_void), + 1_u64 as usize + ) as i64) + == (1_i64)) as i32) + != 0) + ); + let mut pfd: pollfd = std::mem::zeroed::(); + pfd.fd = fds[(0) as usize]; + pfd.events = 1_i16; + pfd.revents = 0_i16; + assert!( + ((((libc::poll((&mut pfd as *mut pollfd), 1_u64 as ::libc::nfds_t, 100)) == (1)) as i32) + != 0) + ); + assert!((((((pfd.revents as i32) & (1)) != (0)) as i32) != 0)); + assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); +} +pub unsafe fn test_poll_multiple_2() { + let mut p1: [i32; 2] = [0_i32; 2]; + let mut p2: [i32; 2] = [0_i32; 2]; + assert!(((((libc::pipe(p1.as_mut_ptr())) == (0)) as i32) != 0)); + assert!(((((libc::pipe(p2.as_mut_ptr())) == (0)) as i32) != 0)); + assert!( + ((((libc::write( + p2[(1) as usize], + (b"y\0".as_ptr().cast_mut() as *const u8 as *const ::libc::c_void), + 1_u64 as usize + ) as i64) + == (1_i64)) as i32) + != 0) + ); + let mut pfds: [pollfd; 2] = [std::mem::zeroed::(); 2]; + pfds[(0) as usize].fd = p1[(0) as usize]; + pfds[(0) as usize].events = 1_i16; + pfds[(0) as usize].revents = 0_i16; + pfds[(1) as usize].fd = p2[(0) as usize]; + pfds[(1) as usize].events = 1_i16; + pfds[(1) as usize].revents = 0_i16; + assert!(((((libc::poll(pfds.as_mut_ptr(), 2_u64 as ::libc::nfds_t, 100)) == (1)) as i32) != 0)); + assert!(((((pfds[(0) as usize].revents as i32) == (0)) as i32) != 0)); + assert!((((((pfds[(1) as usize].revents as i32) & (1)) != (0)) as i32) != 0)); + assert!(((((libc::close(p1[(0) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(p1[(1) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(p2[(0) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(p2[(1) as usize])) == (0)) as i32) != 0)); +} +pub unsafe fn test_poll_hup_3() { + let mut fds: [i32; 2] = [0_i32; 2]; + assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); + assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); + let mut pfd: pollfd = std::mem::zeroed::(); + pfd.fd = fds[(0) as usize]; + pfd.events = 1_i16; + pfd.revents = 0_i16; + assert!( + ((((libc::poll((&mut pfd as *mut pollfd), 1_u64 as ::libc::nfds_t, 100)) >= (1)) as i32) + != 0) + ); + assert!((((((pfd.revents as i32) & (16)) != (0)) as i32) != 0)); + assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); +} +pub fn main() { + unsafe { + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + (unsafe { test_poll_timeout_0() }); + (unsafe { test_poll_readable_1() }); + (unsafe { test_poll_multiple_2() }); + (unsafe { test_poll_hup_3() }); + return 0; +} diff --git a/tests/unit/out/unsafe/select.rs b/tests/unit/out/unsafe/select.rs new file mode 100644 index 00000000..8eead5a0 --- /dev/null +++ b/tests/unit/out/unsafe/select.rs @@ -0,0 +1,74 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub unsafe fn fd_set_bit_0(mut fd: i32, mut set: *mut fd_set) { + let mut p: *mut u8 = (set as *mut u8); + (*p.offset(((fd) / (8)) as isize)) = (((*p.offset(((fd) / (8)) as isize)) as i32) + | ((((1) << ((fd) % (8))) as u8) as i32)) as u8; +} +pub unsafe fn fd_isset_bit_1(mut fd: i32, mut set: *const fd_set) -> i32 { + let mut p: *const u8 = (set as *const u8); + return ((((*p.offset(((fd) / (8)) as isize)) as i32) >> ((fd) % (8))) & (1)); +} +pub unsafe fn test_select_2() { + let mut fds: [i32; 2] = [0_i32; 2]; + assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); + assert!( + ((((libc::write( + fds[(1) as usize], + (b"x\0".as_ptr().cast_mut() as *const u8 as *const ::libc::c_void), + 1_u64 as usize + ) as i64) + == (1_i64)) as i32) + != 0) + ); + let mut rfds: fd_set = std::mem::zeroed::(); + { + let byte_0 = ((&mut rfds as *mut fd_set) as *mut fd_set as *mut ::libc::c_void) as *mut u8; + for offset in 0..::std::mem::size_of::() as u64 { + *byte_0.offset(offset as isize) = 0 as u8; + } + ((&mut rfds as *mut fd_set) as *mut fd_set as *mut ::libc::c_void) + }; + (unsafe { + let _fd: i32 = fds[(0) as usize]; + let _set: *mut fd_set = (&mut rfds as *mut fd_set); + fd_set_bit_0(_fd, _set) + }); + let mut tv: timeval = std::mem::zeroed::(); + tv.tv_sec = 0_i64; + tv.tv_usec = 100000_i64; + assert!( + ((((libc::select( + ((fds[(0) as usize]) + (1)), + (&mut rfds as *mut fd_set), + std::ptr::null_mut(), + std::ptr::null_mut(), + (&mut tv as *mut timeval) + )) == (1)) as i32) + != 0) + ); + assert!( + ((unsafe { + let _fd: i32 = fds[(0) as usize]; + let _set: *const fd_set = (&mut rfds as *mut fd_set).cast_const(); + fd_isset_bit_1(_fd, _set) + }) != 0) + ); + assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); + assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); +} +pub fn main() { + unsafe { + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + (unsafe { test_select_2() }); + return 0; +} diff --git a/tests/unit/poll.c b/tests/unit/poll.c new file mode 100644 index 00000000..5780fe32 --- /dev/null +++ b/tests/unit/poll.c @@ -0,0 +1,73 @@ +// no-compile: refcount +#include +#include +#include + +static void test_poll_timeout(void) { + int fds[2]; + assert(pipe(fds) == 0); + struct pollfd pfd; + pfd.fd = fds[0]; + pfd.events = POLLIN; + pfd.revents = 0; + assert(poll(&pfd, 1, 10) == 0); + assert(pfd.revents == 0); + assert(close(fds[0]) == 0); + assert(close(fds[1]) == 0); +} + +static void test_poll_readable(void) { + int fds[2]; + assert(pipe(fds) == 0); + assert(write(fds[1], "x", 1) == 1); + struct pollfd pfd; + pfd.fd = fds[0]; + pfd.events = POLLIN; + pfd.revents = 0; + assert(poll(&pfd, 1, 100) == 1); + assert((pfd.revents & POLLIN) != 0); + assert(close(fds[0]) == 0); + assert(close(fds[1]) == 0); +} + +static void test_poll_multiple(void) { + int p1[2], p2[2]; + assert(pipe(p1) == 0); + assert(pipe(p2) == 0); + assert(write(p2[1], "y", 1) == 1); + struct pollfd pfds[2]; + pfds[0].fd = p1[0]; + pfds[0].events = POLLIN; + pfds[0].revents = 0; + pfds[1].fd = p2[0]; + pfds[1].events = POLLIN; + pfds[1].revents = 0; + assert(poll(pfds, 2, 100) == 1); + assert(pfds[0].revents == 0); + assert((pfds[1].revents & POLLIN) != 0); + assert(close(p1[0]) == 0); + assert(close(p1[1]) == 0); + assert(close(p2[0]) == 0); + assert(close(p2[1]) == 0); +} + +static void test_poll_hup(void) { + int fds[2]; + assert(pipe(fds) == 0); + assert(close(fds[1]) == 0); + struct pollfd pfd; + pfd.fd = fds[0]; + pfd.events = POLLIN; + pfd.revents = 0; + assert(poll(&pfd, 1, 100) >= 1); + assert((pfd.revents & POLLHUP) != 0); + assert(close(fds[0]) == 0); +} + +int main(void) { + test_poll_timeout(); + test_poll_readable(); + test_poll_multiple(); + test_poll_hup(); + return 0; +} diff --git a/tests/unit/select.c b/tests/unit/select.c new file mode 100644 index 00000000..266d7968 --- /dev/null +++ b/tests/unit/select.c @@ -0,0 +1,41 @@ +// no-compile: refcount +#include +#include +#include +#include +#include +#include + +static void fd_set_bit(int fd, fd_set *set) { + unsigned char *p = (unsigned char *)set; + p[fd / 8] |= (unsigned char)(1 << (fd % 8)); +} + +static int fd_isset_bit(int fd, const fd_set *set) { + const unsigned char *p = (const unsigned char *)set; + return (p[fd / 8] >> (fd % 8)) & 1; +} + +static void test_select(void) { + int fds[2]; + assert(pipe(fds) == 0); + assert(write(fds[1], "x", 1) == 1); + + fd_set rfds; + memset(&rfds, 0, sizeof(rfds)); + fd_set_bit(fds[0], &rfds); + + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 100000; + assert(select(fds[0] + 1, &rfds, NULL, NULL, &tv) == 1); + assert(fd_isset_bit(fds[0], &rfds)); + + assert(close(fds[0]) == 0); + assert(close(fds[1]) == 0); +} + +int main(void) { + test_select(); + return 0; +} From 565c385a853bb9320c85d7957edb4a206db20e1f Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Wed, 20 May 2026 21:35:11 +0100 Subject: [PATCH 3/4] Update rules --- rules/src/modules.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rules/src/modules.rs b/rules/src/modules.rs index 9920f884..b2a3b83d 100644 --- a/rules/src/modules.rs +++ b/rules/src/modules.rs @@ -62,6 +62,10 @@ pub mod math_tgt_unsafe; pub mod pair_tgt_refcount; #[path = r#"../pair/tgt_unsafe.rs"#] pub mod pair_tgt_unsafe; +#[path = r#"../poll/tgt_unsafe.rs"#] +pub mod poll_tgt_unsafe; +#[path = r#"../select/tgt_unsafe.rs"#] +pub mod select_tgt_unsafe; #[path = r#"../socket/tgt_unsafe.rs"#] pub mod socket_tgt_unsafe; #[path = r#"../stdio/tgt_refcount.rs"#] From 8c9193f97b6328457fa2f8f54fa1bc0e3e492279 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Thu, 21 May 2026 09:08:12 +0100 Subject: [PATCH 4/4] Delete unportable tests --- tests/unit/out/unsafe/poll.rs | 103 -------------------------------- tests/unit/out/unsafe/select.rs | 74 ----------------------- tests/unit/out/unsafe/socket.rs | 102 ------------------------------- tests/unit/poll.c | 73 ---------------------- tests/unit/select.c | 41 ------------- tests/unit/socket.c | 43 ------------- 6 files changed, 436 deletions(-) delete mode 100644 tests/unit/out/unsafe/poll.rs delete mode 100644 tests/unit/out/unsafe/select.rs delete mode 100644 tests/unit/out/unsafe/socket.rs delete mode 100644 tests/unit/poll.c delete mode 100644 tests/unit/select.c delete mode 100644 tests/unit/socket.c diff --git a/tests/unit/out/unsafe/poll.rs b/tests/unit/out/unsafe/poll.rs deleted file mode 100644 index 9357b5cb..00000000 --- a/tests/unit/out/unsafe/poll.rs +++ /dev/null @@ -1,103 +0,0 @@ -extern crate libc; -use libc::*; -extern crate libcc2rs; -use libcc2rs::*; -use std::collections::BTreeMap; -use std::io::{Read, Seek, Write}; -use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; -use std::rc::Rc; -pub unsafe fn test_poll_timeout_0() { - let mut fds: [i32; 2] = [0_i32; 2]; - assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); - let mut pfd: pollfd = std::mem::zeroed::(); - pfd.fd = fds[(0) as usize]; - pfd.events = 1_i16; - pfd.revents = 0_i16; - assert!( - ((((libc::poll((&mut pfd as *mut pollfd), 1_u64 as ::libc::nfds_t, 10)) == (0)) as i32) - != 0) - ); - assert!(((((pfd.revents as i32) == (0)) as i32) != 0)); - assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); -} -pub unsafe fn test_poll_readable_1() { - let mut fds: [i32; 2] = [0_i32; 2]; - assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); - assert!( - ((((libc::write( - fds[(1) as usize], - (b"x\0".as_ptr().cast_mut() as *const u8 as *const ::libc::c_void), - 1_u64 as usize - ) as i64) - == (1_i64)) as i32) - != 0) - ); - let mut pfd: pollfd = std::mem::zeroed::(); - pfd.fd = fds[(0) as usize]; - pfd.events = 1_i16; - pfd.revents = 0_i16; - assert!( - ((((libc::poll((&mut pfd as *mut pollfd), 1_u64 as ::libc::nfds_t, 100)) == (1)) as i32) - != 0) - ); - assert!((((((pfd.revents as i32) & (1)) != (0)) as i32) != 0)); - assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); -} -pub unsafe fn test_poll_multiple_2() { - let mut p1: [i32; 2] = [0_i32; 2]; - let mut p2: [i32; 2] = [0_i32; 2]; - assert!(((((libc::pipe(p1.as_mut_ptr())) == (0)) as i32) != 0)); - assert!(((((libc::pipe(p2.as_mut_ptr())) == (0)) as i32) != 0)); - assert!( - ((((libc::write( - p2[(1) as usize], - (b"y\0".as_ptr().cast_mut() as *const u8 as *const ::libc::c_void), - 1_u64 as usize - ) as i64) - == (1_i64)) as i32) - != 0) - ); - let mut pfds: [pollfd; 2] = [std::mem::zeroed::(); 2]; - pfds[(0) as usize].fd = p1[(0) as usize]; - pfds[(0) as usize].events = 1_i16; - pfds[(0) as usize].revents = 0_i16; - pfds[(1) as usize].fd = p2[(0) as usize]; - pfds[(1) as usize].events = 1_i16; - pfds[(1) as usize].revents = 0_i16; - assert!(((((libc::poll(pfds.as_mut_ptr(), 2_u64 as ::libc::nfds_t, 100)) == (1)) as i32) != 0)); - assert!(((((pfds[(0) as usize].revents as i32) == (0)) as i32) != 0)); - assert!((((((pfds[(1) as usize].revents as i32) & (1)) != (0)) as i32) != 0)); - assert!(((((libc::close(p1[(0) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(p1[(1) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(p2[(0) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(p2[(1) as usize])) == (0)) as i32) != 0)); -} -pub unsafe fn test_poll_hup_3() { - let mut fds: [i32; 2] = [0_i32; 2]; - assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); - assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); - let mut pfd: pollfd = std::mem::zeroed::(); - pfd.fd = fds[(0) as usize]; - pfd.events = 1_i16; - pfd.revents = 0_i16; - assert!( - ((((libc::poll((&mut pfd as *mut pollfd), 1_u64 as ::libc::nfds_t, 100)) >= (1)) as i32) - != 0) - ); - assert!((((((pfd.revents as i32) & (16)) != (0)) as i32) != 0)); - assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); -} -pub fn main() { - unsafe { - std::process::exit(main_0() as i32); - } -} -unsafe fn main_0() -> i32 { - (unsafe { test_poll_timeout_0() }); - (unsafe { test_poll_readable_1() }); - (unsafe { test_poll_multiple_2() }); - (unsafe { test_poll_hup_3() }); - return 0; -} diff --git a/tests/unit/out/unsafe/select.rs b/tests/unit/out/unsafe/select.rs deleted file mode 100644 index 8eead5a0..00000000 --- a/tests/unit/out/unsafe/select.rs +++ /dev/null @@ -1,74 +0,0 @@ -extern crate libc; -use libc::*; -extern crate libcc2rs; -use libcc2rs::*; -use std::collections::BTreeMap; -use std::io::{Read, Seek, Write}; -use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; -use std::rc::Rc; -pub unsafe fn fd_set_bit_0(mut fd: i32, mut set: *mut fd_set) { - let mut p: *mut u8 = (set as *mut u8); - (*p.offset(((fd) / (8)) as isize)) = (((*p.offset(((fd) / (8)) as isize)) as i32) - | ((((1) << ((fd) % (8))) as u8) as i32)) as u8; -} -pub unsafe fn fd_isset_bit_1(mut fd: i32, mut set: *const fd_set) -> i32 { - let mut p: *const u8 = (set as *const u8); - return ((((*p.offset(((fd) / (8)) as isize)) as i32) >> ((fd) % (8))) & (1)); -} -pub unsafe fn test_select_2() { - let mut fds: [i32; 2] = [0_i32; 2]; - assert!(((((libc::pipe(fds.as_mut_ptr())) == (0)) as i32) != 0)); - assert!( - ((((libc::write( - fds[(1) as usize], - (b"x\0".as_ptr().cast_mut() as *const u8 as *const ::libc::c_void), - 1_u64 as usize - ) as i64) - == (1_i64)) as i32) - != 0) - ); - let mut rfds: fd_set = std::mem::zeroed::(); - { - let byte_0 = ((&mut rfds as *mut fd_set) as *mut fd_set as *mut ::libc::c_void) as *mut u8; - for offset in 0..::std::mem::size_of::() as u64 { - *byte_0.offset(offset as isize) = 0 as u8; - } - ((&mut rfds as *mut fd_set) as *mut fd_set as *mut ::libc::c_void) - }; - (unsafe { - let _fd: i32 = fds[(0) as usize]; - let _set: *mut fd_set = (&mut rfds as *mut fd_set); - fd_set_bit_0(_fd, _set) - }); - let mut tv: timeval = std::mem::zeroed::(); - tv.tv_sec = 0_i64; - tv.tv_usec = 100000_i64; - assert!( - ((((libc::select( - ((fds[(0) as usize]) + (1)), - (&mut rfds as *mut fd_set), - std::ptr::null_mut(), - std::ptr::null_mut(), - (&mut tv as *mut timeval) - )) == (1)) as i32) - != 0) - ); - assert!( - ((unsafe { - let _fd: i32 = fds[(0) as usize]; - let _set: *const fd_set = (&mut rfds as *mut fd_set).cast_const(); - fd_isset_bit_1(_fd, _set) - }) != 0) - ); - assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); -} -pub fn main() { - unsafe { - std::process::exit(main_0() as i32); - } -} -unsafe fn main_0() -> i32 { - (unsafe { test_select_2() }); - return 0; -} diff --git a/tests/unit/out/unsafe/socket.rs b/tests/unit/out/unsafe/socket.rs deleted file mode 100644 index 04699e10..00000000 --- a/tests/unit/out/unsafe/socket.rs +++ /dev/null @@ -1,102 +0,0 @@ -extern crate libc; -use libc::*; -extern crate libcc2rs; -use libcc2rs::*; -use std::collections::BTreeMap; -use std::io::{Read, Seek, Write}; -use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; -use std::rc::Rc; -pub unsafe fn test_socket_0() { - let mut s: i32 = libc::socket(2, libc::SOCK_STREAM, 0); - assert!(((((s) >= (0)) as i32) != 0)); - assert!(((((libc::close(s)) == (0)) as i32) != 0)); -} -pub unsafe fn test_setsockopt_getsockopt_1() { - let mut s: i32 = libc::socket(2, libc::SOCK_STREAM, 0); - assert!(((((s) >= (0)) as i32) != 0)); - let mut set: i32 = 1; - assert!( - ((((libc::setsockopt( - s, - 1, - 2, - ((&mut set as *mut i32) as *const i32 as *const ::libc::c_void), - (::std::mem::size_of::() as u64 as u32) - )) == (0)) as i32) - != 0) - ); - let mut got: i32 = 0; - let mut len: u32 = (::std::mem::size_of::() as u64 as u32); - assert!( - ((((libc::getsockopt( - s, - 1, - 2, - ((&mut got as *mut i32) as *mut i32 as *mut ::libc::c_void), - (&mut len as *mut u32) - )) == (0)) as i32) - != 0) - ); - assert!(((((got) != (0)) as i32) != 0)); - assert!(((((libc::close(s)) == (0)) as i32) != 0)); -} -pub unsafe fn test_send_recv_2() { - let mut fds: [i32; 2] = [0_i32; 2]; - assert!(((((libc::socketpair(1, libc::SOCK_STREAM, 0, fds.as_mut_ptr())) == (0)) as i32) != 0)); - let mut msg: *const u8 = (b"hello\0".as_ptr().cast_mut()).cast_const(); - assert!( - ((((libc::send( - fds[(0) as usize], - (msg as *const u8 as *const ::libc::c_void), - 5_u64 as usize, - 0 - ) as i64) - == (5_i64)) as i32) - != 0) - ); - let mut buf: [u8; 8] = [0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8, 0_u8]; - assert!( - ((((libc::recv( - fds[(1) as usize], - (buf.as_mut_ptr() as *mut u8 as *mut ::libc::c_void), - 8_u64 as usize, - 0 - ) as i64) - == (5_i64)) as i32) - != 0) - ); - assert!( - (((({ - let sa = core::slice::from_raw_parts( - (buf.as_mut_ptr() as *const u8 as *const ::libc::c_void) as *const u8, - 5_u64 as usize, - ); - let sb = core::slice::from_raw_parts( - (msg as *const u8 as *const ::libc::c_void) as *const u8, - 5_u64 as usize, - ); - let mut diff = 0_i32; - for (x, y) in sa.iter().zip(sb.iter()) { - if x != y { - diff = (*x as i32) - (*y as i32); - break; - } - } - diff - }) == (0)) as i32) - != 0) - ); - assert!(((((libc::close(fds[(0) as usize])) == (0)) as i32) != 0)); - assert!(((((libc::close(fds[(1) as usize])) == (0)) as i32) != 0)); -} -pub fn main() { - unsafe { - std::process::exit(main_0() as i32); - } -} -unsafe fn main_0() -> i32 { - (unsafe { test_socket_0() }); - (unsafe { test_setsockopt_getsockopt_1() }); - (unsafe { test_send_recv_2() }); - return 0; -} diff --git a/tests/unit/poll.c b/tests/unit/poll.c deleted file mode 100644 index 5780fe32..00000000 --- a/tests/unit/poll.c +++ /dev/null @@ -1,73 +0,0 @@ -// no-compile: refcount -#include -#include -#include - -static void test_poll_timeout(void) { - int fds[2]; - assert(pipe(fds) == 0); - struct pollfd pfd; - pfd.fd = fds[0]; - pfd.events = POLLIN; - pfd.revents = 0; - assert(poll(&pfd, 1, 10) == 0); - assert(pfd.revents == 0); - assert(close(fds[0]) == 0); - assert(close(fds[1]) == 0); -} - -static void test_poll_readable(void) { - int fds[2]; - assert(pipe(fds) == 0); - assert(write(fds[1], "x", 1) == 1); - struct pollfd pfd; - pfd.fd = fds[0]; - pfd.events = POLLIN; - pfd.revents = 0; - assert(poll(&pfd, 1, 100) == 1); - assert((pfd.revents & POLLIN) != 0); - assert(close(fds[0]) == 0); - assert(close(fds[1]) == 0); -} - -static void test_poll_multiple(void) { - int p1[2], p2[2]; - assert(pipe(p1) == 0); - assert(pipe(p2) == 0); - assert(write(p2[1], "y", 1) == 1); - struct pollfd pfds[2]; - pfds[0].fd = p1[0]; - pfds[0].events = POLLIN; - pfds[0].revents = 0; - pfds[1].fd = p2[0]; - pfds[1].events = POLLIN; - pfds[1].revents = 0; - assert(poll(pfds, 2, 100) == 1); - assert(pfds[0].revents == 0); - assert((pfds[1].revents & POLLIN) != 0); - assert(close(p1[0]) == 0); - assert(close(p1[1]) == 0); - assert(close(p2[0]) == 0); - assert(close(p2[1]) == 0); -} - -static void test_poll_hup(void) { - int fds[2]; - assert(pipe(fds) == 0); - assert(close(fds[1]) == 0); - struct pollfd pfd; - pfd.fd = fds[0]; - pfd.events = POLLIN; - pfd.revents = 0; - assert(poll(&pfd, 1, 100) >= 1); - assert((pfd.revents & POLLHUP) != 0); - assert(close(fds[0]) == 0); -} - -int main(void) { - test_poll_timeout(); - test_poll_readable(); - test_poll_multiple(); - test_poll_hup(); - return 0; -} diff --git a/tests/unit/select.c b/tests/unit/select.c deleted file mode 100644 index 266d7968..00000000 --- a/tests/unit/select.c +++ /dev/null @@ -1,41 +0,0 @@ -// no-compile: refcount -#include -#include -#include -#include -#include -#include - -static void fd_set_bit(int fd, fd_set *set) { - unsigned char *p = (unsigned char *)set; - p[fd / 8] |= (unsigned char)(1 << (fd % 8)); -} - -static int fd_isset_bit(int fd, const fd_set *set) { - const unsigned char *p = (const unsigned char *)set; - return (p[fd / 8] >> (fd % 8)) & 1; -} - -static void test_select(void) { - int fds[2]; - assert(pipe(fds) == 0); - assert(write(fds[1], "x", 1) == 1); - - fd_set rfds; - memset(&rfds, 0, sizeof(rfds)); - fd_set_bit(fds[0], &rfds); - - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 100000; - assert(select(fds[0] + 1, &rfds, NULL, NULL, &tv) == 1); - assert(fd_isset_bit(fds[0], &rfds)); - - assert(close(fds[0]) == 0); - assert(close(fds[1]) == 0); -} - -int main(void) { - test_select(); - return 0; -} diff --git a/tests/unit/socket.c b/tests/unit/socket.c deleted file mode 100644 index 5c267638..00000000 --- a/tests/unit/socket.c +++ /dev/null @@ -1,43 +0,0 @@ -// no-compile: refcount -#include -#include -#include -#include -#include - -static void test_socket(void) { - int s = socket(AF_INET, SOCK_STREAM, 0); - assert(s >= 0); - assert(close(s) == 0); -} - -static void test_setsockopt_getsockopt(void) { - int s = socket(AF_INET, SOCK_STREAM, 0); - assert(s >= 0); - int set = 1; - assert(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(set)) == 0); - int got = 0; - socklen_t len = sizeof(got); - assert(getsockopt(s, SOL_SOCKET, SO_REUSEADDR, &got, &len) == 0); - assert(got != 0); - assert(close(s) == 0); -} - -static void test_send_recv(void) { - int fds[2]; - assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0); - const char *msg = "hello"; - assert(send(fds[0], msg, 5, 0) == 5); - char buf[8] = {0}; - assert(recv(fds[1], buf, 8, 0) == 5); - assert(memcmp(buf, msg, 5) == 0); - assert(close(fds[0]) == 0); - assert(close(fds[1]) == 0); -} - -int main(void) { - test_socket(); - test_setsockopt_getsockopt(); - test_send_recv(); - return 0; -}