summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/common/util.c58
-rw-r--r--src/common/util.h1
2 files changed, 59 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
index 35c768d2..54ad4f78 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1908,3 +1908,61 @@ hextray_mode ()
 	return 0;
 #endif
 }
+
+/* Routine for listing subfolders of a given folder. ALWAYS free correctly after use, e.g.
+void display_list (GSList *list)
+{
+	GSList *iterator = NULL;
+	for (iterator = list; iterator; iterator = iterator->next)
+	{
+		printf ("%s\t", (char *) iterator->data);
+	}
+}
+
+int main (int argc, char *argv[])
+{
+	GSList *list;
+	list = get_subdirs ("foo");
+	display_list (list);
+#if GLIB_CHECK_VERSION(2,28,0)
+	g_slist_free_full (list, (GFunc) g_free);
+#else
+	g_slist_foreach (list, (GFunc) g_free, NULL);
+	g_slist_free (list);
+#endif
+	return 0;
+}
+*/
+GSList *
+get_subdirs (const char *path)
+{
+	DIR *dir;
+	struct dirent *entry;
+	GSList *dirlist = NULL;
+
+	if (!path)
+	{
+		path = ".";
+	}
+
+	dir = opendir (path);
+
+	if (!dir)
+	{
+		return NULL;
+	}
+
+	entry = readdir (dir);
+
+	while (entry != NULL)
+	{
+		if (entry->d_type == DT_DIR && strcmp (entry->d_name, ".") != 0 && strcmp (entry->d_name, "..") != 0)
+		{
+			dirlist = g_slist_append (dirlist, g_strdup (entry->d_name));
+		}
+
+		entry = readdir (dir);
+	}
+
+	return dirlist;
+}
diff --git a/src/common/util.h b/src/common/util.h
index e7e22524..a2799832 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -60,5 +60,6 @@ void safe_strcpy (char *dest, const char *src, int bytes_left);
 void canonalize_key (char *key);
 int portable_mode ();
 int hextray_mode ();
+GSList *get_subdirs (const char *path);
 
 #endif