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([
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}"
* @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
_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);
}
{
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;
}
_eio_file_xattr_free(async);
}
-#endif
-
/**
* @endcond
*/
Eio_Error_Cb error_cb,
const void *data)
{
-#ifdef HAVE_XATTR
Eio_File_Char_Ls *async;
EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
return NULL;
return &async->ls.common;
-#else
- return NULL;
-#endif
}
/**
Eio_Error_Cb error_cb,
const void *data)
{
-#ifdef HAVE_XATTR
Eio_File_Xattr *async;
if (!path || !attribute || !done_cb || !error_cb)
return NULL;
return &async->common;
-#else
- return NULL;
-#endif
}
/**
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;
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,
return NULL;
return &async->common;
-#else
- return NULL;
-#endif
}
/**