Не могу заставить работать http://ftp.de.debian.org/debian/pool/main/f/fatrace/fatrace_0.6.orig.tar.bz2 на CentOS 6.5 с таким вот патчем:
--- fatrace.c.save 2014-01-07 17:49:57.000000000 +0400
+++ fatrace.c 2014-04-27 19:07:11.974101124 +0400
@@ -32,6 +32,11 @@
#include <sys/stat.h>
#include <sys/fanotify.h>
#include <sys/time.h>
+#include <sys/syscall.h> /* For SYS_xxx definitions */
+
+#define _GNU_SOURCE
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
/* command line options */
static char* option_output = NULL;
@@ -145,7 +150,7 @@
struct mntent* mount;
if (option_current_mount) {
- res = fanotify_mark (fan_fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
+ res = syscall( __NR_fanotify_init, fan_fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
FAN_ACCESS| FAN_MODIFY | FAN_OPEN | FAN_CLOSE | FAN_ONDIR | FAN_EVENT_ON_CHILD,
AT_FDCWD, ".");
if (res < 0) {
@@ -174,7 +179,7 @@
}
//printf("Adding watch for %s mount %s\n", mount->mnt_type, mount->mnt_dir);
- res = fanotify_mark (fan_fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
+ res = syscall( __NR_fanotify_mark, fan_fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
FAN_ACCESS| FAN_MODIFY | FAN_OPEN | FAN_CLOSE | FAN_ONDIR | FAN_EVENT_ON_CHILD,
AT_FDCWD, mount->mnt_dir);
if (res < 0) {
@@ -334,7 +339,7 @@
parse_args (argc, argv);
- fan_fd = fanotify_init (0, 0);
+ fan_fd = syscall(__NR_fanotify_init, 0, 0);
if (fan_fd < 0) {
err = errno;
fprintf (stderr, "Cannot initialize fanotify: %s\n", strerror (err));
Оно собирается (надо взять sys/fanotify.h и linux/fanotify.h из более свежего дистра), но не работает:
# ./fatrace
Cannot initialize fanotify: Invalid argument
strace показывает, что запускается функция timer_getoverrun, вместо syscall.
Что я делаю не так? Ядро стоит 3.14.