Work out config file when needed not at startup.

This commit is contained in:
nicm 2015-09-01 10:10:59 +00:00
parent 83157c02d6
commit 952ba84611
3 changed files with 26 additions and 22 deletions

16
cfg.c
View File

@ -28,6 +28,7 @@
#include "tmux.h" #include "tmux.h"
char *cfg_file;
struct cmd_q *cfg_cmd_q; struct cmd_q *cfg_cmd_q;
int cfg_finished; int cfg_finished;
int cfg_references; int cfg_references;
@ -37,10 +38,18 @@ struct client *cfg_client;
void cfg_default_done(struct cmd_q *); void cfg_default_done(struct cmd_q *);
void
set_cfg_file(const char *path)
{
free(cfg_file);
cfg_file = xstrdup(path);
}
void void
start_cfg(void) start_cfg(void)
{ {
char *cause = NULL; char *cause = NULL;
const char *home;
cfg_cmd_q = cmdq_new(NULL); cfg_cmd_q = cmdq_new(NULL);
cfg_cmd_q->emptyfn = cfg_default_done; cfg_cmd_q->emptyfn = cfg_default_done;
@ -58,6 +67,13 @@ start_cfg(void)
} else if (errno != ENOENT) } else if (errno != ENOENT)
cfg_add_cause("%s: %s", TMUX_CONF, strerror(errno)); cfg_add_cause("%s: %s", TMUX_CONF, strerror(errno));
if (cfg_file == NULL && (home = find_home()) != NULL) {
xasprintf(&cfg_file, "%s/.tmux.conf", home);
if (access(cfg_file, R_OK) != 0 && errno == ENOENT) {
free(cfg_file);
cfg_file = NULL;
}
}
if (cfg_file != NULL && load_cfg(cfg_file, cfg_cmd_q, &cause) == -1) if (cfg_file != NULL && load_cfg(cfg_file, cfg_cmd_q, &cause) == -1)
cfg_add_cause("%s: %s", cfg_file, cause); cfg_add_cause("%s: %s", cfg_file, cause);
free(cause); free(cause);

22
tmux.c
View File

@ -41,7 +41,6 @@ struct options global_s_options; /* session options */
struct options global_w_options; /* window options */ struct options global_w_options; /* window options */
struct environ global_environ; struct environ global_environ;
char *cfg_file;
char *shell_cmd; char *shell_cmd;
int debug_level; int debug_level;
time_t start_time; time_t start_time;
@ -172,7 +171,10 @@ const char *
find_home(void) find_home(void)
{ {
struct passwd *pw; struct passwd *pw;
const char *home; static const char *home;
if (home != NULL)
return (home);
home = getenv("HOME"); home = getenv("HOME");
if (home == NULL || *home == '\0') { if (home == NULL || *home == '\0') {
@ -190,7 +192,6 @@ int
main(int argc, char **argv) main(int argc, char **argv)
{ {
char *s, *path, *label, **var, tmp[PATH_MAX]; char *s, *path, *label, **var, tmp[PATH_MAX];
const char *home;
int opt, flags, keys; int opt, flags, keys;
#ifdef DEBUG #ifdef DEBUG
@ -221,8 +222,7 @@ main(int argc, char **argv)
flags |= CLIENT_CONTROL; flags |= CLIENT_CONTROL;
break; break;
case 'f': case 'f':
free(cfg_file); set_cfg_file(optarg);
cfg_file = xstrdup(optarg);
break; break;
case 'l': case 'l':
flags |= CLIENT_LOGIN; flags |= CLIENT_LOGIN;
@ -306,18 +306,6 @@ main(int argc, char **argv)
options_set_number(&global_w_options, "mode-keys", keys); options_set_number(&global_w_options, "mode-keys", keys);
} }
/* Locate the configuration file. */
if (cfg_file == NULL) {
home = find_home();
if (home != NULL) {
xasprintf(&cfg_file, "%s/.tmux.conf", home);
if (access(cfg_file, R_OK) != 0 && errno == ENOENT) {
free(cfg_file);
cfg_file = NULL;
}
}
}
/* /*
* Figure out the socket path. If specified on the command-line with -S * Figure out the socket path. If specified on the command-line with -S
* or -L, use it, otherwise try $TMUX or assume -L default. * or -L, use it, otherwise try $TMUX or assume -L default.

2
tmux.h
View File

@ -1407,7 +1407,6 @@ extern struct options global_options;
extern struct options global_s_options; extern struct options global_s_options;
extern struct options global_w_options; extern struct options global_w_options;
extern struct environ global_environ; extern struct environ global_environ;
extern char *cfg_file;
extern char *shell_cmd; extern char *shell_cmd;
extern int debug_level; extern int debug_level;
extern time_t start_time; extern time_t start_time;
@ -1425,6 +1424,7 @@ extern int cfg_references;
extern struct client *cfg_client; extern struct client *cfg_client;
void start_cfg(void); void start_cfg(void);
int load_cfg(const char *, struct cmd_q *, char **); int load_cfg(const char *, struct cmd_q *, char **);
void set_cfg_file(const char *);
void cfg_add_cause(const char *, ...); void cfg_add_cause(const char *, ...);
void cfg_print_causes(struct cmd_q *); void cfg_print_causes(struct cmd_q *);
void cfg_show_causes(struct session *); void cfg_show_causes(struct session *);