Support linux extended attributes via libattr when libc does not provide the syscalls (i.e. glibc 2.2). Index: configure.in =================================================================== --- configure.in (revision 47229) +++ configure.in (revision 47231) @@ -1154,6 +1154,7 @@ dnl ********************************** AC_CHECK_HEADERS(checklist.h) AC_CHECK_HEADERS(fstab.h) + AC_CHECK_HEADERS(attr/xattr.h) AC_CHECK_HEADERS(sys/extattr.h) AC_CHECK_HEADERS(sys/sendfile.h) AC_CHECK_HEADERS(sys/statvfs.h) @@ -1186,6 +1187,12 @@ [#include #include ]) + dnl Favour xattr through glibc, but use libattr if we have to + AC_CHECK_FUNC(lsetxattr, , + AC_CHECK_LIB(attr, lsetxattr, XATTR_LIB="-lattr",) + ) + AC_SUBST(XATTR_LIB) + dnl ********************************* dnl *** Check for Console 2.0 I/O *** dnl ********************************* Index: ChangeLog =================================================================== --- ChangeLog (revision 47229) +++ ChangeLog (revision 47231) @@ -1,3 +1,7 @@ +2005-07-12 Daniel Drake + + * configure.in: Add check for libattr's + 2005-07-11 Raja R Harinath * scripts/script.in: Add @framework_version@ blank. Index: support/ChangeLog =================================================================== --- support/ChangeLog (revision 47229) +++ support/ChangeLog (revision 47231) @@ -1,4 +1,10 @@ +2005-07-12 Daniel Drake + * sys-xattr.c: Use if does not exist (e.g. for + glibc 2.2) + * Makefile.am: Link to libattr if libc does not provide the xattr + syscalls. + Thu Jul 7 12:35:20 EDT 2005 Paolo Molaro *supportw.c, Makefile.am: remove calls and link to libmono/libwapi. Index: support/sys-xattr.c =================================================================== --- support/sys-xattr.c (revision 47229) +++ support/sys-xattr.c (revision 47231) @@ -1,5 +1,5 @@ /* - * Wrapper functions for and + * Wrapper functions for (or ) and * * Authors: * Daniel Drake (dsd@gentoo.org) @@ -9,17 +9,30 @@ #include -#if defined(HAVE_SYS_XATTR_H) || defined(HAVE_SYS_EXTATTR_H) +#if defined(HAVE_SYS_XATTR_H) || defined(HAVE_ATTR_ATTR_H) || defined(HAVE_SYS_EXTATTR_H) #include +/* + * Where available, we prefer to use the libc implementation of the xattr + * syscalls. However, we also support using libattr for this on systems where + * libc does not provide this (e.g. glibc-2.2 and older) + * (configure-time magic is used to select which library to link to) + */ #ifdef HAVE_SYS_XATTR_H +// libc #include -#endif +#define EA_UNIX +#elif HAVE_ATTR_ATTR_H +// libattr +#include +#define EA_UNIX +#endif /* HAVE_SYS_XATTR_H */ #ifdef HAVE_SYS_EXTATTR_H #include #include +#define EA_BSD #endif #include @@ -79,7 +92,7 @@ // HELPER FUNCTIONS // -#ifdef HAVE_SYS_EXTATTR_H +#ifdef EA_BSD struct BsdNamespaceInfo { const char *name; @@ -307,7 +320,7 @@ return full_size; } -#endif /* HAVE_SYS_EXTATTR_H */ +#endif /* EA_BSD */ // // THE PROVIDED API @@ -319,7 +332,7 @@ gint32 ret; mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX { int _flags; if (Mono_Posix_FromXattrFlags (flags, &_flags) == -1) @@ -330,7 +343,7 @@ ret = setxattr (path, name, value, (size_t) size, _flags); #endif /* __APPLE__ */ } -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -341,7 +354,7 @@ ret = extattr_set_file (path, namespace, _name, value, (size_t) size); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -353,14 +366,14 @@ gint32 ret; mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX { int _flags; if (Mono_Posix_FromXattrFlags (flags, &_flags) == -1) return -1; ret = lsetxattr (path, name, value, size, _flags); } -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -371,7 +384,7 @@ ret = extattr_set_link (path, namespace, _name, value, (size_t) size); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -383,7 +396,7 @@ gint32 ret; mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX { int _flags; if (Mono_Posix_FromXattrFlags (flags, &_flags) == -1) @@ -394,7 +407,7 @@ ret = fsetxattr (fd, name, value, (size_t) size, _flags); #endif /* __APPLE__ */ } -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -405,7 +418,7 @@ ret = extattr_set_fd (fd, namespace, _name, value, (size_t) size); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -416,13 +429,13 @@ mph_ssize_t ret; mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX #if __APPLE__ ret = getxattr (path, name, value, (size_t) size, 0, 0); #else /* __APPLE__ */ ret = getxattr (path, name, value, (size_t) size); #endif /* __APPLE__ */ -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -431,7 +444,7 @@ ret = extattr_get_file (path, namespace, _name, value, (size_t) size); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -443,9 +456,9 @@ mph_ssize_t ret; mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX ret = lgetxattr (path, name, value, (size_t) size); -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -454,7 +467,7 @@ ret = extattr_get_link (path, namespace, _name, value, (size_t) size); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -466,13 +479,13 @@ mph_ssize_t ret; mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX #if __APPLE__ ret = fgetxattr (fd, name, value, (size_t) size, 0, 0); #else /* __APPLE__ */ ret = fgetxattr (fd, name, value, (size_t) size); #endif /* __APPLE__ */ -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -481,7 +494,7 @@ ret = extattr_get_fd (fd, namespace, _name, value, (size_t) size); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -491,15 +504,15 @@ { mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX #if __APPLE__ return listxattr (path, list, (size_t) size, 0); #else /* __APPLE__ */ return listxattr (path, list, (size_t) size); #endif /* __APPLE__ */ -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ return bsd_listxattr (path, list, size); -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ } #if !__APPLE__ @@ -508,11 +521,11 @@ { mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX return llistxattr (path, list, (size_t) size); -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ return bsd_llistxattr (path, list, size); -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ } #endif /* !__APPLE__ */ @@ -521,15 +534,15 @@ { mph_return_if_size_t_overflow (size); -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX #if __APPLE__ return flistxattr (fd, list, (size_t) size, 0); #else /* __APPLE__ */ return flistxattr (fd, list, (size_t) size); #endif /* __APPLE__ */ -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ return bsd_flistxattr (fd, list, size); -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ } gint32 @@ -537,13 +550,13 @@ { gint32 ret; -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX #if __APPLE__ ret = removexattr (path, name, 0); #else /* __APPLE__ */ ret = removexattr (path, name); #endif /* __APPLE__ */ -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -552,7 +565,7 @@ ret = extattr_delete_file (path, namespace, _name); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -563,9 +576,9 @@ { gint32 ret; -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX ret = lremovexattr (path, name); -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -574,7 +587,7 @@ ret = extattr_delete_link (path, namespace, _name); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } @@ -585,13 +598,13 @@ { gint32 ret; -#ifdef HAVE_SYS_XATTR_H +#ifdef EA_UNIX #if __APPLE__ ret = fremovexattr (fd, name, 0); #else /* __APPLE__ */ ret = fremovexattr (fd, name); #endif /* __APPLE__ */ -#else /* HAVE_SYS_XATTR_H */ +#else /* EA_UNIX */ { char *_name; int namespace; @@ -600,14 +613,14 @@ ret = extattr_delete_fd (fd, namespace, _name); g_free (_name); } -#endif /* HAVE_SYS_XATTR_H */ +#endif /* EA_UNIX */ return ret; } G_END_DECLS -#endif /* HAVE_SYS_XATTR_H || HAVE_SYS_EXTATTR_H */ +#endif /* HAVE_SYS_XATTR_H || HAVE_ATTR_ATTR_H || HAVE_SYS_EXTATTR_H */ /* * vim: noexpandtab Index: support/Makefile.am =================================================================== --- support/Makefile.am (revision 47229) +++ support/Makefile.am (revision 47231) @@ -69,7 +69,8 @@ libMonoPosixHelper_la_LIBADD = \ $(MPH_LIBS) \ - $(Z_LIBS) + $(Z_LIBS) \ + $(XATTR_LIB) # libMonoPosixHelper_la_LDFLAGS = -no-undefined -version-info 1:0:1 libMonoPosixHelper_la_LDFLAGS = -no-undefined -avoid-version