我正在尝试编写一个PAM模块。 PAM模块在首次login时创build一个目录。与pam_mkhomedir非常相似。
这是代码。
PAM_EXTERN int pam_sm_open_session (pam_handle_t *pamh,int flags,int argc,const char **argv) { int retval; const char *user; const struct passwd *pwd; struct stat St; // Parse the args _pam_parse(pamh,flags,argc,argv); pam_info (pamh,"nThese are the args flags. skel: %s,mkdir: %s,umask: %o",SkelDir,MkDir,UMask ); // Determine the user name retval = pam_get_user(pamh,&user,NULL); if (retval != PAM_SUCCESS || user == NULL || *(const char *)user == ' ') { pam_syslog(pamh,LOG_NOTICE,"user unkNown"); return PAM_USER_UNKNowN; } strcpy(DestDir,MkDir); strcat(DestDir,"/"); strcat(DestDir,user); // Get the password entry pwd = pam_modutil_getpwnam (pamh,user); if (pwd == NULL) { return PAM_CRED_INSUFFICIENT; } // For some reason stat wont work,using access instead. //retval = stat(DestDir,&St); retval = access(DestDir,F_OK); if ( retval == 0) { pam_info(pamh,"directory exists %s",DestDir); } return PAM_SUCCESS; }
正如您所看到的,现在,模块只是在login时输出在pamconfiguration文件中指定的参数。
问题在于stat函数。 当我使用它时,即使在stat函数之前调用pam_info函数,也不会打印任何内容。
如果我使用访问function,模块正常执行。 我有点难以理解为什么会发生这种情况。
编辑:我已经包含了一些代码,检查errno和其他返回值,但该代码不会执行。 我没有把它包括在问题中,因为我不想让代码太长以至于无法阅读。 该模块似乎失败并完全退出。 它不打印任何东西。 它什么都不做。 但是,如果我使用access()模块工作正常。
系统运行时是否有延时计时器?
包含<emmintrin.h>时,#error“SSE2指令集未启用”
GCC能打印出中间结果吗?
正则expression式迭代器不能在Cpp中工作
如何知道std :: cin是否来自redirect?
在C主卷Windows中__uuidof
如何在Windows中使用eclipse编译dlib示例?
libstdc ++中奇怪的符号查找错误
在linux的进程间通信应该使用哪个时钟?
有时stat结构可能会被错误的定义,比较你所调用的库,看看这是否是这样的情况下填充你的stat结构的字符数组(确保它不是一个指向字符的指针,实际上定义了数组的大小) “测试堆栈损坏”。 现在当你运行的时候,如果这个缓冲区被破坏,那就是问题的根源。 您可以尝试切换编译器,或不使用stat函数。 当我使用clang编译器vs gcc的时候,我最近刚刚对统计函数有异议。
只需发布完整的代码。
编译它与-W -Wall ,看看是否有帮助。
尝试在strace或valgrind下运行,看看stat是否失败,或者如果valgrind发现问题。
我没有看到DestDir的声明,但我敢打赌它太小了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。