1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker *
4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker *
8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker *
10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker */
16*d57664e9SAndroid Build Coastguard Worker #define DEBUG false
17*d57664e9SAndroid Build Coastguard Worker #include "Log.h"
18*d57664e9SAndroid Build Coastguard Worker
19*d57664e9SAndroid Build Coastguard Worker #include "FdBuffer.h"
20*d57664e9SAndroid Build Coastguard Worker #include "incidentd_util.h"
21*d57664e9SAndroid Build Coastguard Worker
22*d57664e9SAndroid Build Coastguard Worker #include <log/log.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/SystemClock.h>
24*d57664e9SAndroid Build Coastguard Worker
25*d57664e9SAndroid Build Coastguard Worker #include <fcntl.h>
26*d57664e9SAndroid Build Coastguard Worker #include <poll.h>
27*d57664e9SAndroid Build Coastguard Worker #include <unistd.h>
28*d57664e9SAndroid Build Coastguard Worker #include <wait.h>
29*d57664e9SAndroid Build Coastguard Worker
30*d57664e9SAndroid Build Coastguard Worker namespace android {
31*d57664e9SAndroid Build Coastguard Worker namespace os {
32*d57664e9SAndroid Build Coastguard Worker namespace incidentd {
33*d57664e9SAndroid Build Coastguard Worker
34*d57664e9SAndroid Build Coastguard Worker const ssize_t BUFFER_SIZE = 16 * 1024; // 16 KB
35*d57664e9SAndroid Build Coastguard Worker const ssize_t MAX_BUFFER_SIZE = 96 * 1024 * 1024; // 96 MB
36*d57664e9SAndroid Build Coastguard Worker
FdBuffer()37*d57664e9SAndroid Build Coastguard Worker FdBuffer::FdBuffer(): FdBuffer(get_buffer_from_pool(), /* isBufferPooled= */ true) {
38*d57664e9SAndroid Build Coastguard Worker }
39*d57664e9SAndroid Build Coastguard Worker
FdBuffer(sp<EncodedBuffer> buffer,bool isBufferPooled)40*d57664e9SAndroid Build Coastguard Worker FdBuffer::FdBuffer(sp<EncodedBuffer> buffer, bool isBufferPooled)
41*d57664e9SAndroid Build Coastguard Worker :mBuffer(buffer),
42*d57664e9SAndroid Build Coastguard Worker mStartTime(-1),
43*d57664e9SAndroid Build Coastguard Worker mFinishTime(-1),
44*d57664e9SAndroid Build Coastguard Worker mTimedOut(false),
45*d57664e9SAndroid Build Coastguard Worker mTruncated(false),
46*d57664e9SAndroid Build Coastguard Worker mIsBufferPooled(isBufferPooled) {
47*d57664e9SAndroid Build Coastguard Worker }
48*d57664e9SAndroid Build Coastguard Worker
~FdBuffer()49*d57664e9SAndroid Build Coastguard Worker FdBuffer::~FdBuffer() {
50*d57664e9SAndroid Build Coastguard Worker if (mIsBufferPooled) {
51*d57664e9SAndroid Build Coastguard Worker return_buffer_to_pool(mBuffer);
52*d57664e9SAndroid Build Coastguard Worker }
53*d57664e9SAndroid Build Coastguard Worker }
54*d57664e9SAndroid Build Coastguard Worker
read(int fd,int64_t timeout)55*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::read(int fd, int64_t timeout) {
56*d57664e9SAndroid Build Coastguard Worker struct pollfd pfds = {.fd = fd, .events = POLLIN};
57*d57664e9SAndroid Build Coastguard Worker mStartTime = uptimeMillis();
58*d57664e9SAndroid Build Coastguard Worker
59*d57664e9SAndroid Build Coastguard Worker fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
60*d57664e9SAndroid Build Coastguard Worker
61*d57664e9SAndroid Build Coastguard Worker while (true) {
62*d57664e9SAndroid Build Coastguard Worker if (mBuffer->size() >= MAX_BUFFER_SIZE) {
63*d57664e9SAndroid Build Coastguard Worker mTruncated = true;
64*d57664e9SAndroid Build Coastguard Worker VLOG("Truncating data");
65*d57664e9SAndroid Build Coastguard Worker break;
66*d57664e9SAndroid Build Coastguard Worker }
67*d57664e9SAndroid Build Coastguard Worker if (mBuffer->writeBuffer() == NULL) {
68*d57664e9SAndroid Build Coastguard Worker VLOG("No memory");
69*d57664e9SAndroid Build Coastguard Worker return NO_MEMORY;
70*d57664e9SAndroid Build Coastguard Worker }
71*d57664e9SAndroid Build Coastguard Worker
72*d57664e9SAndroid Build Coastguard Worker int64_t remainingTime = (mStartTime + timeout) - uptimeMillis();
73*d57664e9SAndroid Build Coastguard Worker if (remainingTime <= 0) {
74*d57664e9SAndroid Build Coastguard Worker VLOG("timed out due to long read");
75*d57664e9SAndroid Build Coastguard Worker mTimedOut = true;
76*d57664e9SAndroid Build Coastguard Worker break;
77*d57664e9SAndroid Build Coastguard Worker }
78*d57664e9SAndroid Build Coastguard Worker
79*d57664e9SAndroid Build Coastguard Worker int count = TEMP_FAILURE_RETRY(poll(&pfds, 1, remainingTime));
80*d57664e9SAndroid Build Coastguard Worker if (count == 0) {
81*d57664e9SAndroid Build Coastguard Worker VLOG("timed out due to block calling poll");
82*d57664e9SAndroid Build Coastguard Worker mTimedOut = true;
83*d57664e9SAndroid Build Coastguard Worker break;
84*d57664e9SAndroid Build Coastguard Worker } else if (count < 0) {
85*d57664e9SAndroid Build Coastguard Worker VLOG("poll failed: %s", strerror(errno));
86*d57664e9SAndroid Build Coastguard Worker return -errno;
87*d57664e9SAndroid Build Coastguard Worker } else {
88*d57664e9SAndroid Build Coastguard Worker if ((pfds.revents & POLLERR) != 0) {
89*d57664e9SAndroid Build Coastguard Worker VLOG("return event has error %s", strerror(errno));
90*d57664e9SAndroid Build Coastguard Worker return errno != 0 ? -errno : UNKNOWN_ERROR;
91*d57664e9SAndroid Build Coastguard Worker } else {
92*d57664e9SAndroid Build Coastguard Worker ssize_t amt = TEMP_FAILURE_RETRY(
93*d57664e9SAndroid Build Coastguard Worker ::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite()));
94*d57664e9SAndroid Build Coastguard Worker if (amt < 0) {
95*d57664e9SAndroid Build Coastguard Worker if (errno == EAGAIN || errno == EWOULDBLOCK) {
96*d57664e9SAndroid Build Coastguard Worker continue;
97*d57664e9SAndroid Build Coastguard Worker } else {
98*d57664e9SAndroid Build Coastguard Worker VLOG("Fail to read %d: %s", fd, strerror(errno));
99*d57664e9SAndroid Build Coastguard Worker return -errno;
100*d57664e9SAndroid Build Coastguard Worker }
101*d57664e9SAndroid Build Coastguard Worker } else if (amt == 0) {
102*d57664e9SAndroid Build Coastguard Worker VLOG("Reached EOF of fd=%d", fd);
103*d57664e9SAndroid Build Coastguard Worker break;
104*d57664e9SAndroid Build Coastguard Worker }
105*d57664e9SAndroid Build Coastguard Worker mBuffer->wp()->move(amt);
106*d57664e9SAndroid Build Coastguard Worker }
107*d57664e9SAndroid Build Coastguard Worker }
108*d57664e9SAndroid Build Coastguard Worker }
109*d57664e9SAndroid Build Coastguard Worker mFinishTime = uptimeMillis();
110*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
111*d57664e9SAndroid Build Coastguard Worker }
112*d57664e9SAndroid Build Coastguard Worker
readFully(int fd)113*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::readFully(int fd) {
114*d57664e9SAndroid Build Coastguard Worker mStartTime = uptimeMillis();
115*d57664e9SAndroid Build Coastguard Worker
116*d57664e9SAndroid Build Coastguard Worker while (true) {
117*d57664e9SAndroid Build Coastguard Worker if (mBuffer->size() >= MAX_BUFFER_SIZE) {
118*d57664e9SAndroid Build Coastguard Worker // Don't let it get too big.
119*d57664e9SAndroid Build Coastguard Worker mTruncated = true;
120*d57664e9SAndroid Build Coastguard Worker VLOG("Truncating data");
121*d57664e9SAndroid Build Coastguard Worker break;
122*d57664e9SAndroid Build Coastguard Worker }
123*d57664e9SAndroid Build Coastguard Worker if (mBuffer->writeBuffer() == NULL) {
124*d57664e9SAndroid Build Coastguard Worker VLOG("No memory");
125*d57664e9SAndroid Build Coastguard Worker return NO_MEMORY;
126*d57664e9SAndroid Build Coastguard Worker }
127*d57664e9SAndroid Build Coastguard Worker
128*d57664e9SAndroid Build Coastguard Worker ssize_t amt =
129*d57664e9SAndroid Build Coastguard Worker TEMP_FAILURE_RETRY(::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite()));
130*d57664e9SAndroid Build Coastguard Worker if (amt < 0) {
131*d57664e9SAndroid Build Coastguard Worker VLOG("Fail to read %d: %s", fd, strerror(errno));
132*d57664e9SAndroid Build Coastguard Worker return -errno;
133*d57664e9SAndroid Build Coastguard Worker } else if (amt == 0) {
134*d57664e9SAndroid Build Coastguard Worker VLOG("Done reading %zu bytes", mBuffer->size());
135*d57664e9SAndroid Build Coastguard Worker // We're done.
136*d57664e9SAndroid Build Coastguard Worker break;
137*d57664e9SAndroid Build Coastguard Worker }
138*d57664e9SAndroid Build Coastguard Worker mBuffer->wp()->move(amt);
139*d57664e9SAndroid Build Coastguard Worker }
140*d57664e9SAndroid Build Coastguard Worker
141*d57664e9SAndroid Build Coastguard Worker mFinishTime = uptimeMillis();
142*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
143*d57664e9SAndroid Build Coastguard Worker }
144*d57664e9SAndroid Build Coastguard Worker
readProcessedDataInStream(int fd,unique_fd toFd,unique_fd fromFd,int64_t timeoutMs,const bool isSysfs)145*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd fromFd,
146*d57664e9SAndroid Build Coastguard Worker int64_t timeoutMs, const bool isSysfs) {
147*d57664e9SAndroid Build Coastguard Worker struct pollfd pfds[] = {
148*d57664e9SAndroid Build Coastguard Worker {.fd = fd, .events = POLLIN},
149*d57664e9SAndroid Build Coastguard Worker {.fd = toFd.get(), .events = POLLOUT},
150*d57664e9SAndroid Build Coastguard Worker {.fd = fromFd.get(), .events = POLLIN},
151*d57664e9SAndroid Build Coastguard Worker };
152*d57664e9SAndroid Build Coastguard Worker
153*d57664e9SAndroid Build Coastguard Worker mStartTime = uptimeMillis();
154*d57664e9SAndroid Build Coastguard Worker
155*d57664e9SAndroid Build Coastguard Worker // mark all fds non blocking
156*d57664e9SAndroid Build Coastguard Worker fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
157*d57664e9SAndroid Build Coastguard Worker fcntl(toFd.get(), F_SETFL, fcntl(toFd.get(), F_GETFL, 0) | O_NONBLOCK);
158*d57664e9SAndroid Build Coastguard Worker fcntl(fromFd.get(), F_SETFL, fcntl(fromFd.get(), F_GETFL, 0) | O_NONBLOCK);
159*d57664e9SAndroid Build Coastguard Worker
160*d57664e9SAndroid Build Coastguard Worker // A circular buffer holds data read from fd and writes to parsing process
161*d57664e9SAndroid Build Coastguard Worker uint8_t cirBuf[BUFFER_SIZE];
162*d57664e9SAndroid Build Coastguard Worker size_t cirSize = 0;
163*d57664e9SAndroid Build Coastguard Worker int rpos = 0, wpos = 0;
164*d57664e9SAndroid Build Coastguard Worker
165*d57664e9SAndroid Build Coastguard Worker // This is the buffer used to store processed data
166*d57664e9SAndroid Build Coastguard Worker while (true) {
167*d57664e9SAndroid Build Coastguard Worker if (mBuffer->size() >= MAX_BUFFER_SIZE) {
168*d57664e9SAndroid Build Coastguard Worker VLOG("Truncating data");
169*d57664e9SAndroid Build Coastguard Worker mTruncated = true;
170*d57664e9SAndroid Build Coastguard Worker break;
171*d57664e9SAndroid Build Coastguard Worker }
172*d57664e9SAndroid Build Coastguard Worker if (mBuffer->writeBuffer() == NULL) {
173*d57664e9SAndroid Build Coastguard Worker VLOG("No memory");
174*d57664e9SAndroid Build Coastguard Worker return NO_MEMORY;
175*d57664e9SAndroid Build Coastguard Worker }
176*d57664e9SAndroid Build Coastguard Worker
177*d57664e9SAndroid Build Coastguard Worker int64_t remainingTime = (mStartTime + timeoutMs) - uptimeMillis();
178*d57664e9SAndroid Build Coastguard Worker if (remainingTime <= 0) {
179*d57664e9SAndroid Build Coastguard Worker VLOG("timed out due to long read");
180*d57664e9SAndroid Build Coastguard Worker mTimedOut = true;
181*d57664e9SAndroid Build Coastguard Worker break;
182*d57664e9SAndroid Build Coastguard Worker }
183*d57664e9SAndroid Build Coastguard Worker
184*d57664e9SAndroid Build Coastguard Worker // wait for any pfds to be ready to perform IO
185*d57664e9SAndroid Build Coastguard Worker int count = TEMP_FAILURE_RETRY(poll(pfds, 3, remainingTime));
186*d57664e9SAndroid Build Coastguard Worker if (count == 0) {
187*d57664e9SAndroid Build Coastguard Worker VLOG("timed out due to block calling poll");
188*d57664e9SAndroid Build Coastguard Worker mTimedOut = true;
189*d57664e9SAndroid Build Coastguard Worker break;
190*d57664e9SAndroid Build Coastguard Worker } else if (count < 0) {
191*d57664e9SAndroid Build Coastguard Worker VLOG("Fail to poll: %s", strerror(errno));
192*d57664e9SAndroid Build Coastguard Worker return -errno;
193*d57664e9SAndroid Build Coastguard Worker }
194*d57664e9SAndroid Build Coastguard Worker
195*d57664e9SAndroid Build Coastguard Worker // make sure no errors occur on any fds
196*d57664e9SAndroid Build Coastguard Worker for (int i = 0; i < 3; ++i) {
197*d57664e9SAndroid Build Coastguard Worker if ((pfds[i].revents & POLLERR) != 0) {
198*d57664e9SAndroid Build Coastguard Worker if (i == 0 && isSysfs) {
199*d57664e9SAndroid Build Coastguard Worker VLOG("fd %d is sysfs, ignore its POLLERR return value", fd);
200*d57664e9SAndroid Build Coastguard Worker continue;
201*d57664e9SAndroid Build Coastguard Worker }
202*d57664e9SAndroid Build Coastguard Worker VLOG("fd[%d]=%d returns error events: %s", i, fd, strerror(errno));
203*d57664e9SAndroid Build Coastguard Worker return errno != 0 ? -errno : UNKNOWN_ERROR;
204*d57664e9SAndroid Build Coastguard Worker }
205*d57664e9SAndroid Build Coastguard Worker }
206*d57664e9SAndroid Build Coastguard Worker
207*d57664e9SAndroid Build Coastguard Worker // read from fd
208*d57664e9SAndroid Build Coastguard Worker if (cirSize != BUFFER_SIZE && pfds[0].fd != -1) {
209*d57664e9SAndroid Build Coastguard Worker ssize_t amt;
210*d57664e9SAndroid Build Coastguard Worker if (rpos >= wpos) {
211*d57664e9SAndroid Build Coastguard Worker amt = TEMP_FAILURE_RETRY(::read(fd, cirBuf + rpos, BUFFER_SIZE - rpos));
212*d57664e9SAndroid Build Coastguard Worker } else {
213*d57664e9SAndroid Build Coastguard Worker amt = TEMP_FAILURE_RETRY(::read(fd, cirBuf + rpos, wpos - rpos));
214*d57664e9SAndroid Build Coastguard Worker }
215*d57664e9SAndroid Build Coastguard Worker if (amt < 0) {
216*d57664e9SAndroid Build Coastguard Worker if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
217*d57664e9SAndroid Build Coastguard Worker VLOG("Fail to read fd %d: %s", fd, strerror(errno));
218*d57664e9SAndroid Build Coastguard Worker return -errno;
219*d57664e9SAndroid Build Coastguard Worker } // otherwise just continue
220*d57664e9SAndroid Build Coastguard Worker } else if (amt == 0) {
221*d57664e9SAndroid Build Coastguard Worker VLOG("Reached EOF of input file %d", fd);
222*d57664e9SAndroid Build Coastguard Worker pfds[0].fd = -1; // reach EOF so don't have to poll pfds[0].
223*d57664e9SAndroid Build Coastguard Worker } else {
224*d57664e9SAndroid Build Coastguard Worker rpos += amt;
225*d57664e9SAndroid Build Coastguard Worker cirSize += amt;
226*d57664e9SAndroid Build Coastguard Worker }
227*d57664e9SAndroid Build Coastguard Worker }
228*d57664e9SAndroid Build Coastguard Worker
229*d57664e9SAndroid Build Coastguard Worker // write to parsing process
230*d57664e9SAndroid Build Coastguard Worker if (cirSize > 0 && pfds[1].fd != -1) {
231*d57664e9SAndroid Build Coastguard Worker ssize_t amt;
232*d57664e9SAndroid Build Coastguard Worker if (rpos > wpos) {
233*d57664e9SAndroid Build Coastguard Worker amt = TEMP_FAILURE_RETRY(::write(toFd.get(), cirBuf + wpos, rpos - wpos));
234*d57664e9SAndroid Build Coastguard Worker } else {
235*d57664e9SAndroid Build Coastguard Worker amt = TEMP_FAILURE_RETRY(::write(toFd.get(), cirBuf + wpos, BUFFER_SIZE - wpos));
236*d57664e9SAndroid Build Coastguard Worker }
237*d57664e9SAndroid Build Coastguard Worker if (amt < 0) {
238*d57664e9SAndroid Build Coastguard Worker if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
239*d57664e9SAndroid Build Coastguard Worker VLOG("Fail to write toFd %d: %s", toFd.get(), strerror(errno));
240*d57664e9SAndroid Build Coastguard Worker return -errno;
241*d57664e9SAndroid Build Coastguard Worker } // otherwise just continue
242*d57664e9SAndroid Build Coastguard Worker } else {
243*d57664e9SAndroid Build Coastguard Worker wpos += amt;
244*d57664e9SAndroid Build Coastguard Worker cirSize -= amt;
245*d57664e9SAndroid Build Coastguard Worker }
246*d57664e9SAndroid Build Coastguard Worker }
247*d57664e9SAndroid Build Coastguard Worker
248*d57664e9SAndroid Build Coastguard Worker // if buffer is empty and fd is closed, close write fd.
249*d57664e9SAndroid Build Coastguard Worker if (cirSize == 0 && pfds[0].fd == -1 && pfds[1].fd != -1) {
250*d57664e9SAndroid Build Coastguard Worker VLOG("Close write pipe %d", toFd.get());
251*d57664e9SAndroid Build Coastguard Worker toFd.reset();
252*d57664e9SAndroid Build Coastguard Worker pfds[1].fd = -1;
253*d57664e9SAndroid Build Coastguard Worker }
254*d57664e9SAndroid Build Coastguard Worker
255*d57664e9SAndroid Build Coastguard Worker // circular buffer, reset rpos and wpos
256*d57664e9SAndroid Build Coastguard Worker if (rpos >= BUFFER_SIZE) {
257*d57664e9SAndroid Build Coastguard Worker rpos = 0;
258*d57664e9SAndroid Build Coastguard Worker }
259*d57664e9SAndroid Build Coastguard Worker if (wpos >= BUFFER_SIZE) {
260*d57664e9SAndroid Build Coastguard Worker wpos = 0;
261*d57664e9SAndroid Build Coastguard Worker }
262*d57664e9SAndroid Build Coastguard Worker
263*d57664e9SAndroid Build Coastguard Worker // read from parsing process
264*d57664e9SAndroid Build Coastguard Worker ssize_t amt = TEMP_FAILURE_RETRY(
265*d57664e9SAndroid Build Coastguard Worker ::read(fromFd.get(), mBuffer->writeBuffer(), mBuffer->currentToWrite()));
266*d57664e9SAndroid Build Coastguard Worker if (amt < 0) {
267*d57664e9SAndroid Build Coastguard Worker if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
268*d57664e9SAndroid Build Coastguard Worker VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno));
269*d57664e9SAndroid Build Coastguard Worker return -errno;
270*d57664e9SAndroid Build Coastguard Worker } // otherwise just continue
271*d57664e9SAndroid Build Coastguard Worker } else if (amt == 0) {
272*d57664e9SAndroid Build Coastguard Worker VLOG("Reached EOF of fromFd %d", fromFd.get());
273*d57664e9SAndroid Build Coastguard Worker break;
274*d57664e9SAndroid Build Coastguard Worker } else {
275*d57664e9SAndroid Build Coastguard Worker mBuffer->wp()->move(amt);
276*d57664e9SAndroid Build Coastguard Worker }
277*d57664e9SAndroid Build Coastguard Worker }
278*d57664e9SAndroid Build Coastguard Worker
279*d57664e9SAndroid Build Coastguard Worker mFinishTime = uptimeMillis();
280*d57664e9SAndroid Build Coastguard Worker return NO_ERROR;
281*d57664e9SAndroid Build Coastguard Worker }
282*d57664e9SAndroid Build Coastguard Worker
write(uint8_t const * buf,size_t size)283*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::write(uint8_t const* buf, size_t size) {
284*d57664e9SAndroid Build Coastguard Worker return mBuffer->writeRaw(buf, size);
285*d57664e9SAndroid Build Coastguard Worker }
286*d57664e9SAndroid Build Coastguard Worker
write(const sp<ProtoReader> & reader)287*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::write(const sp<ProtoReader>& reader) {
288*d57664e9SAndroid Build Coastguard Worker return mBuffer->writeRaw(reader);
289*d57664e9SAndroid Build Coastguard Worker }
290*d57664e9SAndroid Build Coastguard Worker
write(const sp<ProtoReader> & reader,size_t size)291*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::write(const sp<ProtoReader>& reader, size_t size) {
292*d57664e9SAndroid Build Coastguard Worker return mBuffer->writeRaw(reader, size);
293*d57664e9SAndroid Build Coastguard Worker }
294*d57664e9SAndroid Build Coastguard Worker
size() const295*d57664e9SAndroid Build Coastguard Worker size_t FdBuffer::size() const {
296*d57664e9SAndroid Build Coastguard Worker return mBuffer->size();
297*d57664e9SAndroid Build Coastguard Worker }
298*d57664e9SAndroid Build Coastguard Worker
data() const299*d57664e9SAndroid Build Coastguard Worker sp<EncodedBuffer> FdBuffer::data() const {
300*d57664e9SAndroid Build Coastguard Worker return mBuffer;
301*d57664e9SAndroid Build Coastguard Worker }
302*d57664e9SAndroid Build Coastguard Worker
303*d57664e9SAndroid Build Coastguard Worker } // namespace incidentd
304*d57664e9SAndroid Build Coastguard Worker } // namespace os
305*d57664e9SAndroid Build Coastguard Worker } // namespace android
306