J'essaye d'écrire un module PAM. Le module PAM crée un répertoire lors de la première connexion. Très similaire à pam_mkhomedir.La fonction stat() ne semble pas fonctionner dans le module PAM de test
Voici le code.
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;
}
Comme vous pouvez le voir, le module imprime simplement les arguments spécifiés dans le fichier de configuration de pam lors de la connexion.
Le problème est avec la fonction stat. Quand je l'utilise, rien ne s'imprime, même si les fonctions pam_info sont appelées avant la fonction stat.
Si j'utilise la fonction d'accès, le module s'exécute correctement. Je suis un peu perplexe quant à la raison pour laquelle cela se produit.
EDIT: J'avais inclus du code qui vérifiait l'errno et d'autres valeurs de retour, mais ce code n'est pas exécuté. Je n'ai pas inclus dans la question parce que je ne voulais pas faire le code trop long à lire. Le module semble échouer et quitter complètement. Il n'imprime rien. Cela ne fait rien. Mais si j'utilise access() le module fonctionne bien.
Vérifiez la valeur de 'errno'. –
Votre code est schizophrène entre 'DestDir' et' destir', ce qui pourrait expliquer une partie du problème. Vous n'avez également pas montré les déclarations pour un certain nombre d'autres variables, ce qui complique la vie. –
stat() ne retourne pas avec succès. Avoir du code pour gérer son retour -1 et vérifier le code d'erreur. Pareil pour access() aussi. Avoir du code pour gérer les retours infructueux. – vpit3833