diff options
Diffstat (limited to 'vendor/github.com/msteinert/pam/transaction.c')
-rw-r--r-- | vendor/github.com/msteinert/pam/transaction.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/vendor/github.com/msteinert/pam/transaction.c b/vendor/github.com/msteinert/pam/transaction.c new file mode 100644 index 00000000..4ff649b1 --- /dev/null +++ b/vendor/github.com/msteinert/pam/transaction.c @@ -0,0 +1,51 @@ +#include "_cgo_export.h" +#include <security/pam_appl.h> +#include <string.h> + +int cb_pam_conv( + int num_msg, + const struct pam_message **msg, + struct pam_response **resp, + void *appdata_ptr) +{ + *resp = calloc(num_msg, sizeof **resp); + if (num_msg <= 0 || num_msg > PAM_MAX_NUM_MSG) { + return PAM_CONV_ERR; + } + if (!*resp) { + return PAM_BUF_ERR; + } + for (size_t i = 0; i < num_msg; ++i) { + struct cbPAMConv_return result = cbPAMConv( + msg[i]->msg_style, + (char *)msg[i]->msg, + appdata_ptr); + if (result.r1 != PAM_SUCCESS) { + goto error; + } + (*resp)[i].resp = result.r0; + } + return PAM_SUCCESS; +error: + for (size_t i = 0; i < num_msg; ++i) { + if ((*resp)[i].resp) { + memset((*resp)[i].resp, 0, strlen((*resp)[i].resp)); + free((*resp)[i].resp); + } + } + memset(*resp, 0, num_msg * sizeof *resp); + free(*resp); + *resp = NULL; + return PAM_CONV_ERR; +} + +struct pam_conv *make_pam_conv(void *appdata_ptr) +{ + struct pam_conv* conv = malloc(sizeof *conv); + if (!conv) { + return NULL; + } + conv->conv = cb_pam_conv; + conv->appdata_ptr = appdata_ptr; + return conv; +} |