Bonjour,

J'ai un petit problème que voici (UNIX) :

Je désire récupérer le chemin du dossier Home de l'utilisateur qui lance mon programme, pour ce j'utilise la fonction getpwuid, qui prend un uid_t en paramètre et retourne un pointeur sur struct passwd.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int             init_inf(t_data *d)
{
  struct passwd *p;
 
  d->uid = getuid();
  if ((p = getpwuid(d->uid)) != NULL)
    {
      if ((d->u_name = strdup(p->pw_name)) == NULL)
         return (FAILURE_E);
      if ((d->u_home = strdup(p->pw_dir)) == NULL)
         return (FAILURE_E);
      free(p->pw_name);
      return (SUCCESS_E);
    }
  show_error(2, PRGM ": " ENOINFO "\n");
  return (FAILURE_E);
}
Voici la fonction.
Il se trouve que j'ai quelques fuites de memoire :

in use at exit: 2301 bytes in 9 blocks.
J'ai essayé de free tous les pointeurs de la structure, il se trouve que seul pw_name ne me sort pas de warning.

(Les fuites ne proviennent pas des strdup)

Voici la structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 struct passwd {
                   char    *pw_name;       /* user name */
                   char    *pw_passwd;     /* encrypted password */
                   uid_t   pw_uid;         /* user uid */
                   gid_t   pw_gid;         /* user gid */
                   time_t  pw_change;      /* password change time */
                   char    *pw_class;      /* user access class */
                   char    *pw_gecos;      /* Honeywell login info */
                   char    *pw_dir;        /* home directory */
                   char    *pw_shell;      /* default shell */
                   time_t  pw_expire;      /* account expiration */
                   int     pw_fields;      /* internal: fields filled in */
           };
J'ai essayé avec getpwuid_r, mêmes fuites.

Voila, si quelqu'un connait une solution à ceci, c'est avec plaisir que je l'accepte.

Cdlt.