bool ProcessInfo::parse_stat()

in ProcessInfo.cpp [91:244]


bool ProcessInfo::parse_stat() {
    if (_stat.empty()) {
        return false;
    }

    char *ptr = reinterpret_cast<char*>(_stat.data());
    char *end = reinterpret_cast<char*>(ptr+_stat.size());

    // pid
    char *f_end = ptr;

    errno = 0;
    _pid = static_cast<int>(strtol(ptr, &f_end, 10));
    if (errno != 0 || *f_end != ' ') {
        return false;
    }

    ptr = f_end+1;

    if (ptr >= end) {
        return false;
    }

    // comm
    if (*ptr != '(') {
        return false;
    }
    f_end = strstr(ptr, ") ");
    if (f_end != nullptr && f_end+1 < end && f_end[1] == ')') {
        f_end += 1;
    }
    if (f_end == nullptr || f_end >= end) {
        return false;
    }
    _comm.assign(ptr+1, f_end-ptr-1);

    ptr = f_end+1;
    if (ptr < end && *ptr == ' ') {
        ptr = ptr+1;
    }

    if (ptr >= end) {
        return false;
    }

    // Skip state
    f_end = strchr(ptr, ' ');
    if (f_end == nullptr || f_end >= end) {
        return false;
    }
    ptr = f_end+1;
    if (ptr >= end) {
        return false;
    }

    // ppid
    errno = 0;
    _ppid = static_cast<int>(strtol(ptr, &f_end, 10));
    if (errno != 0 || *f_end != ' ') {
        return false;
    }

    ptr = f_end+1;

    if (ptr >= end) {
        return false;
    }

    // Skip pgrp
    f_end = strchr(ptr, ' ');
    if (f_end == nullptr || f_end >= end) {
        return false;
    }
    ptr = f_end+1;
    if (ptr >= end) {
        return false;
    }

    // sid
    errno = 0;
    _ses = static_cast<int>(strtol(ptr, &f_end, 10));
    if (errno != 0 || *f_end != ' ') {
        return false;
    }

    ptr = f_end+1;

    if (ptr >= end) {
        return false;
    }

    // Skip to utime
    for (int i = 0; i < 7; ++i) {
        f_end = strchr(ptr, ' ');
        if (f_end == nullptr || f_end >= end) {
            return false;
        }
        ptr = f_end + 1;
        if (ptr >= end) {
            return false;
        }
    }

    // utime
    errno = 0;
    _utime = strtoull(ptr, &f_end, 10);
    if (errno != 0 || *f_end != ' ') {
        return false;
    }

    ptr = f_end+1;
    if (ptr >= end) {
        return false;
    }

    // stime
    errno = 0;
    _stime = strtoull(ptr, &f_end, 10);
    if (errno != 0 || *f_end != ' ') {
        return false;
    }

    ptr = f_end+1;
    if (ptr >= end) {
        return false;
    }

    // Skip to starttime
    for (int i = 0; i < 6; ++i) {
        f_end = strchr(ptr, ' ');
        if (f_end == nullptr || f_end >= end) {
            return false;
        }
        ptr = f_end + 1;
        if (ptr >= end) {
            return false;
        }
    }

    // starttime
    errno = 0;
    _starttime = strtoull(ptr, &f_end, 10);
    if (errno != 0 || *f_end != ' ') {
        return false;
    }

    ptr = f_end+1;

    if (ptr >= end) {
        return false;
    }

    return true;
}