1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-24 13:57:43 +03:00

lib/replace: xattr wrappers in lib/replace rather than source3/lib/system.c

This also moves all the still-used configure tests etc.  The unused OSF API
is also removed at this time.

Andrew Bartlett
This commit is contained in:
Andrew Bartlett 2012-06-01 13:29:38 +10:00
parent 664af060ac
commit c290cdb934
9 changed files with 191 additions and 791 deletions

View File

@ -144,6 +144,53 @@ AC_CHECK_FUNCS(clock_gettime,libreplace_cv_have_clock_gettime=yes,[
libreplace_cv_have_clock_gettime=yes
AC_DEFINE(HAVE_CLOCK_GETTIME, 1, Define to 1 if there is support for clock_gettime)])
])
AC_CHECK_HEADERS(sys/attributes.h attr/xattr.h sys/xattr.h sys/extattr.h sys/uio.h)
AC_CHECK_HEADERS(sys/ea.h sys/proplist.h)
############################################
# Check for EA implementations
case "$host_os" in
*freebsd4* | *dragonfly* )
AC_DEFINE(BROKEN_EXTATTR, 1, [Does extattr API work])
;;
*)
AC_SEARCH_LIBS(getxattr, [attr])
AC_CHECK_FUNCS(attr_get attr_getf attr_list attr_listf attropen attr_remove)
AC_CHECK_FUNCS(attr_removef attr_set attr_setf extattr_delete_fd extattr_delete_file)
AC_CHECK_FUNCS(extattr_get_fd extattr_get_file extattr_list_fd extattr_list_file)
AC_CHECK_FUNCS(extattr_set_fd extattr_set_file fgetea fgetxattr flistea flistxattr)
AC_CHECK_FUNCS(fremoveea fremovexattr fsetea fsetxattr getea getxattr listea)
AC_CHECK_FUNCS(listxattr removeea removexattr setea setxattr)
;;
esac
########################################################
# Do xattr functions take additional options like on Darwin?
if test x"$ac_cv_func_getxattr" = x"yes" ; then
AC_CACHE_CHECK([whether xattr interface takes additional options], smb_attr_cv_xattr_add_opt, [
old_LIBS=$LIBS
LIBS="$LIBS $ACL_LIBS"
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
],[
getxattr(0, 0, 0, 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_ADD_OPT, 1, [xattr functions have additional options])
fi
fi
AC_CHECK_FUNCS(get_current_dir_name)
AC_HAVE_DECL(setresuid, [#include <unistd.h>])
AC_HAVE_DECL(setresgid, [#include <unistd.h>])

View File

@ -543,6 +543,46 @@ ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset)
/* prototype is in "system/network.h" */
#endif
#if !defined(HAVE_GETXATTR) || defined(XATTR_ADD_OPT)
#define getxattr rep_getxattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_FGETXATTR) || defined(XATTR_ADD_OPT)
#define fgetxattr rep_fgetxattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_LISTXATTR) || defined(XATTR_ADD_OPT)
#define listxattr rep_listxattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_FLISTXATTR) || defined(XATTR_ADD_OPT)
#define flistxattr rep_flistxattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_REMOVEXATTR) || defined(XATTR_ADD_OPT)
#define removexattr rep_removexattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_FREMOVEXATTR) || defined(XATTR_ADD_OPT)
#define fremovexattr rep_fremovexattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_SETXATTR) || defined(XATTR_ADD_OPT)
#define setxattr rep_setxattr
/* prototype is in "system/filesys.h" */
#endif
#if !defined(HAVE_FSETXATTR) || defined(XATTR_ADD_OPT)
#define fsetxattr rep_fsetxattr
/* prototype is in "system/filesys.h" */
#endif
#ifndef HAVE_GET_CURRENT_DIR_NAME
#define get_current_dir_name rep_get_current_dir_name
char *rep_get_current_dir_name(void);

View File

@ -123,11 +123,26 @@
#include <sys/xattr.h>
#endif
#ifdef HAVE_SYS_EA_H
#include <sys/ea.h>
#endif
#ifdef HAVE_SYS_EXTATTR_H
#include <sys/extattr.h>
#endif
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
#endif
#ifndef XATTR_CREATE
#define XATTR_CREATE 0x1 /* set value, fail if attr already exists */
#endif
#ifndef XATTR_REPLACE
#define XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */
#endif
/* Some POSIX definitions for those without */
#ifndef S_IFDIR
@ -208,4 +223,45 @@
#define ENOATTR ENODATA
#endif
#if !defined(HAVE_GETXATTR) || defined(XATTR_ADD_OPT)
ssize_t rep_getxattr (const char *path, const char *name, void *value, size_t size);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_FGETXATTR) || defined(XATTR_ADD_OPT)
ssize_t rep_fgetxattr (int filedes, const char *name, void *value, size_t size);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_LISTXATTR) || defined(XATTR_ADD_OPT)
ssize_t rep_listxattr (const char *path, char *list, size_t size);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_FLISTXATTR) || defined(XATTR_ADD_OPT)
ssize_t rep_flistxattr (int filedes, char *list, size_t size);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_REMOVEXATTR) || defined(XATTR_ADD_OPT)
int rep_removexattr (const char *path, const char *name);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_FREMOVEXATTR) || defined(XATTR_ADD_OPT)
int rep_fremovexattr (int filedes, const char *name);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_SETXATTR) || defined(XATTR_ADD_OPT)
int rep_setxattr (const char *path, const char *name, const void *value, size_t size, int flags);
/* define is in "replace.h" */
#endif
#if !defined(HAVE_FSETXATTR) || defined(XATTR_ADD_OPT)
int rep_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags);
/* define is in "replace.h" */
#endif
#endif

