| // Copyright 2019 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. |
| |
| #pragma once |
| |
| #include <zircon/types.h> |
| |
| #ifdef __Fuchsia__ |
| #include <lib/zx/channel.h> |
| #include <fs/client.h> |
| #endif // __Fuchsia__ |
| |
| #include <utility> |
| |
| namespace fs { |
| |
| #ifdef __Fuchsia__ |
| |
| // MountChannel functions exactly the same as a channel, except that it |
| // intentionally destructs by sending a clean "shutdown" signal to the |
| // underlying filesystem. Up until the point that a remote handle is |
| // attached to a vnode, this wrapper guarantees not only that the |
| // underlying handle gets closed on error, but also that the sub-filesystem |
| // is released (which cleans up the underlying connection to the block |
| // device). |
| class MountChannel { |
| public: |
| constexpr MountChannel() = default; |
| explicit MountChannel(zx_handle_t handle) |
| : channel_(handle) {} |
| explicit MountChannel(zx::channel channel) |
| : channel_(std::move(channel)) {} |
| MountChannel(MountChannel&& other) |
| : channel_(std::move(other.channel_)) {} |
| |
| zx::channel TakeChannel() { return std::move(channel_); } |
| |
| ~MountChannel() { |
| if (channel_.is_valid()) { |
| vfs_unmount_handle(channel_.release(), 0); |
| } |
| } |
| |
| private: |
| zx::channel channel_; |
| }; |
| |
| #endif // __Fuchsia__ |
| |
| } // namespace fs |