在C程序中使用PAM更新用户密码

在C程序中使用PAM更新用户密码,c,linux,passwords,pam,C,Linux,Passwords,Pam,我正在创建一个更新用户密码的C程序。为了做到这一点,我使用了帕姆。我的最小代码基于 我用这个来确定数字是多少: 主要是,我不知道如何将更新后的密码传递给pam_chauthtok()。我使用了pam\u set\u item,它“成功”了,但实际上没有帮助我获得pam\u chauthtok函数的信息。我想我可能需要以某种方式将更新后的密码传递给pam\u handle\u t或pam\u conv,但我甚至不知道该怎么做,也不知道如何最终将信息发送到pam\u chauthtok() 我保证,

我正在创建一个更新用户密码的C程序。为了做到这一点,我使用了帕姆。我的最小代码基于

我用这个来确定数字是多少:

主要是,我不知道如何将更新后的密码传递给
pam_chauthtok()
。我使用了
pam\u set\u item
,它“成功”了,但实际上没有帮助我获得
pam\u chauthtok
函数的信息。我想我可能需要以某种方式将更新后的密码传递给
pam\u handle\u t
pam\u conv
,但我甚至不知道该怎么做,也不知道如何最终将信息发送到
pam\u chauthtok()


我保证,我已经在谷歌上搜索了很多,我正在尽我最大的努力,我现在非常迷茫。如果我说的或写的没有什么意义,请要求澄清。实际上,我是C新手,因此,如果我遗漏了任何明显的语法错误,那就是原因。

看一下下面的源代码:看一下下面的源代码:
#include <stdio.h>
#include <unistd.h>
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <security/pam_modules.h>

int main(int argc, char** argv)
{
    setuid(0);
    int retval;
    int started;

    const char *user = "user";
    pam_handle_t *pamh=NULL;
    const struct pam_conv conv = {
    misc_conv,
    NULL
    };

    if(argc == 2)
    {
        const char *updated = argv[1];

        started = pam_start("update_password", user, &conv, &pamh);
        int setTok;
        if(started == PAM_SUCCESS)
        {
            setTok = pam_set_item(pamh, PAM_AUTHTOK_TYPE, updated);
            int setPass;
            setPass = pam_chauthtok(pamh, PAM_SILENT);
            retval = setPass;
        }
        printf("Started: %d\n", started);
        printf("SetTok: %d\n", setTok);
        printf("SetPass: %d\n", retval); 

    }
    else{
        printf("incorrect number of args");
    }

    if (pam_end(pamh,retval) != PAM_SUCCESS){
        pamh = NULL;
        exit(1);
    }

    return ( retval == PAM_SUCCESS ? 1:0);
} 
Started: 0
SetTok: 0
SetPass: 20