| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| library fuchsia.io; |
| |
| /// Inotifier implements the linux Inotify functionality. |
| /// It provides a mechanism for monitoring filesystem |
| /// events. Inotify can be used to monitor individual files, or to |
| /// monitor directories. When a directory is monitored, inotify will |
| /// return events for the directory itself, and for files inside the |
| /// directory. |
| protocol Inotifier {}; |
| |
| /// Used by InotifyAddWatch to indicate the server the events to be watched on. |
| /// Also used by [`Node.Inotify`] to indicate the types of events |
| /// that occurred on server side, to be notified to clients. See InotifyEvent. |
| type InotifyWatchMask = strict bits : uint32 { |
| // Events to watch in inotify |
| ACCESS = 0x00000001; // File was accessed. |
| MODIFY = 0x00000002; // File was modified. |
| ATTRIB = 0x00000004; // Metadata was changed. |
| CLOSE_WRITE = 0x00000008; // Writeable file was closed. |
| CLOSE_NOWRITE = 0x00000010; // Unwriteable file closed. |
| OPEN = 0x00000020; // File was opened. |
| MOVED_FROM = 0x00000040; // File was moved from some location. |
| MOVED_TO = 0x00000080; // File was moved to some location. |
| CREATE = 0x00000100; // Subfile was created. |
| DELETE = 0x00000200; // Subfile was deleted. |
| DELETE_SELF = 0x00000400; // Self was deleted. |
| MOVE_SELF = 0x00000800; // Self was moved. |
| UNMOUNT = 0x00002000; // Backing fs was unmounted. |
| Q_OVERFLOW = 0x00004000; // Event queued overflowed. |
| IGNORED = 0x00008000; // File was ignored. |
| |
| // Special flags |
| ONLYDIR = 0x01000000; // only watch the path if it is a directory. |
| DONT_FOLLOW = 0x02000000; // don't follow a sym link. |
| EXCL_UNLINK = 0x04000000; // exclude events on unlinked objects. |
| MASK_CREATE = 0x10000000; // only create watches. |
| MASK_ADD = 0x20000000; // add to the mask of an already existing watch. |
| ISDIRECTORY = 0x40000000; // event occurred against dir. |
| ONESHOT = 0x80000000; // only send event once. |
| }; |
| |
| // Helper events |
| const CLOSE_ALL InotifyWatchMask = InotifyWatchMask.CLOSE_WRITE | InotifyWatchMask.CLOSE_NOWRITE; |
| const MOVE InotifyWatchMask = InotifyWatchMask.MOVED_FROM | InotifyWatchMask.MOVED_TO; |
| |
| // Events returned from reading the inotifier file descriptor. |
| type InotifyEvent = struct { |
| // Watch descriptor for the file/directory. watch_descriptor identifies the watch for which |
| // this event occurs. It is one of the watch descriptors (channel/connection to the |
| // file/directory) returned by a previous call to Directory.AddInotifyFilter |
| watch_descriptor uint32; |
| |
| // Mask describing event. |
| mask InotifyWatchMask; |
| |
| // Unique cookie associating related events like rename. |
| cookie uint32; |
| |
| // Size of filename. |
| len uint32; |
| |
| // filename of file inside a directory being watched. Will be null for event occuring |
| // for the directory itself. |
| filename Path; |
| }; |