@@ -1,11 +1,25 @@
#!/usr/bin/perl
use Test;
-BEGIN { plan tests => 18 } # number of tests to run
-# help the test script locate itself
-$basedir = $0;
-$basedir =~ s|(.*)/[^/]*|$1|;
+BEGIN {
+ # help the test script locate itself
+ $basedir = $0;
+ $basedir =~ s|(.*)/[^/]*|$1|;
+
+ $fanotify_support = 1;
+
+ $result = system("runcon -t test_watch_t $basedir/test_fanotify -c 2>&1");
+
+ # check if CONFIG_FANOTIFY is enabled - ENOSYS
+ if ( $result >> 8 eq 38 ) {
+ $fanotify_support = 0;
+ plan tests => 4;
+ }
+ else {
+ plan tests => 18;
+ }
+}
# Get rid of a testfile and dir from last run if it's there (just in case)
system("rm -f $basedir/watch_me");
@@ -27,45 +41,53 @@ $exit_val =
system("runcon -t test_watch_t $basedir/test_inotify $basedir/watch_me 2>&1");
ok( $exit_val, 0 );
-# Should be able to set non-permissions based fanotify watch
-$exit_val = system(
- "runcon -t test_watch_t $basedir/test_fanotify $basedir/watch_me 2>&1");
-ok( $exit_val, 0 );
+if ($fanotify_support) {
-# Should NOT be able to set permission based fanotify watch
-$exit_val = system(
- "runcon -t test_watch_t $basedir/test_fanotify -p $basedir/watch_me 2>&1");
-ok($exit_val); # this should fail
+ # Should be able to set non-permissions based fanotify watch
+ $exit_val = system(
+ "runcon -t test_watch_t $basedir/test_fanotify $basedir/watch_me 2>&1");
+ ok( $exit_val, 0 );
-# Should NOT be able to set read based fanotify watch
-$exit_val = system(
- "runcon -t test_watch_t $basedir/test_fanotify -r $basedir/watch_me 2>&1");
-ok($exit_val); # this should fail
+ # Should NOT be able to set permission based fanotify watch
+ $exit_val = system(
+"runcon -t test_watch_t $basedir/test_fanotify -p $basedir/watch_me 2>&1"
+ );
+ ok($exit_val); # this should fail
+
+ # Should NOT be able to set read based fanotify watch
+ $exit_val = system(
+"runcon -t test_watch_t $basedir/test_fanotify -r $basedir/watch_me 2>&1"
+ );
+ ok($exit_val); # this should fail
+}
# Should NOT be able to set read based inotify watch
$exit_val = system(
"runcon -t test_watch_t $basedir/test_inotify -r $basedir/watch_me 2>&1");
-ok($exit_val); # this should fail
+ok($exit_val); # this should fail
-## TEST PERM WATCH
-# Should be able to set permission based fanotify watch
-$exit_val = system(
+if ($fanotify_support) {
+
+ ## TEST PERM WATCH
+ # Should be able to set permission based fanotify watch
+ $exit_val = system(
"runcon -t test_perm_watch_t $basedir/test_fanotify -p $basedir/watch_me 2>&1"
-);
-ok( $exit_val, 0 );
+ );
+ ok( $exit_val, 0 );
-# Should NOT be able to set watch of accesses
-$exit_val = system(
+ # Should NOT be able to set watch of accesses
+ $exit_val = system(
"runcon -t test_perm_watch_t $basedir/test_fanotify -r $basedir/watch_me 2>&1"
-);
-ok($exit_val); # this should fail
+ );
+ ok($exit_val); # this should fail
-## TEST READ NO PERM WATCH PERMSISSIONS
-# Should NOT be able to set read and perm watch
-$exit_val = system(
+ ## TEST READ NO PERM WATCH PERMSISSIONS
+ # Should NOT be able to set read and perm watch
+ $exit_val = system(
"runcon -t test_read_watch_t $basedir/test_fanotify -p -r $basedir/watch_me 2>&1"
-);
-ok($exit_val); # should fail
+ );
+ ok($exit_val); # should fail
+}
# Should be able to set read inotify watch
$exit_val = system(
@@ -73,12 +95,15 @@ $exit_val = system(
);
ok( $exit_val, 0 );
-## TEST READ WITH PERM WATCH PERMSISSIONS
-# Should be able to set read and perm watch
-$exit_val = system(
+if ($fanotify_support) {
+
+ ## TEST READ WITH PERM WATCH PERMSISSIONS
+ # Should be able to set read and perm watch
+ $exit_val = system(
"runcon -t test_perm_read_watch_t $basedir/test_fanotify -p -r $basedir/watch_me 2>&1"
-);
-ok( $exit_val, 0 );
+ );
+ ok( $exit_val, 0 );
+}
## TEST NO WATCH PERMSISSIONS
# Should NOT be able to set inotify watch
@@ -86,45 +111,52 @@ $exit_val = system(
"runcon -t test_no_watch_t $basedir/test_inotify $basedir/watch_me 2>&1");
ok($exit_val); # this should fail
-# Should NOT be able to set any fanotify watch
-$exit_val = system(
- "runcon -t test_no_watch_t $basedir/test_fanotify $basedir/watch_me 2>&1");
-ok($exit_val); # this should fail
-
-## TEST READ ONLY
-# Should NOT be able to get read-write descriptor
-$exit_val = system(
- "runcon -t test_rdonly_t $basedir/test_fanotify -l $basedir/watch_me 2>&1");
-ok($exit_val); # this should fail
-
-# Should be able to get read-write descriptor
-$exit_val = system(
- "runcon -t test_watch_t $basedir/test_fanotify -l $basedir/watch_me 2>&1");
-ok( $exit_val, 0 );
-
-## TEST MOUNT WATCHES
-# Should NOT be able to set a watch on a mount point
-$exit_val = system(
- "runcon -t test_watch_t $basedir/test_fanotify -m $basedir/watch_dir 2>&1");
-ok($exit_val); # this should fail
-
-# Should be able to set a watch on mount point
-$exit_val = system(
+if ($fanotify_support) {
+
+ # Should NOT be able to set any fanotify watch
+ $exit_val = system(
+"runcon -t test_no_watch_t $basedir/test_fanotify $basedir/watch_me 2>&1"
+ );
+ ok($exit_val); # this should fail
+
+ ## TEST READ ONLY
+ # Should NOT be able to get read-write descriptor
+ $exit_val = system(
+"runcon -t test_rdonly_t $basedir/test_fanotify -l $basedir/watch_me 2>&1"
+ );
+ ok($exit_val); # this should fail
+
+ # Should be able to get read-write descriptor
+ $exit_val = system(
+"runcon -t test_watch_t $basedir/test_fanotify -l $basedir/watch_me 2>&1"
+ );
+ ok( $exit_val, 0 );
+
+ ## TEST MOUNT WATCHES
+ # Should NOT be able to set a watch on a mount point
+ $exit_val = system(
+"runcon -t test_watch_t $basedir/test_fanotify -m $basedir/watch_dir 2>&1"
+ );
+ ok($exit_val); # this should fail
+
+ # Should be able to set a watch on mount point
+ $exit_val = system(
"runcon -t test_mount_watch_t $basedir/test_fanotify -m $basedir/watch_dir 2>&1"
-);
-ok( $exit_val, 0 );
+ );
+ ok( $exit_val, 0 );
-# Should NOT be able to set a perm watch on a mount
-$exit_val = system(
+ # Should NOT be able to set a perm watch on a mount
+ $exit_val = system(
"runcon -t test_mount_watch_t $basedir/test_fanotify -m -p $basedir/watch_dir 2>&1"
-);
-ok($exit_val); # this should fail
+ );
+ ok($exit_val); # this should fail
-# Should be able to set a perm watch on a mount object
-$exit_val = system(
+ # Should be able to set a perm watch on a mount object
+ $exit_val = system(
"runcon -t test_mount_perm_t $basedir/test_fanotify -p -m $basedir/watch_dir 2>&1"
-);
-ok( $exit_val, 0 );
+ );
+ ok( $exit_val, 0 );
+}
# Clean up test file
system("rm -f $basedir/watch_me");
@@ -5,6 +5,7 @@
#include <getopt.h>
+#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <sys/fanotify.h>
@@ -12,7 +13,7 @@
void printUsage()
{
- fprintf(stderr, "Usage: test_fanotify [-p] [-r] [-l] [-m] file_name\n");
+ fprintf(stderr, "Usage: test_fanotify [-p] [-r] [-l] [-m] [-c] file_name\n");
exit(1);
}
@@ -26,13 +27,14 @@ int main(int argc, char *argv[])
int mask = FAN_OPEN; // default mask
int flags = FAN_MARK_ADD;
int listening = 0;
+ int check = 0;
// the -p flag will test for watch_with_perm
// the mask used at mark will contain FAN_OPEN_PERM
//
// the -r flag will test for watching accesses to files for reads
// the mask will contain FAN_ACCESS
- while ((arg = getopt(argc, argv, "prlm")) != -1) {
+ while ((arg = getopt(argc, argv, "prlmc")) != -1) {
switch (arg) {
case 'p':
mask |= FAN_OPEN_PERM;
@@ -46,6 +48,9 @@ int main(int argc, char *argv[])
case 'm':
flags |= FAN_MARK_MOUNT;
break;
+ case 'c':
+ check = 1;
+ break;
default:
printUsage();
}
@@ -53,6 +58,11 @@ int main(int argc, char *argv[])
// get file descriptor for new fanotify event queue
fd = fanotify_init(FAN_CLASS_CONTENT, O_RDWR);
+ if (check) {
+ if (fd < 0 && errno == ENOSYS)
+ exit(ENOSYS);
+ exit(0);
+ }
if (fd < 0) {
perror("fanotify_init:bad file descriptor");
exit(1);