From a8d7b223e95bc40c65d6dd7838a1656a2203309b Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Mon, 16 Aug 2010 01:12:28 +0200 Subject: Detect files and directories when scanning and handle them accordingly. --- music.c | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'music.c') diff --git a/music.c b/music.c index 2e618bd..09ee7d8 100644 --- a/music.c +++ b/music.c @@ -8,6 +8,8 @@ gboolean music_init(const gchar *path) { music_root = g_new0(struct directory, 1); music_root->path = g_strdup(path); + g_debug("added music root %s", path); + return 1; } @@ -23,15 +25,45 @@ gboolean music_scan(struct directory *directory) { const gchar *entry; while((entry = g_dir_read_name(dir)) != NULL) { - struct file *f = g_new0(struct file, 1); - f->name = g_strdup(entry); - - if(directory->files == NULL) { - directory->files = f; - } else { - struct file *last = directory->files; - while(last->next) last = last->next; - last->next = f; + struct stat st; + gchar *fullpath = g_build_filename(directory->path, entry, NULL); + if(fullpath == NULL) { + g_error("g_build_filename returned NULL"); + } + + if(g_stat(fullpath, &st) < 0) { + g_warning("g_stat failed on %s", fullpath); + } + + if(S_ISREG(st.st_mode)) { + struct file *f = g_new0(struct file, 1); + f->name = g_strdup(entry); + + if(directory->files == NULL) { + directory->files = f; + } else { + struct file *last = directory->files; + while(last->next) last = last->next; + last->next = f; + } + + g_debug("added file %s to %s", entry, directory->path); + } else if(S_ISDIR(st.st_mode)) { + struct directory *d = g_new0(struct directory, 1); + d->path = g_build_filename(directory->path, entry, NULL); + + if(directory->sub == NULL) { + directory->sub = d; + } else { + struct directory *last = directory->sub; + while(last->next) last = last->next; + last->next = d; + } + + g_debug("added subdir %s to %s", entry, directory->path); + + g_debug("recursing into %s", entry); + music_scan(d); } } -- cgit v1.2.3