Soucis de liste chainees en programmant la fonction ls

Fermé
shiklah Messages postés 1 Date d'inscription samedi 16 avril 2016 Statut Membre Dernière intervention 16 avril 2016 - Modifié par mamiemando le 24/04/2016 à 10:43
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 24 avril 2016 à 10:46
Bonjour,


Bonjour a tous !

Je dois en ce moment refaire la fonction ls. Sauf que jai un soucis de segfault (completement aleatoire) sur l'option -R.

Je pense que c'est du au content d'un des maillon de ma liste que serait faux.. Ca nest qu'une supposition. Voici les deux fonctions principales :

void ft_fill_lst(t_list **lst, char *arg, char *root)
{
    t_info *info;
    char *tmp;
 
    if (!ft_strequ(root, arg))
    {
        tmp = ft_strjoin(root, "/");
        arg = ft_strjoin(tmp, arg);
    }
    info = (t_info *)malloc(sizeof(t_info));
    lstat(arg, &info->buf)) == -1;
    info->name = ft_strdup(arg);
    ft_lstadd(lst, ft_lstnew(info, sizeof(t_info)));
}
 
void    ft_isdir(t_list *lst, t_options option, int j)
{
    DIR *dir;
    t_list *list;
    struct dirent * dirent;
 
    while (lst)
    {
        if (((t_info *)(lst->content)) && (S_IFMT & ((t_info *)(lst->content))->buf.st_mode) == S_IFDIR)
        {
            if (!(dir = opendir(((t_info *)(lst->content))->name)))
                perror(((t_info *)(lst->content))->name);
            if (j > 1)
                printf("\n\n%s:\n", ((t_info *)(lst->content))->name);
            while ((dirent = readdir(dir)))
            {
                if (option.all == 1 || (dirent->d_name[0] != '.'))
                {
                    ft_fill_lst(&((t_info *)(lst->content))->for_dir, dirent->d_name, ((t_info *)(lst->content))->name);
                    list = ((t_info *)(lst->content))->for_dir;
                    if (list && dirent->d_name[0] != '.' && option.recursive == 1 && S_ISDIR(((t_info *)(list->content))->buf.st_mode)) /* Cest ici que je segfault, quand jessaye d'acceder au content*/
                        ft_isdir(list, option, j);
                }
            }
            closedir(dir);
        }
        lst = lst->next;
    }
    list = NULL;
}


...
for_dir
étant la nouvelle liste chaînée que je remplis lorsque dans la première liste
lst
je croise un directory.


Merci a tous !

1 réponse

mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
Modifié par mamiemando le 24/04/2016 à 10:46
Bonjour

Pour que l'on puisse t'aider, il vaudrait mieux que tu nous donne un exemple de code que l'on peut compiler et lancer.

Dans un premier temps tu peux regarder avec
gdb
et
valgrind
les éventuelles erreurs que tu fais.

gcc -g toto.c -o toto
valgrind toto
gdb toto


Une fois dans
gdb
:

r
bt


Bonne chance
0