about summary refs log tree commit diff
path: root/src/compat/misc_conv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compat/misc_conv.c')
-rw-r--r--src/compat/misc_conv.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/compat/misc_conv.c b/src/compat/misc_conv.c
new file mode 100644
index 0000000..23d23fb
--- /dev/null
+++ b/src/compat/misc_conv.c
@@ -0,0 +1,59 @@
+/* ISC license. */
+
+#include <string.h>
+#include <stdlib.h>
+#include <skalibs/allreadwrite.h>
+#include <skalibs/strerr.h>
+#include <skalibs/stralloc.h>
+#include <pamela/pam.h>
+#include <pamela/compat.h>
+
+/*
+static void freeres (struct pam_response *res, unsigned int n)
+{
+  while (n--) free(res[n].resp) ;
+  free(res) ;
+}
+*/
+
+static int getsa (int h, char const *msg, stralloc *sa)
+{
+  /* TODO: complete this */
+  return 0 ;
+}
+
+int misc_conv (int n, struct pam_message const **msg, struct pam_response **resp, void *aux)
+{
+  stralloc sa = STRALLOC_ZERO ;
+  struct pam_response *res ;
+  if (n <= 0) return PAM_CONV_ERR ;
+  res = malloc(n * sizeof(struct pam_response)) ;
+  if (!res) return PAM_CONV_ERR ;
+  for (unsigned int i = 0 ; i < n ; i++)
+  {
+    switch (msg[i]->msg_style)
+    {
+      case PAM_PROMPT_ECHO_OFF :
+        if (getsa(0, msg[i]->msg, &sa)) goto fail ;
+        break ;
+      case PAM_PROMPT_ECHO_ON :
+        if (getsa(1, msg[i]->msg, &sa)) goto fail ;
+        break ;
+      case PAM_ERROR_MSG :
+        strerr_warnw1x(msg[i]->msg) ;
+        break ;
+      case PAM_TEXT_INFO :
+      {
+        size_t len = strlen(msg[i]->msg) ;
+        if (allwrite(1, msg[i]->msg, len) < len) goto fail ;
+        break ;
+      }
+      case PAM_BINARY_PROMPT : /* TODO */
+        break ;
+    }
+  }
+  return 0 ;
+
+ fail:  /* TODO: check */
+  return -1 ;
+}