xref: /aosp_15_r20/frameworks/base/cmds/incidentd/src/FdBuffer.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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 #pragma once
17*d57664e9SAndroid Build Coastguard Worker 
18*d57664e9SAndroid Build Coastguard Worker #ifndef FD_BUFFER_H
19*d57664e9SAndroid Build Coastguard Worker #define FD_BUFFER_H
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
22*d57664e9SAndroid Build Coastguard Worker #include <android/util/EncodedBuffer.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/Errors.h>
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker namespace android {
26*d57664e9SAndroid Build Coastguard Worker namespace os {
27*d57664e9SAndroid Build Coastguard Worker namespace incidentd {
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker using namespace android::base;
30*d57664e9SAndroid Build Coastguard Worker using namespace android::util;
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker /**
33*d57664e9SAndroid Build Coastguard Worker  * Reads data from fd into a buffer, fd must be closed explicitly.
34*d57664e9SAndroid Build Coastguard Worker  */
35*d57664e9SAndroid Build Coastguard Worker class FdBuffer {
36*d57664e9SAndroid Build Coastguard Worker public:
37*d57664e9SAndroid Build Coastguard Worker     FdBuffer();
38*d57664e9SAndroid Build Coastguard Worker     FdBuffer(sp<EncodedBuffer> buffer, bool isBufferPooled = false);
39*d57664e9SAndroid Build Coastguard Worker     ~FdBuffer();
40*d57664e9SAndroid Build Coastguard Worker 
41*d57664e9SAndroid Build Coastguard Worker     /**
42*d57664e9SAndroid Build Coastguard Worker      * Read the data until the timeout is hit or we hit eof.
43*d57664e9SAndroid Build Coastguard Worker      * Returns NO_ERROR if there were no errors or if we timed out.
44*d57664e9SAndroid Build Coastguard Worker      * Will mark the file O_NONBLOCK.
45*d57664e9SAndroid Build Coastguard Worker      */
46*d57664e9SAndroid Build Coastguard Worker     status_t read(int fd, int64_t timeoutMs);
47*d57664e9SAndroid Build Coastguard Worker 
48*d57664e9SAndroid Build Coastguard Worker     /**
49*d57664e9SAndroid Build Coastguard Worker      * Read the data until we hit eof.
50*d57664e9SAndroid Build Coastguard Worker      * Returns NO_ERROR if there were no errors.
51*d57664e9SAndroid Build Coastguard Worker      */
52*d57664e9SAndroid Build Coastguard Worker     status_t readFully(int fd);
53*d57664e9SAndroid Build Coastguard Worker 
54*d57664e9SAndroid Build Coastguard Worker     /**
55*d57664e9SAndroid Build Coastguard Worker      * Read processed results by streaming data to a parsing process, e.g. incident helper.
56*d57664e9SAndroid Build Coastguard Worker      * The parsing process provides IO fds which are 'toFd' and 'fromFd'. The function
57*d57664e9SAndroid Build Coastguard Worker      * reads original data in 'fd' and writes to parsing process through 'toFd', then it reads
58*d57664e9SAndroid Build Coastguard Worker      * and stores the processed data from 'fromFd' in memory for later usage.
59*d57664e9SAndroid Build Coastguard Worker      * This function behaves in a streaming fashion in order to save memory usage.
60*d57664e9SAndroid Build Coastguard Worker      * Returns NO_ERROR if there were no errors or if we timed out.
61*d57664e9SAndroid Build Coastguard Worker      *
62*d57664e9SAndroid Build Coastguard Worker      * Poll will return POLLERR if fd is from sysfs, handle this edge case.
63*d57664e9SAndroid Build Coastguard Worker      */
64*d57664e9SAndroid Build Coastguard Worker     status_t readProcessedDataInStream(int fd, unique_fd toFd, unique_fd fromFd, int64_t timeoutMs,
65*d57664e9SAndroid Build Coastguard Worker                                        const bool isSysfs = false);
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker     /**
68*d57664e9SAndroid Build Coastguard Worker      * Write by hand into the buffer.
69*d57664e9SAndroid Build Coastguard Worker      */
70*d57664e9SAndroid Build Coastguard Worker     status_t write(uint8_t const* buf, size_t size);
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker     /**
73*d57664e9SAndroid Build Coastguard Worker      * Write all the data from a ProtoReader into our internal buffer.
74*d57664e9SAndroid Build Coastguard Worker      */
75*d57664e9SAndroid Build Coastguard Worker     status_t write(const sp<ProtoReader>& data);
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     /**
78*d57664e9SAndroid Build Coastguard Worker      * Write size bytes of data from a ProtoReader into our internal buffer.
79*d57664e9SAndroid Build Coastguard Worker      */
80*d57664e9SAndroid Build Coastguard Worker     status_t write(const sp<ProtoReader>& data, size_t size);
81*d57664e9SAndroid Build Coastguard Worker 
82*d57664e9SAndroid Build Coastguard Worker     /**
83*d57664e9SAndroid Build Coastguard Worker      * Whether we timed out.
84*d57664e9SAndroid Build Coastguard Worker      */
timedOut()85*d57664e9SAndroid Build Coastguard Worker     bool timedOut() const { return mTimedOut; }
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker     /**
88*d57664e9SAndroid Build Coastguard Worker      * If more than 4 MB is read, we truncate the data and return success.
89*d57664e9SAndroid Build Coastguard Worker      * Downstream tools must handle truncated incident reports as best as possible
90*d57664e9SAndroid Build Coastguard Worker      * anyway because they could be cut off for a lot of reasons and it's best
91*d57664e9SAndroid Build Coastguard Worker      * to get as much useful information out of the system as possible. If this
92*d57664e9SAndroid Build Coastguard Worker      * happens, truncated() will return true so it can be marked. If the data is
93*d57664e9SAndroid Build Coastguard Worker      * exactly 4 MB, truncated is still set. Sorry.
94*d57664e9SAndroid Build Coastguard Worker      */
truncated()95*d57664e9SAndroid Build Coastguard Worker     bool truncated() const { return mTruncated; }
96*d57664e9SAndroid Build Coastguard Worker 
97*d57664e9SAndroid Build Coastguard Worker     /**
98*d57664e9SAndroid Build Coastguard Worker      * How much data was read.
99*d57664e9SAndroid Build Coastguard Worker      */
100*d57664e9SAndroid Build Coastguard Worker     size_t size() const;
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker     /**
103*d57664e9SAndroid Build Coastguard Worker      * How long the read took in milliseconds.
104*d57664e9SAndroid Build Coastguard Worker      */
durationMs()105*d57664e9SAndroid Build Coastguard Worker     int64_t durationMs() const { return mFinishTime - mStartTime; }
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker     /**
108*d57664e9SAndroid Build Coastguard Worker      * Get the EncodedBuffer inside.
109*d57664e9SAndroid Build Coastguard Worker      */
110*d57664e9SAndroid Build Coastguard Worker     sp<EncodedBuffer> data() const;
111*d57664e9SAndroid Build Coastguard Worker 
112*d57664e9SAndroid Build Coastguard Worker private:
113*d57664e9SAndroid Build Coastguard Worker     sp<EncodedBuffer> mBuffer;
114*d57664e9SAndroid Build Coastguard Worker     int64_t mStartTime;
115*d57664e9SAndroid Build Coastguard Worker     int64_t mFinishTime;
116*d57664e9SAndroid Build Coastguard Worker     bool mTimedOut;
117*d57664e9SAndroid Build Coastguard Worker     bool mTruncated;
118*d57664e9SAndroid Build Coastguard Worker     bool mIsBufferPooled;
119*d57664e9SAndroid Build Coastguard Worker };
120*d57664e9SAndroid Build Coastguard Worker 
121*d57664e9SAndroid Build Coastguard Worker }  // namespace incidentd
122*d57664e9SAndroid Build Coastguard Worker }  // namespace os
123*d57664e9SAndroid Build Coastguard Worker }  // namespace android
124*d57664e9SAndroid Build Coastguard Worker 
125*d57664e9SAndroid Build Coastguard Worker #endif  // FD_BUFFER_H
126