diff options
author | 2020-09-29 15:23:33 +0800 | |
---|---|---|
committer | 2020-11-19 17:11:13 +0800 | |
commit | 031c957e55eb68e885718f3f512be194d23c0148 (patch) | |
tree | f8df9e6d9496ebce435c4b7dd69322438a5e4f50 | |
parent | 270193009fc7ed37cd95b672a2a22b83957bb006 (diff) |
Streaming bugreport content to stdout 1/2
Add a -s option to bugreportz to support streaming data.
Bug: 162910469
Test: adb bugreport --stream > test.txt
Test: adb shell bugreportz -s > test2.txt
Test: atest dumpstate_test
Test: atest bugreportz_test
Change-Id: I33d68bf742c92a7359a925838827a0033ee68658
-rw-r--r-- | cmds/bugreportz/bugreportz.cpp | 33 | ||||
-rw-r--r-- | cmds/bugreportz/bugreportz.h | 4 | ||||
-rw-r--r-- | cmds/bugreportz/main.cpp | 24 |
3 files changed, 51 insertions, 10 deletions
diff --git a/cmds/bugreportz/bugreportz.cpp b/cmds/bugreportz/bugreportz.cpp index ded0ed35cb..203d748aa9 100644 --- a/cmds/bugreportz/bugreportz.cpp +++ b/cmds/bugreportz/bugreportz.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#include "bugreportz.h" + +#include <android-base/file.h> +#include <android-base/strings.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -22,11 +26,6 @@ #include <string> -#include <android-base/file.h> -#include <android-base/strings.h> - -#include "bugreportz.h" - static constexpr char BEGIN_PREFIX[] = "BEGIN:"; static constexpr char PROGRESS_PREFIX[] = "PROGRESS:"; @@ -70,6 +69,30 @@ int bugreportz(int s, bool show_progress) { } // Process final line, in case it didn't finish with newline write_line(line, show_progress); + return EXIT_SUCCESS; +} + +int bugreportz_stream(int s) { + while (1) { + char buffer[65536]; + ssize_t bytes_read = TEMP_FAILURE_RETRY(read(s, buffer, sizeof(buffer))); + if (bytes_read == 0) { + break; + } else if (bytes_read == -1) { + // EAGAIN really means time out, so change the errno. + if (errno == EAGAIN) { + errno = ETIMEDOUT; + } + printf("FAIL:Bugreport read terminated abnormally (%s)\n", strerror(errno)); + return EXIT_FAILURE; + } + if (!android::base::WriteFully(android::base::borrowed_fd(STDOUT_FILENO), buffer, + bytes_read)) { + printf("Failed to write data to stdout: trying to send %zd bytes (%s)\n", bytes_read, + strerror(errno)); + return EXIT_FAILURE; + } + } return EXIT_SUCCESS; } diff --git a/cmds/bugreportz/bugreportz.h b/cmds/bugreportz/bugreportz.h index 7af289b2be..cdeceae083 100644 --- a/cmds/bugreportz/bugreportz.h +++ b/cmds/bugreportz/bugreportz.h @@ -19,4 +19,8 @@ // Ownership of the socket is not transferred. int bugreportz(int s, bool show_progress); +// Calls dumpstate using the given socket and write the file content to stdout +// instead of file location. Ownership of the socket is not transferred. +int bugreportz_stream(int s); + #endif // BUGREPORTZ_H diff --git a/cmds/bugreportz/main.cpp b/cmds/bugreportz/main.cpp index 1d48e08f3e..cd2652c717 100644 --- a/cmds/bugreportz/main.cpp +++ b/cmds/bugreportz/main.cpp @@ -26,13 +26,14 @@ #include "bugreportz.h" -static constexpr char VERSION[] = "1.1"; +static constexpr char VERSION[] = "1.2"; static void show_usage() { fprintf(stderr, - "usage: bugreportz [-hpv]\n" + "usage: bugreportz [-hpsv]\n" " -h: to display this help message\n" " -p: display progress\n" + " -s: stream content to standard output\n" " -v: to display the version\n" " or no arguments to generate a zipped bugreport\n"); } @@ -43,10 +44,11 @@ static void show_version() { int main(int argc, char* argv[]) { bool show_progress = false; + bool stream_data = false; if (argc > 1) { /* parse arguments */ int c; - while ((c = getopt(argc, argv, "hpv")) != -1) { + while ((c = getopt(argc, argv, "hpsv")) != -1) { switch (c) { case 'h': show_usage(); @@ -54,6 +56,9 @@ int main(int argc, char* argv[]) { case 'p': show_progress = true; break; + case 's': + stream_data = true; + break; case 'v': show_version(); return EXIT_SUCCESS; @@ -75,7 +80,11 @@ int main(int argc, char* argv[]) { // should be reused instead. // Start the dumpstatez service. - property_set("ctl.start", "dumpstatez"); + if (stream_data) { + property_set("ctl.start", "dumpstate"); + } else { + property_set("ctl.start", "dumpstatez"); + } // Socket will not be available until service starts. int s = -1; @@ -103,7 +112,12 @@ int main(int argc, char* argv[]) { strerror(errno)); } - int ret = bugreportz(s, show_progress); + int ret; + if (stream_data) { + ret = bugreportz_stream(s); + } else { + ret = bugreportz(s, show_progress); + } if (close(s) == -1) { fprintf(stderr, "WARNING: error closing socket: %s\n", strerror(errno)); |