#define _DEFAULT_SOURCE
#define _BSD_SOURCE
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>

void
dir_recurse (DIR *parent, int level)
{
    struct dirent *ent;
    DIR *child;
    int fd;

    while ((ent = readdir(parent)) != NULL) {
        if ((strcmp(ent->d_name, ".") == 0) ||
            (strcmp(ent->d_name, "..") == 0)) {
            continue;
        }
        fd = openat(dirfd(parent), ent->d_name, O_RDONLY | O_DIRECTORY);
        if (fd != -1) {
            printf("%*s%s/\n", level, "", ent->d_name);
            child = fdopendir(fd);
            dir_recurse(child, level + 1);
            closedir(child);
        } else if (errno == ENOTDIR) {
            printf("%*s%s\n", level, "", ent->d_name);
        } else {
            perror("open");
        }
    }
}

int
main (int argc, char *argv)
{
    DIR *root;

    root = opendir("..");
    dir_recurse(root, 0);
    closedir(root);

    return 0;
}