virfile: Introduce ACL helpers

Namely, virFileGetACLs, virFileSetACLs, virFileFreeACLs and
virFileCopyACLs. These functions are going to be required when we
are creating /dev for qemu. We have copy anything that's in
host's /dev exactly as is. Including ACLs.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2016-11-22 11:14:08 +01:00
parent 1a7c9a5d50
commit 654b4d48bc
6 changed files with 109 additions and 3 deletions

View File

@ -30,6 +30,7 @@
# undef HAVE_LIBNL # undef HAVE_LIBNL
# undef HAVE_LIBNL3 # undef HAVE_LIBNL3
# undef HAVE_LIBSASL2 # undef HAVE_LIBSASL2
# undef HAVE_SYS_ACL_H
# undef WITH_CAPNG # undef WITH_CAPNG
# undef WITH_CURL # undef WITH_CURL
# undef WITH_DBUS # undef WITH_DBUS
@ -56,6 +57,7 @@
# undef HAVE_LIBNL # undef HAVE_LIBNL
# undef HAVE_LIBNL3 # undef HAVE_LIBNL3
# undef HAVE_LIBSASL2 # undef HAVE_LIBSASL2
# undef HAVE_SYS_ACL_H
# undef WITH_CAPNG # undef WITH_CAPNG
# undef WITH_CURL # undef WITH_CURL
# undef WITH_DTRACE_PROBES # undef WITH_DTRACE_PROBES

View File

