version 1.52, 2021/10/28 18:39:15 |
version 1.53, 2023/04/28 06:12:27 |
|
|
.name = "confirm-before", |
.name = "confirm-before", |
.alias = "confirm", |
.alias = "confirm", |
|
|
.args = { "bp:t:", 1, 1, cmd_confirm_before_args_parse }, |
.args = { "bc:p:t:y", 1, 1, cmd_confirm_before_args_parse }, |
.usage = "[-b] [-p prompt] " CMD_TARGET_CLIENT_USAGE " command", |
.usage = "[-by] [-c confirm_key] [-p prompt] " CMD_TARGET_CLIENT_USAGE |
|
" command", |
|
|
.flags = CMD_CLIENT_TFLAG, |
.flags = CMD_CLIENT_TFLAG, |
.exec = cmd_confirm_before_exec |
.exec = cmd_confirm_before_exec |
|
|
struct cmd_confirm_before_data { |
struct cmd_confirm_before_data { |
struct cmdq_item *item; |
struct cmdq_item *item; |
struct cmd_list *cmdlist; |
struct cmd_list *cmdlist; |
|
u_char confirm_key; |
|
int default_yes; |
}; |
}; |
|
|
static enum args_parse_type |
static enum args_parse_type |
|
|
struct client *tc = cmdq_get_target_client(item); |
struct client *tc = cmdq_get_target_client(item); |
struct cmd_find_state *target = cmdq_get_target(item); |
struct cmd_find_state *target = cmdq_get_target(item); |
char *new_prompt; |
char *new_prompt; |
const char *prompt, *cmd; |
const char *confirm_key, *prompt, *cmd; |
int wait = !args_has(args, 'b'); |
int wait = !args_has(args, 'b'); |
|
|
cdata = xcalloc(1, sizeof *cdata); |
cdata = xcalloc(1, sizeof *cdata); |
|
|
if (wait) |
if (wait) |
cdata->item = item; |
cdata->item = item; |
|
|
|
cdata->default_yes = args_has(args, 'y'); |
|
if ((confirm_key = args_get(args, 'c')) != NULL) { |
|
if (confirm_key[1] == '\0' && |
|
confirm_key[0] > 31 && |
|
confirm_key[0] < 127) |
|
cdata->confirm_key = confirm_key[0]; |
|
else { |
|
cmdq_error(item, "invalid confirm key"); |
|
return (CMD_RETURN_ERROR); |
|
} |
|
} |
|
else |
|
cdata->confirm_key = 'y'; |
|
|
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 { |
cmd = cmd_get_entry(cmd_list_first(cdata->cmdlist))->name; |
cmd = cmd_get_entry(cmd_list_first(cdata->cmdlist))->name; |
xasprintf(&new_prompt, "Confirm '%s'? (y/n) ", cmd); |
xasprintf(&new_prompt, "Confirm '%s'? (%c/n) ", |
|
cmd, cdata->confirm_key); |
} |
} |
|
|
status_prompt_set(tc, target, new_prompt, NULL, |
status_prompt_set(tc, target, new_prompt, NULL, |
|
|
if (c->flags & CLIENT_DEAD) |
if (c->flags & CLIENT_DEAD) |
goto out; |
goto out; |
|
|
if (s == NULL || *s == '\0') |
if (s == NULL) |
goto out; |
goto out; |
if (tolower((u_char)s[0]) != 'y' || s[1] != '\0') |
if (s[0] != cdata->confirm_key && (s[0] != '\0' || !cdata->default_yes)) |
goto out; |
goto out; |
retcode = 0; |
retcode = 0; |
|
|
|
|
} |
} |
|
|
out: |
out: |
if (item != NULL) { |
if (item != NULL) { |
if (cmdq_get_client(item) != NULL && |
if (cmdq_get_client(item) != NULL && |
cmdq_get_client(item)->session == NULL) |
cmdq_get_client(item)->session == NULL) |
cmdq_get_client(item)->retval = retcode; |
cmdq_get_client(item)->retval = retcode; |
cmdq_continue(item); |
cmdq_continue(item); |
} |
} |
return (0); |
return (0); |
} |
} |
|
|