// 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.device.fs;

using fuchsia.io;

using zx;

/// Protocol through which a driver can export services to devfs.
@discoverable
protocol Exporter {
    /// Export `service_path` from `service_dir` to `devfs_path`. If `protocol_id`
    /// matches a known protocol, `service_path` will also be accessible through
    /// a class path.
    Export(resource struct {
        service_dir client_end:fuchsia.io.Directory;
        service_path string:fuchsia.io.MAX_PATH;
        devfs_path string:fuchsia.io.MAX_PATH;
        protocol_id uint32;
    }) -> (struct {}) error zx.status;
};
