utwt_raw/
x32.rs

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    /// Seconds
10    pub tv_sec: i32,
11    /// Microseconds
12    pub tv_usec: i32,
13}
14
15#[repr(C)]
16#[derive(Clone, Copy, FromZeroes, FromBytes)]
17pub struct utmp {
18    /// Type of record
19    pub ut_type: c_short,
20    /// PID of login process
21    pub ut_pid: libc::pid_t,
22    /// Device name of tty - `"/dev/"`
23    pub ut_line: [u8; UT_LINESIZE],
24    /// Terminal name suffix, or `inittab(5)` ID
25    pub ut_id: [u8; 4],
26    /// Username
27    pub ut_user: [u8; UT_NAMESIZE],
28    /// Hostname for remote login, or kernel version for run-level message
29    pub ut_host: [u8; UT_HOSTSIZE],
30    /// Exit status of a process marked as `DEAD_PROCESS`; not used by Linux init
31    pub ut_exit: exit_status,
32    /// Session ID (`getsid(2)`) used for windowing
33    pub ut_session: i32,
34    /// Time entry was made
35    pub ut_tv: timeval,
36    /// Internet address of remote host; IPv4 address uses just `ut_addr_v6[0]`
37    pub ut_addr_v6: [i32; 4],
38    /// Reserved for future use
39    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}