souljah | 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
Code :
- /******************* serveur ***************************/
- #include <stdio.h>
- #include <sys/types.h>
- #include <stdlib.h>
- #include <string.h>
- #include <pwd.h>
-
- #define NBRE_CLIENT_MAX 50
- #define NBRE_CLIENT_MAX_ATTS 3
- //#define NBRE_CLIENT_CURRENT 1
-
- // l'idéal étant d'utiliser les listes chainées
- typedef struct _clients
- {
- int uid;
- char *nom;
- int accept;
- }_clients;
- struct _clients clients[NBRE_CLIENT_MAX][NBRE_CLIENT_MAX_ATTS];
-
-
- void LISTE();
- int ajouterClient (int uid, int fd_accept);
-
- int main()
- {
- ajouterClient(30851 , 4);
- ajouterClient(30951 , 5);
-
- LISTE();
-
- if ( strcmp(clients[0][1].nom , "mba" ) == 0 )
- printf("\nLe nom dans la ligne 0 est mba! \n" );
- if ( strcmp(clients[1][1].nom , "mba" ) == 0 )
- printf("Le nom dans la ligne 1 est mba! \n" );
- }
-
- void LISTE () {
- int i,j;
- printf ("\nVOICI LA LISTE DES CLIENTS: \n" );
- for ( i=0 ; i<NBRE_CLIENT_MAX ; i++) {
- if (clients[i][0].uid != 0 ) {
- printf(" uid %d nom %s accept %d", clients[i][0].uid, clients[i][1].nom, clients[i][2].accept );
- }
-
- if ( clients[i][0].uid != 0) {
- printf("\n" );
- }
- }
- printf ("\n *************** \n" );
- }
-
- int ajouterClient (int uid, int fd_accept) {
- int i;
- for (i=0 ; i<NBRE_CLIENT_MAX ; i++) {
- if ( clients [i][0].uid == 0 /* && clients [i][1] == NULL && clients [i][2] == NULL*/ ) {
- printf("c bon g trouve une ligne vide = %d ! \n",i);
-
- printf ("TEST0\n" );
- clients[i][0].uid = uid;
-
- printf ("TEST1\n" );
- clients[i][1].nom = (char*) malloc ( strlen( getpwuid(uid)->pw_name ) + 1); // PROBLEME ICI ON DIRAIT
- printf ("TEST11\n" );
- strncpy( (char*) clients[i][1].nom , (char*) getpwuid(uid)->pw_name , strlen( getpwuid(uid)->pw_name )+1 );// ICI AUSSI
-
- printf ("TEST2\n" );
- clients[i][2].accept = fd_accept;
-
- printf ("TEST3\n" );
-
- return i;
-
- }
- }
- return -1;
- }
|
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 ! |