Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement utmpx.h itens for NetBSD #1576

Merged
merged 7 commits into from
Nov 28, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions src/unix/bsd/netbsdlike/netbsd/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,11 @@ s! {
pub msg_len: ::c_uint,
}

pub struct __exit_status {
pub e_termination: u16,
pub e_exit: u16,
}

pub struct shmid_ds {
pub shm_perm: ::ipc_perm,
pub shm_segsz: ::size_t,
Expand All @@ -297,6 +302,28 @@ s! {
}

s_no_extra_traits! {

pub struct utmpx {
pub ut_name: [::c_char; _UTX_USERSIZE],
pub ut_id: [::c_char; _UTX_IDSIZE],
pub ut_line: [::c_char; _UTX_LINESIZE],
pub ut_host: [::c_char; _UTX_HOSTSIZE],
pub ut_session: u16,
pub ut_type: u16,
pub ut_pid: ::pid_t,
pub ut_exit: __exit_status,
pub ut_ss: sockaddr_storage,
pub ut_tv: ::timeval,
pub ut_pad: [u8; _UTX_PADSIZE],
}

pub struct lastlogx {
pub ll_tv: ::timeval,
pub ll_line: [::c_char; _UTX_LINESIZE],
pub ll_host: [::c_char; _UTX_HOSTSIZE],
pub ll_ss: sockaddr_storage,
}

pub struct in_pktinfo {
pub ipi_addr: ::in_addr,
pub ipi_ifindex: ::c_uint,
Expand Down Expand Up @@ -390,6 +417,101 @@ s_no_extra_traits! {

cfg_if! {
if #[cfg(feature = "extra_traits")] {
impl PartialEq for utmpx {
fn eq(&self, other: &utmpx) -> bool {
self.ut_type == other.ut_type
&& self.ut_pid == other.ut_pid
&& self.ut_name == other.ut_name
&& self.ut_line == other.ut_line
&& self.ut_id == other.ut_id
&& self.ut_exit == other.ut_exit
&& self.ut_session == other.ut_session
&& self.ut_tv == other.ut_tv
&& self.ut_ss == other.ut_ss
&& self
.ut_pad
.iter()
.zip(other.ut_pad.iter())
.all(|(a,b)| a == b)
&& self
.ut_host
.iter()
.zip(other.ut_host.iter())
.all(|(a,b)| a == b)
}
}

impl Eq for utmpx {}

impl ::fmt::Debug for utmpx {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
f.debug_struct("utmpx")
.field("ut_name", &self.ut_name)
.field("ut_id", &self.ut_id)
.field("ut_line", &self.ut_line)
// FIXME .field("ut_host", &self.ut_host)
.field("ut_session", &self.ut_session)
.field("ut_type", &self.ut_type)
.field("ut_pid", &self.ut_pid)
.field("ut_exit", &self.ut_exit)
.field("ut_ss", &self.ut_ss)
.field("ut_tv", &self.ut_tv)
// FIXME .field("ut_pad", &self.ut_pad)
.finish()
}
}

impl ::hash::Hash for utmpx {
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
self.ut_name.hash(state);
self.ut_type.hash(state);
self.ut_pid.hash(state);
self.ut_line.hash(state);
self.ut_id.hash(state);
self.ut_host.hash(state);
self.ut_exit.hash(state);
self.ut_session.hash(state);
self.ut_tv.hash(state);
self.ut_ss.hash(state);
self.ut_pad.hash(state);
}
}

impl PartialEq for lastlogx {
fn eq(&self, other: &lastlogx) -> bool {
self.ll_tv == other.ll_tv
&& self.ll_line == other.ll_line
&& self.ll_ss == other.ll_ss
&& self
.ll_host
.iter()
.zip(other.ll_host.iter())
.all(|(a,b)| a == b)
}
}

impl Eq for lastlogx {}

impl ::fmt::Debug for lastlogx {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
f.debug_struct("lastlogx")
.field("ll_tv", &self.ll_tv)
.field("ll_line", &self.ll_line)
// FIXME.field("ll_host", &self.ll_host)
.field("ll_ss", &self.ll_ss)
.finish()
}
}

impl ::hash::Hash for lastlogx {
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
self.ll_tv.hash(state);
self.ll_line.hash(state);
self.ll_host.hash(state);
self.ll_ss.hash(state);
}
}

impl PartialEq for in_pktinfo {
fn eq(&self, other: &in_pktinfo) -> bool {
self.ipi_addr == other.ipi_addr
Expand Down Expand Up @@ -1391,6 +1513,28 @@ pub const ONLRET: ::tcflag_t = 0x40;
pub const CDTRCTS: ::tcflag_t = 0x00020000;
pub const CHWFLOW: ::tcflag_t = ::MDMBUF | ::CRTSCTS | ::CDTRCTS;

// pub const _PATH_UTMPX: &[::c_char; 14] = b"/var/run/utmpx";
// pub const _PATH_WTMPX: &[::c_char; 14] = b"/var/log/wtmpx";
// pub const _PATH_LASTLOGX: &[::c_char; 17] = b"/var/log/lastlogx";
// pub const _PATH_UTMP_UPDATE: &[::c_char; 24] = b"/usr/libexec/utmp_update";
pub const _UTX_USERSIZE: usize = 32;
pub const _UTX_LINESIZE: usize = 32;
pub const _UTX_PADSIZE: usize = 40;
pub const _UTX_IDSIZE: usize = 4;
pub const _UTX_HOSTSIZE: usize = 256;
pub const EMPTY: u16 = 0;
pub const RUN_LVL: u16 = 1;
pub const BOOT_TIME: u16 = 2;
pub const OLD_TIME: u16 = 3;
pub const NEW_TIME: u16 = 4;
pub const INIT_PROCESS: u16 = 5;
pub const LOGIN_PROCESS: u16 = 6;
pub const USER_PROCESS: u16 = 7;
pub const DEAD_PROCESS: u16 = 8;
pub const ACCOUNTING: u16 = 9;
pub const SIGNATURE: u16 = 10;
pub const DOWN_TIME: u16 = 11;

pub const SOCK_CLOEXEC: ::c_int = 0x10000000;
pub const SOCK_NONBLOCK: ::c_int = 0x20000000;

Expand Down Expand Up @@ -1751,6 +1895,28 @@ extern "C" {
buflen: ::size_t,
result: *mut *mut ::group,
) -> ::c_int;

pub fn updwtmpx(file: *const ::c_char, ut: *const utmpx) -> ::c_int;
pub fn getlastlogx(
fname: *const ::c_char,
uid: ::uid_t,
ll: *mut lastlogx,
) -> *mut lastlogx;
pub fn updlastlogx(
fname: *const ::c_char,
uid: ::uid_t,
ll: *mut lastlogx,
) -> ::c_int;
pub fn utmpxname(file: *const ::c_char) -> ::c_int;
pub fn getutxent() -> *mut utmpx;
pub fn getutxid(ut: *const utmpx) -> *mut utmpx;
pub fn getutxline(ut: *const utmpx) -> *mut utmpx;
pub fn pututxline(ut: *const utmpx) -> *mut utmpx;
pub fn setutxent();
pub fn endutxent();
// TODO: uncomment after utmp implementation
// pub fn getutmp(ux: *const utmpx, u: *mut utmp);
// pub fn getutmpx(u: *const utmp, ux: *mut utmpx);
}

cfg_if! {
Expand Down