On Thu, Sep 15, 2011 at 3:07 PM, Gustavo Sverzut Barbieri
<barbi...@profusion.mobi> wrote:
> Use safety checks for null/invalid parameters

Yep, will do. Forgot about that macro.

> Container get should return ls path, no? AFAIR other iterators do it.

I didn't know, so why not the path.

> How about the helper to set/get string, float and interger values? They can
> convert to string or just store using some standard binary representation
> that is platform independent.

I was planning to put this helper in eio only. Do you think they
should be in eina instead ?

> On Thursday, September 15, 2011, Enlightenment SVN <
> no-re...@enlightenment.org> wrote:
>> Log:
>> eina: add XAttr support to eina.
>>
>>
>> Author:       cedric
>> Date:         2011-09-15 05:39:40 -0700 (Thu, 15 Sep 2011)
>> New Revision: 63408
>> Trac:         http://trac.enlightenment.org/e/changeset/63408
>>
>> Modified:
>>  trunk/eina/configure.ac trunk/eina/src/include/eina_file.h
> trunk/eina/src/lib/eina_file.c
>>
>> Modified: trunk/eina/configure.ac
>> ===================================================================
>> --- trunk/eina/configure.ac     2011-09-15 11:15:46 UTC (rev 63407)
>> +++ trunk/eina/configure.ac     2011-09-15 12:39:40 UTC (rev 63408)
>> @@ -621,6 +621,29 @@
>>
>>  AC_SUBST([rt_libs])
>>
>> +### 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}])
>> +
>>  ### Modules
>>
>>  if test "x${have_default_mempool}" = "xyes" ; then
>> @@ -736,6 +759,7 @@
>>  echo "  Amalgamation.........: ${do_amalgamation}"
>>  echo "  Iconv support........: ${have_iconv}"
>>  echo "  File dirfd...........: ${have_dirfd}"
>> +echo "  File xattr...........: ${have_xattr}"
>>  echo
>>  echo "  Documentation........: ${build_doc}"
>>  echo "  Tests................: ${enable_tests}"
>>
>> Modified: trunk/eina/src/include/eina_file.h
>> ===================================================================
>> --- trunk/eina/src/include/eina_file.h  2011-09-15 11:15:46 UTC (rev
> 63407)
>> +++ trunk/eina/src/include/eina_file.h  2011-09-15 12:39:40 UTC (rev
> 63408)
>> @@ -112,6 +112,12 @@
>>   EINA_FILE_WHT      /**< Whiteout file type (unused on Windows). */
>>  } Eina_File_Type;
>>
>> +typedef enum {
>> +  EINA_XATTR_INSERT, /**< This is the default behaviour, it will either
> create or replace the extended attribute */
>> +  EINA_XATTR_REPLACE, /**< This will only succeed if the extended
> attribute previously existed */
>> +  EINA_XATTR_CREATED /**< This will only succeed if the extended
> attribute wasn't previously set */
>> +} Eina_Xattr_Flags;
>> +
>>  typedef struct _Eina_File Eina_File;
>>
>>  typedef enum {
>> @@ -274,6 +280,47 @@
>>  EAPI Eina_Iterator *eina_file_direct_ls(const char *dir)
> EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
>>
>>  /**
>> + * @brief Get an iterator that list all extended attribute of a file.
>> + *
>> + * @param file The filename to retrieve the extended attribute list from.
>> + * @return an iterator.
>> + *
>> + * The iterator will not allocate any data during the iteration step, so
> you need to copy them yourself
>> + * if you need.
>> + *
>> + * @since 1.1
>> + */
>> +EAPI Eina_Iterator *eina_xattr_ls(const char *file);
>> +
>> +/**
>> + * @brief Retrieve an extended attribute from a file.
>> + *
>> + * @param file The file to retrieve the extended attribute from.
>> + * @param atttribute The extended attribute name to retrieve.
>> + * @param size The size of the retrieved extended attribute.
>> + * @return the allocated data that hold the extended attribute value.
>> + *
>> + * It will return NULL and *size will be @c 0 if it fails.
>> + *
>> + * @since 1.1
>> + */
>> +EAPI void *eina_xattr_get(const char *file, const char *attribute,
> ssize_t *size);
>> +
>> +/**
>> + * @brief Set an extended attribute on a file.
>> + *
>> + * @param file The file to set the extended attribute to.
>> + * @param attribute The attribute to set.
>> + * @param data The data to set.
>> + * @param length The length of the data to set.
>> + * @param flags Define the set policy
>> + * @return EINA_TRUE on success, EINA_FALSE otherwise.
>> + *
>> + * @since 1.1
>> + */
>> +EAPI Eina_Bool eina_xattr_set(const char *file, const char *attribute,
> const void *data, ssize_t length, Eina_Xattr_Flags flags);
>> +
>> +/**
>>  * @brief Get a read-only handler to a file.
>>  *
>>  * @param name Filename to open
>>
>> Modified: trunk/eina/src/lib/eina_file.c
>> ===================================================================
>> --- trunk/eina/src/lib/eina_file.c      2011-09-15 11:15:46 UTC (rev
> 63407)
>> +++ trunk/eina/src/lib/eina_file.c      2011-09-15 12:39:40 UTC (rev
> 63408)
>> @@ -47,6 +47,10 @@
>>  #include <sys/mman.h>
>>  #include <fcntl.h>
>>
>> +#ifdef HAVE_XATTR
>> +# include <sys/xattr.h>
>> +#endif
>> +
>>  #define PATH_DELIM '/'
>>
>>  #ifdef __sun
>> @@ -99,6 +103,7 @@
>>
>>  typedef struct _Eina_File_Iterator Eina_File_Iterator;
>>  typedef struct _Eina_File_Map Eina_File_Map;
>> +typedef struct _Eina_Xattr_Iterator Eina_Xattr_Iterator;
>>
>>  struct _Eina_File_Iterator
>>  {
>> @@ -110,6 +115,16 @@
>>    char dir[1];
>>  };
>>
>> +struct _Eina_Xattr_Iterator
>> +{
>> +   Eina_Iterator iterator;
>> +
>> +   ssize_t length;
>> +   ssize_t offset;
>> +
>> +   char xattr[1];
>> +};
>> +
>>  struct _Eina_File
>>  {
>>    const char *filename;
>> @@ -379,7 +394,34 @@
>>    return EINA_TRUE;
>>  }
>>
>> +#ifdef HAVE_XATTR
>> +static Eina_Bool
>> +_eina_xattr_ls_iterator_next(Eina_Xattr_Iterator *it, void **data)
>> +{
>> +   if (it->offset >= it->length)
>> +     return EINA_FALSE;
>> +
>> +   *data = it->xattr + it->offset;
>> +   it->offset += strlen(it->xattr + it->offset) + 1;
>> +
>> +   return EINA_TRUE;
>> +}
>> +
>> +static void *
>> +_eina_xattr_ls_iterator_container(Eina_Xattr_Iterator *it __UNUSED__)
>> +{
>> +   return NULL;
>> +}
>> +
>>  static void
>> +_eina_xattr_ls_iterator_free(Eina_Xattr_Iterator *it)
>> +{
>> +   EINA_MAGIC_SET(&it->iterator, 0);
>> +   free(it);
>> +}
>> +#endif
>> +
>> +static void
>>  _eina_file_real_close(Eina_File *file)
>>  {
>>    if (file->refcount != 0) return;
>> @@ -736,6 +778,91 @@
>>    return &it->iterator;
>>  }
>>
>> +EAPI Eina_Iterator *
>> +eina_xattr_ls(const char *file)
>> +{
>> +   Eina_Xattr_Iterator *it;
>> +   ssize_t length;
>> +
>> +#ifdef HAVE_XATTR
>> +   if (!file)
>> +     return NULL;
>> +
>> +   length = listxattr(file, NULL, 0);
>> +   if (length <= 0) return NULL;
>> +
>> +   it = calloc(1, sizeof (Eina_Xattr_Iterator) + length - 1);
>> +   if (!it) return NULL;
>> +
>> +   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
>> +
>> +   it->length = listxattr(file, it->xattr, length);
>> +   if (it->length != length)
>> +     {
>> +        free(it);
>> +       return NULL;
>> +     }
>> +
>> +   it->iterator.version = EINA_ITERATOR_VERSION;
>> +   it->iterator.next = FUNC_ITERATOR_NEXT(_eina_xattr_ls_iterator_next);
>> +   it->iterator.get_container =
> FUNC_ITERATOR_GET_CONTAINER(_eina_xattr_ls_iterator_container);
>> +   it->iterator.free = FUNC_ITERATOR_FREE(_eina_xattr_ls_iterator_free);
>> +
>> +   return &it->iterator;
>> +#else
>> +   return NULL;
>> +#endif
>> +}
>> +
>> +EAPI void *
>> +eina_xattr_get(const char *file, const char *attribute, ssize_t *size)
>> +{
>> +   void *ret = NULL;
>> +   ssize_t tmp;
>> +
>> +   if (!size || !file || !attribute) return NULL;
>> +   *size = getxattr(file, attribute, NULL, 0);
>> +   /* Size should be less than 2MB (already huge in my opinion) */
>> +   if (!(*size > 0 && *size < 2 * 1024 * 1024))
>> +     goto on_error;
>> +
>> +   ret = malloc(*size);
>> +   if (!ret) return NULL;
>> +
>> +   tmp = getxattr(file, attribute, ret, *size);
>> +   if (tmp != *size)
>> +     goto on_error;
>> +
>> +   return ret;
>> +
>> + on_error:
>> +   free(ret);
>> +   *size = 0;
>> +   return NULL;
>> +}
>> +
>> +EAPI Eina_Bool
>> +eina_xattr_set(const char *file, const char *attribute, const void *data,
> ssize_t length, Eina_Xattr_Flags flags)
>> +{
>> +   int iflags;
>> +
>> +   if (!file || !attribute || !data || length <= 0 || length > 2 * 1024 *
> 1024)
>> +     return EINA_FALSE;
>> +
>> +   switch (flags)
>> +     {
>> +     case EINA_XATTR_INSERT: iflags = 0; break;
>> +     case EINA_XATTR_REPLACE: iflags = XATTR_REPLACE; break;
>> +     case EINA_XATTR_CREATED: iflags = XATTR_CREATE; break;
>> +     default:
>> +       return EINA_FALSE;
>> +     }
>> +
>> +   if (setxattr(file, attribute, data, length, iflags))
>> +     return EINA_FALSE;
>> +   return EINA_TRUE;
>> +}
>> +
>>  EAPI Eina_File *
>>  eina_file_open(const char *filename, Eina_Bool shared)
>>  {
>>
>>
>>
> ------------------------------------------------------------------------------
>> Doing More with Less: The Next Generation Virtual Desktop
>> What are the key obstacles that have prevented many mid-market businesses
>> from deploying virtual desktops?   How do next-generation virtual desktops
>> provide companies an easier-to-deploy, easier-to-manage and more
> affordable
>> virtual desktop model.http://www.accelacomm.com/jaw/sfnl/114/51426474/
>> _______________________________________________
>> enlightenment-svn mailing list
>> enlightenment-...@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>>
>
> --
> Gustavo Sverzut Barbieri
> http://profusion.mobi embedded systems
> --------------------------------------
> MSN: barbi...@gmail.com
> Skype: gsbarbieri
> Mobile: +55 (19) 9225-2202
> ------------------------------------------------------------------------------
> Doing More with Less: The Next Generation Virtual Desktop
> What are the key obstacles that have prevented many mid-market businesses
> from deploying virtual desktops?   How do next-generation virtual desktops
> provide companies an easier-to-deploy, easier-to-manage and more affordable
> virtual desktop model.http://www.accelacomm.com/jaw/sfnl/114/51426474/
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>
>



-- 
Cedric BAIL

------------------------------------------------------------------------------
Doing More with Less: The Next Generation Virtual Desktop 
What are the key obstacles that have prevented many mid-market businesses
from deploying virtual desktops?   How do next-generation virtual desktops
provide companies an easier-to-deploy, easier-to-manage and more affordable
virtual desktop model.http://www.accelacomm.com/jaw/sfnl/114/51426474/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to