The `fanotify` API[0] is a linux-specific API for notification and interception
of filesystem events. In some ways it is similar to `inotify`, but with
different advantages/tradeoffs. It is particularly well suited to full
filesystem/mount monitoring (vs per directory) and for allowing/denying access
to files (`inotify` lacks this capability).
The `fanotify` API has been updated several times since it was enabled in Linux
2.6.37. Presently I've only included support for the original `fanotify`
features, and the `FAN_MARK_FILESYSTEM` addition made in Linux 4.20. There are
subsequent updates in 5.0 and 5.1 not covered in this initial commit.
This commit adds the relevant constants and types from
`uapi/linux/fanotify.h`[1] and two new functions (`fanotify_init`[2] and
`fanotify_wrap`[3]) to `src/unix/linux_like/linux/mod.rs`. While I believe this
API is also present on Android I have presently limited my attention to Linux.
Although this commit focuses on Linux 4.20.x's `fanotify` API/constants I have
skipped adding constants for `FAN_ALL_CLASS_BITS`, `FAN_ALL_INIT_FLAGS`,
`FAN_ALL_MARK_FLAGS`, `FAN_ALL_EVENTS`, `FAN_ALL_PERM_EVENTS` and
`FAN_ALL_OUTGOING_EVENTS` even though they are present in this kernel version's
headers. These defines were deprecated[4] in later releases with instructions to
not use them in new programs or extend them with new values. It would be a shame
for new Rust programs to use deprecated #defines!
[0]: http://man7.org/linux/man-pages/man7/fanotify.7.html
[1]: d54f4fba88/include/uapi/linux/fanotify.h
[2]: http://man7.org/linux/man-pages/man2/fanotify_init.2.html
[3]: http://man7.org/linux/man-pages/man2/fanotify_mark.2.html
[4]: 23c9deeb32 (diff-4c9ca62be6bf38cc08f7ea9daf16e379)
This change fixes two issues. First, the current cfmakeraw()
implementation in this crate appears to be making a stack copy of the
input "struct termios" before modifying it, rather than correctly
modifying the original through the pointer. Before this modification
the routine did not, thus, set the flags for raw mode.
Second, we address the default settings of the MIN and TIME terminal
options. On at least FreeBSD and Linux systems, the modern default
value for MIN appears to be 1; i.e., block and wait for at least one
input byte. On most Solaris and illumos systems, the MIN control
character slot overlaps with EOF, and thus has a default value of 4.
This breaks at least the examples in the "termion" crate, and probably
quite a lot of other software written first and foremost for Linux
systems. We need to force the MIN value to 1 while switching to raw
mode.
This is a Linux-only feature that was already present as a
syscall. Add it just to linux/gnu for the moment, as the musl version
bundled in the Rust's x86_64-unknown-linux-musl toolchain doesn't
include it yet.
Signed-off-by: Sergio Lopez <slp@redhat.com>
The `ci/run-docker.sh` utility script adds a `--volume` argument to the
`docker` command to mount the Cargo home directory of the host machine
into the container at `/cargo`.
Prior to this patch the host's Cargo home directory is assumed to be the
`dirname` of the `dirname` of the `cargo` command's path. That works in
most cases where the host machine installed rust with vanilla
`rustup`. It may fail if the host machine used a different method.
For example if the host machine used the Archlinux rustup package[0]
then `cargo` is installed to `/usr/bin/cargo` and the `run-docker.sh`
script incorrectly mounts `/usr/` to the `/cargo` directory of the test
container.
This patch allows specifying an explicit `CARGO_HOME` to the
`ci/run-docker.sh` script so that users with a non-standard cargo dir
can use the utility without modification. By default if no `CARGO_HOME`
is set then the legacy behaviour is used and `CARGO_HOME` defaults to
the `dirname` of the `dirname` of the `cargo` command is used.
[0]: https://wiki.archlinux.org/index.php/rust#Arch_Linux_package