version 1.14, 2012/11/27 16:12:29 |
version 1.15, 2013/03/24 09:54:10 |
|
|
* Sources a configuration file. |
* Sources a configuration file. |
*/ |
*/ |
|
|
enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmd_ctx *); |
enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmd_q *); |
|
|
|
void cmd_source_file_show(struct cmd_q *); |
|
void cmd_source_file_done(struct cmd_q *); |
|
|
const struct cmd_entry cmd_source_file_entry = { |
const struct cmd_entry cmd_source_file_entry = { |
"source-file", "source", |
"source-file", "source", |
"", 1, 1, |
"", 1, 1, |
|
|
}; |
}; |
|
|
enum cmd_retval |
enum cmd_retval |
cmd_source_file_exec(struct cmd *self, struct cmd_ctx *ctx) |
cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq) |
{ |
{ |
struct args *args = self->args; |
struct args *args = self->args; |
int retval; |
struct cmd_q *cmdq1; |
u_int i; |
char *cause; |
char *cause; |
|
|
|
retval = load_cfg(args->argv[0], ctx, &cfg_causes); |
cmdq1 = cmdq_new(NULL); |
|
cmdq1->emptyfn = cmd_source_file_done; |
|
cmdq1->data = cmdq; |
|
|
/* |
switch (load_cfg(args->argv[0], cmdq1, &cause)) { |
* If the context for the cmdclient came from tmux's configuration |
case -1: |
* file, then return the status of this command now, regardless of the |
if (cfg_references == 0) { |
* error condition. Any errors from parsing a configuration file at |
cmdq_free(cmdq1); |
* startup will be handled for us by the server. |
cmdq_error(cmdq, "%s", cause); |
*/ |
free(cause); |
if (cfg_references > 0 || |
return (CMD_RETURN_ERROR); |
(ctx->curclient == NULL && ctx->cmdclient == NULL)) |
} |
return (retval); |
ARRAY_ADD(&cfg_causes, cause); |
|
/* FALLTHROUGH */ |
|
case 0: |
|
if (cfg_references == 0) |
|
cmd_source_file_show(cmdq); |
|
cmdq_free(cmdq1); |
|
return (CMD_RETURN_NORMAL); |
|
} |
|
|
/* |
cmdq->references++; |
* We were called from the command-line in which case print the errors |
cfg_references++; |
* gathered here directly. |
|
*/ |
cmdq_continue(cmdq1); |
|
return (CMD_RETURN_WAIT); |
|
} |
|
|
|
void |
|
cmd_source_file_show(struct cmd_q *cmdq) |
|
{ |
|
u_int i; |
|
char *cause; |
|
|
for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) { |
for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) { |
cause = ARRAY_ITEM(&cfg_causes, i); |
cause = ARRAY_ITEM(&cfg_causes, i); |
ctx->print(ctx, "%s", cause); |
cmdq_print(cmdq, "%s", cause); |
free(cause); |
free(cause); |
} |
} |
ARRAY_FREE(&cfg_causes); |
ARRAY_FREE(&cfg_causes); |
|
} |
|
|
return (retval); |
void |
|
cmd_source_file_done(struct cmd_q *cmdq1) |
|
{ |
|
struct cmd_q *cmdq = cmdq1->data; |
|
|
|
cmdq_free(cmdq1); |
|
|
|
cfg_references--; |
|
if (cmdq_free(cmdq) || cfg_references != 0) |
|
return; |
|
|
|
cmd_source_file_show(cmdq); |
|
|
|
cmdq_continue(cmdq); |
} |
} |