1use super::{cstr_from_bytes, exit_status, UT_HOSTSIZE, UT_LINESIZE, UT_NAMESIZE};
2use libc::c_short;
3use std::fmt;
4use zerocopy::{FromBytes, FromZeroes};
5
6#[repr(C)]
7#[derive(Clone, Copy, Debug, FromZeroes, FromBytes)]
8pub struct timeval {
9 pub tv_sec: i32,
11 pub tv_usec: i32,
13}
14
15#[repr(C)]
16#[derive(Clone, Copy, FromZeroes, FromBytes)]
17pub struct utmp {
18 pub ut_type: c_short,
20 pub ut_pid: libc::pid_t,
22 pub ut_line: [u8; UT_LINESIZE],
24 pub ut_id: [u8; 4],
26 pub ut_user: [u8; UT_NAMESIZE],
28 pub ut_host: [u8; UT_HOSTSIZE],
30 pub ut_exit: exit_status,
32 pub ut_session: i32,
34 pub ut_tv: timeval,
36 pub ut_addr_v6: [i32; 4],
38 pub __unused: [u8; 20],
40}
41
42impl fmt::Debug for utmp {
43 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
44 fmt.debug_struct("utmp")
45 .field("ut_type", &self.ut_type)
46 .field("ut_pid", &self.ut_pid)
47 .field("ut_line", &cstr_from_bytes(&self.ut_line))
48 .field("ut_id", &self.ut_id)
49 .field("ut_user", &cstr_from_bytes(&self.ut_user))
50 .field("ut_host", &cstr_from_bytes(&self.ut_host))
51 .field("ut_exit", &self.ut_exit)
52 .field("ut_session", &self.ut_session)
53 .field("ut_tv", &self.ut_tv)
54 .field("ut_addr_v6", &self.ut_addr_v6)
55 .field("__unused", &self.__unused)
56 .finish()
57 }
58}
59
60#[test]
61fn test_size_of_utmp_x32() {
62 assert_eq!(std::mem::size_of::<utmp>(), 384);
63}