diff options
Diffstat (limited to 'src/lib/dir.c')
-rw-r--r-- | src/lib/dir.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/lib/dir.c b/src/lib/dir.c new file mode 100644 index 0000000..150d5bf --- /dev/null +++ b/src/lib/dir.c @@ -0,0 +1,49 @@ +#include <lib/dir.h> +#include <dirent.h> +#include <sys/stat.h> +#include <string.h> +#include <stdlib.h> + +//----------------------------------------------- +// Is directory +bool_t is_directory(char* dirname) { + struct stat st; + if (stat(dirname, &st) == 0) { + if (S_ISDIR(st.st_mode)) { + return TRUE; + } + } + return FALSE; +} + +//----------------------------------------------- +// List directory +char** lsdir(char* dirname) { + DIR *d; + struct dirent *dir; + d = opendir(dirname); + char** file_names = (char**)malloc(sizeof(char*)); + if (!file_names) { + return NULL; + } + file_names[0] = NULL; + size_t file_count = 0; + if (d) { + while ((dir = readdir(d)) != NULL) { + if (dir->d_type == DT_REG) { + // When a regular file is reached + /// Create space for it in the list + file_names = realloc(file_names, (file_count+1+1)*sizeof(char*)); + /// Create space for the name + file_names[file_count] = calloc(strlen(dir->d_name)+1, sizeof(char)); + /// Copy the name + strcpy(file_names[file_count], dir->d_name); + /// Mark the end of the file list with a NULL entry + file_names[++file_count] = NULL; + } + } + return file_names; + } + return NULL; +} + |