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;
}