Где я мог допустить ошибку в портировании кода с 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 шт):

Автор решения: RedCat

Проблема решилась, из-за хитрой реализации PAMLib нельзя было просто передавать указатель на строку при помощи Pchar, а нужно было написать аналог функции NewStr(), только с использованием Calloc вместо GetMem, для того что-бы выделять место под строку в куче, и предавать этот указатель в LIbPAM. Если кому нужно вот моя реализация биндинга.

GitHub: https://github.com/RedCatN1/LibPAM_Pascal-headers

→ Ссылка