diff options
author | Daichi Hirono | 2017-03-05 23:02:42 -0600 |
---|---|---|
committer | Daichi Hirono | 2017-03-13 19:09:29 -0500 |
commit | 57b780fbc3e2c2442c2f58dcb83818e786246b35 (patch) | |
tree | cf2426a800b3566d8f65b884831bf75e42cd47e1 /libappfuse/include/libappfuse/FuseBuffer.h | |
parent | cc9d94ce04dbb63a745001323213bb667ea2e00f (diff) | |
download | platform-system-core-57b780fbc3e2c2442c2f58dcb83818e786246b35.tar.gz platform-system-core-57b780fbc3e2c2442c2f58dcb83818e786246b35.tar.xz platform-system-core-57b780fbc3e2c2442c2f58dcb83818e786246b35.zip |
Add ReadOrAgain and WriteOrAgain methods to FuseMessage.
These methods return kAgain if operation cannot be done without blocking
the current thread.
The CL also introduecs new helper function SetupMessageSockets so that
FuseMessages are always transfered via sockets that save message
boundaries.
Bug: 34903085
Test: libappfuse_test
Change-Id: I34544372cc1b0c7bc9622e581ae16c018a123fa9
Diffstat (limited to 'libappfuse/include/libappfuse/FuseBuffer.h')
-rw-r--r-- | libappfuse/include/libappfuse/FuseBuffer.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/libappfuse/include/libappfuse/FuseBuffer.h b/libappfuse/include/libappfuse/FuseBuffer.h index 7abd2fa40..fbb05d633 100644 --- a/libappfuse/include/libappfuse/FuseBuffer.h +++ b/libappfuse/include/libappfuse/FuseBuffer.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #ifndef ANDROID_LIBAPPFUSE_FUSEBUFFER_H_ | 17 | #ifndef ANDROID_LIBAPPFUSE_FUSEBUFFER_H_ |
18 | #define ANDROID_LIBAPPFUSE_FUSEBUFFER_H_ | 18 | #define ANDROID_LIBAPPFUSE_FUSEBUFFER_H_ |
19 | 19 | ||
20 | #include <android-base/unique_fd.h> | ||
20 | #include <linux/fuse.h> | 21 | #include <linux/fuse.h> |
21 | 22 | ||
22 | namespace android { | 23 | namespace android { |
@@ -28,12 +29,24 @@ constexpr size_t kFuseMaxWrite = 256 * 1024; | |||
28 | constexpr size_t kFuseMaxRead = 128 * 1024; | 29 | constexpr size_t kFuseMaxRead = 128 * 1024; |
29 | constexpr int32_t kFuseSuccess = 0; | 30 | constexpr int32_t kFuseSuccess = 0; |
30 | 31 | ||
32 | // Setup sockets to transfer FuseMessage. | ||
33 | bool SetupMessageSockets(base::unique_fd (*sockets)[2]); | ||
34 | |||
35 | enum class ResultOrAgain { | ||
36 | kSuccess, | ||
37 | kFailure, | ||
38 | kAgain, | ||
39 | }; | ||
40 | |||
31 | template<typename T> | 41 | template<typename T> |
32 | class FuseMessage { | 42 | class FuseMessage { |
33 | public: | 43 | public: |
34 | bool Read(int fd); | 44 | bool Read(int fd); |
35 | bool Write(int fd) const; | 45 | bool Write(int fd) const; |
36 | private: | 46 | ResultOrAgain ReadOrAgain(int fd); |
47 | ResultOrAgain WriteOrAgain(int fd) const; | ||
48 | |||
49 | private: | ||
37 | bool CheckHeaderLength(const char* name) const; | 50 | bool CheckHeaderLength(const char* name) const; |
38 | }; | 51 | }; |
39 | 52 | ||
@@ -54,7 +67,7 @@ struct FuseRequest : public FuseMessage<FuseRequest> { | |||
54 | // for FUSE_READ | 67 | // for FUSE_READ |
55 | fuse_read_in read_in; | 68 | fuse_read_in read_in; |
56 | // for FUSE_LOOKUP | 69 | // for FUSE_LOOKUP |
57 | char lookup_name[0]; | 70 | char lookup_name[kFuseMaxWrite]; |
58 | }; | 71 | }; |
59 | void Reset(uint32_t data_length, uint32_t opcode, uint64_t unique); | 72 | void Reset(uint32_t data_length, uint32_t opcode, uint64_t unique); |
60 | }; | 73 | }; |