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関数にあります。使用すると、stat関数の前にpam_info関数が呼び出されても、何も出力されません。
アクセス機能を使用すると、モジュールは正常に実行されます。なぜこれが起こっているのか、私はちょっと困惑しています。
編集:errnoやその他の戻り値をチェックするコードをいくつか含めましたが、そのコードは実行されません。コードを長く読みすぎないようにしたくなかったので、質問には含めませんでした。モジュールが失敗し、完全に終了したようです。何も印刷されません。何もしません。しかし、access()を使用すると、モジュールは正常に機能します。