sujet: pb de malloc? malloc(strlen(getpwuid(uid)->p w_name)) ? c mal ? - C - Programmation
Marsh Posté le 29-11-2003 à 12:57:15
strlen(bidulz)+1
sizeof(char) == 1 par définition à moins que vous aimiez écrire machin * 1 parce que c'est plus lisible
tu te crois ou avec tous tes casts à la con? aucun n'est utile
bon apreès les "problème ici on dirait" faudrait chercher un peu mieux
t'as regardé que ça retourne pas NULL au moins ta fonction système ?
Marsh Posté le 29-11-2003 à 13:12:43
il renvoie:
soit une struct passwd
soit un pointeur null
mais alors dis moi ce que je peux faire pour résoudre le pb ?
ok chef je vire les cast, c'était pour bien me souvenir des paramètres qu'il fallait placer, suis pas encore très habitué au C
Marsh Posté le 29-11-2003 à 13:28:40
1) tu vires tous les casts
2) ben tu fais la manip en 2 temps
- récupérer le pointeur
- si !=NULL alors action
3) les uid sont de types uid_t et pas int
Marsh Posté le 29-11-2003 à 13:57:54
c bon now ! g traité le cas où getpwuid pouvait renvoyer NULL !
car les UID ke je voulais insérer n'existait pas sur ma machine...c du code que j'avais écris sur un autre pc et qui fonctionnait, et là ça m'a complètement échappé , il me fallait entrer des uid ki existait , kel con je fais....
voici le code:
int ajouterClient (int uid, int fd_accept) {
int i;
struct passwd *pw;
for (i=0 ; i<NBRE_CLIENT_MAX ; i++) {
if ( clients [i][0].uid == 0 ) {
printf("c bon g trouve une ligne vide = %d ! \n",i);
printf ("TEST0\n" );
clients[i][0].uid = uid;
printf ("TEST1\n" );
// + 1 pour le '\0'
pw = getpwuid(uid);
if (pw != NULL) {
clients[i][1].nom = malloc( strlen(pw->pw_name) ) ; // PROBLEME ICI ON DIRAIT
printf ("TEST11\n" );
strncpy( clients[i][1].nom , pw->pw_name , strlen( pw->pw_name ) +1 );// ICI AUSSI
}
printf ("TEST2\n" );
clients[i][2].accept = fd_accept;
printf ("TEST3\n" );
return i;
}
}
return -1;
}
MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ptain j'ai bien cru ke j'allais perdre tout un samedi sur ce truc, merci !
Marsh Posté le 29-11-2003 à 14:08:53
1) initialise toujours toutes tes varaibles, pointeurs compirs
2) strncpy( clients[i][1].nom , pw->pw_name , strlen( pw->pw_name ) +1 ); que tu remplaces simplement par strcpy
3) sous linux, si tu dois ne travailler qu'avec, tu as strdup qui fait le malloc+strcpy d'un coup
Marsh Posté le 29-11-2003 à 12:39:50
bonjour !
j'ai juste une question !
vlà ce ke je veux faire , à partir de l'uid de l'utilisateur retrouver son nom
donc je fais getpwuid(uid)->pw_name et là g son nom normalement
getpwuid renvoie une struct* passwd
à l'exécution j'ai une erreur:
$ ./serveur_test2
c bon g trouve une ligne vide = 0 !
TEST0
TEST1
Segmentation fault
le pb se trouve dans la fonction ajouterClient
alors j'ai remplacé la ligne de malloc par ça:
clients[i][1].nom = (char*)malloc(strlen(getpwuid(uid)->pw_name) * sizeof(char) ) ;
mais ça me met toujours 'segmentation fault'
voici un lien:
http://www.opengroup.org/onlinepub [...] pwuid.html
et adns l'exemple 'Finding the Name for the Effective User ID' c'est exactement ce que je veux faire !
mais ils ne détaillent pas les malloc et tt ça...
si vous pouviez m'aider svp ! merci !