Soucis de liste chainees en programmant la fonction ls
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 :
...
Merci a tous !
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
lstje croise un directory.
Merci a tous !
1 réponse
-
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 avecgdb
etvalgrind
les éventuelles erreurs que tu fais.
gcc -g toto.c -o toto
valgrind toto
gdb toto
Une fois dansgdb
:
r
bt
Bonne chance