diff options
| author | Mark Salyzyn <salyzyn@google.com> | 2017-02-10 13:09:07 -0800 |
|---|---|---|
| committer | Mark Salyzyn <salyzyn@google.com> | 2017-02-17 14:42:14 -0800 |
| commit | f329029081f41f86d4631b4caeeb1ecf7ccae3d9 (patch) | |
| tree | f1b4e8b973d87e41803c666922c1f8a285dae676 /logcat | |
| parent | 5f606605ed8b1f6a0966a7d145553e228561ddf1 (diff) | |
| download | system_core-f329029081f41f86d4631b4caeeb1ecf7ccae3d9.tar.gz system_core-f329029081f41f86d4631b4caeeb1ecf7ccae3d9.tar.bz2 system_core-f329029081f41f86d4631b4caeeb1ecf7ccae3d9.zip | |
logcat: Use std::string instead of large static buffer for -Q
Test: gTest logcat-unit-tests
Bug: 35326290
Change-Id: Ieed3223be2d1386897cfba5fa4d04549e72e4e50
Diffstat (limited to 'logcat')
| -rw-r--r-- | logcat/logcat.cpp | 83 |
1 files changed, 32 insertions, 51 deletions
diff --git a/logcat/logcat.cpp b/logcat/logcat.cpp index c603a5250..adedf881c 100644 --- a/logcat/logcat.cpp +++ b/logcat/logcat.cpp @@ -603,7 +603,7 @@ int main(int argc, char** argv) { char* setPruneList = NULL; char* setId = NULL; int mode = ANDROID_LOG_RDONLY; - const char* forceFilters = NULL; + std::string forceFilters; log_device_t* devices = NULL; log_device_t* dev; struct logger_list* logger_list; @@ -942,58 +942,39 @@ int main(int argc, char** argv) { // run the program. If nothing is found, the program should // quit immediately. { - static char cmdline[1024]; - - int fd = open("/proc/cmdline", O_RDONLY); - if (fd >= 0) { - int n = read(fd, cmdline, sizeof(cmdline) - 1); - if (n < 0) n = 0; - cmdline[n] = 0; - close(fd); - } else { - cmdline[0] = 0; - } - - char* logcat = strstr(cmdline, KERNEL_OPTION); - char* console = strstr(cmdline, CONSOLE_OPTION); - bool force_exit = true; - if (logcat != NULL) { - char* p = logcat + sizeof(KERNEL_OPTION) - 1; - char* q = strpbrk(p, " \t\n\r"); + std::string cmdline; + android::base::ReadFileToString("/proc/cmdline", &cmdline); - if (q != NULL) *q = 0; - - forceFilters = p; - force_exit = false; - } + const char* logcat = strstr(cmdline.c_str(), KERNEL_OPTION); // if nothing found or invalid filters, exit quietly - if (force_exit) return EXIT_SUCCESS; + if (!logcat) return EXIT_SUCCESS; - // redirect our output to the emulator console - if (console) { - char* p = console + sizeof(CONSOLE_OPTION) - 1; - char* q = strpbrk(p, " \t\n\r"); - char devname[64]; - int len; - - if (q != NULL) { - len = q - p; - } else { - len = strlen(p); - } + const char* p = logcat + strlen(KERNEL_OPTION); + const char* q = strpbrk(p, " \t\n\r"); + if (!q) q = p + strlen(p); + forceFilters = std::string(p, q); - len = snprintf(devname, sizeof(devname), "/dev/%.*s", - len, p); - fprintf(stderr, "logcat using %s (%d)\n", devname, len); - if (len < (int)sizeof(devname)) { - fd = open(devname, O_WRONLY); - if (fd >= 0) { - dup2(fd, 1); - dup2(fd, 2); - close(fd); - } - } - } + // redirect our output to the emulator console + const char* console = + strstr(cmdline.c_str(), CONSOLE_OPTION); + if (!console) break; + + p = console + strlen(CONSOLE_OPTION); + q = strpbrk(p, " \t\n\r"); + int len = q ? q - p : strlen(p); + std::string devname = "/dev/" + std::string(p, len); + cmdline.erase(); + + fprintf(stderr, "logcat using %s\n", devname.c_str()); + + int fd = open(devname.c_str(), O_WRONLY); + devname.erase(); + if (fd < 0) break; + + // close output and error channels, replace with console + dup2(fd, 1); + dup2(fd, 2); + close(fd); } break; @@ -1075,8 +1056,8 @@ int main(int argc, char** argv) { } } - if (forceFilters) { - err = android_log_addFilterString(g_logformat, forceFilters); + if (forceFilters.size()) { + err = android_log_addFilterString(g_logformat, forceFilters.c_str()); if (err < 0) { logcat_panic(HELP_FALSE, "Invalid filter expression in logcat args\n"); |
