eio: use eina_xattr.
authorCedric BAIL <cedric.bail@free.fr>
Fri, 16 Sep 2011 11:14:57 +0000 (11:14 +0000)
committerCedric BAIL <cedric.bail@free.fr>
Fri, 16 Sep 2011 11:14:57 +0000 (11:14 +0000)
SVN revision: 63438

legacy/eio/configure.ac
legacy/eio/src/lib/Eio.h
legacy/eio/src/lib/eio_private.h
legacy/eio/src/lib/eio_xattr.c

index 4aa8be1..21b962c 100644 (file)
@@ -187,29 +187,6 @@ EIO_CHECK_NOTIFY_WIN32([${want_notify_win32}], [have_notify_win32="yes"], [have_
 AM_CONDITIONAL([EIO_HAVE_INOTIFY], [test "x$have_inotify" = "xyes"])
 AM_CONDITIONAL([EIO_HAVE_WINCHANGE], [test "x$have_notify_win32" = "xyes"])
 
-### Check for extended attribute
-
-AC_COMPILE_IFELSE(
-   [AC_LANG_PROGRAM(
-       [[
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/xattr.h>
-       ]],
-       [[
-size_t tmp = listxattr("/", NULL, 0);
-tmp = getxattr("/", "user.ethumb.md5", NULL, 0);
-setxattr("/", "user.ethumb.md5", NULL, 0, 0);
-       ]])],
-    [
-      AC_DEFINE(HAVE_XATTR, 1, [Define to 1 if you have 'listxattr', 'setxattr' and 'getxattr'])
-      have_xattr="yes"
-    ],
-    [have_xattr="no"])
-
-AC_MSG_CHECKING([for Xattr])
-AC_MSG_RESULT([${have_xattr}])
-
 ## Report
 
 AC_OUTPUT([
@@ -232,7 +209,6 @@ echo
 echo
 echo "Configuration Options Summary:"
 echo
-echo "  Xattr................: ${have_xattr}"
 echo "  Thread Support.......: ${have_threads}"
 echo "  Inotify..............: ${have_inotify}"
 echo "  Windows notification.: ${have_notify_win32}"
index fae939b..762706e 100644 (file)
@@ -91,17 +91,6 @@ enum _Eio_File_Op
 };
 
 /**
- * @enum Eio_Xattr_Flags
- * Xattr creation flags
- */
-typedef enum
-{
-  EIO_XATTR_INSERT = 0, /**< Xattr will always be set */
-  EIO_XATTR_CREATED, /**< Xattr will be created, but will fail if already exists */
-  EIO_XATTR_REPLACE /**< Xattr will replace the existing value or fail if no value exist before */
-} Eio_Xattr_Flags;
-
-/**
  * @typedef Eio_File_Op
  * Input/Output operations on files.
  */
@@ -253,7 +242,7 @@ EAPI Eio_File *eio_file_xattr_set(const char *path,
                                  const char *attribute,
                                  const char *xattr_data,
                                  unsigned int xattr_size,
-                                 Eio_Xattr_Flags flags,
+                                 Eina_Xattr_Flags flags,
                                  Eio_Done_Cb done_cb,
                                  Eio_Error_Cb error_cb,
                                  const void *data);
index b55b585..26d10fb 100644 (file)
@@ -167,10 +167,10 @@ struct _Eio_File_Xattr
 
    const char *path;
    const char *attribute;
-   int flags;
+   Eina_Xattr_Flags flags;
 
    char *xattr_data;
-   unsigned int xattr_size;
+   ssize_t xattr_size;
 };
 
 struct _Eio_File_Progress
index abafd34..6653229 100644 (file)
  * @cond LOCAL
  */
 
-#ifdef HAVE_XATTR
 static void
 _eio_ls_xattr_heavy(void *data, Ecore_Thread *thread)
 {
    Eio_File_Char_Ls *async = data;
-   char *tmp;
-   ssize_t length;
-   ssize_t i;
-
-   length = listxattr(async->ls.directory, NULL, 0);
-
-   if (length <= 0) return ;
+   Eina_Iterator *it;
+   const char *tmp;
 
-   tmp = alloca(length);
-   length = listxattr(async->ls.directory, tmp, length);
+   it = eina_xattr_ls(async->ls.directory);
+   if (!it) return ;
 
-   for (i = 0; i < length; i += strlen(tmp) + 1)
+   EINA_ITERATOR_FOREACH(it, tmp)
      {
-        const char *xattr;
         Eina_Bool filter = EINA_TRUE;
 
-        xattr = eina_stringshare_add(tmp);
-
         if (async->filter_cb)
           {
              filter = async->filter_cb((void*) async->ls.common.data,
                                        &async->ls.common,
-                                       xattr);
+                                       tmp);
           }
 
-        if (filter) ecore_thread_feedback(thread, xattr);
-        else eina_stringshare_del(xattr);
+        if (filter) ecore_thread_feedback(thread, eina_stringshare_add(tmp));
 
         if (ecore_thread_check(thread))
           break;
      }
+
+   eina_iterator_free(it);
 }
 
 static void
@@ -83,28 +75,12 @@ static void
 _eio_file_xattr_get(void *data, Ecore_Thread *thread)
 {
    Eio_File_Xattr *async = data;
-   ssize_t sz;
 
    async->xattr_size = 0;
    async->xattr_data = NULL;
 
-   sz = getxattr(async->path, async->attribute, NULL, 0);
-   if (sz > 0 && sz < 2 * 1024 * 1024) /* sz should be smaller than 2MB (already huge in my opinion) */
-     {
-        async->xattr_data = malloc(sz);
-        async->xattr_size = (unsigned int) sz;
-
-        sz = getxattr(async->path, async->attribute, async->xattr_data, async->xattr_size);
-        if (sz != async->xattr_size)
-          {
-             free(async->xattr_data);
-             async->xattr_data = NULL;
-             async->xattr_size = 0;
-
-             ecore_thread_cancel(thread);
-          }
-     }
-   else
+   async->xattr_data = eina_xattr_get(async->path, async->attribute, &async->xattr_size);
+   if (!async->xattr_data)
      ecore_thread_cancel(thread);
 }
 
@@ -142,7 +118,7 @@ _eio_file_xattr_set(void *data, Ecore_Thread *thread)
 {
    Eio_File_Xattr *async = data;
 
-   if (setxattr(async->path, async->attribute, async->xattr_data, async->xattr_size, async->flags))
+   if (eina_xattr_set(async->path, async->attribute, async->xattr_data, async->xattr_size, async->flags))
      eio_file_thread_error(&async->common, thread);
    async->xattr_data = NULL;
 }
@@ -167,8 +143,6 @@ _eio_file_xattr_set_error(void *data, Ecore_Thread *thread __UNUSED__)
    _eio_file_xattr_free(async);
 }
 
