parent
31d4f2699b
commit
fc27a465a3
|
@ -187,6 +187,29 @@ 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_INOTIFY], [test "x$have_inotify" = "xyes"])
|
||||||
AM_CONDITIONAL([EIO_HAVE_WINCHANGE], [test "x$have_notify_win32" = "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
|
## Report
|
||||||
|
|
||||||
AC_OUTPUT([
|
AC_OUTPUT([
|
||||||
|
@ -209,6 +232,7 @@ echo
|
||||||
echo
|
echo
|
||||||
echo "Configuration Options Summary:"
|
echo "Configuration Options Summary:"
|
||||||
echo
|
echo
|
||||||
|
echo " Xattr................: ${have_xattr}"
|
||||||
echo " Thread Support.......: ${have_threads}"
|
echo " Thread Support.......: ${have_threads}"
|
||||||
echo " Inotify..............: ${have_inotify}"
|
echo " Inotify..............: ${have_inotify}"
|
||||||
echo " Windows notification.: ${have_notify_win32}"
|
echo " Windows notification.: ${have_notify_win32}"
|
||||||
|
|
|
@ -105,6 +105,10 @@
|
||||||
#include "eio_private.h"
|
#include "eio_private.h"
|
||||||
#include "Eio.h"
|
#include "Eio.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_XATTR
|
||||||
|
# include <sys/xattr.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*============================================================================*
|
/*============================================================================*
|
||||||
* Local *
|
* Local *
|
||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
|
@ -251,6 +255,41 @@ _eio_file_error(void *data, Ecore_Thread *thread __UNUSED__)
|
||||||
free(async);
|
free(async);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_XATTR
|
||||||
|
static void
|
||||||
|
_eio_file_copy_xattr(Ecore_Thread *thread, Eio_File_Progress *op, int in, int out)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
ssize_t length;
|
||||||
|
ssize_t i;
|
||||||
|
|
||||||
|
length = flistxattr(in, NULL, 0);
|
||||||
|
|
||||||
|
if (length > 0) return ;
|
||||||
|
|
||||||
|
tmp = alloca(length);
|
||||||
|
length = flistxattr(in, tmp, length);
|
||||||
|
|
||||||
|
for (i = 0; i < length; i += strlen(tmp) + 1)
|
||||||
|
{
|
||||||
|
ssize_t attr_length;
|
||||||
|
void *value;
|
||||||
|
|
||||||
|
attr_length = fgetxattr(in, tmp, NULL, 0);
|
||||||
|
if (!attr_length) continue ;
|
||||||
|
|
||||||
|
value = malloc(attr_length);
|
||||||
|
if (!value) continue ;
|
||||||
|
attr_length = fgetxattr(in, tmp, value, attr_length);
|
||||||
|
|
||||||
|
if (attr_length > 0)
|
||||||
|
fsetxattr(out, tmp, value, attr_length, 0);
|
||||||
|
|
||||||
|
free(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_eio_file_write(int fd, void *mem, ssize_t length)
|
_eio_file_write(int fd, void *mem, ssize_t length)
|
||||||
{
|
{
|
||||||
|
@ -594,6 +633,10 @@ eio_file_copy_do(Ecore_Thread *thread, Eio_File_Progress *copy)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_XATTR
|
||||||
|
_eio_file_copy_xattr(thread, copy, in, out);
|
||||||
|
#endif
|
||||||
|
|
||||||
close(out);
|
close(out);
|
||||||
close(in);
|
close(in);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue