Index: include/apr_file_xattr.h
===================================================================
--- include/apr_file_xattr.h	(revision 0)
+++ include/apr_file_xattr.h	(revision 0)
@@ -0,0 +1,249 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APR_FILE_XATTR_H
+#define APR_FILE_XATTR_H
+
+/**
+ * @file apr_file_xattr.h
+ * @brief APR File Extended Attributes
+ */
+
+#include "apr.h"
+#include "apr_pools.h"
+#include "apr_tables.h"
+#include "apr_file_io.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup apr_xattr File Extended Attribute Functions
+ * @ingroup APR 
+ * @{
+ */
+
+/** When setting values, fail if the attribute already exists */
+#define APR_XATTR_CREATE      1
+
+/** When setting values, fail if the attribute does not already exist */
+#define APR_XATTR_REPLACE     2
+
+typedef struct apr_xattr_t apr_xattr_t;
+
+/**
+ * Open a context for access to the extended attributes of a file or
+ * directory specified by a path name
+ *
+ * @param new the context allocated for access to extended attributes
+ * @param pathname the path name of the file or directory
+ * @param p the pool to allocate any memory from
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the path was opened for attribute access
+ *        APR_STATUS_IS_ENOENT()  the file or directory does not exist
+ * </PRE>
+ * Other operating system dependant error codes may be returned.
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_open_path(apr_xattr_t **new,
+                                              const char *pathname,
+                                              apr_pool_t *p);
+
+/**
+ * Open a context for access to the extended attributes of an open file
+ *
+ * @param new the context allocated for access to extended attributes
+ * @param file the open file to access the extended attributes on
+ * @param p the pool to allocate any memory from
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the file was opened for attribute access
+ * </PRE>
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_open_file(apr_xattr_t **new,
+                                              apr_file_t *file,
+                                              apr_pool_t *p);
+
+/**
+ * Open a context for access to the extended attributes of an open directory
+ *
+ * @param new the context allocated for access to extended attributes
+ * @param dir the open directory to access the extended attributes on
+ * @param p the pool to allocate any memory from if required
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the directory was opened for attribute access
+ * </PRE>
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_open_dir(apr_xattr_t **new,
+                                             apr_dir_t *dir,
+                                             apr_pool_t *p);
+
+/**
+ * Destroy a context used for access to extended attributes
+ *
+ * @param xattr the context to destroy
+ * <PRE>
+ *        APR_SUCCESS             the context was destroyed
+ * </PRE>
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_destroy(apr_xattr_t *xattr);
+
+/**
+ * Set an extended attribute on a file or directory
+ * @param xattr the opened extended attribute file or directory context
+ * @param name the attribute name to set
+ * @param value the attribute value
+ * @param size the size in bytes of the attribute value
+ * @param flags to control how the attribute is set
+ * <PRE>
+ *         APR_XATTR_CREATE       return an error if the attribute name
+ *                                already exists.
+ *         APR_XATTR_REPLACE      return an error if the attribute name
+ *                                does not already exist.
+ * </PRE>
+ * @param p the pool to allocate any memory from if required
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the attribute was set
+ *        APR_STATUS_IS_EEXIST()  create flag and the attribute exists
+ *        APR_STATUS_IS_ENOATTR() replace flag and the attribute doesn't exist
+ * </PRE>
+ * Other operating system dependant error codes may be returned
+ * in the cases not listed above.
+ *
+ * @remark if neither flag APR_XATTR_CREATE or APR_XATTR_REPLACE are
+ * given then the attribute will either be created if it does not
+ * already exist or replaced if it does exist.
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_set(const apr_xattr_t *xattr,
+                                        const char *name,
+                                        const void *value,
+                                        apr_size_t size,
+                                        apr_uint32_t flags);
+
+/**
+ * Get an extended attribute from a file or directory
+ * @param xattr the opened extended attribute file or directory context
+ * @param name the name of the attribute to get
+ * @param value the returned attribute value allocated from the pool
+ * @param size the returned size of the attribute value
+ * @param flags to control how the attribute is got (reserved for future use)
+ * @param p the pool to allocate any memory from if required
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the attribute was retrieved
+ *        APR_STATUS_IS_ENOATTR() the attribute does not exist
+ * </PRE>
+ * Other operating system dependant error codes may be returned
+ * in the cases not listed above.
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_get(const apr_xattr_t *xattr,
+                                        const char *name,
+                                        void **value,
+                                        apr_size_t *size,
+                                        apr_uint32_t flags);
+
+/**
+ * Check for the existence of an extended attribute on a file or directory
+ * @param xattr the opened extended attribute file or directory context
+ * @param name the name of the attribute to get
+ * @param exists the returned value indicating whether the attribute exists
+ * @param flags to control how the attribute is got (reserved for future use)
+ * @param p the pool to allocate any memory from if required
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the existence was successfully tested
+ * </PRE>
+ * Other operating system dependant error codes may be returned
+ * in the cases not listed above.
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */
+APR_DECLARE(apr_status_t) apr_xattr_exists(const apr_xattr_t *xattr,
+                                           const char *name,
+                                           int *exists,
+                                           apr_uint32_t flags);
+
+/**
+ * List the extended attributes on a file or directory
+ * @param xattr the opened extended attribute file or directory context
+ * @param list the returned array of attributes names
+ * @param flags to control how the file is listed (reserved for future use)
+ * @param p the pool to allocate any memory from if required
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the attributes were listed
+ * </PRE>
+ * Other operating system dependant error codes may be returned
+ * in the cases not listed above.
+ *
+ * @remark list is an array containing simple null terminated strings.
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */                        
+APR_DECLARE(apr_status_t) apr_xattr_list(const apr_xattr_t *xattr,
+                                         apr_array_header_t **list,
+                                         apr_uint32_t flags);
+
+/**
+ * Remove an extended attribute from a file or directory
+ * @param xattr the opened extended attribute file or directory context
+ * @param name the attribute name to remove
+ * @param flags to control how the attribute is removed (reserved for future use)
+ * @param p the pool to allocate any memory from if required
+ * @return the status of the operation:
+ * <PRE>
+ *        APR_SUCCESS             the attribute was removed
+ *        APR_STATUS_IS_ENOATTR() the attribute does not exist
+ * </PRE>
+ * Other operating system dependant error codes may be returned
+ * in the cases not listed above.
+ *
+ * @warning Platforms which do not implement this feature will return
+ * APR_ENOTIMPL.
+ */                        
+APR_DECLARE(apr_status_t) apr_xattr_remove(const apr_xattr_t *xattr,
+                                           const char *name,
+                                           apr_uint32_t flags);
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* ! APR_FILE_XATTR_H */
Index: include/arch/unix/apr_arch_xattr.h
===================================================================
--- include/arch/unix/apr_arch_xattr.h	(revision 0)
+++ include/arch/unix/apr_arch_xattr.h	(revision 0)
@@ -0,0 +1,51 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef FILE_XATTR_H
+#define FILE_XATTR_H
+
+#if APR_HAVE_CTYPE_H
+#include <ctype.h>
+#endif
+#if APR_HAVA_ERRNO_H
+#include <errno.h>
+#endif
+#if APR_HAVE_SYS_XATTR_H
+#include <sys/xattr.h>
+#endif
+#if APR_HAVE_SYS_EXTATTR_H
+#include <sys/extattr.h>
+#endif
+#if APR_HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#if APR_HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+#ifdef _LARGEFILE64_SOURCE
+#define XATTR_OPEN_FLAGS O_RDONLY | O_LARGEFILE
+#else
+#define XATTR_OPEN_FLAGS O_RDONLY
+#endif
+
+struct apr_xattr_t {
+    int fd;
+    apr_uint32_t flags;
+    apr_pool_t *pool;
+};
+
+#endif
Index: include/apr_errno.h
===================================================================
--- include/apr_errno.h	(revision 606453)
+++ include/apr_errno.h	(working copy)
@@ -851,6 +851,13 @@
 #define APR_EAFNOSUPPORT  (APR_OS_START_CANONERR + 27)
 #endif
 
+/** @see APR_STATUS_IS_ENOATTR */
+#ifdef ENOATTR
+#define APR_ENOATTR ENOATTR
+#else
+#define APR_ENOATTR       (APR_OS_START_CANONERR + 28)
+#endif
+
 /** @} */
 
 #if defined(OS2) && !defined(DOXYGEN)
@@ -995,6 +1002,7 @@
                 || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)
 #define APR_STATUS_IS_EAFNOSUPPORT(s)   ((s) == APR_AFNOSUPPORT \
                 || (s) == APR_OS_START_SYSERR + SOCEAFNOSUPPORT)
