1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use crate::genetlink::FamilyError;
use libc::pid_t;
use std::io;
use thiserror::Error;

/// Taskstats error
#[derive(Debug, Error)]
pub enum Error {
    #[error("io")]
    Io(#[from] io::Error),
    #[error("failed to resolve family id")]
    Family(#[from] FamilyError),
    #[error("taskstats service unavailable")]
    Unavailable,
    #[error("unknown command {0}")]
    UnexpectedCmd(u8),
    #[error("invalid taskstats message")]
    InvalidMessage(#[from] InvalidMessage),
    #[error("taskstats version too low: {0}")]
    UnsupportedVersion(u16),
    #[error("unexpected pid, expected {0} got {1}")]
    UnexpectedPid(pid_t, pid_t),
    #[error("unexpected empty result from listener")]
    UnexpectedEmptyResult,
    #[error("no taskstats received")]
    NoResult,
}

/// Invalid taskstats message
#[derive(Debug, Error)]
pub enum InvalidMessage {
    #[error("invalid netlink message")]
    Netlink(#[from] crate::netlink::InvalidBuffer),
    #[error("invalid generic netlink message")]
    GenericNetlink(#[from] crate::genetlink::InvalidBuffer),
    #[error("unexpected attribute, expected {0} got {1}")]
    Attr(u16, u16),
    #[error("expected pid attribute, found nothing")]
    EmptyAggrPid,
    #[error("expected tgid attribute, found nothing")]
    EmptyAggrTgid,
    #[error("expected stats attribute, found nothing")]
    NoStats,
}

impl From<crate::netlink::InvalidBuffer> for Error {
    fn from(inner: crate::netlink::InvalidBuffer) -> Self {
        Error::InvalidMessage(inner.into())
    }
}

impl From<crate::genetlink::InvalidBuffer> for Error {
    fn from(inner: crate::genetlink::InvalidBuffer) -> Self {
        Error::InvalidMessage(inner.into())
    }
}