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.
Voici la fonction.
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); }
Il se trouve que j'ai quelques fuites de memoire :
J'ai essayé de free tous les pointeurs de la structure, il se trouve que seul pw_name ne me sort pas de warning.in use at exit: 2301 bytes in 9 blocks.
(Les fuites ne proviennent pas des strdup)
Voici la structure :
J'ai essayé avec getpwuid_r, mêmes fuites.
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 */ };
Voila, si quelqu'un connait une solution à ceci, c'est avec plaisir que je l'accepte.
Cdlt.
Partager