blob: 0b8736839baab27ed1c59998cb6f03a6ba3d8875 [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 Leme8620bb42015-11-10 11:04:45 -080040#ifdef __cplusplus
41extern "C" {
42#endif
43
Colin Cross0c22e8b2012-11-02 15:46:56 -070044typedef void (for_each_pid_func)(int, const char *);
45typedef void (for_each_tid_func)(int, int, const char *);
46
Felipe Leme71bbfc52015-11-23 14:14:51 -080047/* Estimated total weight of bugreport generation.
48 *
49 * Each section contributes to the total weight by an individual weight, so the overall progress
50 * can be calculated by dividing the all completed weight by the total weight.
51 *
52 * This value is defined empirically and it need to be adjusted as more sections are added.
Felipe Lemead5f6c42015-11-30 14:26:46 -080053 *
54 * It does not need to match the exact sum of all sections, but ideally it should to be slight more
55 * 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 -070056 * example, jumping from 70% to 100%), while a value too low will cause the progress to get stuck
57 * at an almost-finished value (like 99%) for a while.
Felipe Leme71bbfc52015-11-23 14:14:51 -080058 */
Felipe Lemefaf67e32016-03-28 11:15:22 -070059static const int WEIGHT_TOTAL = 6500;
Felipe Leme71bbfc52015-11-23 14:14:51 -080060
61/* Most simple commands have 10 as timeout, so 5 is a good estimate */
62static const int WEIGHT_FILE = 5;
63
64/*
Felipe Leme0c80cf02016-01-05 13:25:34 -080065 * TODO: the dumpstate internal state is getting fragile; for example, this variable is defined
Felipe Leme71bbfc52015-11-23 14:14:51 -080066 * here, declared at utils.cpp, and used on utils.cpp and dumpstate.cpp.
67 * It would be better to take advantage of the C++ migration and encapsulate the state in an object,
68 * but that will be better handled in a major C++ refactoring, which would also get rid of other C
69 * idioms (like using std::string instead of char*, removing varargs, etc...) */
Felipe Leme02b7e002016-07-22 12:03:20 -070070extern int do_update_progress, progress, weight_total, control_socket_fd;
Felipe Leme71bbfc52015-11-23 14:14:51 -080071
Felipe Leme71ca15e2016-05-19 16:18:17 -070072/* full path of the directory where the bugreport files will be written */
73extern std::string bugreport_dir;
74
75/* root dir for all files copied as-is into the bugreport. */
76extern const std::string ZIP_ROOT_DIR;
77
78/* adds a new entry to the existing zip file. */
79bool add_zip_entry(const std::string& entry_name, const std::string& entry_path);
80
81/* adds a new entry to the existing zip file. */
82bool add_zip_entry_from_fd(const std::string& entry_name, int fd);
83
Calvin On249beee2016-06-03 15:17:07 -070084/* adds all files from a directory to the zipped bugreport file */
85void add_dir(const char *dir, bool recursive);
86
Colin Crossf45fa6b2012-03-26 12:38:26 -070087/* prints the contents of a file */
Christopher Ferris1fe61072014-07-22 16:08:19 -070088int dump_file(const char *title, const char *path);
89
Felipe Leme71a74ac2016-03-17 15:43:25 -070090/* saves the the contents of a file as a long */
91int read_file_as_long(const char *path, long int *output);
92
Christopher Ferris54bcc5f2015-02-10 12:15:01 -080093/* prints the contents of the fd
94 * fd must have been opened with the flag O_NONBLOCK.
95 */
Christopher Ferris1fe61072014-07-22 16:08:19 -070096int dump_file_from_fd(const char *title, const char *path, int fd);
Colin Crossf45fa6b2012-03-26 12:38:26 -070097
Mark Salyzyn326842f2015-04-30 09:49:41 -070098/* calls skip to gate calling dump_from_fd recursively
99 * in the specified directory. dump_from_fd defaults to
100 * dump_file_from_fd above when set to NULL. skip defaults
101 * to false when set to NULL. dump_from_fd will always be
102 * called with title NULL.
103 */
104int dump_files(const char *title, const char *dir,
105 bool (*skip)(const char *path),
106 int (*dump_from_fd)(const char *title, const char *path, int fd));
107
Felipe Lemecf6a8b42016-03-11 10:38:19 -0800108// TODO: need to refactor all those run_command variations; there shold be just one, receiving an
109// optional CommandOptions objects with values such as run_always, drop_root, etc...
110
Colin Crossf45fa6b2012-03-26 12:38:26 -0700111/* forks a command and waits for it to finish -- terminate args with NULL */
Felipe Lemecf6a8b42016-03-11 10:38:19 -0800112int run_command_as_shell(const char *title, int timeout_seconds, const char *command, ...);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700113int run_command(const char *title, int timeout_seconds, const char *command, ...);
114
Felipe Leme29c39712016-04-01 10:02:00 -0700115enum RootMode { DROP_ROOT, DONT_DROP_ROOT };
116enum StdoutMode { NORMAL_STDOUT, REDIRECT_TO_STDERR };
117
Felipe Leme93d705b2015-11-10 20:10:25 -0800118/* forks a command and waits for it to finish
119 first element of args is the command, and last must be NULL.
120 command is always ran, even when _DUMPSTATE_DRY_RUN_ is defined. */
Felipe Leme29c39712016-04-01 10:02:00 -0700121int run_command_always(const char *title, RootMode root_mode, StdoutMode stdout_mode,
122 int timeout_seconds, const char *args[]);
Felipe Lemecf6a8b42016-03-11 10:38:19 -0800123
124/* switch to non-root user and group */
125bool drop_root_user();
Felipe Leme93d705b2015-11-10 20:10:25 -0800126
Felipe Leme36b3f6f2015-11-19 15:41:04 -0800127/* sends a broadcast using Activity Manager */
128void send_broadcast(const std::string& action, const std::vector<std::string>& args);
129
Felipe Leme71bbfc52015-11-23 14:14:51 -0800130/* updates the overall progress of dumpstate by the given weight increment */
131void update_progress(int weight);
132
Colin Crossf45fa6b2012-03-26 12:38:26 -0700133/* prints all the system properties */
134void print_properties();
135
Felipe Leme2628e9e2016-04-12 16:36:51 -0700136/** opens a socket and returns its file descriptor */
137int open_socket(const char *service);
138
Colin Crossf45fa6b2012-03-26 12:38:26 -0700139/* redirect output to a service control socket */
140void redirect_to_socket(FILE *redirect, const char *service);
141
Felipe Leme0f3fb202016-06-10 17:10:53 -0700142/* redirect output to a new file */
Christopher Ferrisff4a4dc2015-02-09 16:24:47 -0800143void redirect_to_file(FILE *redirect, char *path);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700144
Felipe Leme0f3fb202016-06-10 17:10:53 -0700145/* redirect output to an existing file */
146void redirect_to_existing_file(FILE *redirect, char *path);
147
Felipe Leme111b9d02016-02-03 09:28:24 -0800148/* create leading directories, if necessary */
149void create_parent_dirs(const char *path);
150
Jeff Brownbf7f4922012-06-07 16:40:01 -0700151/* dump Dalvik and native stack traces, return the trace file location (NULL if none) */
152const char *dump_traces();
Colin Crossf45fa6b2012-03-26 12:38:26 -0700153
154/* for each process in the system, run the specified function */
Colin Cross0c22e8b2012-11-02 15:46:56 -0700155void for_each_pid(for_each_pid_func func, const char *header);
156
157/* for each thread in the system, run the specified function */
158void for_each_tid(for_each_tid_func func, const char *header);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700159
160/* Displays a blocked processes in-kernel wait channel */
Colin Cross0c22e8b2012-11-02 15:46:56 -0700161void show_wchan(int pid, int tid, const char *name);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700162
Mark Salyzyna297c322016-02-05 15:33:17 -0800163/* Displays a processes times */
164void show_showtime(int pid, const char *name);
165
Colin Crossf45fa6b2012-03-26 12:38:26 -0700166/* Runs "showmap" for a process */
167void do_showmap(int pid, const char *name);
168
169/* Gets the dmesg output for the kernel */
170void do_dmesg();
171
Sreeram Ramachandran2b3bba32014-07-08 15:40:55 -0700172/* Prints the contents of all the routing tables, both IPv4 and IPv6. */
173void dump_route_tables();
174
Colin Crossf45fa6b2012-03-26 12:38:26 -0700175/* Play a sound via Stagefright */
Christopher Ferris1fe61072014-07-22 16:08:19 -0700176void play_sound(const char *path);
Colin Crossf45fa6b2012-03-26 12:38:26 -0700177
178/* Implemented by libdumpstate_board to dump board-specific info */
179void dumpstate_board();
180
Felipe Lemee338bf62015-12-07 14:03:50 -0800181/* Takes a screenshot and save it to the given file */
Felipe Leme3634a1e2015-12-09 10:11:47 -0800182void take_screenshot(const std::string& path);
Felipe Lemee338bf62015-12-07 14:03:50 -0800183
Felipe Leme0c80cf02016-01-05 13:25:34 -0800184/* Vibrates for a given durating (in milliseconds). */
185void vibrate(FILE* vibrator, int ms);
186
187/* Checks if a given path is a directory. */
188bool is_dir(const char* pathname);
189
190/** Gets the last modification time of a file, or default time if file is not found. */
191time_t get_mtime(int fd, time_t default_mtime);
192
Calvin On249beee2016-06-03 15:17:07 -0700193/* Dumps eMMC Extended CSD data. */
Felipe Leme78f2c862015-12-21 09:55:22 -0800194void dump_emmc_ecsd(const char *ext_csd_path);
195
Calvin On249beee2016-06-03 15:17:07 -0700196/** Gets command-line arguments. */
Felipe Lemea34efb72016-03-11 09:33:32 -0800197void format_args(int argc, const char *argv[], std::string *args);
Felipe Leme88c79332016-02-22 11:06:49 -0800198
Calvin On249beee2016-06-03 15:17:07 -0700199/** Tells if the device is running a user build. */
200bool is_user_build();
201
Felipe Leme78f2c862015-12-21 09:55:22 -0800202/*
Felipe Leme8268ed22016-08-02 18:18:25 -0700203 * When running in dry-run mode, skips the real dumps and just print the section headers.
204 *
205 * Useful when debugging dumpstate or other bugreport-related activities.
206 *
207 * Dry-run mode is enabled by setting the system property dumpstate.dry_run to true.
208 */
209bool is_dry_run();
210
211/*
Felipe Leme78f2c862015-12-21 09:55:22 -0800212 * Helper class used to report how long it takes for a section to finish.
213 *
214 * Typical usage:
215 *
216 * DurationReporter duration_reporter(title);
217 *
218 */
219class DurationReporter {
220public:
221 DurationReporter(const char *title);
Felipe Leme608385d2016-02-01 10:35:38 -0800222 DurationReporter(const char *title, FILE* out);
Felipe Leme78f2c862015-12-21 09:55:22 -0800223
224 ~DurationReporter();
225
226 static uint64_t nanotime();
227
228private:
229 const char* title_;
Felipe Leme608385d2016-02-01 10:35:38 -0800230 FILE* out_;
Felipe Leme78f2c862015-12-21 09:55:22 -0800231 uint64_t started_;
232};
233
Felipe Leme8620bb42015-11-10 11:04:45 -0800234#ifdef __cplusplus
235}
236#endif
237
Felipe Leme8268ed22016-08-02 18:18:25 -0700238#endif /* FRAMEWORK_NATIVE_CMD_DUMPSTATE_H_ */