View File

@ -211,6 +211,32 @@ def configure(conf):
conf.CHECK_FUNCS('getgrent_r getgrgid_r getgrnam_r getgrouplist getpagesize')
conf.CHECK_FUNCS('getpwent_r getpwnam_r getpwuid_r epoll_create')
conf.SET_TARGET_TYPE('attr', 'EMPTY')
conf.CHECK_FUNCS_IN('''
fgetxattr flistea flistxattr
fremovexattr fsetxattr getxattr
listxattr removexattr setxattr
''', 'attr', checklibc=True)
# We need to check for linux xattrs first, as we do not wish to link to -lattr
# (the XFS compat API) on Linux systems with the native xattr API
if not conf.CONFIG_SET('HAVE_GETXATTR'):
conf.CHECK_FUNCS_IN('''
attr_get attr_getf attr_list attr_listf attropen attr_remove
attr_removef attr_set attr_setf extattr_delete_fd extattr_delete_file
extattr_get_fd extattr_get_file extattr_list_fd extattr_list_file
extattr_set_fd extattr_set_file fgetea flistea
fremoveea fsetea getea listea
removeea setea
''', 'attr', checklibc=True)
# Darwin has extra options to xattr-family functions
conf.CHECK_CODE('getxattr(0, 0, 0, 0, 0, 0);',
'XATTR_ADD_OPT',
msg="Checking whether xattr interface takes additional options",
headers='sys/types.h attr/xattr.h sys/xattr.h')
conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl',
checklibc=True, headers='dlfcn.h dl.h')
@ -474,6 +500,8 @@ def build(bld):
if not bld.CONFIG_SET('HAVE_INET_ATON'): REPLACE_SOURCE += ' inet_aton.c'
if not bld.CONFIG_SET('HAVE_INET_NTOP'): REPLACE_SOURCE += ' inet_ntop.c'
if not bld.CONFIG_SET('HAVE_INET_PTON'): REPLACE_SOURCE += ' inet_pton.c'
if not bld.CONFIG_SET('HAVE_GETXATTR') or bld.CONFIG_SET('XATTR_ADD_OPT'):
REPLACE_SOURCE += ' xattr.c'
bld.SAMBA_LIBRARY('replace',
source=REPLACE_SOURCE,
@ -484,7 +512,7 @@ def build(bld):
# at the moment:
# hide_symbols=bld.BUILTIN_LIBRARY('replace'),
private_library=True,
deps='crypt dl nsl socket rt' + extra_libs)
deps='crypt dl nsl socket rt attr' + extra_libs)
bld.SAMBA_SUBSYSTEM('replace-test',
source='''test/testsuite.c test/strptime.c

View File

@ -668,9 +668,6 @@ AC_CHECK_HEADERS(shadow.h)
AC_CHECK_HEADERS(nss.h nss_common.h nsswitch.h ns_api.h sys/security.h)
AC_CHECK_HEADERS(syscall.h sys/syscall.h)
AC_CHECK_HEADERS(sys/attributes.h attr/xattr.h sys/xattr.h sys/extattr.h sys/uio.h)
AC_CHECK_HEADERS(sys/ea.h sys/proplist.h)
AC_CHECK_HEADERS(sys/cdefs.h glob.h)
# For experimental utmp support (lastlog on some BSD-like systems)
@ -1259,62 +1256,6 @@ AC_LIBTESTFUNC(sec, getprpwnam)
AC_CHECK_FUNCS(strsignal)
############################################
# Check for EA implementations
case "$host_os" in
*osf*)
AC_SEARCH_LIBS(getproplist, [proplist])
AC_CHECK_FUNCS(getproplist fgetproplist setproplist fsetproplist)
AC_CHECK_FUNCS(delproplist fdelproplist add_proplist_entry get_proplist_entry)
AC_CHECK_FUNCS(sizeof_proplist_entry)
;;
*freebsd4* | *dragonfly* )
AC_DEFINE(BROKEN_EXTATTR, 1, [Does extattr API work])
;;
*solaris*)
AC_CHECK_FUNCS(attropen)
;;
*)
AC_SEARCH_LIBS(getxattr, [attr])
AC_CHECK_FUNCS(getxattr,[
AC_CHECK_FUNCS(fgetxattr listxattr flistxattr removexattr fremovexattr setxattr fsetxattr)
])
AC_CHECK_FUNCS(getea,[
AC_CHECK_FUNCS(fgetea listea flistea removeea fremoveea setea fsetea)
])
AC_CHECK_FUNCS(attr_get,[
AC_CHECK_FUNCS(attr_list attr_set attr_remove attr_getf attr_listf attr_setf attr_removef)
])
AC_CHECK_FUNCS(extattr_delete_file,[
AC_CHECK_FUNCS(extattr_delete_fd extattr_get_fd extattr_get_file extattr_list_fd extattr_list_file extattr_set_fd extattr_set_file)
])
;;
esac
########################################################
# Do xattr functions take additional options like on Darwin?
if test x"$ac_cv_func_getxattr" = x"yes" ; then
AC_CACHE_CHECK([whether xattr interface takes additional options], smb_attr_cv_xattr_add_opt, [
old_LIBS=$LIBS
LIBS="$LIBS $ACL_LIBS"
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
],[
getxattr(0, 0, 0, 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_ADD_OPT, 1, [xattr functions have additional options])
fi
fi
AC_DISABLE_STATIC
AC_ENABLE_SHARED

View File

@ -137,21 +137,6 @@
#endif
#endif
/* mutually exclusive (SuSE 8.2) */
#if HAVE_ATTR_XATTR_H
#include <attr/xattr.h>
#elif HAVE_SYS_XATTR_H
#include <sys/xattr.h>
#endif
#ifdef HAVE_SYS_EA_H
#include <sys/ea.h>
#endif
#ifdef HAVE_SYS_EXTATTR_H
#include <sys/extattr.h>
#endif
#ifdef HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif
@ -501,14 +486,6 @@ char *talloc_asprintf_strupper_m(TALLOC_CTX *t, const char *fmt, ...) PRINTF_ATT
#define VXFS_QUOTA
#endif
#ifndef XATTR_CREATE
#define XATTR_CREATE 0x1 /* set value, fail if attr already exists */
#endif
#ifndef XATTR_REPLACE
#define XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */
#endif
#ifdef TRUE
#undef TRUE
#endif

View File

@ -1292,684 +1292,6 @@ int sys_pclose(int fd)
SAFE_FREE(msgbuf);
}
/******** Solaris EA helper function prototypes ********/
#ifdef HAVE_ATTROPEN
#define SOLARIS_ATTRMODE S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP
static int solaris_write_xattr(int attrfd, const char *value, size_t size);
static ssize_t solaris_read_xattr(int attrfd, void *value, size_t size);
static ssize_t solaris_list_xattr(int attrdirfd, char *list, size_t size);
static int solaris_unlinkat(int attrdirfd, const char *name);
static int solaris_attropen(const char *path, const char *attrpath, int oflag, mode_t mode);
static int solaris_openat(int fildes, const char *path, int oflag, mode_t mode);
#endif
/**************************************************************************
Wrappers for extented attribute calls. Based on the Linux package with
support for IRIX and (Net|Free)BSD also. Expand as other systems have them.
****************************************************************************/
ssize_t sys_getxattr (const char *path, const char *name, void *value, size_t size)
{
#if defined(HAVE_GETXATTR)
#ifndef XATTR_ADD_OPT
return getxattr(path, name, value, size);
#else
int options = 0;
return getxattr(path, name, value, size, 0, options);
#endif
#elif defined(HAVE_GETEA)
return getea(path, name, value, size);
#elif defined(HAVE_EXTATTR_GET_FILE)
char *s;
ssize_t retval;
int attrnamespace = (strncmp(name, "system", 6) == 0) ?
EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
/*
* The BSD implementation has a nasty habit of silently truncating
* the returned value to the size of the buffer, so we have to check
* that the buffer is large enough to fit the returned value.
*/
if((retval=extattr_get_file(path, attrnamespace, attrname, NULL, 0)) >= 0) {
if(retval > size) {
errno = ERANGE;
return -1;
}
if((retval=extattr_get_file(path, attrnamespace, attrname, value, size)) >= 0)
return retval;
}
DEBUG(10,("sys_getxattr: extattr_get_file() failed with: %s\n", strerror(errno)));
return -1;
#elif defined(HAVE_ATTR_GET)
int retval, flags = 0;
int valuelength = (int)size;
char *attrname = strchr(name,'.') + 1;
if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;
retval = attr_get(path, attrname, (char *)value, &valuelength, flags);
return retval ? retval : valuelength;
#elif defined(HAVE_ATTROPEN)
ssize_t ret = -1;
int attrfd = solaris_attropen(path, name, O_RDONLY, 0);
if (attrfd >= 0) {
ret = solaris_read_xattr(attrfd, value, size);
close(attrfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
ssize_t sys_fgetxattr (int filedes, const char *name, void *value, size_t size)
{
#if defined(HAVE_FGETXATTR)
#ifndef XATTR_ADD_OPT
return fgetxattr(filedes, name, value, size);
#else
int options = 0;
return fgetxattr(filedes, name, value, size, 0, options);
#endif
#elif defined(HAVE_FGETEA)
return fgetea(filedes, name, value, size);
#elif defined(HAVE_EXTATTR_GET_FD)
char *s;
ssize_t retval;
int attrnamespace = (strncmp(name, "system", 6) == 0) ?
EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
if((retval=extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0)) >= 0) {
if(retval > size) {
errno = ERANGE;
return -1;
}
if((retval=extattr_get_fd(filedes, attrnamespace, attrname, value, size)) >= 0)
return retval;
}
DEBUG(10,("sys_fgetxattr: extattr_get_fd() failed with: %s\n", strerror(errno)));
return -1;
#elif defined(HAVE_ATTR_GETF)
int retval, flags = 0;
int valuelength = (int)size;
char *attrname = strchr(name,'.') + 1;
if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;
retval = attr_getf(filedes, attrname, (char *)value, &valuelength, flags);
return retval ? retval : valuelength;
#elif defined(HAVE_ATTROPEN)
ssize_t ret = -1;
int attrfd = solaris_openat(filedes, name, O_RDONLY|O_XATTR, 0);
if (attrfd >= 0) {
ret = solaris_read_xattr(attrfd, value, size);
close(attrfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
#if defined(HAVE_EXTATTR_LIST_FILE)
#define EXTATTR_PREFIX(s) (s), (sizeof((s))-1)
static struct {
int space;
const char *name;
size_t len;
}
extattr[] = {
{ EXTATTR_NAMESPACE_SYSTEM, EXTATTR_PREFIX("system.") },
{ EXTATTR_NAMESPACE_USER, EXTATTR_PREFIX("user.") },
};
typedef union {
const char *path;
int filedes;
} extattr_arg;
static ssize_t bsd_attr_list (int type, extattr_arg arg, char *list, size_t size)
{
ssize_t list_size, total_size = 0;
int i, t, len;
char *buf;
/* Iterate through extattr(2) namespaces */
for(t = 0; t < ARRAY_SIZE(extattr); t++) {
switch(type) {
#if defined(HAVE_EXTATTR_LIST_FILE)
case 0:
list_size = extattr_list_file(arg.path, extattr[t].space, list, size);
break;
#endif
#if defined(HAVE_EXTATTR_LIST_LINK)
case 1:
list_size = extattr_list_link(arg.path, extattr[t].space, list, size);
break;
#endif
#if defined(HAVE_EXTATTR_LIST_FD)
case 2:
list_size = extattr_list_fd(arg.filedes, extattr[t].space, list, size);
break;
#endif
default:
errno = ENOSYS;
return -1;
}
/* Some error happend. Errno should be set by the previous call */
if(list_size < 0)
return -1;
/* No attributes */
if(list_size == 0)
continue;
/* XXX: Call with an empty buffer may be used to calculate
necessary buffer size. Unfortunately, we can't say, how
many attributes were returned, so here is the potential
problem with the emulation.
*/
if(list == NULL) {
/* Take the worse case of one char attribute names -
two bytes per name plus one more for sanity.
*/
total_size += list_size + (list_size/2 + 1)*extattr[t].len;
continue;
}
/* Count necessary offset to fit namespace prefixes */
len = 0;
for(i = 0; i < list_size; i += list[i] + 1)
len += extattr[t].len;
total_size += list_size + len;
/* Buffer is too small to fit the results */
if(total_size > size) {
errno = ERANGE;
return -1;
}
/* Shift results back, so we can prepend prefixes */
buf = (char *)memmove(list + len, list, list_size);
for(i = 0; i < list_size; i += len + 1) {
len = buf[i];
strncpy(list, extattr[t].name, extattr[t].len + 1);
list += extattr[t].len;
strncpy(list, buf + i + 1, len);
list[len] = '\0';
list += len + 1;
}
size -= total_size;
}
return total_size;
}
#endif
#if defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H)
static char attr_buffer[ATTR_MAX_VALUELEN];
static ssize_t irix_attr_list(const char *path, int filedes, char *list, size_t size, int flags)
{
int retval = 0, index;
attrlist_cursor_t *cursor = 0;
int total_size = 0;
attrlist_t * al = (attrlist_t *)attr_buffer;
attrlist_ent_t *ae;
size_t ent_size, left = size;
char *bp = list;
while (True) {
if (filedes)
retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);
else
retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);
if (retval) break;
for (index = 0; index < al->al_count; index++) {
ae = ATTR_ENTRY(attr_buffer, index);
ent_size = strlen(ae->a_name) + sizeof("user.");
if (left >= ent_size) {
strncpy(bp, "user.", sizeof("user."));
strncat(bp, ae->a_name, ent_size - sizeof("user."));
bp += ent_size;
left -= ent_size;
} else if (size) {
errno = ERANGE;
retval = -1;
break;
}
total_size += ent_size;
}
if (al->al_more == 0) break;
}
if (retval == 0) {
flags |= ATTR_ROOT;
cursor = 0;
while (True) {
if (filedes)
retval = attr_listf(filedes, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);
else
retval = attr_list(path, attr_buffer, ATTR_MAX_VALUELEN, flags, cursor);
if (retval) break;
for (index = 0; index < al->al_count; index++) {
ae = ATTR_ENTRY(attr_buffer, index);
ent_size = strlen(ae->a_name) + sizeof("system.");
if (left >= ent_size) {
strncpy(bp, "system.", sizeof("system."));
strncat(bp, ae->a_name, ent_size - sizeof("system."));
bp += ent_size;
left -= ent_size;
} else if (size) {
errno = ERANGE;
retval = -1;
break;
}
total_size += ent_size;
}
if (al->al_more == 0) break;
}
}
return (ssize_t)(retval ? retval : total_size);
}
#endif
ssize_t sys_listxattr (const char *path, char *list, size_t size)
{
#if defined(HAVE_LISTXATTR)
#ifndef XATTR_ADD_OPT
return listxattr(path, list, size);
#else
int options = 0;
return listxattr(path, list, size, options);
#endif
#elif defined(HAVE_LISTEA)
return listea(path, list, size);
#elif defined(HAVE_EXTATTR_LIST_FILE)
extattr_arg arg;
arg.path = path;
return bsd_attr_list(0, arg, list, size);
#elif defined(HAVE_ATTR_LIST) && defined(HAVE_SYS_ATTRIBUTES_H)
return irix_attr_list(path, 0, list, size, 0);
#elif defined(HAVE_ATTROPEN)
ssize_t ret = -1;
int attrdirfd = solaris_attropen(path, ".", O_RDONLY, 0);
if (attrdirfd >= 0) {
ret = solaris_list_xattr(attrdirfd, list, size);
close(attrdirfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
ssize_t sys_flistxattr (int filedes, char *list, size_t size)
{
#if defined(HAVE_FLISTXATTR)
#ifndef XATTR_ADD_OPT
return flistxattr(filedes, list, size);
#else
int options = 0;
return flistxattr(filedes, list, size, options);
#endif
#elif defined(HAVE_FLISTEA)
return flistea(filedes, list, size);
#elif defined(HAVE_EXTATTR_LIST_FD)
extattr_arg arg;
arg.filedes = filedes;
return bsd_attr_list(2, arg, list, size);
#elif defined(HAVE_ATTR_LISTF)
return irix_attr_list(NULL, filedes, list, size, 0);
#elif defined(HAVE_ATTROPEN)
ssize_t ret = -1;
int attrdirfd = solaris_openat(filedes, ".", O_RDONLY|O_XATTR, 0);
if (attrdirfd >= 0) {
ret = solaris_list_xattr(attrdirfd, list, size);
close(attrdirfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
int sys_removexattr (const char *path, const char *name)
{
#if defined(HAVE_REMOVEXATTR)
#ifndef XATTR_ADD_OPT
return removexattr(path, name);
#else
int options = 0;
return removexattr(path, name, options);
#endif
#elif defined(HAVE_REMOVEEA)
return removeea(path, name);
#elif defined(HAVE_EXTATTR_DELETE_FILE)
char *s;
int attrnamespace = (strncmp(name, "system", 6) == 0) ?
EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
return extattr_delete_file(path, attrnamespace, attrname);
#elif defined(HAVE_ATTR_REMOVE)
int flags = 0;
char *attrname = strchr(name,'.') + 1;
if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;
return attr_remove(path, attrname, flags);
#elif defined(HAVE_ATTROPEN)
int ret = -1;
int attrdirfd = solaris_attropen(path, ".", O_RDONLY, 0);
if (attrdirfd >= 0) {
ret = solaris_unlinkat(attrdirfd, name);
close(attrdirfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
int sys_fremovexattr (int filedes, const char *name)
{
#if defined(HAVE_FREMOVEXATTR)
#ifndef XATTR_ADD_OPT
return fremovexattr(filedes, name);
#else
int options = 0;
return fremovexattr(filedes, name, options);
#endif
#elif defined(HAVE_FREMOVEEA)
return fremoveea(filedes, name);
#elif defined(HAVE_EXTATTR_DELETE_FD)
char *s;
int attrnamespace = (strncmp(name, "system", 6) == 0) ?
EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
return extattr_delete_fd(filedes, attrnamespace, attrname);
#elif defined(HAVE_ATTR_REMOVEF)
int flags = 0;
char *attrname = strchr(name,'.') + 1;
if (strncmp(name, "system", 6) == 0) flags |= ATTR_ROOT;
return attr_removef(filedes, attrname, flags);
#elif defined(HAVE_ATTROPEN)
int ret = -1;
int attrdirfd = solaris_openat(filedes, ".", O_RDONLY|O_XATTR, 0);
if (attrdirfd >= 0) {
ret = solaris_unlinkat(attrdirfd, name);
close(attrdirfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
int sys_setxattr (const char *path, const char *name, const void *value, size_t size, int flags)
{
#if defined(HAVE_SETXATTR)
#ifndef XATTR_ADD_OPT
return setxattr(path, name, value, size, flags);
#else
int options = 0;
return setxattr(path, name, value, size, 0, options);
#endif
#elif defined(HAVE_SETEA)
return setea(path, name, value, size, flags);
#elif defined(HAVE_EXTATTR_SET_FILE)
char *s;
int retval = 0;
int attrnamespace = (strncmp(name, "system", 6) == 0) ?
EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
if (flags) {
/* Check attribute existence */
retval = extattr_get_file(path, attrnamespace, attrname, NULL, 0);
if (retval < 0) {
/* REPLACE attribute, that doesn't exist */
if (flags & XATTR_REPLACE && errno == ENOATTR) {
errno = ENOATTR;
return -1;
}
/* Ignore other errors */
}
else {
/* CREATE attribute, that already exists */
if (flags & XATTR_CREATE) {
errno = EEXIST;
return -1;
}
}
}
retval = extattr_set_file(path, attrnamespace, attrname, value, size);
return (retval < 0) ? -1 : 0;
#elif defined(HAVE_ATTR_SET)
int myflags = 0;
char *attrname = strchr(name,'.') + 1;
if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT;
if (flags & XATTR_CREATE) myflags |= ATTR_CREATE;
if (flags & XATTR_REPLACE) myflags |= ATTR_REPLACE;
return attr_set(path, attrname, (const char *)value, size, myflags);
#elif defined(HAVE_ATTROPEN)
int ret = -1;
int myflags = O_RDWR;
int attrfd;
if (flags & XATTR_CREATE) myflags |= O_EXCL;
if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
attrfd = solaris_attropen(path, name, myflags, (mode_t) SOLARIS_ATTRMODE);
if (attrfd >= 0) {
ret = solaris_write_xattr(attrfd, value, size);
close(attrfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
int sys_fsetxattr (int filedes, const char *name, const void *value, size_t size, int flags)
{
#if defined(HAVE_FSETXATTR)
#ifndef XATTR_ADD_OPT
return fsetxattr(filedes, name, value, size, flags);
#else
int options = 0;
return fsetxattr(filedes, name, value, size, 0, options);
#endif
#elif defined(HAVE_FSETEA)
return fsetea(filedes, name, value, size, flags);
#elif defined(HAVE_EXTATTR_SET_FD)
char *s;
int retval = 0;
int attrnamespace = (strncmp(name, "system", 6) == 0) ?
EXTATTR_NAMESPACE_SYSTEM : EXTATTR_NAMESPACE_USER;
const char *attrname = ((s=strchr_m(name, '.')) == NULL) ? name : s + 1;
if (flags) {
/* Check attribute existence */
retval = extattr_get_fd(filedes, attrnamespace, attrname, NULL, 0);
if (retval < 0) {
/* REPLACE attribute, that doesn't exist */
if (flags & XATTR_REPLACE && errno == ENOATTR) {
errno = ENOATTR;
return -1;
}
/* Ignore other errors */
}
else {
/* CREATE attribute, that already exists */
if (flags & XATTR_CREATE) {
errno = EEXIST;
return -1;
}
}
}
retval = extattr_set_fd(filedes, attrnamespace, attrname, value, size);
return (retval < 0) ? -1 : 0;
#elif defined(HAVE_ATTR_SETF)
int myflags = 0;
char *attrname = strchr(name,'.') + 1;
if (strncmp(name, "system", 6) == 0) myflags |= ATTR_ROOT;
if (flags & XATTR_CREATE) myflags |= ATTR_CREATE;
if (flags & XATTR_REPLACE) myflags |= ATTR_REPLACE;
return attr_setf(filedes, attrname, (const char *)value, size, myflags);
#elif defined(HAVE_ATTROPEN)
int ret = -1;
int myflags = O_RDWR | O_XATTR;
int attrfd;
if (flags & XATTR_CREATE) myflags |= O_EXCL;
if (!(flags & XATTR_REPLACE)) myflags |= O_CREAT;
attrfd = solaris_openat(filedes, name, myflags, (mode_t) SOLARIS_ATTRMODE);
if (attrfd >= 0) {
ret = solaris_write_xattr(attrfd, value, size);
close(attrfd);
}
return ret;
#else
errno = ENOSYS;
return -1;
#endif
}
/**************************************************************************
helper functions for Solaris' EA support
****************************************************************************/
#ifdef HAVE_ATTROPEN
static ssize_t solaris_read_xattr(int attrfd, void *value, size_t size)
{
struct stat sbuf;
if (fstat(attrfd, &sbuf) == -1) {
errno = ENOATTR;
return -1;
}
/* This is to return the current size of the named extended attribute */
if (size == 0) {
return sbuf.st_size;
}
/* check size and read xattr */
if (sbuf.st_size > size) {
errno = ERANGE;
return -1;
}
return read(attrfd, value, sbuf.st_size);
}
static ssize_t solaris_list_xattr(int attrdirfd, char *list, size_t size)
{
ssize_t len = 0;
DIR *dirp;
struct dirent *de;
int newfd = dup(attrdirfd);
/* CAUTION: The originating file descriptor should not be
used again following the call to fdopendir().
For that reason we dup() the file descriptor
here to make things more clear. */
dirp = fdopendir(newfd);
while ((de = readdir(dirp))) {
size_t listlen = strlen(de->d_name) + 1;
if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) {
/* we don't want "." and ".." here: */
DEBUG(10,("skipped EA %s\n",de->d_name));
continue;
}
if (size == 0) {
/* return the current size of the list of extended attribute names*/
len += listlen;
} else {
/* check size and copy entrieѕ + nul into list. */
if ((len + listlen) > size) {
errno = ERANGE;
len = -1;
break;
} else {
strlcpy(list + len, de->d_name, listlen);
len += listlen;
}
}
}
if (closedir(dirp) == -1) {
DEBUG(0,("closedir dirp failed: %s\n",strerror(errno)));
return -1;
}
return len;
}
static int solaris_unlinkat(int attrdirfd, const char *name)
{
if (unlinkat(attrdirfd, name, 0) == -1) {
if (errno == ENOENT) {
errno = ENOATTR;
}
return -1;
}
return 0;
}
static int solaris_attropen(const char *path, const char *attrpath, int oflag, mode_t mode)
{
int filedes = attropen(path, attrpath, oflag, mode);
if (filedes == -1) {
DEBUG(10,("attropen FAILED: path: %s, name: %s, errno: %s\n",path,attrpath,strerror(errno)));
if (errno == EINVAL) {
errno = ENOTSUP;
} else {
errno = ENOATTR;
}
}
return filedes;
}
static int solaris_openat(int fildes, const char *path, int oflag, mode_t mode)
{
int filedes = openat(fildes, path, oflag, mode);
if (filedes == -1) {
DEBUG(10,("openat FAILED: fd: %d, path: %s, errno: %s\n",filedes,path,strerror(errno)));
if (errno == EINVAL) {
errno = ENOTSUP;
} else {
errno = ENOATTR;
}
}
return filedes;
}
static int solaris_write_xattr(int attrfd, const char *value, size_t size)
{
if ((ftruncate(attrfd, 0) == 0) && (write(attrfd, value, size) == size)) {
return 0;
} else {
DEBUG(10,("solaris_write_xattr FAILED!\n"));
return -1;
}
}
#endif /*HAVE_ATTROPEN*/
/****************************************************************************
Return the major devicenumber for UNIX extensions.
****************************************************************************/

View File

@ -2029,42 +2029,42 @@ static int vfswrap_sys_acl_free_qualifier(vfs_handle_struct *handle, void *qual
static ssize_t vfswrap_getxattr(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size)
{
return sys_getxattr(path, name, value, size);
return getxattr(path, name, value, size);
}
static ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size)
{
return sys_fgetxattr(fsp->fh->fd, name, value, size);
return fgetxattr(fsp->fh->fd, name, value, size);
}
static ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size)
{
return sys_listxattr(path, list, size);
return listxattr(path, list, size);
}
static ssize_t vfswrap_flistxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size)
{
return sys_flistxattr(fsp->fh->fd, list, size);
return flistxattr(fsp->fh->fd, list, size);
}
static int vfswrap_removexattr(struct vfs_handle_struct *handle, const char *path, const char *name)
{
return sys_removexattr(path, name);
return removexattr(path, name);
}
static int vfswrap_fremovexattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name)
{
return sys_fremovexattr(fsp->fh->fd, name);
return fremovexattr(fsp->fh->fd, name);
}
static int vfswrap_setxattr(struct vfs_handle_struct *handle, const char *path, const char *name, const void *value, size_t size, int flags)
{
return sys_setxattr(path, name, value, size, flags);
return setxattr(path, name, value, size, flags);
}
static int vfswrap_fsetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags)
{
return sys_fsetxattr(fsp->fh->fd, name, value, size, flags);
return fsetxattr(fsp->fh->fd, name, value, size, flags);
}
static int vfswrap_aio_read(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb)

View File

@ -235,24 +235,19 @@ if (0) {
msg="Checking for LL suffix on long long integers")
conf.CHECK_FUNCS('''
_acl __acl add_proplist_entry atexit attr_getf attr_list attr_listf
attropen attr_remove attr_removef attr_set attr_setf
_acl __acl atexit
bindtextdomain _chdir __chdir chflags chmod _close __close _closedir
__closedir crypt16 delproplist devnm dgettext dirfd
__closedir crypt16 devnm dgettext dirfd
DNSServiceRegister _dup __dup _dup2 __dup2 endmntent execl
extattr_delete_fd extattr_get_fd extattr_get_file
extattr_list_fd extattr_list_file
extattr_set_fd extattr_set_file _facl __facl _fchdir
_facl __facl _fchdir
__fchdir fchmod fchown _fcntl __fcntl fcvt fcvtl fdatasync
fdelproplist fgetea fgetproplist fgetxattr flistea flistxattr
_fork __fork fremoveea fremovexattr fseeko fsetea
fsetproplist fsetxattr _fstat __fstat fsync
_fork __fork fseeko
fsetxattr _fstat __fstat fsync
futimens futimes __fxstat getauthuid
getcwd _getcwd __getcwd getdents __getdents getdirentries
getgrent getgrnam getgrouplist getgrset getmntent getpagesize
getproplist get_proplist_entry getpwanam getpwent_r getrlimit gettext
getpwanam getpwent_r getrlimit gettext
glob grantpt hstrerror initgroups innetgr
listea listxattr
llseek _llseek __llseek _lseek __lseek
_lstat __lstat lutimes
__lxstat memalign mknod mlock mlockall munlock munlockall
@ -261,11 +256,11 @@ pathconf poll posix_fallocate
posix_memalign prctl pread _pread __pread
pwrite _pwrite __pwrite
rdchk _read __read _readdir __readdir
removeea removexattr _seekdir __seekdir
select setea setenv setgidx setgroups setlocale setluid
setmntent setpgid setpriv setproplist setsid setuidx
setxattr shmget shm_open sigaction sigblock sigprocmask sigset
sizeof_proplist_entry _stat __stat statvfs
_seekdir __seekdir
select setenv setgidx setgroups setlocale setluid
setmntent setpgid setpriv setsid setuidx
shmget shm_open sigaction sigblock sigprocmask sigset
_stat __stat statvfs
strcasecmp strchr strpbrk strsignal strtol strupr sysconf sysctl sysctlbyname
__sys_llseek syslog _telldir __telldir textdomain timegm
utimensat vsyslog _write __write __xstat
@ -434,12 +429,6 @@ msg.msg_acctrightslen = sizeof(fd);
conf.find_program('awk', var='AWK')
conf.find_program('perl', var='PERL')
# Darwin has extra options to xattr-family functions
conf.CHECK_CODE('getxattr(0, 0, 0, 0, 0, 0);',
'XATTR_ADD_OPT',
msg="Checking whether xattr interface takes additional options",
headers='sys/types.h attr/xattr.h sys/xattr.h')
conf.CHECK_HEADERS('asm/types.h')
conf.CHECK_CODE('dev_t dev; int i = major(dev); return 0', "HAVE_DEVICE_MAJOR_FN",