]> CyberLeo.Net >> Repos - SourceForge/afuse.git/blob - src/dir_list.c
Tidying up for release 0.2.
[SourceForge/afuse.git] / src / dir_list.c
1 #define __DIR_LIST_C
2
3 #include <stdlib.h>
4 #include <errno.h>
5 #include "afuse.h"
6 #include "utils.h"
7 #include "dir_list.h"
8
9 void dir_list_add(dir_list_t **dir_list, DIR *dir)
10 {
11         dir_list_t *new_dir;
12
13         new_dir = my_malloc( sizeof(dir_list_t) );
14         new_dir->dir = dir;
15         new_dir->next = *dir_list;
16         new_dir->prev = NULL;
17
18         *dir_list = new_dir;
19 }
20
21 void dir_list_remove(dir_list_t **dir_list, DIR *dir)
22 {
23         dir_list_t *current_dir = *dir_list;
24
25         while(current_dir) {
26                 if(current_dir->dir == dir) {
27                         if(current_dir->prev)
28                                 current_dir->prev->next = current_dir->next;
29                         else
30                                 *dir_list = current_dir->next;
31                         if(current_dir->next)
32                                 current_dir->next->prev = current_dir->prev;
33                         free(current_dir);
34
35                         return;
36                 }
37
38                 current_dir = current_dir->next;
39         }
40 }
41
42 void dir_list_close_all(dir_list_t **dir_list)
43 {
44         while(*dir_list) {
45                 int retries;
46                 
47                 for(retries = 0; retries < CLOSE_MAX_RETRIES &&
48                                  closedir((*dir_list)->dir) == -1   &&
49                                  errno == EINTR;
50                     retries++);
51                 dir_list_remove(dir_list, (*dir_list)->dir);
52         }
53 }
54
55 bool dir_list_empty(dir_list_t *dir_list)
56 {
57         return (dir_list == NULL) ? true : false;
58 }