IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Segfault sur readdir().


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Par défaut Segfault sur readdir().
    Bonjour à tous,

    Mon code segfault actuellement sur un readdir que je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while ((entry = readdir(dirp)) != NULL)
     {
       printf("%s\n", entry->d_name);
     }
    Pour information voici le code en entier:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    int     main(int ac, char **av)
    {
      struct        dirent  *entry;
      struct sockaddr_in sin;
      struct protoent *pre;
      const char    *ip_adress;
      DIR   *dirp;
      FILE  *fd;
      char  *buffer;
      char  s[4096];
      char  *ret_s;
      int   sock;
      int   error;
      int   port;
      int   b;
      int   ret;
     
      if (ac != 3)
        exit(EXIT_FAILURE);
      port = atoi(av[2]);
      ip_adress = av[1];
      buffer = malloc(sizeof(char*));
      pre = getprotobyname("TCP");
      sock = socket(AF_INET, SOCK_STREAM, pre->p_proto);
      sin.sin_family = AF_INET;
      sin.sin_addr.s_addr = inet_addr(ip_adress);
      sin.sin_port = htons(port);
      error = connect(sock, (const struct sockaddr *)&sin, sizeof(sin));
      while (1)
        {
          b = read(0, buffer, 2048);
          buffer[b] = '\0';
          if (ret = strcmp(buffer, "exit") == 10)
            return (0);
          if (ret = strcmp(buffer, "ls") == 10)
            {
              fd = fopen("/home/france_m/my_ftp/serv_conf", "r");
              ret_s = fgets(s, 4096, fd);
              if (s == NULL)
                {
                  printf("\33[1;31mfile empty\033[0m\n");
                  exit(EXIT_FAILURE);
                }
              if (dirp = opendir(s) == NULL)
                {
                  printf("\33[1;31mdirp = NULL\033[0m\n");
                  exit(EXIT_FAILURE);
                }
              while ((entry = readdir(dirp)) != NULL)
                {
                  printf("%s\n", entry->d_name);
                }
            }
        }
    }
    Merci par avance pour votre aide, car la je bloque un peu

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Bonjour,

    Mets des parenthèses autour de "dirp = opendir(s)".

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Par défaut
    Citation Envoyé par the Hound Voir le message
    Bonjour,

    Mets des parenthèses autour de "dirp = opendir(s)".
    , j'ai oublié ça ?!......merci

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bien vu.

    En effet, la comparaison à une priorité supérieure à l'affectation (permettant ainsi l'affectation de booléens)

    En fait, à part la virgule, tout à une priorité supérieure à l'affectation.
    Plus d'information à ce sujet sur cppreference.com

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 385
    Par défaut
    Elles me paraîssent vachement bizarres, ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (ret = strcmp(buffer, "exit") == 10)
    1. Déjà, d'où vient la valeur magique 10? strcmp() ne connait que 0, <0 et >0.
    2. Ensuite, ret doit-il valoir le résultat de strcmp() (0, <0 ou >0, auquel cas le code est faux) ou celui de la comparaison (0 ou 1, auquel cas le code est vrai mais bénéficierait de parenthèses pour le rendre plus explicite) ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Déjà, d'où vient la valeur magique 10? strcmp() ne connait que 0, <0 et >0.
    Je suppose (je n'ai pas relu le code) que buffer a été lu de l'entrée standard, et que la fonction qui a rempli le buffer y a également placé le '\n'. Donc le 10 c'est la différence '\n' - '\0'.
    Mais comme tu dis, c'est dégueu. D'abord parce que strcmp() ne retourne pas forcément la différence, donc pas portable, et parce que c'est pas évident à comprendre (la preuve).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Segfault sur my_strcat()
    Par kimikimi dans le forum C
    Réponses: 4
    Dernier message: 09/02/2011, 10h06
  2. segfault sur une boost::python::list
    Par psycofdj dans le forum Boost
    Réponses: 1
    Dernier message: 15/10/2008, 01h41
  3. Segfault sur un int?
    Par lguignar dans le forum Débuter
    Réponses: 9
    Dernier message: 18/07/2008, 11h03
  4. Segfault sur un int?
    Par lguignar dans le forum C++
    Réponses: 9
    Dernier message: 18/07/2008, 11h03
  5. Segfault sur contructeur de string
    Par lemmel dans le forum SL & STL
    Réponses: 7
    Dernier message: 02/09/2007, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo