// 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.
@available(deprecated=12, removed=13, note="inotify was never fully implemented")
closed 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.
@available(deprecated=12, removed=13, note="inotify was never fully implemented")
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
@available(deprecated=12, removed=13, note="inotify was never fully implemented")
const CLOSE_ALL InotifyWatchMask = InotifyWatchMask.CLOSE_WRITE | InotifyWatchMask.CLOSE_NOWRITE;

@available(deprecated=12, removed=13, note="inotify was never fully implemented")
const MOVE InotifyWatchMask = InotifyWatchMask.MOVED_FROM | InotifyWatchMask.MOVED_TO;

// Events returned from reading the inotifier file descriptor.
@available(deprecated=12, removed=13, note="inotify was never fully implemented")
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;
};
