Ir para conteúdo
Fórum Script Brasil
  • 0

Erro Ao Compilar Em C


chneves

Pergunta

Olá Pessoal,

Estou com um problema ao tentar compilar um programa em C.

Estou recebendo a seguinte mensagem de erro:

[b]"line 62: Error: Cannot use int(*)(int,const pam_message**,pam_response**,void*) to initialize extern "C" int(*)(int,pam_message**,pam_response**,void*)"[/b]
Não sei o que pode ser e não estou conseguindo resolver. Estou utilizando o CC do Sun Studio Express para compilar. Se alguém puder me ajudar, agradeço. Segue abaixo o fonte do programa que estou compilando:
/*
* Author: Ariel Nigri
* Version: 1.0 stable
* By: Winco Tec. e Sis. Ltda.
* www.winco.com.br
* Please observe the General Public License (GPL) to use this code
* Thanks for all that makes Linux an exemple of freedom
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/file.h>
#include <pwd.h>
#include <grp.h>

#ifdef _cplusplus
extern "C"{
#endif

#include <security/pam_appl.h>

#ifdef _cplusplus
};
#endif

int respIndex = 0;

//--------------------------------------------------------------------------
pam_handle_t *pamh=NULL;
static int my_conv(int nmsg, const struct pam_message **msg,
                struct pam_response **resp, void *appdata_ptr)
{
    int i;
    const char **senhas = (const char **) appdata_ptr;

    *resp = (struct pam_response *) malloc(sizeof(struct pam_response) *
nmsg);
    memset(*resp, 0, sizeof(struct pam_response) * nmsg);
        for (i = 0; i < nmsg; i ++) {
        // printf("%s\n", (*msg)[i].msg);
        fflush(stdout);
            (*resp)[i].resp = strdup(senhas[respIndex]);
    }
    return PAM_SUCCESS;
}
//--------------------------------------------------------------------------
int main(int argc, char *argv[])
{
    if (argc != 4) {
    printf("uso: %s <usuario> <senha_antiga> <senha_nova>\n", argv[0]);
    return 1;
    }
    struct pam_conv conv = {
    my_conv,
    (void *) (argv + 2) // passamos a senha antiga e a nova.
    };

    if (pam_start("passwd", argv[1], &conv, &pamh) != PAM_SUCCESS) {
    printf("ERRO: Iniciando biblioteca PAM\n");
        return 1;
    }
    int retval = pam_authenticate(pamh, 0);
    if (retval != PAM_SUCCESS) {
    printf("ERRO: Logon invalido\n");
    } else {
    setuid(0);
    respIndex = 1;
        retval = pam_chauthtok(pamh, 0);    /* is user really user? */
        if (retval != PAM_SUCCESS) {
        printf("ERRO: Nova senha invalida\n");
    }
    }

    /* This is where we have been authorized or not. */
    if (retval == PAM_SUCCESS) {
        // umask(0117);
        // strcpy(user, luser);
        // Vamos mudar nosso uid e gid.
    printf("Senha alterada com sucesso\n");
    } else {
    printf("Houve algum erro. Tente novamente\n");
    }
    pam_end(pamh, PAM_SUCCESS);
    return retval;
}
//--------------------------------------------------------------------

Editado por chneves
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Opa!

Cara, o ponteiro de função membro da estrtura pam_conv deveria ter o protótipo igual ao da função my_conv, que você implementou, ou seja:

int (*) ( int, const struct pam_message **, struct pam_response **, void * );
Mas aparentemente não é isso o que ocorre. Talvez o header pam_appl.h tenha uma implementação diferente nesse compilador. Então tente fazer as duas coisa seguintes: 1 - Adicione as seguintes linhas antes e depois da sua função my_conv:
...

#ifdef _cplusplus
extern "C" {
#endif

/*
 *
 * CÓDIGO DA SUA FUNÇÃO
 *
 */ 

#ifdef _cplusplus
};
#endif

...
2 - Retire o const do segundo parâmetro da função my_conv. Sugiro isso me baseando na informação do erro, pois ele parace mostrar que o ponteiro de função membro da estrutura pam_conv deve ter o formato mostrado na mensagem, isto é:
extern "C" int(*)(int,pam_message**,pam_response**,void*)

Poste depois para dizer se funcionou.

Boa sorte!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...