Merge 1.8.0~pre4 packaging into master
[pkg-k5-afs_openafs.git] / src / pam / afs_pam_msg.c
blob29b89fca2c8f1ea21bebaf75a76910b0873a5821
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 */
10 #include <afsconfig.h>
11 #include <afs/param.h>
13 #include <roken.h>
15 #include <security/pam_appl.h>
17 #include "afs_pam_msg.h"
18 #include "afs_message.h"
21 int
22 pam_afs_printf(PAM_CONST struct pam_conv *pam_convp, int error, int fmt_msgid, ...)
24 va_list args;
25 char buf[PAM_MAX_MSG_SIZE];
26 char *fmt_msg = NULL;
27 int freeit;
28 struct pam_message mesg;
29 PAM_CONST struct pam_message *mesgp = &mesg;
30 struct pam_response *resp = NULL;
31 int errcode;
33 if (pam_convp == NULL || pam_convp->conv == NULL)
34 return PAM_CONV_ERR;
36 fmt_msg = pam_afs_message(fmt_msgid, &freeit);
37 va_start(args, fmt_msgid);
38 vsprintf(buf, fmt_msg, args);
39 va_end(args);
40 if (freeit)
41 free(fmt_msg);
43 mesg.msg_style = error ? PAM_ERROR_MSG : PAM_TEXT_INFO;
44 mesg.msg = buf;
45 errcode = (*(pam_convp->conv)) (1, &mesgp, &resp, pam_convp->appdata_ptr);
46 if (resp) {
47 if (resp->resp)
48 free(resp->resp);
49 free(resp);
51 return errcode;
55 int
56 pam_afs_prompt(PAM_CONST struct pam_conv *pam_convp, char **response, int echo,
57 int fmt_msgid, ...)
59 va_list args;
60 char buf[PAM_MAX_MSG_SIZE];
61 char *fmt_msg = NULL;
62 int freeit;
63 struct pam_message mesg;
64 PAM_CONST struct pam_message *mesgp = &mesg;
65 struct pam_response *resp = NULL;
66 int errcode;
68 if (pam_convp == NULL || pam_convp->conv == NULL || response == NULL)
69 return PAM_CONV_ERR;
71 *response = NULL;
73 fmt_msg = pam_afs_message(fmt_msgid, &freeit);
74 va_start(args, fmt_msgid);
75 vsprintf(buf, fmt_msg, args);
76 va_end(args);
77 if (freeit)
78 free(fmt_msg);
80 mesg.msg_style = echo ? PAM_PROMPT_ECHO_ON : PAM_PROMPT_ECHO_OFF;
81 mesg.msg = buf;
83 errcode = (*(pam_convp->conv)) (1, &mesgp, &resp, pam_convp->appdata_ptr);
84 if (resp) {
85 *response = resp->resp;
87 free(resp); /* but not resp->resp */
89 return errcode;