diff options
Diffstat (limited to 'i3status.c')
-rw-r--r-- | i3status.c | 35 |
1 files changed, 34 insertions, 1 deletions
@@ -19,6 +19,9 @@ #include <getopt.h> #include <signal.h> #include <confuse.h> +#include <glob.h> +#include <sys/stat.h> +#include <sys/types.h> #include "i3status.h" @@ -37,6 +40,27 @@ void sigpipe(int signum) { exit(1); } +/* + * Checks if there is a file at the given path (expanding ~) and returns the + * full path if so or NULL if there is no file. + * + */ +char *file_exists(const char *path) { + static glob_t globbuf; + struct stat buf; + char *full_path = NULL; + + if (glob(path, GLOB_NOCHECK | GLOB_TILDE, NULL, &globbuf) < 0) + return NULL; + + full_path = (globbuf.gl_pathc > 0 ? globbuf.gl_pathv[0] : path); + + if (stat(full_path, &buf) < 0) + return NULL; + + return full_path; +} + int main(int argc, char *argv[]) { unsigned int j; @@ -111,7 +135,7 @@ int main(int argc, char *argv[]) { CFG_END() }; - char *configfile = PREFIX "/etc/i3status.conf"; + char *configfile; int o, option_index = 0; struct option long_options[] = { {"config", required_argument, 0, 'c'}, @@ -124,6 +148,12 @@ int main(int argc, char *argv[]) { action.sa_handler = sigpipe; sigaction(SIGPIPE, &action, NULL); + /* Figure out which configuration file to use before the user may + * override this setting using -c */ + + if ((configfile = file_exists("~/.i3status.conf")) == NULL) + configfile = file_exists(PREFIX "/etc/i3status.conf"); + while ((o = getopt_long(argc, argv, "c:h", long_options, &option_index)) != -1) if ((char)o == 'c') configfile = optarg; @@ -133,6 +163,9 @@ int main(int argc, char *argv[]) { return 0; } + if (configfile == NULL) + die("No configuration file found\n"); + cfg = cfg_init(opts, CFGF_NONE); if (cfg_parse(cfg, configfile) == CFG_PARSE_ERROR) return EXIT_FAILURE; |