Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dcf6021e authored by Mark Salyzyn's avatar Mark Salyzyn Committed by android-build-merger
Browse files

Merge "liblogcat: replace NULL with nullptr"

am: 7826f853

Change-Id: Ic2e33c1c81cbbb83b459359403739cd98fdab2e7
parents ec172b5f 7826f853
Loading
Loading
Loading
Loading
+123 −183
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ android_logcat_context create_android_logcat() {

    context = (android_logcat_context_internal*)calloc(
        1, sizeof(android_logcat_context_internal));
    if (!context) return NULL;
    if (!context) return nullptr;

    context->fds[0] = -1;
    context->fds[1] = -1;
@@ -139,10 +139,10 @@ struct log_device_t {
    log_device_t(const char* d, bool b) {
        device = d;
        binary = b;
        next = NULL;
        next = nullptr;
        printed = false;
        logger = NULL;
        logger_list = NULL;
        logger = nullptr;
        logger_list = nullptr;
    }
};

@@ -162,7 +162,7 @@ static int openLogFile(const char* pathname) {
static void close_output(android_logcat_context_internal* context) {
    // split output_from_error
    if (context->error == context->output) {
        context->output = NULL;
        context->output = nullptr;
        context->output_fd = -1;
    }
    if (context->error && (context->output_fd == fileno(context->error))) {
@@ -182,7 +182,7 @@ static void close_output(android_logcat_context_internal* context) {
            }
            fclose(context->output);
        }
        context->output = NULL;
        context->output = nullptr;
    }
    if (context->output_fd >= 0) {
        if (context->output_fd != fileno(stdout)) {
@@ -198,7 +198,7 @@ static void close_output(android_logcat_context_internal* context) {
static void close_error(android_logcat_context_internal* context) {
    // split error_from_output
    if (context->output == context->error) {
        context->error = NULL;
        context->error = nullptr;
        context->error_fd = -1;
    }
    if (context->output && (context->error_fd == fileno(context->output))) {
@@ -218,14 +218,12 @@ static void close_error(android_logcat_context_internal* context) {
            }
            fclose(context->error);
        }
        context->error = NULL;
        context->error = nullptr;
    }
    if (context->error_fd >= 0) {
        if ((context->error_fd != fileno(stdout)) &&
            (context->error_fd != fileno(stderr))) {
            if (context->fds[1] == context->error_fd) {
                context->fds[1] = -1;
            }
            if (context->fds[1] == context->error_fd) context->fds[1] = -1;
            close(context->error_fd);
        }
        context->error_fd = -1;
@@ -236,9 +234,7 @@ static void rotateLogs(android_logcat_context_internal* context) {
    int err;

    // Can't rotate logs if we're not outputting to a file
    if (context->outputFileName == NULL) {
        return;
    }
    if (!context->outputFileName) return;

    close_output(context);

@@ -257,7 +253,7 @@ static void rotateLogs(android_logcat_context_internal* context) {
            "%s.%.*d", context->outputFileName, maxRotationCountDigits, i);

        std::string file0;
        if (i - 1 == 0) {
        if (!(i - 1)) {
            file0 = android::base::StringPrintf("%s", context->outputFileName);
        } else {
            file0 =
@@ -265,7 +261,7 @@ static void rotateLogs(android_logcat_context_internal* context) {
                                            maxRotationCountDigits, i - 1);
        }

        if ((file0.length() == 0) || (file1.length() == 0)) {
        if (!file0.length() || !file1.length()) {
            perror("while rotating log files");
            break;
        }
@@ -284,7 +280,7 @@ static void rotateLogs(android_logcat_context_internal* context) {
        return;
    }
    context->output = fdopen(context->output_fd, "web");
    if (context->output == NULL) {
    if (!context->output) {
        logcat_panic(context, HELP_FALSE, "couldn't fdopen output file");
        return;
    }
@@ -305,9 +301,7 @@ void printBinary(android_logcat_context_internal* context, struct log_msg* buf)

static bool regexOk(android_logcat_context_internal* context,
                    const AndroidLogEntry& entry) {
    if (!context->regex) {
        return true;
    }
    if (!context->regex) return true;

    std::string messageString(entry.message, entry.messageLen);

@@ -323,7 +317,7 @@ static void processBuffer(android_logcat_context_internal* context,

    if (dev->binary) {
        if (!context->eventTagMap && !context->hasOpenedEventTagMap) {
            context->eventTagMap = android_openEventTagMap(NULL);
            context->eventTagMap = android_openEventTagMap(nullptr);
            context->hasOpenedEventTagMap = true;
        }
        err = android_log_processBinaryLogBuffer(
@@ -334,9 +328,7 @@ static void processBuffer(android_logcat_context_internal* context,
    } else {
        err = android_log_processLogBuffer(&buf->entry_v1, &entry);
    }
    if ((err < 0) && !context->debug) {
        return;
    }
    if ((err < 0) && !context->debug) return;

    if (android_log_shouldPrintLine(
            context->logformat, std::string(entry.tag, entry.tagLen).c_str(),
@@ -381,7 +373,7 @@ static void maybePrintStart(android_logcat_context_internal* context,

static void setupOutputAndSchedulingPolicy(
    android_logcat_context_internal* context, bool blocking) {
    if (context->outputFileName == NULL) return;
    if (!context->outputFileName) return;

    if (blocking) {
        // Lower priority and set to batch scheduling if we are saving
@@ -562,10 +554,8 @@ static int setLogFormat(android_logcat_context_internal* context,

    format = android_log_formatFromString(formatString);

    if (format == FORMAT_OFF) {
        // FORMAT_OFF means invalid string
        return -1;
    }
    // invalid string?
    if (format == FORMAT_OFF) return -1;

    return android_log_setPrintFormat(context->logformat, format);
}
@@ -592,21 +582,15 @@ static const char* multiplier_of_size(unsigned long value) {
// String to unsigned int, returns -1 if it fails
static bool getSizeTArg(const char* ptr, size_t* val, size_t min = 0,
                        size_t max = SIZE_MAX) {
    if (!ptr) {
        return false;
    }
    if (!ptr) return false;

    char* endp;
    errno = 0;
    size_t ret = (size_t)strtoll(ptr, &endp, 0);

    if (endp[0] || errno) {
        return false;
    }
    if (endp[0] || errno) return false;

    if ((ret > max) || (ret < min)) {
        return false;
    }
    if ((ret > max) || (ret < min)) return false;

    *val = ret;
    return true;
@@ -642,22 +626,16 @@ static void logcat_panic(android_logcat_context_internal* context,

static char* parseTime(log_time& t, const char* cp) {
    char* ep = t.strptime(cp, "%m-%d %H:%M:%S.%q");
    if (ep) {
        return ep;
    }
    if (ep) return ep;
    ep = t.strptime(cp, "%Y-%m-%d %H:%M:%S.%q");
    if (ep) {
        return ep;
    }
    if (ep) return ep;
    return t.strptime(cp, "%s.%q");
}

// Find last logged line in <outputFileName>, or <outputFileName>.1
static log_time lastLogTime(char* outputFileName) {
    log_time retval(log_time::EPOCH);
    if (!outputFileName) {
        return retval;
    }
    if (!outputFileName) return retval;

    std::string directory;
    char* file = strrchr(outputFileName, '/');
@@ -673,9 +651,7 @@ static log_time lastLogTime(char* outputFileName) {

    std::unique_ptr<DIR, int (*)(DIR*)> dir(opendir(directory.c_str()),
                                            closedir);
    if (!dir.get()) {
        return retval;
    }
    if (!dir.get()) return retval;

    log_time now(android_log_clockid());

@@ -683,10 +659,10 @@ static log_time lastLogTime(char* outputFileName) {
    log_time modulo(0, NS_PER_SEC);
    struct dirent* dp;

    while ((dp = readdir(dir.get())) != NULL) {
        if ((dp->d_type != DT_REG) || (strncmp(dp->d_name, file, len) != 0) ||
    while (!!(dp = readdir(dir.get()))) {
        if ((dp->d_type != DT_REG) || !!strncmp(dp->d_name, file, len) ||
            (dp->d_name[len] && ((dp->d_name[len] != '.') ||
                                 (strtoll(dp->d_name + 1, NULL, 10) != 1)))) {
                                 (strtoll(dp->d_name + 1, nullptr, 10) != 1)))) {
            continue;
        }

@@ -694,17 +670,13 @@ static log_time lastLogTime(char* outputFileName) {
        file_name += "/";
        file_name += dp->d_name;
        std::string file;
        if (!android::base::ReadFileToString(file_name, &file)) {
            continue;
        }
        if (!android::base::ReadFileToString(file_name, &file)) continue;

        bool found = false;
        for (const auto& line : android::base::Split(file, "\n")) {
            log_time t(log_time::EPOCH);
            char* ep = parseTime(t, line.c_str());
            if (!ep || (*ep != ' ')) {
                continue;
            }
            if (!ep || (*ep != ' ')) continue;
            // determine the time precision of the logs (eg: msec or usec)
            for (unsigned long mod = 1UL; mod < modulo.tv_nsec; mod *= 10) {
                if (t.tv_nsec % (mod * 10)) {
@@ -722,13 +694,9 @@ static log_time lastLogTime(char* outputFileName) {
            }
        }
        // We count on the basename file to be the definitive end, so stop here.
        if (!dp->d_name[len] && found) {
            break;
        }
    }
    if (retval == log_time::EPOCH) {
        return retval;
        if (!dp->d_name[len] && found) break;
    }
    if (retval == log_time::EPOCH) return retval;
    // tail_time prints matching or higher, round up by the modulo to prevent
    // a replay of the last entry we have just checked.
    retval += modulo;
@@ -736,27 +704,24 @@ static log_time lastLogTime(char* outputFileName) {
}

const char* getenv(android_logcat_context_internal* context, const char* name) {
    if (!context->envp || !name || !*name) return NULL;
    if (!context->envp || !name || !*name) return nullptr;

    for (size_t len = strlen(name), i = 0; context->envp[i]; ++i) {
        if (strncmp(context->envp[i], name, len)) continue;
        if (context->envp[i][len] == '=') return &context->envp[i][len + 1];
    }
    return NULL;
    return nullptr;
}

}  // namespace android

void reportErrorName(const char** current, const char* name,
                     bool blockSecurity) {
    if (*current) {
        return;
    }
    if (blockSecurity && (android_name_to_log_id(name) == LOG_ID_SECURITY)) {
        return;
    }
    if (*current) return;
    if (!blockSecurity || (android_name_to_log_id(name) != LOG_ID_SECURITY)) {
        *current = name;
    }
}

static int __logcat(android_logcat_context_internal* context) {
    using namespace android;
@@ -769,11 +734,11 @@ static int __logcat(android_logcat_context_internal* context) {
    bool printStatistics = false;
    bool printDividers = false;
    unsigned long setLogSize = 0;
    char* setPruneList = NULL;
    char* setId = NULL;
    char* setPruneList = nullptr;
    char* setId = nullptr;
    int mode = ANDROID_LOG_RDONLY;
    std::string forceFilters;
    log_device_t* devices = NULL;
    log_device_t* devices = nullptr;
    log_device_t* dev;
    struct logger_list* logger_list;
    size_t tail_lines = 0;
@@ -783,10 +748,10 @@ static int __logcat(android_logcat_context_internal* context) {

    // object instantiations before goto's can happen
    log_device_t unexpected("unexpected", false);
    const char* openDeviceFail = NULL;
    const char* clearFail = NULL;
    const char* setSizeFail = NULL;
    const char* getSizeFail = NULL;
    const char* openDeviceFail = nullptr;
    const char* clearFail = nullptr;
    const char* setSizeFail = nullptr;
    const char* getSizeFail = nullptr;
    int argc = context->argc;
    char* const* argv = context->argv;

@@ -813,7 +778,7 @@ static int __logcat(android_logcat_context_internal* context) {
        break;
    }

    const char* filename = NULL;
    const char* filename = nullptr;
    for (int i = 0; i < argc; ++i) {
        // Simulate shell stdout redirect parsing
        if (argv[i][0] != '>') continue;
@@ -843,7 +808,7 @@ static int __logcat(android_logcat_context_internal* context) {
        }
    }
    if (context->output_fd >= 0) {  // Is an output file descriptor supplied?
        if (filename) { // redirect to file, close the supplied file descriptor.
        if (filename) {  // redirect to file, close supplied file descriptor.
            close(context->output_fd);
            context->output_fd = -1;
        } else {  // All Ok, convert output to a FILE pointer
@@ -865,7 +830,7 @@ static int __logcat(android_logcat_context_internal* context) {
    // Deal with 2>/dev/null
    if (context->stderr_null) {
        context->error_fd = -1;
        context->error = NULL;
        context->error = nullptr;
    }
    // Only happens if output=stdout or output=filename
    if ((context->output_fd < 0) && context->output) {
@@ -878,7 +843,7 @@ static int __logcat(android_logcat_context_internal* context) {

    context->logformat = android_log_format_new();

    if (argc == 2 && 0 == strcmp(argv[1], "--help")) {
    if (argc == 2 && !strcmp(argv[1], "--help")) {
        show_help(context);
        context->retval = EXIT_SUCCESS;
        goto exit;
@@ -898,43 +863,40 @@ static int __logcat(android_logcat_context_internal* context) {
        static const char print_str[] = "print";
        // clang-format off
        static const struct option long_options[] = {
          { "binary",        no_argument,       NULL,   'B' },
          { "buffer",        required_argument, NULL,   'b' },
          { "buffer-size",   optional_argument, NULL,   'g' },
          { "clear",         no_argument,       NULL,   'c' },
          { debug_str,       no_argument,       NULL,   0 },
          { "dividers",      no_argument,       NULL,   'D' },
          { "file",          required_argument, NULL,   'f' },
          { "format",        required_argument, NULL,   'v' },
          { "binary",        no_argument,       nullptr, 'B' },
          { "buffer",        required_argument, nullptr, 'b' },
          { "buffer-size",   optional_argument, nullptr, 'g' },
          { "clear",         no_argument,       nullptr, 'c' },
          { debug_str,       no_argument,       nullptr, 0 },
          { "dividers",      no_argument,       nullptr, 'D' },
          { "file",          required_argument, nullptr, 'f' },
          { "format",        required_argument, nullptr, 'v' },
          // hidden and undocumented reserved alias for --regex
          { "grep",          required_argument, NULL,   'e' },
          { "grep",          required_argument, nullptr, 'e' },
          // hidden and undocumented reserved alias for --max-count
          { "head",          required_argument, NULL,   'm' },
          { id_str,          required_argument, NULL,   0 },
          { "last",          no_argument,       NULL,   'L' },
          { "max-count",     required_argument, NULL,   'm' },
          { pid_str,         required_argument, NULL,   0 },
          { print_str,       no_argument,       NULL,   0 },
          { "prune",         optional_argument, NULL,   'p' },
          { "regex",         required_argument, NULL,   'e' },
          { "rotate-count",  required_argument, NULL,   'n' },
          { "rotate-kbytes", required_argument, NULL,   'r' },
          { "statistics",    no_argument,       NULL,   'S' },
          { "head",          required_argument, nullptr, 'm' },
          { id_str,          required_argument, nullptr, 0 },
          { "last",          no_argument,       nullptr, 'L' },
          { "max-count",     required_argument, nullptr, 'm' },
          { pid_str,         required_argument, nullptr, 0 },
          { print_str,       no_argument,       nullptr, 0 },
          { "prune",         optional_argument, nullptr, 'p' },
          { "regex",         required_argument, nullptr, 'e' },
          { "rotate-count",  required_argument, nullptr, 'n' },
          { "rotate-kbytes", required_argument, nullptr, 'r' },
          { "statistics",    no_argument,       nullptr, 'S' },
          // hidden and undocumented reserved alias for -t
          { "tail",          required_argument, NULL,   't' },
          { "tail",          required_argument, nullptr, 't' },
          // support, but ignore and do not document, the optional argument
          { wrap_str,        optional_argument, NULL,   0 },
          { NULL,            0,                 NULL,   0 }
          { wrap_str,        optional_argument, nullptr, 0 },
          { nullptr,         0,                 nullptr, 0 }
        };
        // clang-format on

        ret = getopt_long(argc, argv,
                          ":cdDLt:T:gG:sQf:r:n:v:b:BSpP:m:e:", long_options,
                          &option_index);

        if (ret < 0) {
            break;
        }
        if (ret < 0) break;

        switch (ret) {
            case 0:
@@ -976,8 +938,7 @@ static int __logcat(android_logcat_context_internal* context) {
                    break;
                }
                if (long_options[option_index].name == id_str) {
                    setId = optarg && optarg[0] ? optarg : NULL;
                    break;
                    setId = (optarg && optarg[0]) ? optarg : nullptr;
                }
                break;

@@ -1045,7 +1006,7 @@ static int __logcat(android_logcat_context_internal* context) {
                break;

            case 'm': {
                char* end = NULL;
                char* end = nullptr;
                if (!getSizeTArg(optarg, &context->maxCount)) {
                    logcat_panic(context, HELP_FALSE,
                                 "-%c \"%s\" isn't an "
@@ -1110,18 +1071,18 @@ static int __logcat(android_logcat_context_internal* context) {

            case 'b': {
                unsigned idMask = 0;
                while ((optarg = strtok(optarg, ",:; \t\n\r\f")) != NULL) {
                    if (strcmp(optarg, "default") == 0) {
                while (!!(optarg = strtok(optarg, ",:; \t\n\r\f"))) {
                    if (!strcmp(optarg, "default")) {
                        idMask |= (1 << LOG_ID_MAIN) | (1 << LOG_ID_SYSTEM) |
                                  (1 << LOG_ID_CRASH);
                    } else if (strcmp(optarg, "all") == 0) {
                    } else if (!strcmp(optarg, "all")) {
                        allSelected = true;
                        idMask = (unsigned)-1;
                    } else {
                        log_id_t log_id = android_name_to_log_id(optarg);
                        const char* name = android_log_id_to_name(log_id);

                        if (strcmp(name, optarg) != 0) {
                        if (!!strcmp(name, optarg)) {
                            logcat_panic(context, HELP_TRUE,
                                         "unknown buffer %s\n", optarg);
                            goto exit;
@@ -1129,19 +1090,15 @@ static int __logcat(android_logcat_context_internal* context) {
                        if (log_id == LOG_ID_SECURITY) allSelected = false;
                        idMask |= (1 << log_id);
                    }
                    optarg = NULL;
                    optarg = nullptr;
                }

                for (int i = LOG_ID_MIN; i < LOG_ID_MAX; ++i) {
                    const char* name = android_log_id_to_name((log_id_t)i);
                    log_id_t log_id = android_name_to_log_id(name);

                    if (log_id != (log_id_t)i) {
                        continue;
                    }
                    if ((idMask & (1 << i)) == 0) {
                        continue;
                    }
                    if (log_id != (log_id_t)i) continue;
                    if (!(idMask & (1 << i))) continue;

                    bool found = false;
                    for (dev = devices; dev; dev = dev->next) {
@@ -1149,13 +1106,9 @@ static int __logcat(android_logcat_context_internal* context) {
                            found = true;
                            break;
                        }
                        if (!dev->next) {
                            break;
                        }
                    }
                    if (found) {
                        continue;
                        if (!dev->next) break;
                    }
                    if (found) continue;

                    bool binary =
                        !strcmp(name, "events") || !strcmp(name, "security");
@@ -1176,7 +1129,7 @@ static int __logcat(android_logcat_context_internal* context) {
                break;

            case 'f':
                if ((tail_time == log_time::EPOCH) && (tail_lines == 0)) {
                if ((tail_time == log_time::EPOCH) && !tail_lines) {
                    tail_time = lastLogTime(optarg);
                }
                // redirect output to a file
@@ -1319,13 +1272,13 @@ static int __logcat(android_logcat_context_internal* context) {
        }
    }

    if (context->logRotateSizeKBytes != 0 && context->outputFileName == NULL) {
    if (!!context->logRotateSizeKBytes && !context->outputFileName) {
        logcat_panic(context, HELP_TRUE, "-r requires -f as well\n");
        goto exit;
    }

    if (setId != NULL) {
        if (context->outputFileName == NULL) {
    if (!!setId) {
        if (!context->outputFileName) {
            logcat_panic(context, HELP_TRUE,
                         "--id='%s' requires -f as well\n", setId);
            goto exit;
@@ -1337,15 +1290,13 @@ static int __logcat(android_logcat_context_internal* context) {
        bool file_ok = android::base::ReadFileToString(file_name, &file);
        android::base::WriteStringToFile(setId, file_name, S_IRUSR | S_IWUSR,
                                         getuid(), getgid());
        if (!file_ok || (file.compare(setId) == 0)) {
            setId = NULL;
        }
        if (!file_ok || !file.compare(setId)) setId = nullptr;
    }

    if (hasSetLogFormat == 0) {
    if (!hasSetLogFormat) {
        const char* logFormat = android::getenv(context, "ANDROID_PRINTF_LOG");

        if (logFormat != NULL) {
        if (!!logFormat) {
            err = setLogFormat(context, logFormat);
            if ((err < 0) && context->error) {
                fprintf(context->error,
@@ -1369,7 +1320,7 @@ static int __logcat(android_logcat_context_internal* context) {
        // Add from environment variable
        const char* env_tags_orig = android::getenv(context, "ANDROID_LOG_TAGS");

        if (env_tags_orig != NULL) {
        if (!!env_tags_orig) {
            err = android_log_addFilterString(context->logformat,
                                              env_tags_orig);

@@ -1424,7 +1375,7 @@ static int __logcat(android_logcat_context_internal* context) {
                for (int i = context->maxRotatedLogs ; i >= 0 ; --i) {
                    std::string file;

                    if (i == 0) {
                    if (!i) {
                        file = android::base::StringPrintf(
                            "%s", context->outputFileName);
                    } else {
@@ -1432,7 +1383,7 @@ static int __logcat(android_logcat_context_internal* context) {
                            context->outputFileName, maxRotationCountDigits, i);
                    }

                    if (file.length() == 0) {
                    if (!file.length()) {
                        perror("while clearing log files");
                        reportErrorName(&clearFail, dev->device, allSelected);
                        break;
@@ -1440,7 +1391,7 @@ static int __logcat(android_logcat_context_internal* context) {

                    err = unlink(file.c_str());

                    if (err < 0 && errno != ENOENT && clearFail == NULL) {
                    if (err < 0 && errno != ENOENT && !clearFail) {
                        perror("while clearing log files");
                        reportErrorName(&clearFail, dev->device, allSelected);
                    }
@@ -1507,7 +1458,7 @@ static int __logcat(android_logcat_context_internal* context) {
        size_t len = strlen(setPruneList);
        // extra 32 bytes are needed by android_logger_set_prune_list
        size_t bLen = len + 32;
        char* buf = NULL;
        char* buf = nullptr;
        if (asprintf(&buf, "%-*s", (int)(bLen - 1), setPruneList) > 0) {
            buf[len] = '\0';
            if (android_logger_set_prune_list(logger_list, buf, bLen)) {
@@ -1527,7 +1478,7 @@ static int __logcat(android_logcat_context_internal* context) {
        char* buf;

        for (int retry = 32; (retry >= 0) && ((buf = new char[len]));
             delete[] buf, buf = NULL, --retry) {
             delete[] buf, buf = nullptr, --retry) {
            if (getPruneList) {
                android_logger_get_prune_list(logger_list, buf, len);
            } else {
@@ -1536,7 +1487,7 @@ static int __logcat(android_logcat_context_internal* context) {
            buf[len - 1] = '\0';
            if (atol(buf) < 3) {
                delete[] buf;
                buf = NULL;
                buf = nullptr;
                break;
            }
            size_t ret = atol(buf) + 1;
@@ -1556,19 +1507,13 @@ static int __logcat(android_logcat_context_internal* context) {
        char* cp = buf + len - 1;
        *cp = '\0';
        bool truncated = *--cp != '\f';
        if (!truncated) {
            *cp = '\0';
        }
        if (!truncated) *cp = '\0';

        // squash out the byte count
        cp = buf;
        if (!truncated) {
            while (isdigit(*cp)) {
                ++cp;
            }
            if (*cp == '\n') {
                ++cp;
            }
            while (isdigit(*cp)) ++cp;
            if (*cp == '\n') ++cp;
        }

        len = strlen(cp);
@@ -1577,32 +1522,28 @@ static int __logcat(android_logcat_context_internal* context) {
        goto close;
    }

    if (getLogSize || setLogSize || clearLog) {
        goto close;
    }
    if (getLogSize || setLogSize || clearLog) goto close;

    setupOutputAndSchedulingPolicy(context, (mode & ANDROID_LOG_NONBLOCK) == 0);
    setupOutputAndSchedulingPolicy(context, !(mode & ANDROID_LOG_NONBLOCK));
    if (context->stop) goto close;

    // LOG_EVENT_INT(10, 12345);
    // LOG_EVENT_LONG(11, 0x1122334455667788LL);
    // LOG_EVENT_STRING(0, "whassup, doc?");

    dev = NULL;
    dev = nullptr;

    while (!context->stop &&
           (!context->maxCount || (context->printCount < context->maxCount))) {
        struct log_msg log_msg;
        int ret = android_logger_list_read(logger_list, &log_msg);
        if (ret == 0) {
        if (!ret) {
            logcat_panic(context, HELP_FALSE, "read: unexpected EOF!\n");
            break;
        }

        if (ret < 0) {
            if (ret == -EAGAIN) {
                break;
            }
            if (ret == -EAGAIN) break;

            if (ret == -EIO) {
                logcat_panic(context, HELP_FALSE, "read: unexpected EOF!\n");
@@ -1618,9 +1559,7 @@ static int __logcat(android_logcat_context_internal* context) {

        log_device_t* d;
        for (d = devices; d; d = d->next) {
            if (android_name_to_log_id(d->device) == log_msg.id()) {
                break;
            }
            if (android_name_to_log_id(d->device) == log_msg.id()) break;
        }
        if (!d) {
            context->devCount = 2; // set to Multiple
@@ -1686,9 +1625,7 @@ int android_logcat_run_command_thread(android_logcat_context ctx,
    android_logcat_context_internal* context = ctx;

    int save_errno = EBUSY;
    if ((context->fds[0] >= 0) || (context->fds[1] >= 0)) {
        goto exit;
    }
    if ((context->fds[0] >= 0) || (context->fds[1] >= 0)) goto exit;

    if (pipe(context->fds) < 0) {
        save_errno = errno;
@@ -1725,11 +1662,11 @@ int android_logcat_run_command_thread(android_logcat_context ctx,
    for (auto& str : context->args) {
        context->argv_hold.push_back(str.c_str());
    }
    context->argv_hold.push_back(NULL);
    context->argv_hold.push_back(nullptr);
    for (auto& str : context->envs) {
        context->envp_hold.push_back(str.c_str());
    }
    context->envp_hold.push_back(NULL);
    context->envp_hold.push_back(nullptr);

    context->argc = context->argv_hold.size() - 1;
    context->argv = (char* const*)&context->argv_hold[0];
@@ -1738,7 +1675,7 @@ int android_logcat_run_command_thread(android_logcat_context ctx,
#ifdef DEBUG
    fprintf(stderr, "argv[%d] = {", context->argc);
    for (auto str : context->argv_hold) {
        fprintf(stderr, " \"%s\"", str ?: "NULL");
        fprintf(stderr, " \"%s\"", str ?: "nullptr");
    }
    fprintf(stderr, " }\n");
    fflush(stderr);
@@ -1784,11 +1721,14 @@ int android_logcat_run_command_thread_running(android_logcat_context ctx) {
int android_logcat_destroy(android_logcat_context* ctx) {
    android_logcat_context_internal* context = *ctx;

    *ctx = NULL;
    if (!context) return -EBADF;

    *ctx = nullptr;

    context->stop = true;

    while (context->thread_stopped == false) {
        // Makes me sad, replace thread_stopped with semaphore.  Short lived.
        sched_yield();
    }