Forum Programmation.c modifier une variable

Posté par  (site web personnel) .
Étiquettes : aucune
0
17
jan.
2007
Préambule : j'ai jamais programmé de ma vie en C mais la, j'ai un petit besoin.

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  . Évalué à 10.

    Attend ... tout c'que tu veux faire c'est mettre tes users dans /home/eleve/user et toi tu veux patcher un bout de c et recompiler PAM pour ça ?
    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  . Évalué à 2.

      je n'aurais pas dis mieux
      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  (site web personnel) . Évalué à 6.

      En informatique et en beaucoup d'autres matière, seule la connaissance gloable et un certain recul permet de choisir la solution adaptée.
      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
      GROUPHOMES
      Si positionné à yes, les répertoires personnels seront de la
      forme /home/[nomgroupe]/utilisateur. Par défaut positionné à
      no.

      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  . Évalué à 7.

    J'aurais dit que créer le compte de l'élève via "useradd -m -b /home/eleve user" serait suffisant...(man useradd) maintenant il y a probablement des subtilités pour de l'authentification centralisée ?..

    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.