sujet: pb de malloc? malloc(strlen(getpwuid(uid)->p w_name)) ? c mal ?

sujet: pb de malloc? malloc(strlen(getpwuid(uid)->p w_name)) ? c mal ? - C - Programmation

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  
 

Code :
  1. /******************* serveur ***************************/
  2.   #include <stdio.h>
  3.   #include <sys/types.h>
  4.   #include <stdlib.h>
  5.   #include <string.h>
  6.   #include <pwd.h>
  7.  
  8.   #define NBRE_CLIENT_MAX 50
  9.   #define NBRE_CLIENT_MAX_ATTS 3
  10.   //#define NBRE_CLIENT_CURRENT 1  
  11.  
  12.     // l'idéal étant d'utiliser les listes chainées   
  13.     typedef struct _clients 
  14.     { 
  15.             int uid; 
  16.             char *nom; 
  17.             int  accept; 
  18.     }_clients; 
  19.     struct _clients clients[NBRE_CLIENT_MAX][NBRE_CLIENT_MAX_ATTS]; 
  20.  
  21.  
  22.   void LISTE();
  23.   int ajouterClient (int uid, int fd_accept);
  24.  
  25.   int main()
  26.   { 
  27.       ajouterClient(30851 , 4);
  28.       ajouterClient(30951 , 5);
  29.    
  30.         LISTE();
  31.    
  32.         if ( strcmp(clients[0][1].nom , "mba" ) == 0 )
  33.             printf("\nLe nom dans la ligne 0 est mba! \n" );
  34.         if ( strcmp(clients[1][1].nom , "mba" ) == 0 )
  35.             printf("Le nom dans la ligne 1 est mba! \n" );
  36.   }
  37.  
  38.     void LISTE () { 
  39.           int i,j; 
  40.           printf ("\nVOICI LA LISTE DES CLIENTS: \n" ); 
  41.           for ( i=0 ; i<NBRE_CLIENT_MAX ; i++) { 
  42.        if (clients[i][0].uid != 0 ) { 
  43.                         printf(" uid %d nom %s accept %d", clients[i][0].uid, clients[i][1].nom, clients[i][2].accept ); 
  44.                   } 
  45.              
  46.                 if ( clients[i][0].uid != 0) { 
  47.                       printf("\n" ); 
  48.                 } 
  49.           } 
  50.           printf ("\n *************** \n" ); 
  51.     } 
  52.  
  53.   int ajouterClient (int uid, int fd_accept) {
  54.       int i;
  55.       for (i=0 ; i<NBRE_CLIENT_MAX ; i++) {
  56.           if ( clients [i][0].uid == 0 /* &&  clients [i][1] == NULL  && clients [i][2] == NULL*/ ) {
  57.             printf("c bon g trouve une ligne vide = %d ! \n",i);
  58.      
  59.             printf ("TEST0\n" );
  60.             clients[i][0].uid = uid;
  61.      
  62.             printf ("TEST1\n" );
  63.             clients[i][1].nom = (char*) malloc ( strlen( getpwuid(uid)->pw_name ) + 1); // PROBLEME ICI ON DIRAIT  
  64.             printf ("TEST11\n" );
  65.             strncpy( (char*) clients[i][1].nom , (char*) getpwuid(uid)->pw_name , strlen( getpwuid(uid)->pw_name )+1 );// ICI AUSSI  
  66.      
  67.             printf ("TEST2\n" );
  68.             clients[i][2].accept =  fd_accept;
  69.      
  70.             printf ("TEST3\n" );
  71.      
  72.             return i; 
  73.            
  74.         }
  75.     }
  76.      return -1;
  77.   }


 
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 !

Reply

Marsh Posté le 29-11-2003 à 12:39:50   

Reply

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 ?


Message édité par Taz le 29-11-2003 à 12:59:39
Reply

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

Reply

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

Reply

Marsh Posté le 29-11-2003 à 13:35:33    

MERCI !!! JE VAIS TESTER CA !!!

Reply

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  !

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed