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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

/// Error codes associated to fanotify, fanotify_init(), fanotify_mark() and read()
/// EINVAL An invalid value was passed in flags or event_f_flags.
///        FAN_ALL_INIT_FLAGS (deprecated since Linux kernel version
///        4.20) defines all allowable bits for flags.
///
/// EMFILE The number of fanotify groups for this user exceeds 128.
///
/// EMFILE The per-process limit on the number of open file
///        descriptors has been reached.
///
/// ENOMEM The allocation of memory for the notification group
///        failed.
///
/// ENOSYS This kernel does not implement fanotify_init().  The
///        fanotify API is available only if the kernel was
///        configured with CONFIG_FANOTIFY.
///
/// EPERM  The operation is not permitted because the caller lacks
///        the CAP_SYS_ADMIN capability.
///
/// Error codes associated to fanotify_mark()
///
/// EBADF  An invalid file descriptor was passed in fanotify_fd.
///
/// EBADF  pathname is relative but dirfd is neither AT_FDCWD nor a
///        valid file descriptor.
///
/// EINVAL An invalid value was passed in flags or mask, or
///        fanotify_fd was not an fanotify file descriptor.
///
/// EINVAL The fanotify file descriptor was opened with
///        FAN_CLASS_NOTIF or the fanotify group identifies
///        filesystem objects by file handles and mask contains a
///        flag for permission events (FAN_OPEN_PERM or
///        FAN_ACCESS_PERM).
///
/// ENODEV The filesystem object indicated by pathname is not
///        associated with a filesystem that supports fsid (e.g.,
///        tmpfs(5)).  This error can be returned only with an
///        fanotify group that identifies filesystem objects by file
///        handles.
///
/// ENOENT The filesystem object indicated by dirfd and pathname does
///        not exist.  This error also occurs when trying to remove a
///        mark from an object which is not marked.
///
/// ENOMEM The necessary memory could not be allocated.
///
/// ENOSPC The number of marks exceeds the limit of 8192 and the
///        FAN_UNLIMITED_MARKS flag was not specified when the
///        fanotify file descriptor was created with
///        fanotify_init(2).
///
/// ENOSYS This kernel does not implement fanotify_mark().  The
///        fanotify API is available only if the kernel was
///        configured with CONFIG_FANOTIFY.
///
/// ENOTDIR
///        flags contains FAN_MARK_ONLYDIR, and dirfd and pathname do
///        not specify a directory.
///
/// EOPNOTSUPP
///        The object indicated by pathname is associated with a
///        filesystem that does not support the encoding of file
///        handles.  This error can be returned only with an fanotify
///        group that identifies filesystem objects by file handles.
///
/// EXDEV  The filesystem object indicated by pathname resides within
///        a filesystem subvolume (e.g., btrfs(5)) which uses a
///        different fsid than its root superblock.  This error can
///        be returned only with an fanotify group that identifies
///        filesystem objects by file handles.
///
use std::fmt;
pub struct FanotifyInitError {
    code: i32,
}
impl fmt::Display for FanotifyInitError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let err_msg = match self.code {
            libc::EINVAL => "An invalid value was passed in flags or event_f_flags.
            FAN_ALL_INIT_FLAGS (deprecated since Linux kernel version
            4.20) defines all allowable bits for flags.",
            libc::EMFILE => "The number of fanotify groups for this user exceeds 128 or the per-process limit on the number of open file
            descriptors has been reached.",
            libc::ENOMEM => "The allocation of memory for the notification group
            failed.",
            libc::ENOSYS => "This kernel does not implement fanotify_init().  The
            fanotify API is available only if the kernel was
            configured with CONFIG_FANOTIFY.",
            libc::EPERM => "The operation is not permitted because the caller lacks
            the CAP_SYS_ADMIN capability.",
            _ => "Unknown error occured."
        };

        write!(f, "{}", err_msg)
    }
}