Я пытаюсь написать модуль PAM. Модуль PAM создает каталог при первом входе в систему. Очень похож на 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 == '\0')
{
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;
}
Как видите, прямо сейчас модуль просто выводит аргументы, указанные в конфигурационном файле pam, во время входа в систему.
Проблема связана с функцией stat. Когда я использую его, ничего не печатается, хотя функции pam_info вызываются до функции stat.
Если я использую функцию доступа, модуль выполняется правильно. Я немного озадачен тем, почему это происходит.
РЕДАКТИРОВАТЬ: я включил некоторый код, который проверял errno и другие возвращаемые значения, но этот код не выполняется. Я не включил его в вопрос, потому что не хотел делать код слишком длинным для чтения. Модуль, похоже, выходит из строя и полностью выходит. Ничего не печатает. Он просто ничего не делает. Но если я использую access(), модуль работает нормально.
DestDir
иdestir
, что может объяснить некоторые проблемы. Вы также не показали объявления для ряда других переменных, что усложняет жизнь. - person Jonathan Leffler   schedule 06.07.2010