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: + *
+ * APR_SUCCESS the path was opened for attribute access + * APR_STATUS_IS_ENOENT() the file or directory does not exist + *+ * 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: + *
+ * APR_SUCCESS the file was opened for attribute access + *+ * + * @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: + *
+ * APR_SUCCESS the directory was opened for attribute access + *+ * + * @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 + *
+ * APR_SUCCESS the context was destroyed + *+ * + * @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 + *
+ * 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. + *+ * @param p the pool to allocate any memory from if required + * @return the status of the operation: + *
+ * 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 + *+ * 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: + *
+ * APR_SUCCESS the attribute was retrieved + * APR_STATUS_IS_ENOATTR() the attribute does not exist + *+ * 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: + *
+ * APR_SUCCESS the existence was successfully tested + *+ * 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: + *
+ * APR_SUCCESS the attributes were listed + *+ * 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: + *
+ * APR_SUCCESS the attribute was removed + * APR_STATUS_IS_ENOATTR() the attribute does not exist + *+ * 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