Re: How to monitor a directory in FreeBSD?

From: Gleb Popov <arrowd_at_freebsd.org>
Date: Sat, 13 Aug 2022 15:35:21 UTC
On Sat, Aug 13, 2022, 15:16 meator <meator.dev@gmail.com> wrote:

> Hello. I'm working on a C program that needs to know whether files and
> directories in a specific directory were added, modified or deleted. (It
> should also be done recursively for all subdirectories, but to keep it
> simple I don't take recursion into account. It shouldn't be that hard to
> implement it after I will be able to monitor a directory nonrecursively.)
>
> I don't have much experience with BSD programming but I know POSIX. I
> have used inotify before for this purpose, but BSD doesn't have it so I
> started looking for BSD alternatives. The internet lead me to kqueue. I
> saw some criticism of it, but I don't need to monitor several thousands
> of files, so I hope it will be usable for my use case.
>
> The EVFILT_VNODE filter documentation in kqueue(2) doesn't really talk
> about files and directories, it talks about file descriptors. Inotify on
> the other hand is very explicit about handling files in the monitored
> directory. Kqueue can still detect creation and deletion of files inside
> the monitored directory with NOTE_WRITE for files and NOTE_LINK for
> directories (at least I think, I made a little test program to test this).
>
> This is useful, but I don't see any obvious way to identify a newly
> created file inside the monitored directory. File creation would result
> in NOTE_WRITE, but struct kevent doesn't have any "name" field (unlike
> inotify) that would show which file was created. I would have to make a
> list of directories and compare the old state with the current state to
> see the file which was added.
>
> Kqueue also doesn't seem to detect modification of files inside the
> monitored directory. Does this mean that I would have to monitor every
> single file in the directory to make this work?
>
> I think this shows that kqueue isn't really meant to be used for
> monitoring directory members. Is this true? Have I misunderstood something?
>

Yes, there is no native API to monitor directories. You can use libinotify
from ports, which replicates Linux inotify API and it does have ability to
monitor directories.

>