#include "mm_file_traverse.h"
static GList *g_directories = NULL;
+static GMutex g_fileinfo_mutex;
int mmfile_get_file_names(char *root_dir, MMFunc cbfunc, void *user_data)
{
struct stat statbuf;
- struct dirent dirp;
- struct dirent *result = NULL;
+ struct dirent *dirp;
DIR *dp;
char pdirname[MMFILE_PATH_MAX + 1];
return MMFILE_FAIL;
}
+ /* "readdir" is thread-unsafty, so mutex lock is necessary for thread-safety*/
+ g_mutex_lock(&g_fileinfo_mutex);
+
g_directories = g_list_append(g_directories, strdup(root_dir));
strncpy(pdirname, (char *) element_data, strlen((char *) element_data));
if ((dp = opendir(pdirname)) != NULL) {
- while (!readdir_r(dp, &dirp, &result)) {
+ while ((dirp = readdir(dp)) != NULL) {
char cdirname[MMFILE_PATH_MAX + 1];
- if (strcmp(dirp.d_name, ".") == 0 ||
- strcmp(dirp.d_name, "..") == 0) {
+ if (strcmp(dirp->d_name, ".") == 0 ||
+ strcmp(dirp->d_name, "..") == 0) {
continue;
}
memset(cdirname, 0x00, MMFILE_PATH_MAX + 1);
strncpy(cdirname, pdirname, strlen(pdirname));
strncat(cdirname, "/", 1);
- strncat(cdirname, dirp.d_name, strlen(dirp.d_name));
+ strncat(cdirname, dirp->d_name, strlen(dirp->d_name));
if (lstat(cdirname, &statbuf) < 0) {
printf("lstat error\n");
+ free(dirp);
closedir(dp);
+ g_mutex_unlock(&g_fileinfo_mutex);
return MMFILE_FAIL;
}
cbfunc(cdirname, user_data, true);
}
}
-
+ free(dirp);
}
closedir(dp);
g_list_free(g_directories);
+ g_mutex_unlock(&g_fileinfo_mutex);
+
return MMFILE_SUCCESS;