+#define APR_STATUS_IS_ENOATTR(s)        ((s) == APR_ENOATTR)
 
 /*
     Sorry, too tired to wrap this up for OS2... feel free to
@@ -1139,6 +1147,7 @@
                 || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY)
 #define APR_STATUS_IS_EAFNOSUPPORT(s)   ((s) == APR_EAFNOSUPPORT \
                 || (s) == APR_OS_START_SYSERR + WSAEAFNOSUPPORT)
+#define APR_STATUS_IS_ENOATTR(s)        ((s) == APR_ENOATTR)
 
 #elif defined(NETWARE) && defined(USE_WINSOCK) && !defined(DOXYGEN) /* !defined(OS2) && !defined(WIN32) */
 
@@ -1200,6 +1209,7 @@
 #define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY)
 #define APR_STATUS_IS_EAFNOSUPPORT(s)   ((s) == APR_EAFNOSUPPORT \
                 || (s) == APR_OS_START_SYSERR + WSAEAFNOSUPPORT)
+#define APR_STATUS_IS_ENOATTR(s)        ((s) == APR_ENOATTR)
 
 #else /* !defined(NETWARE) && !defined(OS2) && !defined(WIN32) */
 
@@ -1319,6 +1329,13 @@
                                           (s) == APR_EEXIST)
 /** Address Family not supported */
 #define APR_STATUS_IS_EAFNOSUPPORT(s)    ((s) == APR_EAFNOSUPPORT)
+/** Attribute does not exists */
+#ifdef ENODATA
+#define APR_STATUS_IS_ENOATTR(s)         ((s) == APR_ENOATTR \
+                                       || (s) == ENODATA)
+#else
+#define APR_STATUS_IS_ENOATTR(s)         ((s) == APR_ENOATTR)
+#endif
 /** @} */
 
 #endif /* !defined(NETWARE) && !defined(OS2) && !defined(WIN32) */