diff --git a/BatteryMeter.c b/BatteryMeter.c index aed5f232..f2dfa6ab 100644 --- a/BatteryMeter.c +++ b/BatteryMeter.c @@ -56,15 +56,16 @@ static unsigned long int parseBatInfo(const char *fileName, const unsigned short if (!batteryDir) return 0; - char* batteries[64]; + #define MAX_BATTERIES 64 + char* batteries[MAX_BATTERIES]; unsigned int nBatteries = 0; - memset(batteries, sizeof batteries, sizeof (char*)); + memset(batteries, 0, MAX_BATTERIES * sizeof(char*)); struct dirent result; struct dirent* dirEntry; - while (nBatteries < sizeof batteries) { - readdir_r(batteryDir, &result, &dirEntry); - if (!dirEntry) + while (nBatteries < MAX_BATTERIES) { + int err = readdir_r(batteryDir, &result, &dirEntry); + if (err || !dirEntry) break; char* entryName = dirEntry->d_name; if (strncmp(entryName, "BAT", 3)) @@ -84,9 +85,10 @@ static unsigned long int parseBatInfo(const char *fileName, const unsigned short break; } - char line[50]; + char line[50] = ""; for (unsigned short int i = 0; i < lineNum; i++) { - fgets(line, sizeof line, file); + char* ok = fgets(line, sizeof line, file); + if (!ok) break; } fclose(file); @@ -116,8 +118,8 @@ static ACPresence procAcpiCheck() { struct dirent result; struct dirent* dirEntry; for (;;) { - readdir_r((DIR *) power_supplyDir, &result, &dirEntry); - if (!dirEntry) + int err = readdir_r((DIR *) power_supplyDir, &result, &dirEntry); + if (err || !dirEntry) break; char* entryName = (char *) dirEntry->d_name; @@ -169,8 +171,8 @@ static ACPresence sysCheck() { struct dirent result; struct dirent* dirEntry; for (;;) { - readdir_r((DIR *) power_supplyDir, &result, &dirEntry); - if (!dirEntry) + int err = readdir_r((DIR *) power_supplyDir, &result, &dirEntry); + if (err || !dirEntry) break; char* entryName = (char *) dirEntry->d_name; @@ -232,8 +234,8 @@ static double getSysBatData() { struct dirent result; struct dirent* dirEntry; for (;;) { - readdir_r((DIR *) power_supplyDir, &result, &dirEntry); - if (!dirEntry) + int err = readdir_r((DIR *) power_supplyDir, &result, &dirEntry); + if (err || !dirEntry) break; char* entryName = (char *) dirEntry->d_name; diff --git a/ChangeLog b/ChangeLog index 4e1c3149..1aafc65d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,7 @@ What's new in version 1.0.3 of IO data depending on selected fields. * Better consistency in coloring. * Increase limit of buffer when tracing a deep nested process tree. +* Display pagefault stats. * BUGFIX: Fix crash when adding meters and toggling detailed CPU time. (thanks to Dawid Gajownik) * Add column to track the OOM-killer score of processes diff --git a/IncSet.c b/IncSet.c index f38ba6dc..40aa9233 100644 --- a/IncSet.c +++ b/IncSet.c @@ -29,7 +29,7 @@ typedef enum { #define IncSet_filter(inc_) (inc_->filtering ? inc_->modes[INC_FILTER].buffer : NULL) typedef struct IncMode_ { - char buffer[INCMODE_MAX]; + char buffer[INCMODE_MAX+1]; int index; FunctionBar* bar; bool isFilter; diff --git a/IncSet.h b/IncSet.h index fe425330..c528f18c 100644 --- a/IncSet.h +++ b/IncSet.h @@ -24,7 +24,7 @@ typedef enum { #define IncSet_filter(inc_) (inc_->filtering ? inc_->modes[INC_FILTER].buffer : NULL) typedef struct IncMode_ { - char buffer[INCMODE_MAX]; + char buffer[INCMODE_MAX+1]; int index; FunctionBar* bar; bool isFilter; diff --git a/Process.c b/Process.c index f501d2b7..31ceed72 100644 --- a/Process.c +++ b/Process.c @@ -168,11 +168,11 @@ typedef struct Process_ { int basenameOffset; bool updated; - #ifdef DEBUG unsigned long int minflt; unsigned long int cminflt; unsigned long int majflt; unsigned long int cmajflt; + #ifdef DEBUG long int itrealvalue; unsigned long int vsize; long int rss; @@ -254,7 +254,7 @@ const int Process_fieldFlags[] = { const char *Process_fieldTitles[] = { "", " PID ", "Command ", "S ", " PPID ", " PGRP ", " SESN ", - " TTY ", " TPGID ", "- ", "- ", "- ", "- ", "- ", + " TTY ", " TPGID ", "- ", " MINFLT ", " CMINFLT ", " MAJFLT ", " CMAJFLT ", " UTIME+ ", " STIME+ ", " CUTIME+ ", " CSTIME+ ", "PRI ", " NI ", "- ", "START ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", "- ", @@ -483,6 +483,10 @@ static void Process_writeField(Process* this, RichString* str, ProcessField fiel case TTY_NR: snprintf(buffer, n, "%5u ", this->tty_nr); break; case TGID: snprintf(buffer, n, Process_pidFormat, this->tgid); break; case TPGID: snprintf(buffer, n, Process_tpgidFormat, this->tpgid); break; + case MINFLT: Process_colorNumber(str, this->minflt, coloring); return; + case CMINFLT: Process_colorNumber(str, this->cminflt, coloring); return; + case MAJFLT: Process_colorNumber(str, this->majflt, coloring); return; + case CMAJFLT: Process_colorNumber(str, this->cmajflt, coloring); return; case PROCESSOR: snprintf(buffer, n, "%3d ", ProcessList_cpuId(this->pl, this->processor)); break; case NLWP: snprintf(buffer, n, "%4ld ", this->nlwp); break; case COMM: { diff --git a/Process.h b/Process.h index 774b50ac..19083fde 100644 --- a/Process.h +++ b/Process.h @@ -147,11 +147,11 @@ typedef struct Process_ { int basenameOffset; bool updated; - #ifdef DEBUG unsigned long int minflt; unsigned long int cminflt; unsigned long int majflt; unsigned long int cmajflt; + #ifdef DEBUG long int itrealvalue; unsigned long int vsize; long int rss; diff --git a/ProcessList.c b/ProcessList.c index 908d88fc..d3621155 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -444,10 +444,14 @@ static bool ProcessList_readStatFile(Process *process, const char* dirname, cons location += 1; process->flags = strtoul(location, &location, 10); location += 1; - location = strchr(location, ' ')+1; - location = strchr(location, ' ')+1; - location = strchr(location, ' ')+1; - location = strchr(location, ' ')+1; + process->minflt = strtoull(location, &location, 10); + location += 1; + process->cminflt = strtoull(location, &location, 10); + location += 1; + process->majflt = strtoull(location, &location, 10); + location += 1; + process->cmajflt = strtoull(location, &location, 10); + location += 1; process->utime = strtoull(location, &location, 10); location += 1; process->stime = strtoull(location, &location, 10); diff --git a/Settings.c b/Settings.c index 3198cb6b..cd9e6c13 100644 --- a/Settings.c +++ b/Settings.c @@ -61,7 +61,7 @@ static void Settings_readMeterModes(Settings* this, char* line, HeaderSide side) String_freeArray(ids); } -static bool Settings_read(Settings* this, char* fileName, int cpuCount) { +static bool Settings_read(Settings* this, const char* fileName, int cpuCount) { FILE* fd = fopen(fileName, "r"); if (!fd) return false; @@ -265,7 +265,6 @@ Settings* Settings_new(ProcessList* pl, Header* header, int cpuCount) { // Transition to new location and delete old configuration file if (Settings_write(this)) unlink(legacyDotfile); - free(legacyDotfile); } } else { this->changed = true; @@ -280,5 +279,6 @@ Settings* Settings_new(ProcessList* pl, Header* header, int cpuCount) { pl->highlightThreads = false; } } + free(legacyDotfile); return this; } diff --git a/configure.ac b/configure.ac index ef57ebdc..2b934e8a 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.65) -AC_INIT([htop],[1.0.2],[hisham@gobolinux.org]) +AC_INIT([htop],[1.0.3],[hisham@gobolinux.org]) # The following two lines are required by hwloc scripts AC_USE_SYSTEM_EXTENSIONS diff --git a/htop.c b/htop.c index b3438097..6b56727a 100644 --- a/htop.c +++ b/htop.c @@ -623,6 +623,9 @@ int main(int argc, char** argv) { if (inc->active) { doRefresh = IncSet_handleKey(inc, ch, panel, getMainPanelValue, NULL); + if (!inc->active) { + follow = true; + } continue; }