blob: 0779ceaa59115996af6344d0dab1802d341a24ce [file] [log] [blame]
// Copyright 2017 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.
#ifndef FS_SERVICE_H_
#define FS_SERVICE_H_
#include <fbl/function.h>
#include <fbl/macros.h>
#include <lib/zx/channel.h>
#include "vnode.h"
namespace fs {
// A node which binds a channel to a service implementation when opened.
//
// This class is thread-safe.
class Service : public Vnode {
public:
// Handler called to bind the provided channel to an implementation
// of the service.
using Connector = fbl::Function<zx_status_t(zx::channel channel)>;
// Creates a service with the specified connector.
//
// If the |connector| is null, then incoming connection requests will be dropped.
Service(Connector connector);
// Destroys the services and releases its connector.
~Service() override;
// |Vnode| implementation:
zx_status_t ValidateFlags(uint32_t flags) final;
zx_status_t Getattr(vnattr_t* a) final;
zx_status_t Serve(fs::Vfs* vfs, zx::channel channel, uint32_t flags) final;
bool IsDirectory() const final;
zx_status_t GetNodeInfo(uint32_t flags, fuchsia_io_NodeInfo* info) final;
private:
Connector connector_;
DISALLOW_COPY_ASSIGN_AND_MOVE(Service);
};
} // namespace fs
#endif // FS_SERVICE_H_