summaryrefslogtreecommitdiff
path: root/source4/ntvfs/posix/pvfs_xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/ntvfs/posix/pvfs_xattr.c')
-rw-r--r--source4/ntvfs/posix/pvfs_xattr.c93
1 files changed, 26 insertions, 67 deletions
diff --git a/source4/ntvfs/posix/pvfs_xattr.c b/source4/ntvfs/posix/pvfs_xattr.c
index 47549499e6..4487663e8d 100644
--- a/source4/ntvfs/posix/pvfs_xattr.c
+++ b/source4/ntvfs/posix/pvfs_xattr.c
@@ -21,12 +21,11 @@
*/
#include "includes.h"
-#include "system/filesys.h"
#include "vfs_posix.h"
#include "librpc/gen_ndr/ndr_xattr.h"
/*
- pull a xattr as a blob, from either a file or a file descriptor
+ pull a xattr as a blob
*/
static NTSTATUS pull_xattr_blob(struct pvfs_state *pvfs,
TALLOC_CTX *mem_ctx,
@@ -36,45 +35,16 @@ static NTSTATUS pull_xattr_blob(struct pvfs_state *pvfs,
size_t estimated_size,
DATA_BLOB *blob)
{
-#if HAVE_XATTR_SUPPORT
- int ret;
-
- *blob = data_blob_talloc(mem_ctx, NULL, estimated_size);
- if (blob->data == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
-again:
- if (fd != -1) {
- ret = fgetxattr(fd, attr_name, blob->data, estimated_size);
- } else {
- ret = getxattr(fname, attr_name, blob->data, estimated_size);
- }
- if (ret == -1 && errno == ERANGE) {
- estimated_size *= 2;
- blob->data = talloc_realloc(mem_ctx, blob->data, estimated_size);
- if (blob->data == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- blob->length = estimated_size;
- goto again;
+ if (pvfs->ea_db) {
+ return pull_xattr_blob_tdb(pvfs, mem_ctx, attr_name, fname,
+ fd, estimated_size, blob);
}
-
- if (ret == -1) {
- data_blob_free(blob);
- return pvfs_map_errno(pvfs, errno);
- }
-
- blob->length = ret;
-
- return NT_STATUS_OK;
-#else
- return NT_STATUS_NOT_SUPPORTED;
-#endif
+ return pull_xattr_blob_system(pvfs, mem_ctx, attr_name, fname,
+ fd, estimated_size, blob);
}
/*
- push a xattr as a blob, from either a file or a file descriptor
+ push a xattr as a blob
*/
static NTSTATUS push_xattr_blob(struct pvfs_state *pvfs,
const char *attr_name,
@@ -82,22 +52,10 @@ static NTSTATUS push_xattr_blob(struct pvfs_state *pvfs,
int fd,
const DATA_BLOB *blob)
{
-#if HAVE_XATTR_SUPPORT
- int ret;
-
- if (fd != -1) {
- ret = fsetxattr(fd, attr_name, blob->data, blob->length, 0);
- } else {
- ret = setxattr(fname, attr_name, blob->data, blob->length, 0);
+ if (pvfs->ea_db) {
+ return push_xattr_blob_tdb(pvfs, attr_name, fname, fd, blob);
}
- if (ret == -1) {
- return pvfs_map_errno(pvfs, errno);
- }
-
- return NT_STATUS_OK;
-#else
- return NT_STATUS_NOT_SUPPORTED;
-#endif
+ return push_xattr_blob_system(pvfs, attr_name, fname, fd, blob);
}
@@ -107,24 +65,24 @@ static NTSTATUS push_xattr_blob(struct pvfs_state *pvfs,
static NTSTATUS delete_xattr(struct pvfs_state *pvfs, const char *attr_name,
const char *fname, int fd)
{
-#if HAVE_XATTR_SUPPORT
- int ret;
-
- if (fd != -1) {
- ret = fremovexattr(fd, attr_name);
- } else {
- ret = removexattr(fname, attr_name);
- }
- if (ret == -1) {
- return pvfs_map_errno(pvfs, errno);
+ if (pvfs->ea_db) {
+ return delete_xattr_tdb(pvfs, attr_name, fname, fd);
}
+ return delete_xattr_system(pvfs, attr_name, fname, fd);
+}
- return NT_STATUS_OK;
-#else
- return NT_STATUS_NOT_SUPPORTED;
-#endif
+/*
+ a hook called on unlink - allows the tdb xattr backend to cleanup
+*/
+NTSTATUS pvfs_xattr_unlink_hook(struct pvfs_state *pvfs, const char *fname)
+{
+ if (pvfs->ea_db) {
+ return unlink_xattr_tdb(pvfs, fname);
+ }
+ return unlink_xattr_system(pvfs, fname);
}
+
/*
load a NDR structure from a xattr
*/
@@ -211,7 +169,7 @@ NTSTATUS pvfs_dosattrib_load(struct pvfs_state *pvfs, struct pvfs_filename *name
/* not having a DosAttrib is not an error */
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
talloc_free(mem_ctx);
- return NT_STATUS_OK;
+ return pvfs_stream_info(pvfs, name, fd);
}
if (!NT_STATUS_IS_OK(status)) {
@@ -493,3 +451,4 @@ NTSTATUS pvfs_xattr_save(struct pvfs_state *pvfs,
talloc_free(aname);
return status;
}
+