@ -313,11 +313,19 @@ dnl Availability of various common headers (non-fatal if missing).
AC_CHECK_HEADERS([pwd.h regex.h sys/un.h \ AC_CHECK_HEADERS([pwd.h regex.h sys/un.h \
sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \ sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \
sys/un.h sys/syscall.h sys/sysctl.h netinet/tcp.h ifaddrs.h \ sys/un.h sys/syscall.h sys/sysctl.h netinet/tcp.h ifaddrs.h \
libtasn1.h sys/ucred.h sys/mount.h]) libtasn1.h sys/ucred.h sys/mount.h sys/acl.h])
dnl Check whether endian provides handy macros. dnl Check whether endian provides handy macros.
AC_CHECK_DECLS([htole64], [], [], [[#include <endian.h>]]) AC_CHECK_DECLS([htole64], [], [], [[#include <endian.h>]])
AC_CHECK_FUNCS([stat stat64 __xstat __xstat64 lstat lstat64 __lxstat __lxstat64]) AC_CHECK_FUNCS([stat stat64 __xstat __xstat64 lstat lstat64 __lxstat __lxstat64])
ACL_CFLAGS=""
ACL_LIBS=""
if test "x$ac_cv_header_sys_acl_h" = "xyes" ; then
ACL_LIBS="-lacl"
fi
AC_SUBST([ACL_CFLAGS])
AC_SUBST([ACL_LIBS])
dnl We need to decide at configure time if libvirt will use real atomic dnl We need to decide at configure time if libvirt will use real atomic
dnl operations ("lock free") or emulated ones with a mutex. dnl operations ("lock free") or emulated ones with a mutex.

View File

@ -1127,12 +1127,12 @@ libvirt_util_la_SOURCES = \
libvirt_util_la_CFLAGS = $(CAPNG_CFLAGS) $(YAJL_CFLAGS) $(LIBNL_CFLAGS) \ libvirt_util_la_CFLAGS = $(CAPNG_CFLAGS) $(YAJL_CFLAGS) $(LIBNL_CFLAGS) \
$(AM_CFLAGS) $(AUDIT_CFLAGS) $(DEVMAPPER_CFLAGS) \ $(AM_CFLAGS) $(AUDIT_CFLAGS) $(DEVMAPPER_CFLAGS) \
$(DBUS_CFLAGS) $(LDEXP_LIBM) $(NUMACTL_CFLAGS) \ $(DBUS_CFLAGS) $(LDEXP_LIBM) $(NUMACTL_CFLAGS) \
$(POLKIT_CFLAGS) $(GNUTLS_CFLAGS) \ $(POLKIT_CFLAGS) $(GNUTLS_CFLAGS) $(ACL_CFLAGS) \
-I$(srcdir)/conf -I$(srcdir)/conf
libvirt_util_la_LIBADD = $(CAPNG_LIBS) $(YAJL_LIBS) $(LIBNL_LIBS) \ libvirt_util_la_LIBADD = $(CAPNG_LIBS) $(YAJL_LIBS) $(LIBNL_LIBS) \
$(THREAD_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \ $(THREAD_LIBS) $(AUDIT_LIBS) $(DEVMAPPER_LIBS) \
$(LIB_CLOCK_GETTIME) $(DBUS_LIBS) $(MSCOM_LIBS) $(LIBXML_LIBS) \ $(LIB_CLOCK_GETTIME) $(DBUS_LIBS) $(MSCOM_LIBS) $(LIBXML_LIBS) \
$(SECDRIVER_LIBS) $(NUMACTL_LIBS) \ $(SECDRIVER_LIBS) $(NUMACTL_LIBS) $(ACL_LIBS) \
$(POLKIT_LIBS) $(POLKIT_LIBS)

View File

@ -1559,6 +1559,7 @@ virFileActivateDirOverride;
virFileBindMountDevice; virFileBindMountDevice;
virFileBuildPath; virFileBuildPath;
virFileClose; virFileClose;
virFileCopyACLs;
virFileDeleteTree; virFileDeleteTree;
virFileDirectFdFlag; virFileDirectFdFlag;
virFileExists; virFileExists;
@ -1568,6 +1569,8 @@ virFileFindHugeTLBFS;
virFileFindMountPoint; virFileFindMountPoint;
virFileFindResource; virFileFindResource;
virFileFindResourceFull; virFileFindResourceFull;
virFileFreeACLs;
virFileGetACLs;
virFileGetHugepageSize; virFileGetHugepageSize;
virFileGetMountReverseSubtree; virFileGetMountReverseSubtree;
virFileGetMountSubtree; virFileGetMountSubtree;
@ -1604,6 +1607,7 @@ virFileResolveLink;
virFileRewrite; virFileRewrite;
virFileRewriteStr; virFileRewriteStr;
virFileSanitizePath; virFileSanitizePath;
virFileSetACLs;
virFileSetupDev; virFileSetupDev;
virFileSkipRoot; virFileSkipRoot;
virFileStripSuffix; virFileStripSuffix;

View File

@ -48,6 +48,9 @@
#if HAVE_SYS_SYSCALL_H #if HAVE_SYS_SYSCALL_H
# include <sys/syscall.h> # include <sys/syscall.h>
#endif #endif
#if HAVE_SYS_ACL_H
# include <sys/acl.h>
#endif
#ifdef __linux__ #ifdef __linux__
# if HAVE_LINUX_MAGIC_H # if HAVE_LINUX_MAGIC_H
@ -3629,3 +3632,81 @@ virFileBindMountDevice(const char *src ATTRIBUTE_UNUSED,
return -1; return -1;
} }
#endif /* !defined(HAVE_SYS_MOUNT_H) */ #endif /* !defined(HAVE_SYS_MOUNT_H) */
#if defined(HAVE_SYS_ACL_H)
int
virFileGetACLs(const char *file,
void **acl)
{
if (!(*acl = acl_get_file(file, ACL_TYPE_ACCESS)))
return -1;
return 0;
}
int
virFileSetACLs(const char *file,
void *acl)
{
if (acl_set_file(file, ACL_TYPE_ACCESS, acl) < 0)
return -1;
return 0;
}
void
virFileFreeACLs(void **acl)
{
acl_free(*acl);
*acl = NULL;
}
#else /* !defined(HAVE_SYS_ACL_H) */
int
virFileGetACLs(const char *file ATTRIBUTE_UNUSED,
void **acl ATTRIBUTE_UNUSED)
{
errno = ENOTSUP;
return -1;
}
int
virFileSetACLs(const char *file ATTRIBUTE_UNUSED,
void *acl ATTRIBUTE_UNUSED)
{
errno = ENOTSUP;
return -1;
}
void
virFileFreeACLs(void **acl)
{
*acl = NULL;
}
#endif /* !defined(HAVE_SYS_ACL_H) */
int
virFileCopyACLs(const char *src,
const char *dst)
{
void *acl = NULL;
int ret = -1;
if (virFileGetACLs(src, &acl) < 0)
return ret;
if (virFileSetACLs(dst, acl) < 0)
goto cleanup;
ret = 0;
cleanup:
virFileFreeACLs(&acl);
return ret;
}

View File

@ -317,4 +317,15 @@ int virFileSetupDev(const char *path,
int virFileBindMountDevice(const char *src, int virFileBindMountDevice(const char *src,
const char *dst); const char *dst);
int virFileGetACLs(const char *file,
void **acl);
int virFileSetACLs(const char *file,
void *acl);
void virFileFreeACLs(void **acl);
int virFileCopyACLs(const char *src,
const char *dst);
#endif /* __VIR_FILE_H */ #endif /* __VIR_FILE_H */