diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2021-03-12 16:56:06 +0100 |
---|---|---|
committer | Christian Göttsche <cgzones@googlemail.com> | 2021-03-12 16:56:06 +0100 |
commit | 521f1343e372e011326e10cf58a9ba1d191b7bdb (patch) | |
tree | aea050326b3d520f96b6e6a1480c9b21229b50d3 | |
parent | 350b48e44c45a280520c15762a04940670b6aec9 (diff) |
Settings: check if writing configuration file was successful
Writing to the file stream might fail due to a immutable file or a
filesystem error.
Check the error indicator for the stream and for fclose() failures.
-rw-r--r-- | Settings.c | 13 | ||||
-rw-r--r-- | Settings.h | 2 | ||||
-rw-r--r-- | htop.c | 9 |
3 files changed, 16 insertions, 8 deletions
@@ -7,6 +7,7 @@ in the source distribution for its full text. #include "Settings.h" +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -280,10 +281,10 @@ static void writeMeterModes(const Settings* this, FILE* fd, int column) { fprintf(fd, "\n"); } -bool Settings_write(const Settings* this) { +int Settings_write(const Settings* this) { FILE* fd = fopen(this->filename, "w"); if (fd == NULL) - return false; + return -errno; fprintf(fd, "# Beware! This file is rewritten by htop when settings are changed in the interface.\n"); fprintf(fd, "# The parser is also very primitive, and not human-friendly.\n"); @@ -331,8 +332,10 @@ bool Settings_write(const Settings* this) { #ifdef HAVE_LIBHWLOC fprintf(fd, "topology_affinity=%d\n", (int) this->topologyAffinity); #endif - fclose(fd); - return true; + + int r1 = ferror(fd); + int r2 = fclose(fd); + return r1 ? r1 : r2; } Settings* Settings_new(int initialCpuCount) { @@ -422,7 +425,7 @@ Settings* Settings_new(int initialCpuCount) { ok = Settings_read(this, legacyDotfile, initialCpuCount); if (ok) { // Transition to new location and delete old configuration file - if (Settings_write(this)) { + if (Settings_write(this) == 0) { unlink(legacyDotfile); } } @@ -87,7 +87,7 @@ static inline int Settings_getActiveDirection(const Settings* this) { void Settings_delete(Settings* this); -bool Settings_write(const Settings* this); +int Settings_write(const Settings* this); Settings* Settings_new(int initialCpuCount); @@ -482,8 +482,13 @@ int main(int argc, char** argv) { Platform_done(); CRT_done(); - if (settings->changed) - Settings_write(settings); + + if (settings->changed) { + int r = Settings_write(settings); + if (r < 0) + fprintf(stderr, "Can not save configuration to %s: %s\n", settings->filename, strerror(-r)); + } + Header_delete(header); ProcessList_delete(pl); |