diff --git a/CRT.c b/CRT.c index 97f2144e..6cc979f7 100644 --- a/CRT.c +++ b/CRT.c @@ -11,8 +11,10 @@ in the source distribution for its full text. #include "String.h" #include +#include #include #include +#include #ifdef HAVE_EXECINFO_H #include #endif @@ -198,6 +200,13 @@ void CRT_done() { endwin(); } +void CRT_fatalError(const char* note) { + char* sysMsg = strerror(errno); + CRT_done(); + fprintf(stderr, "%s: %s\n", note, sysMsg); + exit(2); +} + int CRT_readKey() { nocbreak(); cbreak(); diff --git a/CRT.h b/CRT.h index 1fe3d248..7916b16d 100644 --- a/CRT.h +++ b/CRT.h @@ -119,6 +119,8 @@ void CRT_init(int delay, int colorScheme); void CRT_done(); +void CRT_fatalError(const char* note); + int CRT_readKey(); void CRT_disableDelay(); diff --git a/ChangeLog b/ChangeLog index 45b4edbb..4376249d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ What's new in version 1.0.2 * Add IO priority support ('i' key) * Avoid deleting .htoprc if it is a symlink +* Fail gracefully when /proc is not mounted + (thanks to Philipp Hagemeister) * BUGFIX: Fix crashes when process list is empty What's new in version 1.0.1 diff --git a/ProcessList.c b/ProcessList.c index 268793f2..30cc8012 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -193,7 +193,9 @@ ProcessList* ProcessList_new(UsersTable* usersTable, Hashtable* pidWhiteList) { this->processes2 = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare); FILE* file = fopen(PROCSTATFILE, "r"); - assert(file != NULL); + if (file == NULL) { + CRT_fatalError("Cannot open " PROCSTATFILE); + } char buffer[256]; int cpus = -1; do { @@ -758,7 +760,9 @@ void ProcessList_scan(ProcessList* this) { unsigned long long int swapFree = 0; FILE* file = fopen(PROCMEMINFOFILE, "r"); - assert(file != NULL); + if (file == NULL) { + CRT_fatalError("Cannot open " PROCMEMINFOFILE); + } int cpus = this->cpuCount; { char buffer[128]; @@ -796,7 +800,9 @@ void ProcessList_scan(ProcessList* this) { fclose(file); file = fopen(PROCSTATFILE, "r"); - assert(file != NULL); + if (file == NULL) { + CRT_fatalError("Cannot open " PROCSTATFILE); + } for (int i = 0; i <= cpus; i++) { char buffer[256]; int cpuid;