aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/msteinert/pam/transaction.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/msteinert/pam/transaction.c')
-rw-r--r--vendor/github.com/msteinert/pam/transaction.c51
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;
+}