From e2b58f0ab81b2aafeb8c29a69abad7829fa21ab3 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:00:30 +0200 Subject: Imported Upstream version 1.0.1 --- Settings.c | 71 +++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 21 deletions(-) (limited to 'Settings.c') diff --git a/Settings.c b/Settings.c index 816a7ec..f2573e8 100644 --- a/Settings.c +++ b/Settings.c @@ -6,15 +6,21 @@ in the source distribution for its full text. */ #include "Settings.h" + #include "String.h" -#include "ProcessList.h" -#include "Header.h" +#include "Vector.h" -#include "debug.h" +#include +#include +#include +#include #define DEFAULT_DELAY 15 /*{ +#include "ProcessList.h" +#include "Header.h" +#include typedef struct Settings_ { char* userSettings; @@ -56,13 +62,10 @@ static void Settings_readMeterModes(Settings* this, char* line, HeaderSide side) } static bool Settings_read(Settings* this, char* fileName, int cpuCount) { - // TODO: implement File object and make - // file I/O object-oriented. - FILE* fd; - fd = fopen(fileName, "r"); - if (fd == NULL) { + FILE* fd = fopen(fileName, "r"); + if (!fd) return false; - } + const int maxLine = 2048; char buffer[maxLine]; bool readMeters = false; @@ -212,21 +215,47 @@ Settings* Settings_new(ProcessList* pl, Header* header, int cpuCount) { Settings* this = malloc(sizeof(Settings)); this->pl = pl; this->header = header; - const char* home; - char* rcfile; - home = getenv("HOME_ETC"); - if (!home) home = getenv("HOME"); - if (!home) home = ""; - rcfile = getenv("HOMERC"); - if (!rcfile) - this->userSettings = String_cat(home, "/.htoprc"); - else - this->userSettings = String_copy(rcfile); + char* legacyDotfile = NULL; + char* rcfile = getenv("HTOPRC"); + if (rcfile) { + this->userSettings = strdup(rcfile); + } else { + const char* home = getenv("HOME"); + if (!home) home = ""; + const char* xdgConfigHome = getenv("XDG_CONFIG_HOME"); + char* configDir = NULL; + char* htopDir = NULL; + if (xdgConfigHome) { + this->userSettings = String_cat(xdgConfigHome, "/htop/htoprc"); + configDir = strdup(xdgConfigHome); + htopDir = String_cat(xdgConfigHome, "/htop"); + } else { + this->userSettings = String_cat(home, "/.config/htop/htoprc"); + configDir = String_cat(home, "/.config"); + htopDir = String_cat(home, "/.config/htop"); + } + legacyDotfile = String_cat(home, "/.htoprc"); + mkdir(configDir, 0700); + mkdir(htopDir, 0700); + free(htopDir); + free(configDir); + if (access(legacyDotfile, R_OK) != 0) { + free(legacyDotfile); + legacyDotfile = NULL; + } + } this->colorScheme = 0; this->changed = false; this->delay = DEFAULT_DELAY; - bool ok = Settings_read(this, this->userSettings, cpuCount); - if (!ok) { + bool ok = Settings_read(this, legacyDotfile ? legacyDotfile : this->userSettings, cpuCount); + if (ok) { + if (legacyDotfile) { + // Transition to new location and delete old configuration file + if (Settings_write(this)) + unlink(legacyDotfile); + free(legacyDotfile); + } + } else { this->changed = true; // TODO: how to get SYSCONFDIR correctly through Autoconf? char* systemSettings = String_cat(SYSCONFDIR, "/htoprc"); -- cgit v1.2.3