// Copyright 2018 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.pkg;
using zx;

/// Administrates the critical system blobs on the system.
[Discoverable]
interface SystemBlobAdmin {
    /// Allows blobs from old system versions to be garbage collected. The current system blobs
    /// will not be collected.
    ReleaseRetainedBlobs();

    /// Adds the blobs listed in the |retention_index| blob to the retention list. This should be
    /// called during a system upgrade with the new system blob in order to make sure they are not
    /// garbage collected before the upgrade completes.
    ///
    /// Arguments:
    /// * |retention_index| is the blob id for a list of blobs to retain.
    ///
    /// Return Values:
    /// * |ZX_OK| if the blobs were successfully retained.
    /// * |ZX_ERR_IO| if there is some other unspecified error during I/O.
    /// * |ZX_ERR_NOT_FOUND| if the |retention_index| could not be found on the local system.
    RetainBlobs(BlobId retention_index) -> (zx.status status);
};
