amount of examples and references I've found [1], I *think* I need to write a new conversation function and pass that to pam_start(), but I haven't figured out the propper syntax to do that [2].
Correct.. kind of.
int static_conv(int n, const struct pam_message **msg, struct pam_response **resp, void *data)
the void * here is for your "custom" data. I usually define a structure like:
// The structure used to pass a username and password to pam typedef struct auth_struct { // Username to authenticate const char *username; // Password to use const char *password; } auth_struct;
Then setup a conversation structure for PAM:
static struct pam_conv myauthconv = {
auth_conv, // conversation function
NULL };
And finally, fill in and provide the auth structure:
struct auth_struct buffer;
buffer.username = username;
buffer.password = password;
myauthconv.appdata_ptr = &buffer; // This is the meat of the idea here - we need to tell PAM to pass our structure as the 'user defined data' in the last argument of our conversation function
Now when your conv callback gets hit, pam will pass it the appdata_ptr as the last argument and you can cast it back to a structure and get whatever info you needed out of it.
Hope that helps! Nate Yocom
Also - Note that I have written an entire section on writing PAM aware applications for use with network programming in my (co-authored) upcoming title: http://www.apress.com/book/bookDisplay.html?bID=309 - The Definitive Guide to Linux Network Programming - pre-order your copy today!
_______________________________________________ Pam-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/pam-list