summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2006-06-05 21:48:29 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:08:53 -0500
commitca62ddd8d901cce923d1cda958793054f80b1f57 (patch)
treec32836c83e6d7102ae4bde6917a5251f7d493860
parent2a9982aa52d07605a5170806530ee46eae38a78e (diff)
downloadsamba-ca62ddd8d901cce923d1cda958793054f80b1f57.tar.gz
samba-ca62ddd8d901cce923d1cda958793054f80b1f57.tar.bz2
samba-ca62ddd8d901cce923d1cda958793054f80b1f57.zip
r16051: Move the XATTR compatability code into a new file, so I can use it for
the getntacl utility. Andrew Bartlett (This used to be commit b1e0d4747b412929e1d4e24d6d9e504df3ddc824)
-rw-r--r--source4/configure.ac1
-rw-r--r--source4/lib/util/config.mk11
-rw-r--r--source4/lib/util/wrap_xattr.c121
-rw-r--r--source4/lib/util/wrap_xattr.h25
-rw-r--r--source4/ntvfs/posix/config.m432
-rw-r--r--source4/ntvfs/posix/config.mk2
-rw-r--r--source4/ntvfs/posix/xattr_system.c83
-rw-r--r--source4/utils/config.mk2
-rw-r--r--source4/utils/getntacl.c18
9 files changed, 170 insertions, 125 deletions
diff --git a/source4/configure.ac b/source4/configure.ac
index c5d1b361fa..ee3d9a8677 100644
--- a/source4/configure.ac
+++ b/source4/configure.ac
@@ -22,6 +22,7 @@ sinclude(lib/util/fault.m4)
sinclude(lib/util/signal.m4)
sinclude(lib/util/util.m4)
sinclude(lib/util/fsusage.m4)
+sinclude(lib/util/xattr.m4)
sinclude(lib/util/capability.m4)
sinclude(lib/util/time.m4)
sinclude(lib/popt/config.m4)
diff --git a/source4/lib/util/config.mk b/source4/lib/util/config.mk
index 312653c19f..84598be4d0 100644
--- a/source4/lib/util/config.mk
+++ b/source4/lib/util/config.mk
@@ -39,3 +39,14 @@ OBJ_FILES = pidfile.o
[SUBSYSTEM::UNIX_PRIVS]
PRIVATE_PROTO_HEADER = unix_privs.h
OBJ_FILES = unix_privs.o
+
+################################################
+# Start SUBSYSTEM WRAP_XATTR
+[SUBSYSTEM::WRAP_XATTR]
+PUBLIC_PROTO_HEADER = wrap_xattr.h
+OBJ_FILES = \
+ wrap_xattr.o
+PUBLIC_DEPENDENCIES = XATTR
+#
+# End SUBSYSTEM WRAP_XATTR
+################################################
diff --git a/source4/lib/util/wrap_xattr.c b/source4/lib/util/wrap_xattr.c
new file mode 100644
index 0000000000..21c8f90635
--- /dev/null
+++ b/source4/lib/util/wrap_xattr.c
@@ -0,0 +1,121 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ POSIX NTVFS backend - xattr support using filesystem xattrs
+
+ Copyright (C) Andrew Tridgell 2004
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "system/filesys.h"
+#include "wrap_xattr.h"
+
+#if defined(HAVE_XATTR_SUPPORT) && defined(XATTR_ADDITIONAL_OPTIONS)
+static ssize_t _wrap_darwin_fgetxattr(int fd, const char *name, void *value, size_t size)
+{
+ return fgetxattr(fd, name, value, size, 0, 0);
+}
+static ssize_t _wrap_darwin_getxattr(const char *path, const char *name, void *value, size_t size)
+{
+ return getxattr(path, name, value, size, 0, 0);
+}
+static int _wrap_darwin_fsetxattr(int fd, const char *name, void *value, size_t size, int flags)
+{
+ return fsetxattr(fd, name, value, size, 0, flags);
+}
+static int _wrap_darwin_setxattr(const char *path, const char *name, void *value, size_t size, int flags)
+{
+ return setxattr(path, name, value, size, 0, flags);
+}
+static int _wrap_darwin_fremovexattr(int fd, const char *name)
+{
+ return fremovexattr(fd, name, 0);
+}
+static int _wrap_darwin_removexattr(const char *path, const char *name)
+{
+ return removexattr(path, name, 0);
+}
+#define fgetxattr _wrap_darwin_fgetxattr
+#define getxattr _wrap_darwin_getxattr
+#define fsetxattr _wrap_darwin_fsetxattr
+#define setxattr _wrap_darwin_setxattr
+#define fremovexattr _wrap_darwin_fremovexattr
+#define removexattr _wrap_darwin_removexattr
+#elif !defined(HAVE_XATTR_SUPPORT)
+static ssize_t _none_fgetxattr(int fd, const char *name, void *value, size_t size)
+{
+ errno = ENOSYS;
+ return -1;
+}
+static ssize_t _none_getxattr(const char *path, const char *name, void *value, size_t size)
+{
+ errno = ENOSYS;
+ return -1;
+}
+static int _none_fsetxattr(int fd, const char *name, void *value, size_t size, int flags)
+{
+ errno = ENOSYS;
+ return -1;
+}
+static int _none_setxattr(const char *path, const char *name, void *value, size_t size, int flags)
+{
+ errno = ENOSYS;
+ return -1;
+}
+static int _none_fremovexattr(int fd, const char *name)
+{
+ errno = ENOSYS;
+ return -1;
+}
+static int _none_removexattr(const char *path, const char *name)
+{
+ errno = ENOSYS;
+ return -1;
+}
+#define fgetxattr _none_fgetxattr
+#define getxattr _none_getxattr
+#define fsetxattr _none_fsetxattr
+#define setxattr _none_setxattr
+#define fremovexattr _none_fremovexattr
+#define removexattr _none_removexattr
+#endif
+
+_PUBLIC_ ssize_t wrap_fgetxattr(int fd, const char *name, void *value, size_t size)
+{
+ return fgetxattr(fd, name, value, size);
+}
+_PUBLIC_ ssize_t wrap_getxattr(const char *path, const char *name, void *value, size_t size)
+{
+ return getxattr(path, name, value, size);
+}
+_PUBLIC_ int wrap_fsetxattr(int fd, const char *name, void *value, size_t size, int flags)
+{
+ return fsetxattr(fd, name, value, size, flags);
+}
+_PUBLIC_ int wrap_setxattr(const char *path, const char *name, void *value, size_t size, int flags)
+{
+ return setxattr(path, name, value, size, flags);
+}
+_PUBLIC_ int wrap_fremovexattr(int fd, const char *name)
+{
+ return fremovexattr(fd, name);
+}
+_PUBLIC_ int wrap_removexattr(const char *path, const char *name)
+{
+ return removexattr(path, name);
+}
+
diff --git a/source4/lib/util/wrap_xattr.h b/source4/lib/util/wrap_xattr.h
new file mode 100644
index 0000000000..58f920704b
--- /dev/null
+++ b/source4/lib/util/wrap_xattr.h
@@ -0,0 +1,25 @@
+#ifndef __LIB_UTIL_WRAP_XATTR_H__
+#define __LIB_UTIL_WRAP_XATTR_H__
+
+#undef _PRINTF_ATTRIBUTE
+#define _PRINTF_ATTRIBUTE(a1, a2) PRINTF_ATTRIBUTE(a1, a2)
+/* This file was automatically generated by mkproto.pl. DO NOT EDIT */
+
+#ifndef _PUBLIC_
+#define _PUBLIC_
+#endif
+
+
+/* The following definitions come from lib/util/wrap_xattr.c */
+
+_PUBLIC_ ssize_t wrap_fgetxattr(int fd, const char *name, void *value, size_t size);
+_PUBLIC_ ssize_t wrap_getxattr(const char *path, const char *name, void *value, size_t size);
+_PUBLIC_ int wrap_fsetxattr(int fd, const char *name, void *value, size_t size, int flags);
+_PUBLIC_ int wrap_setxattr(const char *path, const char *name, void *value, size_t size, int flags);
+_PUBLIC_ int wrap_fremovexattr(int fd, const char *name);
+_PUBLIC_ int wrap_removexattr(const char *path, const char *name);
+#undef _PRINTF_ATTRIBUTE
+#define _PRINTF_ATTRIBUTE(a1, a2)
+
+#endif /* __LIB_UTIL_WRAP_XATTR_H__ */
+
diff --git a/source4/ntvfs/posix/config.m4 b/source4/ntvfs/posix/config.m4
index fb4362f755..c2cdf0ecaf 100644
--- a/source4/ntvfs/posix/config.m4
+++ b/source4/ntvfs/posix/config.m4
@@ -21,38 +21,6 @@ if test x"$ac_cv_decl_have_stat_tv_nsec" = x"yes"; then
AC_DEFINE(HAVE_STAT_TV_NSEC,1,[Whether stat has tv_nsec nanosecond fields])
fi
-dnl ############################################
-dnl use flistxattr as the key function for having
-dnl sufficient xattr support for posix xattr backend
-AC_CHECK_HEADERS(sys/attributes.h attr/xattr.h sys/xattr.h)
-AC_SEARCH_LIBS_EXT(flistxattr, [attr], XATTR_LIBS)
-AC_CHECK_FUNC_EXT(flistxattr, $XATTR_LIBS)
-SMB_EXT_LIB(XATTR,[${XATTR_LIBS}],[${XATTR_CFLAGS}],[${XATTR_CPPFLAGS}],[${XATTR_LDFLAGS}])
-if test x"$ac_cv_func_ext_flistxattr" = x"yes"; then
- AC_CACHE_CHECK([whether xattr interface takes additional options], smb_attr_cv_xattr_add_opt,
- [old_LIBS=$LIBS
- LIBS="$LIBS $XATTRLIBS"
- AC_TRY_COMPILE([
- #include <sys/types.h>
- #if HAVE_ATTR_XATTR_H
- #include <attr/xattr.h>
- #elif HAVE_SYS_XATTR_H
- #include <sys/xattr.h>
- #endif
- #ifndef NULL
- #define NULL ((void *)0)
- #endif
- ],[
- getxattr(NULL, NULL, NULL, 0, 0, 0);
- ],smb_attr_cv_xattr_add_opt=yes,smb_attr_cv_xattr_add_opt=no)
- LIBS=$old_LIBS])
- if test x"$smb_attr_cv_xattr_add_opt" = x"yes"; then
- AC_DEFINE(XATTR_ADDITIONAL_OPTIONS, 1, [xattr functions have additional options])
- fi
- AC_DEFINE(HAVE_XATTR_SUPPORT,1,[Whether we have xattr support])
- SMB_ENABLE(XATTR,YES)
-fi
-
AC_CHECK_HEADERS(blkid/blkid.h)
AC_SEARCH_LIBS_EXT(blkid_get_cache, [blkid], BLKID_LIBS)
AC_CHECK_FUNC_EXT(blkid_get_cache, $BLKID_LIBS)
diff --git a/source4/ntvfs/posix/config.mk b/source4/ntvfs/posix/config.mk
index dde49a5531..2835fc4575 100644
--- a/source4/ntvfs/posix/config.mk
+++ b/source4/ntvfs/posix/config.mk
@@ -32,6 +32,6 @@ OBJ_FILES = \
pvfs_notify.o \
xattr_system.o \
xattr_tdb.o
-PUBLIC_DEPENDENCIES = NDR_XATTR XATTR BLKID ntvfs_common MESSAGING
+PUBLIC_DEPENDENCIES = NDR_XATTR WRAP_XATTR BLKID ntvfs_common MESSAGING
# End MODULE ntvfs_posix
################################################
diff --git a/source4/ntvfs/posix/xattr_system.c b/source4/ntvfs/posix/xattr_system.c
index 958f57e0fd..9dca13e5c2 100644
--- a/source4/ntvfs/posix/xattr_system.c
+++ b/source4/ntvfs/posix/xattr_system.c
@@ -22,76 +22,7 @@
#include "includes.h"
#include "vfs_posix.h"
-
-#if defined(HAVE_XATTR_SUPPORT) && defined(XATTR_ADDITIONAL_OPTIONS)
-static ssize_t _wrap_darwin_fgetxattr(int fd, const char *name, void *value, size_t size)
-{
- return fgetxattr(fd, name, value, size, 0, 0);
-}
-static ssize_t _wrap_darwin_getxattr(const char *path, const char *name, void *value, size_t size)
-{
- return getxattr(path, name, value, size, 0, 0);
-}
-static int _wrap_darwin_fsetxattr(int fd, const char *name, void *value, size_t size, int flags)
-{
- return fsetxattr(fd, name, value, size, 0, flags);
-}
-static int _wrap_darwin_setxattr(const char *path, const char *name, void *value, size_t size, int flags)
-{
- return setxattr(path, name, value, size, 0, flags);
-}
-static int _wrap_darwin_fremovexattr(int fd, const char *name)
-{
- return fremovexattr(fd, name, 0);
-}
-static int _wrap_darwin_removexattr(const char *path, const char *name)
-{
- return removexattr(path, name, 0);
-}
-#define fgetxattr _wrap_darwin_fgetxattr
-#define getxattr _wrap_darwin_getxattr
-#define fsetxattr _wrap_darwin_fsetxattr
-#define setxattr _wrap_darwin_setxattr
-#define fremovexattr _wrap_darwin_fremovexattr
-#define removexattr _wrap_darwin_removexattr
-#elif !defined(HAVE_XATTR_SUPPORT)
-static ssize_t _none_fgetxattr(int fd, const char *name, void *value, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-static ssize_t _none_getxattr(const char *path, const char *name, void *value, size_t size)
-{
- errno = ENOSYS;
- return -1;
-}
-static int _none_fsetxattr(int fd, const char *name, void *value, size_t size, int flags)
-{
- errno = ENOSYS;
- return -1;
-}
-static int _none_setxattr(const char *path, const char *name, void *value, size_t size, int flags)
-{
- errno = ENOSYS;
- return -1;
-}
-static int _none_fremovexattr(int fd, const char *name)
-{
- errno = ENOSYS;
- return -1;
-}
-static int _none_removexattr(const char *path, const char *name)
-{
- errno = ENOSYS;
- return -1;
-}
-#define fgetxattr _none_fgetxattr
-#define getxattr _none_getxattr
-#define fsetxattr _none_fsetxattr
-#define setxattr _none_setxattr
-#define fremovexattr _none_fremovexattr
-#define removexattr _none_removexattr
-#endif
+#include "lib/util/wrap_xattr.h"
/*
pull a xattr as a blob, from either a file or a file descriptor
@@ -113,9 +44,9 @@ NTSTATUS pull_xattr_blob_system(struct pvfs_state *pvfs,
again:
if (fd != -1) {
- ret = fgetxattr(fd, attr_name, blob->data, estimated_size);
+ ret = wrap_fgetxattr(fd, attr_name, blob->data, estimated_size);
} else {
- ret = getxattr(fname, attr_name, blob->data, estimated_size);
+ ret = wrap_getxattr(fname, attr_name, blob->data, estimated_size);
}
if (ret == -1 && errno == ERANGE) {
estimated_size *= 2;
@@ -150,9 +81,9 @@ NTSTATUS push_xattr_blob_system(struct pvfs_state *pvfs,
int ret;
if (fd != -1) {
- ret = fsetxattr(fd, attr_name, blob->data, blob->length, 0);
+ ret = wrap_fsetxattr(fd, attr_name, blob->data, blob->length, 0);
} else {
- ret = setxattr(fname, attr_name, blob->data, blob->length, 0);
+ ret = wrap_setxattr(fname, attr_name, blob->data, blob->length, 0);
}
if (ret == -1) {
return pvfs_map_errno(pvfs, errno);
@@ -171,9 +102,9 @@ NTSTATUS delete_xattr_system(struct pvfs_state *pvfs, const char *attr_name,
int ret;
if (fd != -1) {
- ret = fremovexattr(fd, attr_name);
+ ret = wrap_fremovexattr(fd, attr_name);
} else {
- ret = removexattr(fname, attr_name);
+ ret = wrap_removexattr(fname, attr_name);
}
if (ret == -1) {
return pvfs_map_errno(pvfs, errno);
diff --git a/source4/utils/config.mk b/source4/utils/config.mk
index cc89f5cc4f..2dbf26940e 100644
--- a/source4/utils/config.mk
+++ b/source4/utils/config.mk
@@ -47,7 +47,7 @@ PRIVATE_DEPENDENCIES = \
LIBSAMBA-CONFIG \
LIBSAMBA-UTIL \
NDR_XATTR \
- XATTR
+ WRAP_XATTR
# End BINARY getntacl
#################################
diff --git a/source4/utils/getntacl.c b/source4/utils/getntacl.c
index 98aec2804e..441f233a84 100644
--- a/source4/utils/getntacl.c
+++ b/source4/utils/getntacl.c
@@ -23,8 +23,7 @@
#include "includes.h"
#include "system/filesys.h"
#include "librpc/gen_ndr/ndr_xattr.h"
-
-#if HAVE_XATTR_SUPPORT
+#include "lib/util/wrap_xattr.h"
static void ntacl_print_debug_helper(struct ndr_print *ndr, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
@@ -57,7 +56,7 @@ static NTSTATUS get_ntacl(char *filename, struct xattr_NTACL **ntacl,
*ntacl = talloc(NULL, struct xattr_NTACL);
- size = getxattr(filename, XATTR_NTACL_NAME, NULL, 0);
+ size = wrap_getxattr(filename, XATTR_NTACL_NAME, NULL, 0);
if (size < 0) {
fprintf(stderr, "get_ntacl: %s\n", strerror(errno));
@@ -65,7 +64,7 @@ static NTSTATUS get_ntacl(char *filename, struct xattr_NTACL **ntacl,
}
blob.data = talloc_size(*ntacl, size);
- size = getxattr(filename, XATTR_NTACL_NAME, blob.data, size);
+ size = wrap_getxattr(filename, XATTR_NTACL_NAME, blob.data, size);
if (size < 0) {
fprintf(stderr, "get_ntacl: %s\n", strerror(errno));
return NT_STATUS_INTERNAL_ERROR;
@@ -109,14 +108,3 @@ int main(int argc, char *argv[])
return 0;
}
-
-#else
-
-int main(int argc, char *argv[])
-{
- printf("getntacl: not compiled with xattr support!\n");
- return 1;
-
-}
-
-#endif