-#endif
-
 /**
  * @endcond
  */
@@ -205,7 +179,6 @@ eio_file_xattr(const char *path,
               Eio_Error_Cb error_cb,
               const void *data)
 {
-#ifdef HAVE_XATTR
   Eio_File_Char_Ls *async;
 
   EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
@@ -231,9 +204,6 @@ eio_file_xattr(const char *path,
     return NULL;
 
   return &async->ls.common;
-#else
-  return NULL;
-#endif
 }
 
 /**
@@ -255,7 +225,6 @@ eio_file_xattr_get(const char *path,
                   Eio_Error_Cb error_cb,
                    const void *data)
 {
-#ifdef HAVE_XATTR
    Eio_File_Xattr *async;
 
    if (!path || !attribute || !done_cb || !error_cb)
@@ -278,9 +247,6 @@ eio_file_xattr_get(const char *path,
      return NULL;
 
    return &async->common;
-#else
-   return NULL;
-#endif
 }
 
 /**
@@ -302,27 +268,16 @@ eio_file_xattr_set(const char *path,
                    const char *attribute,
                    const char *xattr_data,
                    unsigned int xattr_size,
-                   Eio_Xattr_Flags flags,
+                   Eina_Xattr_Flags flags,
                    Eio_Done_Cb done_cb,
                    Eio_Error_Cb error_cb,
                    const void *data)
 {
-#ifdef HAVE_XATTR
    Eio_File_Xattr *async;
-   int iflags;
 
    if (!path || !attribute || !done_cb || !xattr_data || !xattr_size || !error_cb)
      return NULL;
 
-   switch (flags)
-     {
-      case EIO_XATTR_INSERT: iflags = 0; break;
-      case EIO_XATTR_REPLACE: iflags = XATTR_REPLACE; break;
-      case EIO_XATTR_CREATED: iflags = XATTR_CREATE; break;
-      default:
-         return NULL;
-     }
-
    async = malloc(sizeof (Eio_File_Xattr) + xattr_size);
    if (!async) return NULL;
 
@@ -331,7 +286,7 @@ eio_file_xattr_set(const char *path,
    async->xattr_size = xattr_size;
    async->xattr_data = (char*) (async + 1);
    memcpy(async->xattr_data, xattr_data, xattr_size);
-   async->flags = iflags;
+   async->flags = flags;
 
    if (!eio_file_set(&async->common,
                      done_cb,
@@ -343,9 +298,6 @@ eio_file_xattr_set(const char *path,
      return NULL;
 
    return &async->common;
-#else
-   return NULL;
-#endif
 }
 
 /**