X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/447940b31cc47df5b2e94a1e3e100dedced5ccd2..7374c7790ee32f36855e4257eb15d2fe43e277ea:/misc.c diff --git a/misc.c b/misc.c index 9d71a8d4..09506de2 100644 --- a/misc.c +++ b/misc.c @@ -87,6 +87,46 @@ char ctrlparse(char *s, char **next) return c; } +prompts_t *new_prompts(void *frontend) +{ + prompts_t *p = snew(prompts_t); + p->prompts = NULL; + p->n_prompts = 0; + p->frontend = frontend; + p->data = NULL; + p->to_server = TRUE; /* to be on the safe side */ + p->name = p->instruction = NULL; + p->name_reqd = p->instr_reqd = FALSE; + return p; +} +void add_prompt(prompts_t *p, char *promptstr, int echo, size_t len) +{ + prompt_t *pr = snew(prompt_t); + unsigned char *result = snewn(len, unsigned char); + pr->prompt = promptstr; + pr->echo = echo; + pr->result = result; + pr->result_len = len; + p->n_prompts++; + p->prompts = sresize(p->prompts, p->n_prompts, prompt_t *); + p->prompts[p->n_prompts-1] = pr; +} +void free_prompts(prompts_t *p) +{ + size_t i; + for (i=0; i < p->n_prompts; i++) { + prompt_t *pr = p->prompts[i]; + memset(pr->result, 0, pr->result_len); /* burn the evidence */ + sfree(pr->result); + sfree(pr->prompt); + sfree(pr); + } + sfree(p->prompts); + sfree(p->name); + sfree(p->instruction); + sfree(p); +} + /* ---------------------------------------------------------------------- * String handling routines. */ @@ -441,6 +481,7 @@ void *safemalloc(size_t n, size_t size) p = NULL; } else { size *= n; + if (size == 0) size = 1; #ifdef MINEFIELD p = minefield_c_malloc(size); #else @@ -584,3 +625,23 @@ void debug_memdump(void *buf, int len, int L) } #endif /* def DEBUG */ + +/* + * Determine whether or not a Config structure represents a session + * which can sensibly be launched right now. + */ +int cfg_launchable(const Config *cfg) +{ + if (cfg->protocol == PROT_SERIAL) + return cfg->serline[0] != 0; + else + return cfg->host[0] != 0; +} + +char const *cfg_dest(const Config *cfg) +{ + if (cfg->protocol == PROT_SERIAL) + return cfg->serline; + else + return cfg->host; +}