samples/fanotify/fs-monitor.c
Source file repositories/reference/linux-study-clean/samples/fanotify/fs-monitor.c
File Facts
- System
- Linux kernel
- Corpus path
samples/fanotify/fs-monitor.c- Extension
.c- Size
- 3229 bytes
- Lines
- 150
- Domain
- Support Tooling And Documentation
- Bucket
- samples
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
errno.herr.hstdlib.hstdio.hfcntl.hsys/fanotify.hsys/types.hunistd.hasm-generic/int-ll64.h
Detected Declarations
struct fanotify_event_info_errorfunction print_fhfunction handle_notificationsfunction main
Annotated Snippet
struct fanotify_event_info_error {
struct fanotify_event_info_header hdr;
__s32 error;
__u32 error_count;
};
#endif
#ifndef FILEID_INO32_GEN
#define FILEID_INO32_GEN 1
#endif
#ifndef FILEID_INVALID
#define FILEID_INVALID 0xff
#endif
static void print_fh(struct file_handle *fh)
{
int i;
uint32_t *h = (uint32_t *) fh->f_handle;
printf("\tfh: ");
for (i = 0; i < fh->handle_bytes; i++)
printf("%hhx", fh->f_handle[i]);
printf("\n");
printf("\tdecoded fh: ");
if (fh->handle_type == FILEID_INO32_GEN)
printf("inode=%u gen=%u\n", h[0], h[1]);
else if (fh->handle_type == FILEID_INVALID && !fh->handle_bytes)
printf("Type %d (Superblock error)\n", fh->handle_type);
else
printf("Type %d (Unknown)\n", fh->handle_type);
}
static void handle_notifications(char *buffer, int len)
{
struct fanotify_event_metadata *event =
(struct fanotify_event_metadata *) buffer;
struct fanotify_event_info_header *info;
struct fanotify_event_info_error *err;
struct fanotify_event_info_fid *fid;
int off;
for (; FAN_EVENT_OK(event, len); event = FAN_EVENT_NEXT(event, len)) {
if (event->mask != FAN_FS_ERROR) {
printf("unexpected FAN MARK: %llx\n",
(unsigned long long)event->mask);
goto next_event;
}
if (event->fd != FAN_NOFD) {
printf("Unexpected fd (!= FAN_NOFD)\n");
goto next_event;
}
printf("FAN_FS_ERROR (len=%d)\n", event->event_len);
for (off = sizeof(*event) ; off < event->event_len;
off += info->len) {
info = (struct fanotify_event_info_header *)
((char *) event + off);
switch (info->info_type) {
case FAN_EVENT_INFO_TYPE_ERROR:
err = (struct fanotify_event_info_error *) info;
printf("\tGeneric Error Record: len=%d\n",
err->hdr.len);
printf("\terror: %d\n", err->error);
printf("\terror_count: %d\n", err->error_count);
break;
case FAN_EVENT_INFO_TYPE_FID:
fid = (struct fanotify_event_info_fid *) info;
printf("\tfsid: %x%x\n",
#if defined(__GLIBC__)
fid->fsid.val[0], fid->fsid.val[1]);
#else
fid->fsid.__val[0], fid->fsid.__val[1]);
#endif
print_fh((struct file_handle *) &fid->handle);
break;
default:
printf("\tUnknown info type=%d len=%d:\n",
info->info_type, info->len);
}
Annotation
- Immediate include surface: `errno.h`, `err.h`, `stdlib.h`, `stdio.h`, `fcntl.h`, `sys/fanotify.h`, `sys/types.h`, `unistd.h`.
- Detected declarations: `struct fanotify_event_info_error`, `function print_fh`, `function handle_notifications`, `function main`.
- Atlas domain: Support Tooling And Documentation / samples.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.