blob: 84998892e33c88d76cffc06173e107e56c726775 [file] [log] [blame]
Yi Jin99c248f2017-08-25 18:11:58 -07001/*
2 * Copyright (C) 2017 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 */
Yi Jinb592e3b2018-02-01 15:17:04 -080016#pragma once
Yi Jin99c248f2017-08-25 18:11:58 -070017
Yi Jinb592e3b2018-02-01 15:17:04 -080018#ifndef INCIDENTD_UTIL_H
19#define INCIDENTD_UTIL_H
Yi Jin99c248f2017-08-25 18:11:58 -070020
Yi Jin1a11fa12018-02-22 16:44:10 -080021#include <stdarg.h>
Yi Jinc36e91d2018-03-08 11:25:58 -080022#include <utils/Errors.h>
Yi Jin1a11fa12018-02-22 16:44:10 -080023
Yi Jinb592e3b2018-02-01 15:17:04 -080024#include "Privacy.h"
Yi Jin99c248f2017-08-25 18:11:58 -070025
Yi Jin6cacbcb2018-03-30 14:04:52 -070026namespace android {
Mike Ma892ccd92020-03-20 16:30:37 -070027
28namespace util {
29class EncodedBuffer;
30}
31
Yi Jin6cacbcb2018-03-30 14:04:52 -070032namespace os {
33namespace incidentd {
34
Mike Ma892ccd92020-03-20 16:30:37 -070035using android::base::unique_fd;
36using android::util::EncodedBuffer;
Yi Jinb592e3b2018-02-01 15:17:04 -080037
Yi Jin1a11fa12018-02-22 16:44:10 -080038/**
39 * Looks up Privacy of a section in the auto-gen PRIVACY_POLICY_LIST;
40 */
Yi Jinb592e3b2018-02-01 15:17:04 -080041const Privacy* get_privacy_of_section(int id);
Yi Jin99c248f2017-08-25 18:11:58 -070042
Yi Jin1a11fa12018-02-22 16:44:10 -080043/**
Mike Ma892ccd92020-03-20 16:30:37 -070044 * Get an EncodedBuffer from an internal pool, or create and return a new one if the pool is empty.
45 * The EncodedBuffer should be returned after use.
46 * Thread safe.
47 */
48sp<EncodedBuffer> get_buffer_from_pool();
49
50/**
51 * Return the EncodedBuffer back to the pool for reuse.
52 * Thread safe.
53 */
54void return_buffer_to_pool(sp<EncodedBuffer> buffer);
55
56/**
57 * Clear the buffer pool to free memory, after taking an incident report.
58 * Thread safe.
59 */
60void clear_buffer_pool();
61
62/**
Yi Jin1a11fa12018-02-22 16:44:10 -080063 * This class wraps android::base::Pipe.
64 */
Yi Jin99c248f2017-08-25 18:11:58 -070065class Fpipe {
66public:
67 Fpipe();
68 ~Fpipe();
69
70 bool init();
71 bool close();
Yi Jin6355d2f2018-03-14 15:18:02 -070072 unique_fd& readFd();
73 unique_fd& writeFd();
Yi Jin99c248f2017-08-25 18:11:58 -070074
75private:
Yi Jinb592e3b2018-02-01 15:17:04 -080076 unique_fd mRead;
77 unique_fd mWrite;
Yi Jin99c248f2017-08-25 18:11:58 -070078};
79
Yi Jin1a11fa12018-02-22 16:44:10 -080080/**
Mike Mab6f7c472020-03-03 17:58:35 -080081 * Forks and exec a command with two pipes and returns the pid of the child, or -1 when it fails.
82 *
83 * input connects stdin for input. output connects stdout for output. input can be nullptr to
84 * indicate that child process doesn't read stdin. This function will close in and out fds upon
85 * success. If status is not NULL, the status information will be stored in the int to which it
86 * points.
Yi Jin1a11fa12018-02-22 16:44:10 -080087 */
Mike Mab6f7c472020-03-03 17:58:35 -080088pid_t fork_execute_cmd(char* const argv[], Fpipe* input, Fpipe* output, int* status = nullptr);
89
90/**
91 * Forks and exec a command that reads from in fd and writes to out fd and returns the pid of the
92 * child, or -1 when it fails.
93 *
94 * in can be -1 to indicate that child process doesn't read stdin. This function will close in and
95 * out fds upon success. If status is not NULL, the status information will be stored in the int
96 * to which it points.
97 */
98pid_t fork_execute_cmd(char* const argv[], int in, int out, int* status = nullptr);
Yi Jin1a11fa12018-02-22 16:44:10 -080099
100/**
101 * Grabs varargs from stack and stores them in heap with NULL-terminated array.
102 */
103const char** varargs(const char* first, va_list rest);
104
Kweku Adamseadd1232018-02-05 16:45:13 -0800105/**
106 * Returns the current monotonic clock time in nanoseconds.
107 */
108uint64_t Nanotime();
109
Yi Jinc36e91d2018-03-08 11:25:58 -0800110/**
111 * Methods to wait or kill child process, return exit status code.
112 */
113status_t kill_child(pid_t pid);
Mike Mab6f7c472020-03-03 17:58:35 -0800114status_t wait_child(pid_t pid, int timeout_ms = 1000);
Yi Jinc36e91d2018-03-08 11:25:58 -0800115
Joe Onorato99598ee2019-02-11 15:55:13 +0000116status_t start_detached_thread(const function<void ()>& func);
117
Yi Jin6cacbcb2018-03-30 14:04:52 -0700118} // namespace incidentd
119} // namespace os
120} // namespace android
121
Kweku Adamseadd1232018-02-05 16:45:13 -0800122#endif // INCIDENTD_UTIL_H