1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <string>
18 #include <thread>
19 #include <vector>
20 
21 #include "common/libs/fs/shared_fd.h"
22 
23 namespace cuttlefish {
24 
25 /**
26  * Reads from fd until it is closed or errors, storing all data in buf.
27  *
28  * On a successful read, returns the number of bytes read.
29  *
30  * If a read error is encountered, returns -1. buf will contain any data read
31  * up until that point and errno will be set.
32  */
33 ssize_t ReadAll(SharedFD fd, std::string* buf);
34 
35 /**
36  * Reads from fd until reading buf->size() bytes or errors.
37  *
38  * On a successful read, returns buf->size().
39  *
40  * If a read error is encountered, returns -1. buf will contain any data read
41  * up until that point and errno will be set.
42  */
43 ssize_t ReadExact(SharedFD fd, std::string* buf);
44 
45 /**
46  * Reads from fd until reading buf->size() bytes or errors.
47  *
48  * On a successful read, returns buf->size().
49  *
50  * If a read error is encountered, returns -1. buf will contain any data read
51  * up until that point and errno will be set.
52  */
53 ssize_t ReadExact(SharedFD fd, std::vector<char>* buf);
54 
55 /**
56  * Reads from fd until reading `size` bytes or errors.
57  *
58  * On a successful read, returns buf->size().
59  *
60  * If a read error is encountered, returns -1. buf will contain any data read
61  * up until that point and errno will be set.
62  */
63 ssize_t ReadExact(SharedFD fd, char* buf, size_t size);
64 
65 /*
66  * Reads from fd until reading `sizeof(T)` bytes or errors.
67  *
68  * On a successful read, returns `sizeof(T)`.
69  *
70  * If a read error is encountered, returns -1. buf will contain any data read
71  * up until that point and errno will be set.
72  */
73 template<typename T>
ReadExactBinary(SharedFD fd,T * binary_data)74 ssize_t ReadExactBinary(SharedFD fd, T* binary_data) {
75   return ReadExact(fd, (char*) binary_data, sizeof(*binary_data));
76 }
77 
78 /**
79  * Writes to fd until writing all bytes in buf.
80  *
81  * On a successful write, returns buf.size().
82  *
83  * If a write error is encountered, returns -1. Some data may have already been
84  * written to fd at that point.
85  */
86 ssize_t WriteAll(SharedFD fd, const std::string& buf);
87 
88 /**
89  * Writes to fd until writing all bytes in buf.
90  *
91  * On a successful write, returns buf.size().
92  *
93  * If a write error is encountered, returns -1. Some data may have already been
94  * written to fd at that point.
95  */
96 ssize_t WriteAll(SharedFD fd, const std::vector<char>& buf);
97 
98 /**
99  * Writes to fd until `size` bytes are written from `buf`.
100  *
101  * On a successful write, returns `size`.
102  *
103  * If a write error is encountered, returns -1. Some data may have already been
104  * written to fd at that point.
105  */
106 ssize_t WriteAll(SharedFD fd, const char* buf, size_t size);
107 
108 /**
109  * Writes to fd until `sizeof(T)` bytes are written from binary_data.
110  *
111  * On a successful write, returns `sizeof(T)`.
112  *
113  * If a write error is encountered, returns -1. Some data may have already been
114  * written to fd at that point.
115  */
116 template<typename T>
WriteAllBinary(SharedFD fd,const T * binary_data)117 ssize_t WriteAllBinary(SharedFD fd, const T* binary_data) {
118   return WriteAll(fd, (const char*) binary_data, sizeof(*binary_data));
119 }
120 
121 } // namespace cuttlefish
122