Listing 1. A Basic Conversation Function
int su_conv(int num_msg,const struct pam_message **msgm,
struct pam_response **resp,void *appdata)
{
int count;
struct pam_response *r;
char *recvpass=(char *)malloc(20*sizeof(char));
*(recvpass+19) = '\0';
r = (struct pam_response*)calloc(num_msg,sizeof(struct pam_response));
for(count=0;count < num_msg;++count)
{
switch(msgm[count]->msg_style)
{
case PAM_PROMPT_ECHO_OFF:
printf("%s",msgm[count]->msg);
getPassword(recvpass);
break;
case PAM_PROMPT_ECHO_ON:
printf("%s",msgm[count]->msg);
scanf("%s",recvpass);
break;
case PAM_ERROR_MSG:
printf(" %s\n",msgm[count]->msg);
break;
case PAM_TEXT_INFO:
printf(" %s\n",msgm[count]->msg);
break;
default:
printf("Erroneous Conversation (%d)\n"
,msgm[count]->msg_style);
}
r[count].resp_retcode = 0;
r[count].resp = recvpass;
}
*resp = r;
return PAM_SUCCESS;
}
void getPassword(char *revcbuf)
{
int i=0;
char buf[20];
while((i = getch()) != '\n')
buf[i++] = i;
buf[i] = '\0';
strcpy(recvbuf,buf);
}