Где я мог допустить ошибку в портировании кода с C на Pascal
Портирую заголовки LibPAM с C на Pascal, вызовы портировал без проблем, так-же без проблем перевел минимальный пример, теперь пытаюсь перевести более сложный пример и не могу разобраться в коде на Си Вот оригинал функции:
static int conversation(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
{
(void)(appdata_ptr); int i;
/* check the count of message */
if (num_msg <= 0 || num_msg >= PAM_MAX_MSG_SIZE)
{
fprintf(stderr, "invalid num_msg(%d)\n", num_msg);
return PAM_CONV_ERR;
}
/* alloc memory for response */
if ((resp[0] = malloc(num_msg * sizeof(struct pam_response))) == NULL)
{
fprintf(stderr, "bad alloc\n");
return PAM_BUF_ERR;
}
/* response for message */
for (i = 0; i < num_msg; i++)
{
const struct pam_message *m = *msg + i;
struct pam_response *r = *resp + i;
r->resp_retcode = 0; /* currently un-used, zero expected */
switch (m->msg_style)
{
case PAM_PROMPT_ECHO_OFF: /* get the input with echo off, like the password */
printf("%s", m->msg);
echoOffStdin();
r->resp = readline();
echoOnStdin();
printf("\n");
break;
case PAM_PROMPT_ECHO_ON: /* get the input with echo on, like the username */
printf("%s", m->msg);
r->resp = readline();
break;
case PAM_TEXT_INFO: /* normal info */
printf("%s\n", m->msg);
break;
case PAM_ERROR_MSG: /* error info */
fprintf(stderr, "%s\n", m->msg);
break;
default:
fprintf(stderr, "unexpected msg_style: %d\n", m->msg_style);
break;
}
}
return PAM_SUCCESS;
}
А вот так выглядит мой порт:
function conversation(num_msg:longint; msg:PPpam_message; resp:PPpam_response;
appdata_ptr:pointer):longint;cdecl;
var
i:longint;
passstr:string;
m:ppam_message;
r:ppam_response;
begin
appdata_ptr:=nil;
{ check the count of message }
if (num_msg <= 0 ) or (num_msg >= PAM_MAX_MSG_SIZE) then
begin
writeln('invalid num_msg '+inttostr(num_msg));
result:=PAM_CONV_ERR;
end;
{ alloc memory for response }
r:=CAlloc(num_msg,SizeOf(pam_response));
if r=nil then
begin
writeln('bad alloc ');
result:=PAM_BUF_ERR;
end;
{ response for message }
for i:= 0 to num_msg-1 do
Begin
m:=msg[i];
if m^.msg_style = PAM_PROMPT_ECHO_OFF then
begin
writeln('MyMessage: '+Pchar(m^.msg));
readln(passstr);
r^.resp:=Pchar(passstr);
r^.resp_retcode:= 0;
resp:=@r[i];
break;
end;
end;
result:=PAM_SUCCESS;
end;
Ошибка заключается в том что функция аутификации PAM возвращает 7, т.е. ошибку, значит я не правильно передаю параметр r^.resp:=Pchar(passstr);
просто я запутался в этих двойных указателях
Ответы (1 шт):
Проблема решилась, из-за хитрой реализации PAMLib нельзя было просто передавать указатель на строку при помощи Pchar, а нужно было написать аналог функции NewStr(), только с использованием Calloc вместо GetMem, для того что-бы выделять место под строку в куче, и предавать этот указатель в LIbPAM. Если кому нужно вот моя реализация биндинга.