blob: 374a25cb87db95f8fd21e6bf4ea750206941c46e [file] [log] [blame]
// Copyright 2020 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.io2;
using zx;
/// Advisory locking protocol.
///
/// This protocol is intended to be composed into the |File| protocol to
/// provide support for advisory locking.
///
/// Advisory locks are purely advisory. They do not prevent actual read or
/// write operations from occurring on the file, either through this
/// connection or through other connections.
///
/// These primitives are designed to support the flock() and fcntl(),
/// specifically F_SETLK, F_SETLKW, and F_GETLK, functionality that code
/// running on Fuchsia expects from other operating systems.
protocol AdvisoryLocking {
/// Acquires an advisory lock on the underlying file.
///
/// The lock lasts until either this connection is closed or
/// this method is called with |AdvisoryLockType.UNLOCK| to release the lock
/// explicitly.
///
/// Advisory locks are purely advisory. They do not prevent actual read or
/// write operations from occurring on the file, either through this
/// connection or through other connections.
///
/// This method requires the following rights:
///
/// * [`Rights.READ_BYTES`] if `request.type` is [`AdvisoryLockType.READ`].
/// * [`Rights.WRITE_BYTES`] if `request.type` is
/// [`AdvisoryLockType.WRITE`].
///
/// # Errors
///
/// * `ZX_ERR_BAD_STATE` The specified type of lock cannot be acquired. For
/// example, another connection might hold a conflicting lock type.
/// * `ZX_ERR_NOT_SUPPORTED` This file does not support advisory locking.
/// * `ZX_ERR_ACCESS_DENIED` This connection does not have sufficient rights
/// to acquire the given type of lock.
[Transitional]
AdvisoryLock(AdvisoryLockRequest request) -> () error zx.status;
};
/// A type of advisory lock.
///
/// Used with [`AdvisoryLocking.AdvisoryLock`].
enum AdvisoryLockType : uint32 {
/// Zero or more connections can hold read locks on a file simultaneously.
READ = 1;
/// At most one connection can hold a write lock on a file simultaneously.
/// When a write lock is held on a file, no other types of locks can be held
/// on that file.
WRITE = 2;
/// The region specifies a region to be unlocked.
UNLOCK = 3;
};
/// A range within a file associated with an advisory lock.
///
/// The range can extend beyond the end of the file but cannot extend beyond
/// the beginning of the file.
struct AdvisoryLockRange {
/// The location in the file from which [`offset`] is computed.
SeekOrigin origin;
/// The start of the byte range, expressed as an offset from [`origin`].
/// Cannot be negative if [`origin`] is [`SeekOrigin.START`].
int64 offset;
/// The length of the byte range in bytes.
///
/// If the length is zero, then the byte range exends until the end of the
/// file, regardless of how large the file becomes.
///
/// If the length is negative, the byte range includes the bytes `offset` +
/// `length` up to, and including, `offset` - 1, provided this range does
/// not extend beyond the beginning of the file.
int64 length;
};
table AdvisoryLockRequest {
/// The type of lock to be acquired.
///
/// If this field is absent, the [`AdvisoryLock`] method will fail
/// with ZX_ERR_INVALID_ARGS.
1: AdvisoryLockType type;
/// The byte range within the file to be locked. See [`AdvisoryLockRange`]
/// for semantics.
///
/// If this field is absent, the range defaults to the entire file.
2: AdvisoryLockRange range;
/// Whether the file should wait reply to the [`AdvisoryLock`]
/// method until the requested lock can be acquired.
///
/// If this field is absent, the file will not wait.
3: bool wait;
};