eina: Always do opendir first
authorSebastian Dransfeld <sd@tango.flipp.net>
Fri, 19 Oct 2012 09:03:14 +0000 (09:03 +0000)
committerSebastian Dransfeld <sd@tango.flipp.net>
Fri, 19 Oct 2012 09:03:14 +0000 (09:03 +0000)
SVN revision: 78238

src/lib/eina/eina_file.c

index b284dc0..e7c557f 100644 (file)
@@ -787,6 +787,7 @@ eina_file_ls(const char *dir)
 #ifdef HAVE_DIRENT_H
    Eina_File_Iterator *it;
    size_t length;
+   DIR *dirp;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(dir, NULL);
 
@@ -794,19 +795,21 @@ eina_file_ls(const char *dir)
    if (length < 1)
       return NULL;
 
-   it = calloc(1, sizeof (Eina_File_Iterator) + length);
-   if (!it)
+   dirp = opendir(dir);
+   if (!dirp)
       return NULL;
 
-   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
-
-   it->dirp = opendir(dir);
-   if (!it->dirp)
+   it = calloc(1, sizeof (Eina_File_Iterator) + length);
+   if (EINA_UNLIKELY(!it))
      {
-        free(it);
+        closedir(dirp);
         return NULL;
      }
 
+   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+   it->dirp = dirp;
+
    memcpy(it->dir, dir, length + 1);
    if (dir[length - 1] != '/')
       it->length = length;
@@ -832,6 +835,7 @@ eina_file_direct_ls(const char *dir)
 #ifdef HAVE_DIRENT_H
    Eina_File_Direct_Iterator *it;
    size_t length;
+   DIR *dirp;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(dir, NULL);
 
@@ -839,19 +843,21 @@ eina_file_direct_ls(const char *dir)
    if (length < 1)
       return NULL;
 
-   it = calloc(1, sizeof(Eina_File_Direct_Iterator) + length);
-   if (!it)
+   dirp = opendir(dir);
+   if (!dirp)
       return NULL;
 
-   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
-
-   it->dirp = opendir(dir);
-   if (!it->dirp)
+   it = calloc(1, sizeof(Eina_File_Direct_Iterator) + length);
+   if (EINA_UNLIKELY(!it))
      {
-        free(it);
+        closedir(dirp);
         return NULL;
      }
 
+   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+   it->dirp = dirp;
+
    if (length + _eina_name_max(it->dirp) + 2 >= EINA_PATH_MAX)
      {
         _eina_file_direct_ls_iterator_free(it);
@@ -902,7 +908,7 @@ eina_file_stat_ls(const char *dir)
       return NULL;
 
    it = calloc(1, sizeof(Eina_File_Direct_Iterator) + length);
-   if (!it)
+   if (EINA_UNLIKELY(!it))
      {
         closedir(dirp);
         return NULL;