Objectif : plutot que le répertoire crée soit /home/user, qu'il soit /home/eleve/user
-> je suis dans les sources du module d'authentification pam_mkhomedir
dans le programme, la variable dirigeant la création est :
"dir". Elle a pour forme : /home/user
or j'aimerai intercalé la chaine "eleve/" pour que ca me donne /home/eleve/user
comment qu'on fait ?
La fonction :
void
copymkdir(char const * dir, char const * skel, mode_t mode, uid_t uid, gid_t gid)
{
int rc = 0;
char src[MAXPATHLEN];
char dst[MAXPATHLEN];
if (mkdir(dir, mode) != 0 && errno != EEXIST) {
PAM_LOG("mkdir(%s)", dir);
} else {
int infd, outfd;
struct stat st;
static char counter = 0;
static char *copybuf = NULL;
++counter;
chown(dir, uid, gid);
if (skel == NULL || *skel == '\0')
rc = 1;
else {
DIR *d = opendir(skel);
if (d != NULL) {
struct dirent *e;
while ((e = readdir(d)) != NULL) {
char *p = e->d_name;
if (snprintf(src, sizeof(src), "%s/%s", skel, p) >= (int)sizeof(src))
PAM_LOG("warning: pathname too long '%s/%s' (skel not copied)", skel, p);
else if (stat(src, &st) == 0) {
if (strncmp(p, "dot.", 4) == 0) /* Conversion */
p += 3;
if (snprintf(dst, sizeof(dst), "%s/%s", dir, p) >= (int)sizeof(dst))
PAM_LOG("warning: path too long '%s/%s' (skel file skipped)", dir, p);
else {
if (S_ISDIR(st.st_mode)) { /* Recurse for this */
if (strcmp(e->d_name, ".") != 0 && strcmp(e->d_name, "..") != 0)
copymkdir(dst, src, (st.st_mode & 0777), uid, gid);
chflags(dst, st.st_flags); /* propogate flags */
/*
* Note: don't propogate special attributes
* but do propogate file flags
*/
} else if (S_ISREG(st.st_mode) && (outfd = open(dst, O_RDWR | O_CREAT | O_EXCL, st.st_mode)) != -1) {
if ((infd = open(src, O_RDONLY)) == -1) {
close(outfd);
remove(dst);
} else {
int b;
/*
* Allocate our copy buffer if we need to
*/
if (copybuf == NULL)
copybuf = malloc(4096);
while ((b = read(infd, copybuf, 4096)) > 0)
write(outfd, copybuf, b);
close(infd);
/*
* Propogate special filesystem flags
*/
fchown(outfd, uid, gid);
fchflags(outfd, st.st_flags);
close(outfd);
chown(dst, uid, gid);
}
}
}
}
}
closedir(d);
}
}
if (--counter == 0 && copybuf != NULL) {
free(copybuf);
copybuf = NULL;
}
}
}
# WTF ?
Posté par Cereal Killer . Évalué à 10.
Me dis pas que tu t'es même pas demandé si y avais plus simple pour faire ça !?
D'autant que ta fonction en c prend l'argument *dir et c'est justement cet argument qui sera le rep à créer. (en gros, même si c'était PAM qui gerais ça, ce serais pas avec cette fonction qu'on pourrait répondre). Et de toute façon, ce serais une absurdité et mettre directement dans ton source le chemin du repertoire.
Donc tu fais fausse route et je reste gentil. Tu t'es déchiré grave pour être plus realiste :) !
T'essayes d'allumer une bougie avec un lance flame
Si tu souhaites simplement changer le repertoire de création de tes users, commence par lire le man de adduser et si tu veux que ça soit definitif, change DHOME dans /etc/adduser.conf.
[^] # Re: WTF ?
Posté par NeoX . Évalué à 2.
et si veux le faire apres coup (deplacement des dossiers) tu peux modifier le contenu de
/etc/passwd qui contient les home de chaque utilisateur
si tu veux le faire à la creation et que tu utilises une interface graphique (kde, gnome) il doit meme y avoir l'option qui va bien.
[^] # Re: WTF ?
Posté par djibb (site web personnel) . Évalué à 6.
Adepte de Linux depuis 6 ans, je n'ai jamais eu à trifouiller et faire de l'authentification LDAP. J'oubliais : je suis prof de physique et ai une formation d'ingé chimiste.
Donc Linux, pour moi c'est un desktop.
Cette solution me paraissait la meilleure ce matin car je ne voyais pas comment y arriver autrement.
Maintenant, grace à ton aide (qui aurait pu être moins condescendante mais tout aussi efficace), je m'aperçois que ce dont j'ai besoin se trouve dans /etc/adduser.conf (dont je ne connaissais pas l'existence, notamment car il n'existe pas sur ma distrib) et que l'option
me paraît d'une limpidité sans commune mesure.
Merci de ta précieuse aide. (qui m'a fait gagner 4 jours au bas mot... )
# marteau, mouche ?
Posté par daggett . Évalué à 7.
En tout cas je pense que tout ce qui implique d'aller modifier les sources d'un truc système aussi enfoui indique qu'on fait fausse route, et qu'il y a probablement plus simple, au moins via un fichier de conf ou une option bien placée !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.