summaryrefslogtreecommitdiff
path: root/src/scanner.c
blob: d20c7142f9f4524d299e1faf917d3689ae11c011 (plain)
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
#define _GNU_SOURCE
#include "shared.h"

#include "ll.h"
#include "scanner.h"

#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>
#include <error.h>

dlinkedlist * scandirlist(const char * const dir, int (*selector)(const struct dirent *), int (*cmp)(const struct dirent **, const struct dirent **)) {
    struct dirent **namelist = NULL;
    dlinkedlist *list = NULL;
    int numentries = -1;

    if((numentries = scandir(dir, &namelist, selector, cmp)) < 0)
        RETURNWERR(errno, NULL);

    list = dlinkedlist_init();
    for(int i = 0; i < numentries; i++)
        if(dlinkedlist_append(list, (void *)(namelist[i]), free) < 0) {
            dlinkedlist_free(list);
            for(int j = i; j < numentries; j++)
                free(namelist[j]);

            free(namelist);
            RETURNWERR(errno, NULL);
        }
    free(namelist);

    return list;
}