diff options
Diffstat (limited to 'utils/prompts.c')
-rw-r--r-- | utils/prompts.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/utils/prompts.c b/utils/prompts.c new file mode 100644 index 00000000..d0823334 --- /dev/null +++ b/utils/prompts.c @@ -0,0 +1,69 @@ +/* + * Functions for making, destroying, and manipulating prompts_t + * structures. + */ + +#include "putty.h" + +prompts_t *new_prompts(void) +{ + prompts_t *p = snew(prompts_t); + p->prompts = NULL; + p->n_prompts = p->prompts_size = 0; + p->data = NULL; + p->spr = SPR_INCOMPLETE; + p->to_server = true; /* to be on the safe side */ + p->name = p->instruction = NULL; + p->name_reqd = p->instr_reqd = false; + p->callback = NULL; + p->callback_ctx = NULL; + p->ldisc_ptr_to_us = NULL; + return p; +} + +void add_prompt(prompts_t *p, char *promptstr, bool echo) +{ + prompt_t *pr = snew(prompt_t); + pr->prompt = promptstr; + pr->echo = echo; + pr->result = strbuf_new_nm(); + sgrowarray(p->prompts, p->prompts_size, p->n_prompts); + p->prompts[p->n_prompts++] = pr; +} + +void prompt_set_result(prompt_t *pr, const char *newstr) +{ + strbuf_clear(pr->result); + put_dataz(pr->result, newstr); +} + +const char *prompt_get_result_ref(prompt_t *pr) +{ + return pr->result->s; +} + +char *prompt_get_result(prompt_t *pr) +{ + return dupstr(pr->result->s); +} + +void free_prompts(prompts_t *p) +{ + size_t i; + + /* If an Ldisc currently knows about us, tell it to forget us, so + * it won't dereference a stale pointer later. */ + if (p->ldisc_ptr_to_us) + *p->ldisc_ptr_to_us = NULL; + + for (i=0; i < p->n_prompts; i++) { + prompt_t *pr = p->prompts[i]; + strbuf_free(pr->result); + sfree(pr->prompt); + sfree(pr); + } + sfree(p->prompts); + sfree(p->name); + sfree(p->instruction); + sfree(p); +} |