Soucis de liste chainees en programmant la fonction ls

shiklah Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
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 !
A voir également:

1 réponse

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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