static KbdintAuthctxt * kbdint_alloc(const char *devs) { KbdintAuthctxt *kbdintctxt; Buffer b; int i; #ifdef USE_PAM if (!options.use_pam) remove_kbdint_device("pam"); #endif kbdintctxt = xcalloc(1, sizeof(KbdintAuthctxt)); if (strcmp(devs, "") == 0) { buffer_init(&b); for (i = 0; devices[i]; i++) { if (buffer_len(&b) > 0) buffer_append(&b, ",", 1); buffer_append(&b, devices[i]->name, strlen(devices[i]->name)); } buffer_append(&b, "\0", 1); kbdintctxt->devices = xstrdup(buffer_ptr(&b)); buffer_free(&b); } else { kbdintctxt->devices = xstrdup(devs); } debug("kbdint_alloc: devices '%s'", kbdintctxt->devices); kbdintctxt->ctxt = NULL; kbdintctxt->device = NULL; kbdintctxt->nreq = 0; return kbdintctxt; }
char * get_challenge(Authctxt *authctxt) { char *challenge, *name, *info, **prompts; u_int i, numprompts; u_int *echo_on; #ifdef USE_PAM if (!options.use_pam) remove_kbdint_device("pam"); #endif device = devices[0]; /* we always use the 1st device for protocol 1 */ if (device == NULL) return NULL; if ((authctxt->kbdintctxt = device->init_ctx(authctxt)) == NULL) return NULL; if (device->query(authctxt->kbdintctxt, &name, &info, &numprompts, &prompts, &echo_on)) { device->free_ctx(authctxt->kbdintctxt); authctxt->kbdintctxt = NULL; return NULL; } if (numprompts < 1) fatal("get_challenge: numprompts < 1"); challenge = xstrdup(prompts[0]); for (i = 0; i < numprompts; i++) free(prompts[i]); free(prompts); free(name); free(echo_on); free(info); return (challenge); }