| // Copyright 2019 The Chromium OS 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 SMBFS_REQUEST_H_ |
| #define SMBFS_REQUEST_H_ |
| |
| #include <fuse_lowlevel.h> |
| |
| #include <memory> |
| |
| #include <base/macros.h> |
| #include <base/strings/string_piece.h> |
| |
| namespace smbfs { |
| namespace internal { |
| |
| // Base class for maintaining state about a fuse request, and ensuring requests |
| // are responded to correctly. |
| class BaseRequest { |
| public: |
| bool IsInterrupted() const; |
| void ReplyError(int error); |
| |
| protected: |
| explicit BaseRequest(fuse_req_t req); |
| virtual ~BaseRequest(); |
| |
| const fuse_req_t req_; |
| bool replied_ = false; |
| |
| private: |
| DISALLOW_IMPLICIT_CONSTRUCTORS(BaseRequest); |
| }; |
| |
| } // namespace internal |
| |
| // State of fuse requests that can be responded to with a simple 'success' |
| // response. |
| class SimpleRequest : public internal::BaseRequest { |
| public: |
| explicit SimpleRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyOk(); |
| }; |
| |
| // State of fuse requests that can be responded to with a statfs response. |
| class StatFsRequest : public internal::BaseRequest { |
| public: |
| explicit StatFsRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyStatFs(const struct statvfs& st); |
| }; |
| |
| // State of fuse requests that can be responded to with an attributes response. |
| class AttrRequest : public internal::BaseRequest { |
| public: |
| explicit AttrRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyAttr(const struct stat& attr, double attr_timeout); |
| }; |
| |
| // State of fuse requests that can be responded to with an entry response. |
| class EntryRequest : public internal::BaseRequest { |
| public: |
| explicit EntryRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyEntry(const fuse_entry_param& entry); |
| }; |
| |
| // State of fuse requests that can be responded to with an open file handle. |
| class OpenRequest : public internal::BaseRequest { |
| public: |
| explicit OpenRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyOpen(uint64_t file_handle); |
| }; |
| |
| // State of fuse requests that can be responded to with a new entry and open |
| // file handle. |
| class CreateRequest : public internal::BaseRequest { |
| public: |
| explicit CreateRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyCreate(const fuse_entry_param& entry, uint64_t file_handle); |
| }; |
| |
| // State of fuse requests that can be responded to with a buffer of data |
| // (eg. read()). |
| class BufRequest : public internal::BaseRequest { |
| public: |
| explicit BufRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyBuf(const char* buf, size_t size); |
| }; |
| |
| // State of fuse requests that can be responded to with a number of bytes |
| // written. |
| class WriteRequest : public internal::BaseRequest { |
| public: |
| explicit WriteRequest(fuse_req_t req) : internal::BaseRequest(req) {} |
| void ReplyWrite(size_t written); |
| }; |
| |
| // State of fuse requests that can be responded to with a set of directory |
| // entries. |
| class DirentryRequest : public internal::BaseRequest { |
| public: |
| DirentryRequest(fuse_req_t req, size_t size); |
| |
| // Add a directory entry to the response. |name| is the entry name, must not |
| // be "." or "..", must be terminated with '\0', and must not contain '/'. |
| // |inode| is the inode number for the entry. |mode| is the file type and must |
| // be either S_IFREG or S_IFDIR. |next_offset| is the offset for the _next_ |
| // directory entry (not this one). |
| bool AddEntry(base::StringPiece name, |
| fuse_ino_t inode, |
| mode_t mode, |
| off_t next_offset); |
| void ReplyDone(); |
| |
| private: |
| const size_t size_; |
| std::unique_ptr<char[]> buf_; |
| size_t off_ = 0; |
| }; |
| |
| } // namespace smbfs |
| |
| #endif // SMBFS_REQUEST_H_ |