LINUX.ORG.RU

Hacking fatrace для старых дистров


0

1

Не могу заставить работать 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.



Последнее исправление: thespiritofbirdie (всего исправлений: 1)

Вы твёрдо уверены за 262, 263?

А вот зря вы просто таскаете хедеры из свежих ядер. Собраться то все соберется, а вот флаги и константы могут быть другими.

MKuznetsov ★★★★★
()

Для начала - ты уверен, что в fanotify_init (системный вызов, не библиотечную обертку) можно передавать (0, 0)?

Сделай минимальный пример, вызывающий fanotify_init, убедись (objdump), что вызывается именно нужный сисколл.

запускается функция timer_getoverrun, вместо syscall.

objdump твой друг.

Что я делаю не так?

Берешься не за свое дело.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.