blob: 11b0c3e5e179e7a48370682919e631dde8a8dc13 [file] [log] [blame]
Colin Crossf45fa6b2012-03-26 12:38:26 -07001/*
2 * Copyright (C) 2008 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
Felipe Leme8268ed22016-08-02 18:18:25 -070017#ifndef FRAMEWORK_NATIVE_CMD_DUMPSTATE_H_
18#define FRAMEWORK_NATIVE_CMD_DUMPSTATE_H_
Colin Crossf45fa6b2012-03-26 12:38:26 -070019
Felipe Lemecbce55d2016-02-08 09:53:18 -080020#ifndef MYLOGD
Felipe Leme60869c92016-02-09 16:07:20 -080021#define MYLOGD(...) fprintf(stderr, __VA_ARGS__); ALOGD(__VA_ARGS__);
Felipe Lemecbce55d2016-02-08 09:53:18 -080022#endif
23
24#ifndef MYLOGI
Felipe Leme60869c92016-02-09 16:07:20 -080025#define MYLOGI(...) fprintf(stderr, __VA_ARGS__); ALOGI(__VA_ARGS__);
Felipe Lemecbce55d2016-02-08 09:53:18 -080026#endif
27
28#ifndef MYLOGE
Felipe Leme60869c92016-02-09 16:07:20 -080029#define MYLOGE(...) fprintf(stderr, __VA_ARGS__); ALOGE(__VA_ARGS__);
Felipe Lemecbce55d2016-02-08 09:53:18 -080030#endif
Felipe Leme93d705b2015-11-10 20:10:25 -080031
Colin Crossf45fa6b2012-03-26 12:38:26 -070032#include <time.h>
33#include <unistd.h>
Colin Cross0c22e8b2012-11-02 15:46:56 -070034#include <stdbool.h>
Colin Crossf45fa6b2012-03-26 12:38:26 -070035#include <stdio.h>
Felipe Leme36b3f6f2015-11-19 15:41:04 -080036#include <vector>
Colin Crossf45fa6b2012-03-26 12:38:26 -070037
38#define SU_PATH "/system/xbin/su"
39
Felipe Leme35c94f32016-08-12 10:51:54 -070040// Workaround for const char *args[MAX_ARGS_ARRAY_SIZE] variables until they're converted to
41// std::vector<std::string>
42#define MAX_ARGS_ARRAY_SIZE 1000
43
44
Felipe Leme8620bb42015-11-10 11:04:45 -080045#ifdef __cplusplus
46extern "C" {
47#endif
48
Colin Cross0c22e8b2012-11-02 15:46:56 -070049typedef void (for_each_pid_func)(int, const char *);
50typedef void (for_each_tid_func)(int, int, const char *);
51
Felipe Leme71bbfc52015-11-23 14:14:51 -080052/* Estimated total weight of bugreport generation.
53 *
54 * Each section contributes to the total weight by an individual weight, so the overall progress
55 * can be calculated by dividing the all completed weight by the total weight.
56 *
57 * This value is defined empirically and it need to be adjusted as more sections are added.
Felipe Lemead5f6c42015-11-30 14:26:46 -080058 *
59 * It does not need to match the exact sum of all sections, but ideally it should to be slight more
60 * than such sum: a value too high will cause the bugreport to finish before the user expected (for
Felipe Lemefaf67e32016-03-28 11:15:22 -070061 * example, jumping from 70% to 100%), while a value too low will cause the progress to get stuck
62 * at an almost-finished value (like 99%) for a while.
Felipe Leme71bbfc52015-11-23 14:14:51 -080063 */
Felipe Lemefaf67e32016-03-28 11:15:22 -070064static const int WEIGHT_TOTAL = 6500;
Felipe Leme71bbfc52015-11-23 14:14:51 -080065
66/* Most simple commands have 10 as timeout, so 5 is a good estimate */
67static const int WEIGHT_FILE = 5;
68
69/*
Felipe Leme0c80cf02016-01-05 13:25:34 -080070 * TODO: the dumpstate internal state is getting fragile; for example, this variable is defined
Felipe Leme71bbfc52015-11-23 14:14:51 -080071 * here, declared at utils.cpp, and used on utils.cpp and dumpstate.cpp.
72 * It would be better to take advantage of the C++ migration and encapsulate the state in an object,
73 * but that will be better handled in a major C++ refactoring, which would also get rid of other C
74 * idioms (like using std::string instead of char*, removing varargs, etc...) */
Felipe Leme02b7e002016-07-22 12:03:20 -070075extern int do_update_progress, progress, weight_total, control_socket_fd;
Felipe Leme71bbfc52015-11-23 14:14:51 -080076
Felipe Leme71ca15e2016-05-19 16:18:17 -070077/* full path of the directory where the bugreport files will be written */
78extern std::string bugreport_dir;
79
80/* root dir for all files copied as-is into the bugreport. */
81extern const std::string ZIP_ROOT_DIR;
82
83/* adds a new entry to the existing zip file. */
84bool add_zip_entry(const std::string& entry_name, const std::string& entry_path);
85
86/* adds a new entry to the existing zip file. */
87bool add_zip_entry_from_fd(const std::string& entry_name, int fd);
88
Calvin On249beee2016-06-03 15:17:07 -070089/* adds all files from a directory to the zipped bugreport file */
90void add_dir(const char *dir, bool recursive);
91
Colin Crossf45fa6b2012-03-26 12:38:26 -070092/* prints the contents of a file */
Christopher Ferris1fe61072014-07-22 16:08:19 -070093int dump_file(const char *title, const char *path);
94
Felipe Leme71a74ac2016-03-17 15:43:25 -070095/* saves the the contents of a file as a long */
96int read_file_as_long(const char *path, long int *output);
97
Christopher Ferris54bcc5f2015-02-10 12:15:01 -080098/* prints the contents of the fd
99 * fd must have been opened with the flag O_NONBLOCK.
100 */
Christopher Ferris1fe61072014-07-22 16:08:19 -0700101int dump_file_from_fd(const char *title, const char *path, int fd);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700102
Mark Salyzyn326842f2015-04-30 09:49:41 -0700103/* calls skip to gate calling dump_from_fd recursively
104 * in the specified directory. dump_from_fd defaults to
105 * dump_file_from_fd above when set to NULL. skip defaults
106 * to false when set to NULL. dump_from_fd will always be
107 * called with title NULL.
108 */
109int dump_files(const char *title, const char *dir,
110 bool (*skip)(const char *path),
111 int (*dump_from_fd)(const char *title, const char *path, int fd));
112
Felipe Lemecf6a8b42016-03-11 10:38:19 -0800113// TODO: need to refactor all those run_command variations; there shold be just one, receiving an
114// optional CommandOptions objects with values such as run_always, drop_root, etc...
115
Colin Crossf45fa6b2012-03-26 12:38:26 -0700116/* forks a command and waits for it to finish -- terminate args with NULL */
Felipe Lemecf6a8b42016-03-11 10:38:19 -0800117int run_command_as_shell(const char *title, int timeout_seconds, const char *command, ...);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700118int run_command(const char *title, int timeout_seconds, const char *command, ...);
119
Felipe Leme29c39712016-04-01 10:02:00 -0700120enum RootMode { DROP_ROOT, DONT_DROP_ROOT };
121enum StdoutMode { NORMAL_STDOUT, REDIRECT_TO_STDERR };
122
Felipe Leme93d705b2015-11-10 20:10:25 -0800123/* forks a command and waits for it to finish
124 first element of args is the command, and last must be NULL.
125 command is always ran, even when _DUMPSTATE_DRY_RUN_ is defined. */
Felipe Leme29c39712016-04-01 10:02:00 -0700126int run_command_always(const char *title, RootMode root_mode, StdoutMode stdout_mode,
127 int timeout_seconds, const char *args[]);
Felipe Lemecf6a8b42016-03-11 10:38:19 -0800128
129/* switch to non-root user and group */
130bool drop_root_user();
Felipe Leme93d705b2015-11-10 20:10:25 -0800131
Felipe Leme36b3f6f2015-11-19 15:41:04 -0800132/* sends a broadcast using Activity Manager */
133void send_broadcast(const std::string& action, const std::vector<std::string>& args);
134
Felipe Leme71bbfc52015-11-23 14:14:51 -0800135/* updates the overall progress of dumpstate by the given weight increment */
136void update_progress(int weight);
137
Colin Crossf45fa6b2012-03-26 12:38:26 -0700138/* prints all the system properties */
139void print_properties();
140
Felipe Leme2628e9e2016-04-12 16:36:51 -0700141/** opens a socket and returns its file descriptor */
142int open_socket(const char *service);
143
Colin Crossf45fa6b2012-03-26 12:38:26 -0700144/* redirect output to a service control socket */
145void redirect_to_socket(FILE *redirect, const char *service);
146
Felipe Leme0f3fb202016-06-10 17:10:53 -0700147/* redirect output to a new file */
Christopher Ferrisff4a4dc2015-02-09 16:24:47 -0800148void redirect_to_file(FILE *redirect, char *path);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700149
Felipe Leme0f3fb202016-06-10 17:10:53 -0700150/* redirect output to an existing file */
151void redirect_to_existing_file(FILE *redirect, char *path);
152
Felipe Leme111b9d02016-02-03 09:28:24 -0800153/* create leading directories, if necessary */
154void create_parent_dirs(const char *path);
155
Jeff Brownbf7f4922012-06-07 16:40:01 -0700156/* dump Dalvik and native stack traces, return the trace file location (NULL if none) */
157const char *dump_traces();
Colin Crossf45fa6b2012-03-26 12:38:26 -0700158
159/* for each process in the system, run the specified function */
Colin Cross0c22e8b2012-11-02 15:46:56 -0700160void for_each_pid(for_each_pid_func func, const char *header);
161
162/* for each thread in the system, run the specified function */
163void for_each_tid(for_each_tid_func func, const char *header);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700164
165/* Displays a blocked processes in-kernel wait channel */
Colin Cross0c22e8b2012-11-02 15:46:56 -0700166void show_wchan(int pid, int tid, const char *name);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700167
Mark Salyzyna297c322016-02-05 15:33:17 -0800168/* Displays a processes times */
169void show_showtime(int pid, const char *name);
170
Colin Crossf45fa6b2012-03-26 12:38:26 -0700171/* Runs "showmap" for a process */
172void do_showmap(int pid, const char *name);
173
174/* Gets the dmesg output for the kernel */
175void do_dmesg();
176
Sreeram Ramachandran2b3bba32014-07-08 15:40:55 -0700177/* Prints the contents of all the routing tables, both IPv4 and IPv6. */
178void dump_route_tables();
179
Colin Crossf45fa6b2012-03-26 12:38:26 -0700180/* Play a sound via Stagefright */
Christopher Ferris1fe61072014-07-22 16:08:19 -0700181void play_sound(const char *path);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700182
183/* Implemented by libdumpstate_board to dump board-specific info */
184void dumpstate_board();
185
Felipe Lemee338bf62015-12-07 14:03:50 -0800186/* Takes a screenshot and save it to the given file */
Felipe Leme3634a1e2015-12-09 10:11:47 -0800187void take_screenshot(const std::string& path);
Felipe Lemee338bf62015-12-07 14:03:50 -0800188
Felipe Leme0c80cf02016-01-05 13:25:34 -0800189/* Vibrates for a given durating (in milliseconds). */
190void vibrate(FILE* vibrator, int ms);
191
192/* Checks if a given path is a directory. */
193bool is_dir(const char* pathname);
194
195/** Gets the last modification time of a file, or default time if file is not found. */
196time_t get_mtime(int fd, time_t default_mtime);
197
Calvin On249beee2016-06-03 15:17:07 -0700198/* Dumps eMMC Extended CSD data. */
Felipe Leme78f2c862015-12-21 09:55:22 -0800199void dump_emmc_ecsd(const char *ext_csd_path);
200
Calvin On249beee2016-06-03 15:17:07 -0700201/** Gets command-line arguments. */
Felipe Lemea34efb72016-03-11 09:33:32 -0800202void format_args(int argc, const char *argv[], std::string *args);
Felipe Leme88c79332016-02-22 11:06:49 -0800203
Calvin On249beee2016-06-03 15:17:07 -0700204/** Tells if the device is running a user build. */
205bool is_user_build();
206
Felipe Leme78f2c862015-12-21 09:55:22 -0800207/*
Felipe Leme8268ed22016-08-02 18:18:25 -0700208 * When running in dry-run mode, skips the real dumps and just print the section headers.
209 *
210 * Useful when debugging dumpstate or other bugreport-related activities.
211 *
212 * Dry-run mode is enabled by setting the system property dumpstate.dry_run to true.
213 */
214bool is_dry_run();
215
216/*
Felipe Leme78f2c862015-12-21 09:55:22 -0800217 * Helper class used to report how long it takes for a section to finish.
218 *
219 * Typical usage:
220 *
221 * DurationReporter duration_reporter(title);
222 *
223 */
224class DurationReporter {
225public:
Chih-Hung Hsieh759af112016-09-01 11:42:49 -0700226 explicit DurationReporter(const char *title);
Felipe Leme608385d2016-02-01 10:35:38 -0800227 DurationReporter(const char *title, FILE* out);
Felipe Leme78f2c862015-12-21 09:55:22 -0800228
229 ~DurationReporter();
230
231 static uint64_t nanotime();
232
233private:
234 const char* title_;
Felipe Leme608385d2016-02-01 10:35:38 -0800235 FILE* out_;
Felipe Leme78f2c862015-12-21 09:55:22 -0800236 uint64_t started_;
237};
238
Felipe Leme8620bb42015-11-10 11:04:45 -0800239#ifdef __cplusplus
240}
241#endif
242
Felipe Leme8268ed22016-08-02 18:18:25 -0700243#endif /* FRAMEWORK_NATIVE_CMD_DUMPSTATE_H_ */