path: root/doc/man/pam_conv.3
diff options
authorThorsten Kukuk <>2006-03-12 21:29:44 +0000
committerThorsten Kukuk <>2006-03-12 21:29:44 +0000
commit9569b246d900234c4276c46181147c24e5a6ec43 (patch)
tree30f38c358f104fd3835849c47506463902ba5ae6 /doc/man/pam_conv.3
parentd1623a3eec7265ad6be1b13292d19718d7816478 (diff)
Relevant BUGIDs:
Purpose of commit: new feature Commit summary: --------------- More manual pages 2006-03-12 Thorsten Kukuk <> * doc/man/ Add new manual pages. * doc/man/pam.conf.5.xml: Replace link with content of PAM admin guide. * doc/man/pam.conf.5: Regenerated from XML file. * doc/man/pam_info.3.xml: New. * doc/man/pam_info.3: New, generated from XML file. * doc/man/pam_vinfo.3: New, generated from XML file. * doc/man/pam_conv.3.xml: New. * doc/man/pam_conv.3: New, generated from XML file. * doc/man/pam_putenv.3.xml: New. * doc/man/pam_putenv.3: New, generated from XML file. * doc/man/pam_getenv.3.xml: New. * doc/man/pam_getenv.3: New, generated from XML file. * doc/man/pam_getenvlist.3.xml: New. * doc/man/pam_getenvlist.3: New, generated from XML file.
Diffstat (limited to 'doc/man/pam_conv.3')
1 files changed, 117 insertions, 0 deletions
diff --git a/doc/man/pam_conv.3 b/doc/man/pam_conv.3
new file mode 100644
index 00000000..6b181486
--- /dev/null
+++ b/doc/man/pam_conv.3
@@ -0,0 +1,117 @@
+.\" ** You probably do not want to edit this file directly **
+.\" It was generated using the DocBook XSL Stylesheets (version 1.69.1).
+.\" Instead of manually editing it, you probably should edit the DocBook XML
+.\" source for it and then use the DocBook XSL Stylesheets to regenerate it.
+.TH "PAM_CONV" "3" "03/12/2006" "Linux\-PAM Manual" "Linux\-PAM Manual"
+.\" disable hyphenation
+.\" disable justification (adjust text to left margin only) l
+pam_conv \- PAM conversation function
+\fB#include <security/pam_appl.h>\fR
+struct pam_message {
+ int msg_style;
+ const char *msg;
+struct pam_response {
+ char *resp;
+ int resp_retcode;
+struct pam_conv {
+ int (*conv)(int num_msg, const struct pam_message **msg,
+ struct pam_response **resp, void *appdata_ptr);
+ void *appdata_ptr;
+The PAM library uses an application\-defined callback to allow a direct communication between a loaded module and the application. This callback is specified by the
+\fIstruct pam_conv\fR
+passed to
+at the start of the transaction.
+When a module calls the referenced conv() function, the argument
+is set to the second element of this structure.
+The other arguments of a call to conv() concern the information exchanged by module and application. That is to say,
+holds the length of the array of pointers,
+\fImsg\fR. After a successful return, the pointer
+points to an array of pam_response structures, holding the application supplied text. The
+member of this struct is unused and should be set to zero. It is the caller's responsibility to release both, this array and the responses themselves, using
+\fBfree\fR(3). Note,
+is a
+\fIstruct pam_response\fR
+array and not an array of pointers.
+The number of responses is always equal to the
+conversation function argument. This does require that the response array is
+\fBfree\fR(3)'d after every call to the conversation function. The index of the responses corresponds directly to the prompt index in the pam_message array.
+On failure, the conversation function should release any resources it has allocated, and return one of the predefined PAM error codes.
+Each message can have one of four types, specified by the
+member of
+\fIstruct pam_message\fR:
+Obtain a string without echoing any text.
+Obtain a string whilst echoing text.
+Display an error message.
+Display some text.
+The point of having an array of messages is that it becomes possible to pass a number of things to the application in a single call from the module. It can also be convenient for the application that related things come at once: a windows based application can then present a single form with many messages/prompts on at once.
+In passing, it is worth noting that there is a descrepency between the way Linux\-PAM handles the const struct pam_message **msg conversation function argument from the way that Solaris' PAM (and derivitives, known to include HP/UX, are there others?) does. Linux\-PAM interprets the msg argument as entirely equivalent to the following prototype const struct pam_message *msg[] (which, in spirit, is consistent with the commonly used prototypes for argv argument to the familiar main() function: char **argv; and char *argv[]). Said another way Linux\-PAM interprets the msg argument as a pointer to an array of num_meg read only 'struct pam_message' pointers. Solaris' PAM implementation interprets this argument as a pointer to a pointer to an array of num_meg pam_message structures. Fortunately, perhaps, for most module/application developers when num_msg has a value of one these two definitions are entirely equivalent. Unfortunately, casually raising this number to two has led to unanticipated compatibility problems.
+For what its worth the two known module writer work\-arounds for trying to maintain source level compatibility with both PAM implementations are:
+.TP 3
+never call the conversation function with num_msg greater than one.
+set up msg as doubly referenced so both types of conversation function can find the messages. That is, make
+ msg[n] = & (( *msg )[n])
+Memory buffer error.
+Conversation failure. The application should not set