version 1.18, 2013/03/24 09:27:19 |
version 1.19, 2013/03/24 09:54:10 |
|
|
*/ |
*/ |
|
|
void cmd_confirm_before_key_binding(struct cmd *, int); |
void cmd_confirm_before_key_binding(struct cmd *, int); |
enum cmd_retval cmd_confirm_before_exec(struct cmd *, struct cmd_ctx *); |
enum cmd_retval cmd_confirm_before_exec(struct cmd *, struct cmd_q *); |
|
|
int cmd_confirm_before_callback(void *, const char *); |
int cmd_confirm_before_callback(void *, const char *); |
void cmd_confirm_before_free(void *); |
void cmd_confirm_before_free(void *); |
|
|
}; |
}; |
|
|
struct cmd_confirm_before_data { |
struct cmd_confirm_before_data { |
struct client *c; |
|
char *cmd; |
char *cmd; |
|
struct client *client; |
}; |
}; |
|
|
void |
void |
|
|
} |
} |
|
|
enum cmd_retval |
enum cmd_retval |
cmd_confirm_before_exec(struct cmd *self, struct cmd_ctx *ctx) |
cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq) |
{ |
{ |
struct args *args = self->args; |
struct args *args = self->args; |
struct cmd_confirm_before_data *cdata; |
struct cmd_confirm_before_data *cdata; |
|
|
char *cmd, *copy, *new_prompt, *ptr; |
char *cmd, *copy, *new_prompt, *ptr; |
const char *prompt; |
const char *prompt; |
|
|
if (ctx->curclient == NULL) { |
if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL) |
ctx->error(ctx, "must be run interactively"); |
|
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
} |
|
|
|
if ((c = cmd_find_client(ctx, args_get(args, 't'), 0)) == NULL) |
|
return (CMD_RETURN_ERROR); |
|
|
|
if ((prompt = args_get(args, 'p')) != NULL) |
if ((prompt = args_get(args, 'p')) != NULL) |
xasprintf(&new_prompt, "%s ", prompt); |
xasprintf(&new_prompt, "%s ", prompt); |
else { |
else { |
|
|
|
|
cdata = xmalloc(sizeof *cdata); |
cdata = xmalloc(sizeof *cdata); |
cdata->cmd = xstrdup(args->argv[0]); |
cdata->cmd = xstrdup(args->argv[0]); |
cdata->c = c; |
|
status_prompt_set(cdata->c, new_prompt, NULL, |
cdata->client = c; |
|
cdata->client->references++; |
|
|
|
status_prompt_set(c, new_prompt, NULL, |
cmd_confirm_before_callback, cmd_confirm_before_free, cdata, |
cmd_confirm_before_callback, cmd_confirm_before_free, cdata, |
PROMPT_SINGLE); |
PROMPT_SINGLE); |
|
|
free(new_prompt); |
free(new_prompt); |
return (CMD_RETURN_YIELD); |
return (CMD_RETURN_NORMAL); |
} |
} |
|
|
int |
int |
cmd_confirm_before_callback(void *data, const char *s) |
cmd_confirm_before_callback(void *data, const char *s) |
{ |
{ |
struct cmd_confirm_before_data *cdata = data; |
struct cmd_confirm_before_data *cdata = data; |
struct client *c = cdata->c; |
struct client *c = cdata->client; |
struct cmd_list *cmdlist; |
struct cmd_list *cmdlist; |
struct cmd_ctx *ctx; |
|
char *cause; |
char *cause; |
|
|
|
if (c->flags & CLIENT_DEAD) |
|
return (0); |
|
|
if (s == NULL || *s == '\0') |
if (s == NULL || *s == '\0') |
return (0); |
return (0); |
if (tolower((u_char) s[0]) != 'y' || s[1] != '\0') |
if (tolower((u_char) s[0]) != 'y' || s[1] != '\0') |
return (0); |
return (0); |
|
|
if (cmd_string_parse(cdata->cmd, &cmdlist, &cause) != 0) { |
if (cmd_string_parse(cdata->cmd, &cmdlist, NULL, 0, &cause) != 0) { |
if (cause != NULL) { |
if (cause != NULL) { |
*cause = toupper((u_char) *cause); |
cmdq_error(c->cmdq, "%s", cause); |
status_message_set(c, "%s", cause); |
|
free(cause); |
free(cause); |
} |
} |
return (0); |
return (0); |
} |
} |
|
|
ctx = cmd_get_ctx(NULL, c); |
cmdq_run(c->cmdq, cmdlist); |
ctx->error = key_bindings_error; |
|
ctx->print = key_bindings_print; |
|
ctx->info = key_bindings_info; |
|
|
|
cmd_list_exec(cmdlist, ctx); |
|
cmd_list_free(cmdlist); |
cmd_list_free(cmdlist); |
cmd_free_ctx(ctx); |
|
|
|
return (0); |
return (0); |
} |
} |
|
|
cmd_confirm_before_free(void *data) |
cmd_confirm_before_free(void *data) |
{ |
{ |
struct cmd_confirm_before_data *cdata = data; |
struct cmd_confirm_before_data *cdata = data; |
|
struct client *c = cdata->client; |
|
|
|
c->references--; |
|
|
free(cdata->cmd); |
free(cdata->cmd); |
free(cdata); |
free(cdata); |