diff options
author | Amir Goldstein <amir73il@gmail.com> | 2020-08-25 14:40:56 +0300 |
---|---|---|
committer | Michael Kerrisk <mtk.manpages@gmail.com> | 2020-08-28 14:16:30 +0200 |
commit | ea4f577808ea713a363f15c9cee423ebf579648c (patch) | |
tree | 102522e6aa0136e340c44e0a3d7a9058a93d3f65 /man7 | |
parent | e9f14fa0bbc13a86912bc558d7876eeff406bb58 (diff) | |
download | man-pages-ea4f577808ea713a363f15c9cee423ebf579648c.tar.gz |
fanotify.7, fanotify_init.2: Document FAN_REPORT_NAME
Document fanotify_init(2) flag FAN_REPORT_NAME and the format of
the event info type FAN_EVENT_INFO_TYPE_DFID_NAME.
The fanotify_fid.c example is extended to also report the name of
the created file or subdirectory.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Matthew Bobrowski <mbobrowski@mbobrowski.org>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
Diffstat (limited to 'man7')
-rw-r--r-- | man7/fanotify.7 | 81 |
1 files changed, 64 insertions, 17 deletions
diff --git a/man7/fanotify.7 b/man7/fanotify.7 index fa1c85159d..65fb2720a8 100644 --- a/man7/fanotify.7 +++ b/man7/fanotify.7 @@ -467,6 +467,12 @@ the .IR file_handle identifies the modified directory and not the created/deleted/moved child object. +If the value of +.I info_type +field is +.BR FAN_EVENT_INFO_TYPE_DFID_NAME , +the file handle is followed by a null terminated string that identifies the +created/deleted/moved directory entry name. For other events such as .BR FAN_OPEN , .BR FAN_ATTRIB , @@ -487,7 +493,18 @@ field is the .IR file_handle identifies the directory object correlated to the event or the parent directory -of the non-directory object correlated to the event. +of a non-directory object correlated to the event. +If the value of +.I info_type +field is +.BR FAN_EVENT_INFO_TYPE_DFID_NAME , +the +.IR file_handle +identifies the same directory object that would be reported with +.BR FAN_EVENT_INFO_TYPE_DFID +and the file handle is followed by a null terminated string that identifies the +name of a directory entry in that directory, or '.' to identify the directory +object itself. .PP The following macros are provided to iterate over a buffer containing fanotify event metadata returned by a @@ -672,12 +689,17 @@ events for the monitored directory itself. Fanotify monitoring of directories is not recursive: to monitor subdirectories under a directory, additional marks must be created. -(But note that the fanotify API provides no way of detecting when a -subdirectory has been created under a marked directory, -which makes recursive monitoring difficult.) -Monitoring mounts offers the capability to monitor a whole directory tree. +The +.B FAN_CREATE +event can be used for detecting when a subdirectory has been created under +a marked directory. +An additional mark must then be set on the newly created subdirectory. +This approach is racy, because it can lose events that occurred inside the +newly created subdirectory, before a mark is added on that subdirectory. +Monitoring mounts offers the capability to monitor a whole directory tree +in a race free manner. Monitoring filesystems offers the capability to monitor changes made from -any mount of a filesystem instance. +any mount of a filesystem instance in a race free manner. .PP The event queue can overflow. In this case, events are lost. @@ -961,9 +983,8 @@ main(int argc, char *argv[]) .EE .\" .SS Example program: fanotify_fid.c -The second program is an example of fanotify being used with -.B FAN_REPORT_FID -enabled. +The second program is an example of fanotify being used with a group that +identifies objects by file handles. The program marks the filesystem object that is passed as a command-line argument and waits until an event of type @@ -984,7 +1005,7 @@ This is followed by the creation of a regular file, This results in a .B FAN_CREATE event being generated and reported against the file's parent watched -directory object. +directory object and with the created file name. Program execution ends once all events captured within the buffer have been processed. .PP @@ -994,6 +1015,7 @@ been processed. Listening for events. FAN_CREATE (file created): Directory /home/user has been modified. + Entry 'testfile.txt' is not a subdirectory. All events processed successfully. Program exiting. $ \fBtouch /home/user/testfile.txt\fP # In another terminal @@ -1008,7 +1030,7 @@ This specific action results in a .B FAN_CREATE event being generated and is reported with the .B FAN_ONDIR -flag set. +flag set and with the created directory name. .PP .in +4n .EX @@ -1016,6 +1038,7 @@ flag set. Listening for events. FAN_CREATE | FAN_ONDIR (subdirectory created): Directory /home/user has been modified. + Entry 'testdir' is a subdirectory. All events processed successfully. Program exiting. $ \fBmkdir \-p /home/user/testdir\fP # In another terminal @@ -1048,6 +1071,8 @@ main(int argc, char **argv) struct file_handle *file_handle; struct fanotify_event_metadata *metadata; struct fanotify_event_info_fid *fid; + const char *file_name; + struct stat sb; if (argc != 2) { fprintf(stderr, "Invalid number of command line arguments.\en"); @@ -1061,10 +1086,10 @@ main(int argc, char **argv) } - /* Create an fanotify file descriptor with FAN_REPORT_FID as a flag - so that program can receive fid events. */ + /* Create an fanotify file descriptor with FAN_REPORT_DFID_NAME as a flag + so that program can receive fid events with directory entry name. */ - fd = fanotify_init(FAN_CLASS_NOTIF | FAN_REPORT_FID, 0); + fd = fanotify_init(FAN_CLASS_NOTIF | FAN_REPORT_DFID_NAME, 0); if (fd == \-1) { perror("fanotify_init"); exit(EXIT_FAILURE); @@ -1100,7 +1125,13 @@ main(int argc, char **argv) /* Ensure that the event info is of the correct type */ - if (fid\->hdr.info_type != FAN_EVENT_INFO_TYPE_FID) { + if (fid\->hdr.info_type == FAN_EVENT_INFO_TYPE_FID || + fid\->hdr.info_type == FAN_EVENT_INFO_TYPE_DFID) { + file_name = NULL; + } else if (fid\->hdr.info_type == FAN_EVENT_INFO_TYPE_DFID_NAME) { + file_name = file_handle->f_handle + + file_handle->handle_bytes; + } else { fprintf(stderr, "Received unexpected event info type.\en"); exit(EXIT_FAILURE); } @@ -1111,8 +1142,8 @@ main(int argc, char **argv) if (metadata\->mask == (FAN_CREATE | FAN_ONDIR)) printf("FAN_CREATE | FAN_ONDIR (subdirectory created):\en"); - /* metadata\->fd is set to FAN_NOFD when FAN_REPORT_FID is - enabled. To obtain a file descriptor for the file object + /* metadata\->fd is set to FAN_NOFD when the group identifies objects + by file handles. To obtain a file descriptor for the file object corresponding to an event you can use the struct file_handle that\(aqs provided within the fanotify_event_info_fid in conjunction with the open_by_handle_at(2) system call. @@ -1146,6 +1177,22 @@ main(int argc, char **argv) path[path_len] = \(aq\e0\(aq; printf("\etDirectory \(aq%s\(aq has been modified.\en", path); + if (file_name) { + ret = fstatat(event_fd, file_name, &sb, 0); + if (ret == \-1) { + if (errno != ENOENT) { + perror("fstatat"); + exit(EXIT_FAILURE); + } + printf("\etEntry \(aq%s\(aq does not exist.\en", file_name); + } else if ((sb.st_mode & S_IFMT) == S_IFDIR) { + printf("\etEntry \(aq%s\(aq is a subdirectory.\en", file_name); + } else { + printf("\etEntry \(aq%s\(aq is not a subdirectory.\en", + file_name); + } + } + /* Close associated file descriptor for this event */ close(event_fd); |