pub const SUPPORT_IPV6: bool = true;
#[allow(non_camel_case_types)]
#[repr(C)]
pub union tcp_sockaddr {
pub a: libc::sockaddr, pub in_: libc::sockaddr_in, pub in6: libc::sockaddr_in6, pub storage: libc::sockaddr_storage,
}
pub type Tcp_session = Box<tcp_session>;
pub const ZTCP_LISTEN: i32 = 1;
pub const ZTCP_INBOUND: i32 = 2;
pub const ZTCP_ZFTP: i32 = 16;
#[allow(non_camel_case_types)]
#[repr(C)]
pub struct tcp_session {
pub fd: i32, pub sock: tcp_sockaddr, pub peer: tcp_sockaddr, pub flags: i32, }
pub const INET_ADDRSTRLEN: usize = 16;
pub const INET6_ADDRSTRLEN: usize = 46;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ztcp_zftp_bit_does_not_overlap_listen_or_inbound() {
let _g = crate::test_util::global_state_lock();
assert_eq!(ZTCP_ZFTP & (ZTCP_LISTEN | ZTCP_INBOUND), 0);
}
#[test]
fn support_ipv6_enabled() {
assert!(SUPPORT_IPV6, "IPv6 must be enabled on modern platforms");
}
#[test]
fn ztcp_listen_is_bit_zero() {
assert_eq!(ZTCP_LISTEN, 1);
}
#[test]
fn ztcp_inbound_is_bit_one() {
assert_eq!(ZTCP_INBOUND, 2);
}
#[test]
fn ztcp_zftp_is_bit_four() {
assert_eq!(ZTCP_ZFTP, 16);
}
#[test]
fn ztcp_flags_are_single_bits() {
for &v in &[ZTCP_LISTEN, ZTCP_INBOUND, ZTCP_ZFTP] {
assert!(v > 0, "{} must be positive", v);
assert!(
(v as u32).is_power_of_two(),
"{} must be a power of 2 (single bit)",
v
);
}
}
#[test]
fn ztcp_listen_inbound_can_combine() {
let combined = ZTCP_LISTEN | ZTCP_INBOUND;
assert_eq!(combined, 3, "1 | 2 = 3");
assert_ne!(combined & ZTCP_LISTEN, 0);
assert_ne!(combined & ZTCP_INBOUND, 0);
}
#[test]
fn inet_addrstrlen_is_16() {
assert_eq!(INET_ADDRSTRLEN, 16);
}
#[test]
fn inet6_addrstrlen_is_46() {
assert_eq!(INET6_ADDRSTRLEN, 46);
}
#[test]
fn inet6_strlen_greater_than_inet_strlen() {
assert!(
INET6_ADDRSTRLEN > INET_ADDRSTRLEN,
"IPv6 string is longer than IPv4"
);
}
#[test]
fn inet_addrstrlen_matches_max_ipv4_text() {
assert_eq!(INET_ADDRSTRLEN, "255.255.255.255".len() + 1);
}
#[test]
fn tcp_session_struct_non_zero_size() {
let size = std::mem::size_of::<tcp_session>();
assert!(size > 0, "tcp_session must have non-zero size");
assert!(size >= 4 + 4, "tcp_session must hold fd + flags minimum");
}
#[test]
fn ztcp_flags_all_i32_type() {
let _: i32 = ZTCP_LISTEN;
let _: i32 = ZTCP_INBOUND;
let _: i32 = ZTCP_ZFTP;
}
#[test]
fn inet_strlen_constants_are_usize_type() {
let _: usize = INET_ADDRSTRLEN;
let _: usize = INET6_ADDRSTRLEN;
}
#[test]
fn inet6_addrstrlen_matches_max_ipv6_with_v4_mapped() {
let max_ipv6 = "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255";
assert_eq!(max_ipv6.len(), 45, "verify max IPv6 text length");
assert_eq!(
INET6_ADDRSTRLEN,
max_ipv6.len() + 1,
"INET6_ADDRSTRLEN must hold max textual + NUL"
);
}
#[test]
fn support_ipv6_is_bool_type() {
let _: bool = SUPPORT_IPV6;
}
#[test]
fn ztcp_listen_inbound_or_keeps_both_bits() {
let combo = ZTCP_LISTEN | ZTCP_INBOUND;
assert_ne!(combo & ZTCP_LISTEN, 0, "LISTEN bit preserved");
assert_ne!(combo & ZTCP_INBOUND, 0, "INBOUND bit preserved");
}
#[test]
fn ztcp_zftp_can_or_with_listen_inbound_combo() {
let combo = ZTCP_ZFTP | ZTCP_LISTEN | ZTCP_INBOUND;
assert_ne!(combo & ZTCP_ZFTP, 0);
assert_ne!(combo & ZTCP_LISTEN, 0);
assert_ne!(combo & ZTCP_INBOUND, 0);
}
#[test]
fn inet_strlen_constants_positive() {
assert!(INET_ADDRSTRLEN > 0);
assert!(INET6_ADDRSTRLEN > 0);
}
#[test]
fn inet_addrstrlen_holds_max_ipv4_dotted() {
let max_ipv4 = "255.255.255.255";
assert_eq!(
INET_ADDRSTRLEN,
max_ipv4.len() + 1,
"INET_ADDRSTRLEN must hold max IPv4 textual + NUL"
);
}
#[test]
fn tcp_session_minimum_size_holds_fd_plus_flags() {
let size = std::mem::size_of::<tcp_session>();
assert!(
size >= 8,
"must hold fd+flags pair (≥ 8 bytes), got {}",
size
);
}
#[test]
fn tcp_sockaddr_union_at_least_sockaddr_storage_size() {
let union_sz = std::mem::size_of::<tcp_sockaddr>();
let storage_sz = std::mem::size_of::<libc::sockaddr_storage>();
assert!(
union_sz >= storage_sz,
"tcp_sockaddr union ({}) must hold sockaddr_storage ({})",
union_sz,
storage_sz
);
}
#[test]
fn tcp_sockaddr_union_holds_every_variant() {
let union_sz = std::mem::size_of::<tcp_sockaddr>();
assert!(
union_sz >= std::mem::size_of::<libc::sockaddr>(),
"must hold sockaddr ({})",
std::mem::size_of::<libc::sockaddr>()
);
assert!(
union_sz >= std::mem::size_of::<libc::sockaddr_in>(),
"must hold sockaddr_in ({})",
std::mem::size_of::<libc::sockaddr_in>()
);
assert!(
union_sz >= std::mem::size_of::<libc::sockaddr_in6>(),
"must hold sockaddr_in6 ({})",
std::mem::size_of::<libc::sockaddr_in6>()
);
}
#[test]
fn tcp_session_fd_field_is_i32() {
let sess: tcp_session = unsafe { std::mem::zeroed() };
let _: i32 = sess.fd;
let _: i32 = sess.flags;
}
#[test]
fn ztcp_flags_no_pairwise_overlap_across_all_three() {
let sum = ZTCP_LISTEN + ZTCP_INBOUND + ZTCP_ZFTP;
let or = ZTCP_LISTEN | ZTCP_INBOUND | ZTCP_ZFTP;
assert_eq!(
sum, or,
"sum==OR proves no shared bits between LISTEN/INBOUND/ZFTP"
);
}
#[test]
fn ztcp_listen_disjoint_from_inbound() {
assert_eq!(
ZTCP_LISTEN & ZTCP_INBOUND,
0,
"LISTEN and INBOUND must not share bits"
);
}
#[test]
fn ztcp_zftp_bit_higher_than_inbound() {
assert!(
ZTCP_ZFTP > ZTCP_INBOUND,
"ZTCP_ZFTP ({}) must be > ZTCP_INBOUND ({}) for clean bitfield growth",
ZTCP_ZFTP,
ZTCP_INBOUND
);
}
#[test]
fn inet_addrstrlen_matches_posix_rfc_value() {
assert_eq!(
INET_ADDRSTRLEN, 16,
"INET_ADDRSTRLEN must equal 16 per RFC 4291 + POSIX (max IPv4 + NUL)"
);
}
#[test]
fn inet6_addrstrlen_matches_posix_rfc_value() {
assert_eq!(
INET6_ADDRSTRLEN, 46,
"INET6_ADDRSTRLEN must equal 46 per RFC 4291 + POSIX"
);
}
#[test]
fn tcp_session_size_holds_two_sockaddr_unions() {
let sz = std::mem::size_of::<tcp_session>();
let storage_sz = std::mem::size_of::<libc::sockaddr_storage>();
let minimum = 4 + 2 * storage_sz + 4;
assert!(
sz >= minimum,
"tcp_session ({} bytes) must hold fd+2*storage+flags (≥ {})",
sz,
minimum
);
}
#[test]
fn tcp_session_typedef_is_box() {
let sess: Tcp_session = Box::new(unsafe { std::mem::zeroed::<tcp_session>() });
let _: &tcp_session = &*sess;
}
#[test]
fn ztcp_flags_all_strictly_positive() {
assert!(ZTCP_LISTEN > 0);
assert!(ZTCP_INBOUND > 0);
assert!(ZTCP_ZFTP > 0);
}
#[test]
fn ztcp_flag_values_verbatim() {
assert_eq!(ZTCP_LISTEN, 1, "c:83 — ZTCP_LISTEN must be 1");
assert_eq!(ZTCP_INBOUND, 2, "c:84 — ZTCP_INBOUND must be 2");
assert_eq!(ZTCP_ZFTP, 16, "c:85 — ZTCP_ZFTP must be 16");
}
#[test]
fn ztcp_flags_all_powers_of_two() {
for v in [ZTCP_LISTEN, ZTCP_INBOUND, ZTCP_ZFTP] {
assert!(
(v as u32).is_power_of_two(),
"ZTCP_* {} must be single bit",
v
);
}
}
#[test]
fn ztcp_flags_pairwise_distinct() {
let flags = [ZTCP_LISTEN, ZTCP_INBOUND, ZTCP_ZFTP];
let unique: std::collections::HashSet<_> = flags.iter().copied().collect();
assert_eq!(
unique.len(),
flags.len(),
"ZTCP_* must be pairwise distinct"
);
}
#[test]
fn ztcp_flags_fit_in_i8() {
for v in [ZTCP_LISTEN, ZTCP_INBOUND, ZTCP_ZFTP] {
assert!(v < i8::MAX as i32, "ZTCP_* {} must fit in i8", v);
}
}
#[test]
fn ztcp_zftp_is_bit_4() {
assert_eq!(
ZTCP_ZFTP,
1 << 4,
"ZTCP_ZFTP must be bit 4 (reserved gap from INBOUND)"
);
}
#[test]
fn support_ipv6_is_enabled() {
assert!(SUPPORT_IPV6, "SUPPORT_IPV6 must be true on modern target");
}
#[test]
fn inet_addrstrlen_is_16_alt() {
assert_eq!(INET_ADDRSTRLEN, 16, "INET_ADDRSTRLEN must be 16 (RFC 791)");
}
#[test]
fn inet6_addrstrlen_is_46_alt() {
assert_eq!(
INET6_ADDRSTRLEN, 46,
"INET6_ADDRSTRLEN must be 46 (RFC 4291)"
);
}
#[test]
fn inet6_strlen_larger_than_inet_strlen() {
assert!(
INET6_ADDRSTRLEN > INET_ADDRSTRLEN,
"IPv6 string must be longer than IPv4: {} vs {}",
INET6_ADDRSTRLEN,
INET_ADDRSTRLEN
);
}
#[test]
fn tcp_session_non_zero_size() {
assert!(
std::mem::size_of::<tcp_session>() > 0,
"tcp_session must have a non-zero size"
);
}
#[test]
fn tcp_session_min_alignment() {
assert!(
std::mem::align_of::<tcp_session>() >= 4,
"tcp_session must be ≥ 4-byte aligned"
);
}
#[test]
fn ztcp_flags_or_equals_nineteen() {
let or_all = ZTCP_LISTEN | ZTCP_INBOUND | ZTCP_ZFTP;
assert_eq!(or_all, 19, "OR of all ZTCP_* must equal 0b10011 = 19");
}
}