#include #include #include #include #include #include "pam.h" class pam_conversation_impl : public pam_conversation { private: struct pam_conv *pam_conv_; public: pam_conversation_impl(pam_conv *conv) : pam_conv_(conv) {} int conv(const std::vector &prompts, std::vector &answers); }; class pam_impl : public pam { public: int get_conversation(pam_handle_t *pamh, std::shared_ptr &conversation); }; int pam_impl::get_conversation(pam_handle_t *pamh, std::shared_ptr &conversation) { struct pam_conv *pam_conv; int result = pam_get_item(pamh, PAM_CONV, (const void **)&pam_conv); conversation.reset(new pam_conversation_impl(pam_conv)); return result; } int pam_conversation_impl::conv(const std::vector &prompts, std::vector &answers) { return pam_conv_->conv(prompts.size(), const_cast(prompts.data()), answers.data(), pam_conv_->appdata_ptr); } pam_p get_system_pam() { return (pam_p)new pam_impl; }