2005-11-02 13:19:10 +00:00
|
|
|
/*
|
|
|
|
* internal.h: internal definitions just used by code from the library
|
|
|
|
*/
|
|
|
|
|
2005-12-05 11:16:07 +00:00
|
|
|
#ifndef __VIR_INTERNAL_H__
|
2010-03-09 18:22:22 +00:00
|
|
|
# define __VIR_INTERNAL_H__
|
2005-11-02 13:19:10 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# include <errno.h>
|
|
|
|
# include <limits.h>
|
|
|
|
# include <verify.h>
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
|
|
|
|
2010-04-07 14:13:17 +00:00
|
|
|
# if STATIC_ANALYSIS
|
|
|
|
# undef NDEBUG /* Don't let a prior NDEBUG definition cause trouble. */
|
|
|
|
# include <assert.h>
|
|
|
|
# define sa_assert(expr) assert (expr)
|
|
|
|
# else
|
|
|
|
# define sa_assert(expr) /* empty */
|
|
|
|
# endif
|
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifdef HAVE_SYS_SYSLIMITS_H
|
|
|
|
# include <sys/syslimits.h>
|
|
|
|
# endif
|
2007-11-26 11:40:28 +00:00
|
|
|
|
2008-05-23 08:32:08 +00:00
|
|
|
/* The library itself is allowed to use deprecated functions /
|
|
|
|
* variables, so effectively undefine the deprecated attribute
|
|
|
|
* which would otherwise be defined in libvirt.h.
|
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# define VIR_DEPRECATED /*empty*/
|
2008-05-23 08:32:08 +00:00
|
|
|
|
2010-11-16 19:01:37 +00:00
|
|
|
/* All uses of _() within the library should pick up translations from
|
|
|
|
* libvirt's message files, rather than from the package that is
|
|
|
|
* linking in the library. Setting this macro before including
|
|
|
|
* "gettext.h" means that gettext() (and _()) will properly expand to
|
|
|
|
* dgettext. */
|
|
|
|
# define DEFAULT_TEXT_DOMAIN PACKAGE
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "gettext.h"
|
2010-11-16 19:01:37 +00:00
|
|
|
# define _(str) gettext(str)
|
|
|
|
# define N_(str) str
|
2007-12-07 14:52:24 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "libvirt/libvirt.h"
|
2011-02-02 15:37:10 +00:00
|
|
|
# include "libvirt/libvirt-qemu.h"
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "libvirt/virterror.h"
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "libvirt_internal.h"
|
2009-10-02 13:43:22 +00:00
|
|
|
|
2007-11-26 11:40:28 +00:00
|
|
|
/* On architectures which lack these limits, define them (ie. Cygwin).
|
|
|
|
* Note that the libvirt code should be robust enough to handle the
|
|
|
|
* case where actual value is longer than these limits (eg. by setting
|
|
|
|
* length correctly in second argument to gethostname and by always
|
|
|
|
* using strncpy instead of strcpy).
|
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef HOST_NAME_MAX
|
|
|
|
# define HOST_NAME_MAX 256
|
|
|
|
# endif
|
2007-11-26 11:40:28 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef IF_NAMESIZE
|
|
|
|
# define IF_NAMESIZE 16
|
|
|
|
# endif
|
2006-01-13 16:41:01 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef INET_ADDRSTRLEN
|
|
|
|
# define INET_ADDRSTRLEN 16
|
|
|
|
# endif
|
2007-12-07 14:52:24 +00:00
|
|
|
|
2007-06-22 11:42:22 +00:00
|
|
|
/* String equality tests, suggested by Jim Meyering. */
|
2010-03-09 18:22:22 +00:00
|
|
|
# define STREQ(a,b) (strcmp(a,b) == 0)
|
|
|
|
# define STRCASEEQ(a,b) (strcasecmp(a,b) == 0)
|
|
|
|
# define STRNEQ(a,b) (strcmp(a,b) != 0)
|
|
|
|
# define STRCASENEQ(a,b) (strcasecmp(a,b) != 0)
|
|
|
|
# define STREQLEN(a,b,n) (strncmp(a,b,n) == 0)
|
|
|
|
# define STRCASEEQLEN(a,b,n) (strncasecmp(a,b,n) == 0)
|
|
|
|
# define STRNEQLEN(a,b,n) (strncmp(a,b,n) != 0)
|
|
|
|
# define STRCASENEQLEN(a,b,n) (strncasecmp(a,b,n) != 0)
|
|
|
|
# define STRPREFIX(a,b) (strncmp(a,b,strlen(b)) == 0)
|
2010-03-30 14:15:13 +00:00
|
|
|
# define STRSKIP(a,b) (STRPREFIX(a,b) ? (a) + strlen(b) : NULL)
|
2010-03-09 18:22:22 +00:00
|
|
|
|
2010-03-22 18:44:58 +00:00
|
|
|
# define STREQ_NULLABLE(a, b) \
|
|
|
|
((!(a) && !(b)) || ((a) && (b) && STREQ((a), (b))))
|
|
|
|
# define STRNEQ_NULLABLE(a, b) \
|
|
|
|
((!(a) ^ !(b)) || ((a) && (b) && STRNEQ((a), (b))))
|
|
|
|
|
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# define NUL_TERMINATE(buf) do { (buf)[sizeof(buf)-1] = '\0'; } while (0)
|
|
|
|
# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
|
2008-04-25 20:46:13 +00:00
|
|
|
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
|
|
|
/* C99 uses __func__. __FUNCTION__ is legacy. */
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef __GNUC__
|
|
|
|
# define __FUNCTION__ __func__
|
|
|
|
# endif
|
2007-09-29 18:16:26 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifdef __GNUC__
|
2008-04-28 21:44:54 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef __GNUC_PREREQ
|
|
|
|
# if defined __GNUC__ && defined __GNUC_MINOR__
|
|
|
|
# define __GNUC_PREREQ(maj, min) \
|
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 15:07:32 +00:00
|
|
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
2010-03-09 18:22:22 +00:00
|
|
|
# else
|
|
|
|
# define __GNUC_PREREQ(maj,min) 0
|
|
|
|
# endif
|
2009-08-05 09:19:34 +00:00
|
|
|
|
|
|
|
/* Work around broken limits.h on debian etch */
|
2010-03-09 18:22:22 +00:00
|
|
|
# if defined _GCC_LIMITS_H_ && ! defined ULLONG_MAX
|
|
|
|
# define ULLONG_MAX ULONG_LONG_MAX
|
|
|
|
# endif
|
2008-04-28 21:44:54 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# endif /* __GNUC__ */
|
2009-08-05 09:19:34 +00:00
|
|
|
|
2005-11-07 17:16:18 +00:00
|
|
|
/**
|
|
|
|
* ATTRIBUTE_UNUSED:
|
|
|
|
*
|
|
|
|
* Macro to flag conciously unused parameters to functions
|
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef ATTRIBUTE_UNUSED
|
|
|
|
# define ATTRIBUTE_UNUSED __attribute__((__unused__))
|
|
|
|
# endif
|
2007-03-16 15:03:21 +00:00
|
|
|
|
2009-11-06 09:39:13 +00:00
|
|
|
/**
|
|
|
|
* ATTRIBUTE_SENTINEL:
|
|
|
|
*
|
|
|
|
* Macro to check for NULL-terminated varargs lists
|
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef ATTRIBUTE_SENTINEL
|
|
|
|
# if __GNUC_PREREQ (4, 0)
|
|
|
|
# define ATTRIBUTE_SENTINEL __attribute__((__sentinel__))
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_SENTINEL
|
|
|
|
# endif
|
|
|
|
# endif
|
2009-11-06 09:39:13 +00:00
|
|
|
|
2007-03-16 15:03:21 +00:00
|
|
|
/**
|
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 15:07:32 +00:00
|
|
|
* ATTRIBUTE_FMT_PRINTF
|
2007-03-16 15:03:21 +00:00
|
|
|
*
|
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 15:07:32 +00:00
|
|
|
* Macro used to check printf like functions, if compiling
|
2007-03-16 15:03:21 +00:00
|
|
|
* with gcc.
|
Fix misc Win32 compile warnings
GCC >= 4.4 assumes the 'printf' attribute refers to the native
runtime libraries format specifiers. Thanks to gnulib, libvirt
has GNU format specifiers everywhere. This means we need to
use 'gnu_printf' with GCC >= 4.4 to get correct compiler
checking of printf format specifiers.
* HACKING: Document new rules for ATTRIBUTE_FMT_PRINTF
* autobuild.sh, mingw32-libvirt.spec.in: Disable OpenNebula
driver on mingw32 builds
* qemud/dispatch.h, qemud/qemu.h, src/buf.h src/internal.h,
src/logging.h, src/security.h, src/sexpr.h, src/util.h,
src/virterror_internal.h, src/xend_internal.c: Change
over to ATTRIBUTE_FMT_PRINTF.
* src/virsh.c: Disable 'cd' and 'pwd' commands on Win32
since they don't compile
* src/threads-win32.c: Add missing return value check
2009-07-23 15:07:32 +00:00
|
|
|
*
|
|
|
|
* We use gnulib which guarentees we always have GNU style
|
|
|
|
* printf format specifiers even on broken Win32 platforms
|
|
|
|
* hence we have to force 'gnu_printf' for new GCC
|
2007-03-16 15:03:21 +00:00
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef ATTRIBUTE_FMT_PRINTF
|
|
|
|
# if __GNUC_PREREQ (4, 4)
|
|
|
|
# define ATTRIBUTE_FMT_PRINTF(fmtpos,argpos) __attribute__((__format__ (gnu_printf, fmtpos,argpos)))
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_FMT_PRINTF(fmtpos,argpos) __attribute__((__format__ (printf, fmtpos,argpos)))
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
|
|
|
|
# ifndef ATTRIBUTE_RETURN_CHECK
|
|
|
|
# if __GNUC_PREREQ (3, 4)
|
|
|
|
# define ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__))
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_RETURN_CHECK
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
|
nwfilter: Support for learning a VM's IP address
This patch implements support for learning a VM's IP address. It uses
the pcap library to listen on the VM's backend network interface (tap)
or the physical ethernet device (macvtap) and tries to capture packets
with source or destination MAC address of the VM and learn from DHCP
Offers, ARP traffic, or first-sent IPv4 packet what the IP address of
the VM's interface is. This then allows to instantiate the network
traffic filtering rules without the user having to provide the IP
parameter somewhere in the filter description or in the interface
description as a parameter. This only supports to detect the parameter
IP, which is for the assumed single IPv4 address of a VM. There is not
support for interfaces that may have multiple IP addresses (IP
aliasing) or IPv6 that may then require more than one valid IP address
to be detected. A VM can have multiple independent interfaces that each
uses a different IP address and in that case it will be attempted to
detect each one of the address independently.
So, when for example an interface description in the domain XML has
looked like this up to now:
<interface type='bridge'>
<source bridge='mybridge'/>
<model type='virtio'/>
<filterref filter='clean-traffic'>
<parameter name='IP' value='10.2.3.4'/>
</filterref>
</interface>
you may omit the IP parameter:
<interface type='bridge'>
<source bridge='mybridge'/>
<model type='virtio'/>
<filterref filter='clean-traffic'/>
</interface>
Internally I am walking the 'tree' of a VM's referenced network filters
and determine with the given variables which variables are missing. Now,
the above IP parameter may be missing and this causes a libvirt-internal
thread to be started that uses the pcap library's API to listen to the
backend interface (in case of macvtap to the physical interface) in an
attempt to determine the missing IP parameter. If the backend interface
disappears the thread terminates assuming the VM was brought down. In
case of a macvtap device a timeout is being used to wait for packets
from the given VM (filtering by VM's interface MAC address). If the VM's
macvtap device disappeared the thread also terminates. In all other
cases it tries to determine the IP address of the VM and will then apply
the rules late on the given interface, which would have happened
immediately if the IP parameter had been explicitly given. In case an
error happens while the firewall rules are applied, the VM's backend
interface is 'down'ed preventing it to communicate. Reasons for failure
for applying the network firewall rules may that an ebtables/iptables
command failes or OOM errors. Essentially the same failure reasons may
occur as when the firewall rules are applied immediately on VM start,
except that due to the late application of the filtering rules the VM
now is already running and cannot be hindered anymore from starting.
Bringing down the whole VM would probably be considered too drastic.
While a VM's IP address is attempted to be determined only limited
updates to network filters are allowed. In particular it is prevented
that filters are modified in such a way that they would introduce new
variables.
A caveat: The algorithm does not know which one is the appropriate IP
address of a VM. If the VM spoofs an IP address in its first ARP traffic
or IPv4 packets its filtering rules will be instantiated for this IP
address, thus 'locking' it to the found IP address. So, it's still
'safer' to explicitly provide the IP address of a VM's interface in the
filter description if it is known beforehand.
* configure.ac: detect libpcap
* libvirt.spec.in: require libpcap[-devel] if qemu is built
* src/internal.h: add the new ATTRIBUTE_PACKED define
* src/Makefile.am src/libvirt_private.syms: add the new modules and symbols
* src/nwfilter/nwfilter_learnipaddr.[ch]: new module being added
* src/nwfilter/nwfilter_driver.c src/conf/nwfilter_conf.[ch]
src/nwfilter/nwfilter_ebiptables_driver.[ch]
src/nwfilter/nwfilter_gentech_driver.[ch]: plu the new functionality in
* tests/nwfilterxml2xmltest: extend testing
2010-04-07 21:02:18 +00:00
|
|
|
/**
|
|
|
|
* ATTRIBUTE_PACKED
|
|
|
|
*
|
|
|
|
* force a structure to be packed, i.e. not following architecture and
|
|
|
|
* compiler best alignments for its sub components. It's needed for example
|
|
|
|
* for the network filetering code when defining the content of raw
|
|
|
|
* ethernet packets.
|
|
|
|
* Others compiler than gcc may use something different e.g. #pragma pack(1)
|
|
|
|
*/
|
|
|
|
# ifndef ATTRIBUTE_PACKED
|
|
|
|
# if __GNUC_PREREQ (3, 3)
|
|
|
|
# define ATTRIBUTE_PACKED __attribute__((packed))
|
|
|
|
# else
|
|
|
|
# error "Need an __attribute__((packed)) equivalent"
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef ATTRIBUTE_NONNULL
|
|
|
|
# if __GNUC_PREREQ (3, 3)
|
|
|
|
# define ATTRIBUTE_NONNULL(m) __attribute__((__nonnull__(m)))
|
|
|
|
# else
|
|
|
|
# define ATTRIBUTE_NONNULL(m)
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
|
2009-09-02 10:20:32 +00:00
|
|
|
# else
|
2010-03-09 18:22:22 +00:00
|
|
|
# ifndef ATTRIBUTE_UNUSED
|
|
|
|
# define ATTRIBUTE_UNUSED
|
|
|
|
# endif
|
|
|
|
# ifndef ATTRIBUTE_FMT_PRINTF
|
|
|
|
# define ATTRIBUTE_FMT_PRINTF(...)
|
|
|
|
# endif
|
|
|
|
# ifndef ATTRIBUTE_RETURN_CHECK
|
|
|
|
# define ATTRIBUTE_RETURN_CHECK
|
|
|
|
# endif
|
|
|
|
# endif /* __GNUC__ */
|
2006-03-27 15:24:36 +00:00
|
|
|
|
2009-01-15 17:54:20 +00:00
|
|
|
/*
|
|
|
|
* Use this when passing possibly-NULL strings to printf-a-likes.
|
|
|
|
*/
|
2010-03-09 18:22:22 +00:00
|
|
|
# define NULLSTR(s) \
|
2009-01-15 17:54:20 +00:00
|
|
|
((void)verify_true(sizeof *(s) == sizeof (char)), \
|
|
|
|
(s) ? (s) : "(null)")
|
|
|
|
|
2005-11-07 17:16:18 +00:00
|
|
|
/**
|
|
|
|
* TODO:
|
|
|
|
*
|
|
|
|
* macro to flag unimplemented blocks
|
|
|
|
*/
|
2010-12-21 15:58:03 +00:00
|
|
|
# define TODO \
|
2005-11-07 17:16:18 +00:00
|
|
|
fprintf(stderr, "Unimplemented block at %s:%d\n", \
|
|
|
|
__FILE__, __LINE__);
|
|
|
|
|
2010-04-13 13:48:04 +00:00
|
|
|
/**
|
|
|
|
* virCheckFlags:
|
|
|
|
* @supported: an OR'ed set of supported flags
|
|
|
|
* @retval: return value in case unsupported flags were passed
|
|
|
|
*
|
|
|
|
* To avoid memory leaks this macro has to be used before any non-trivial
|
|
|
|
* code which could possibly allocate some memory.
|
|
|
|
*
|
|
|
|
* Returns nothing. Exits the caller function if unsupported flags were
|
|
|
|
* passed to it.
|
|
|
|
*/
|
|
|
|
# define virCheckFlags(supported, retval) \
|
|
|
|
do { \
|
2010-05-20 19:25:41 +00:00
|
|
|
unsigned long __unsuppflags = flags & ~(supported); \
|
|
|
|
if (__unsuppflags) { \
|
2010-04-13 13:48:04 +00:00
|
|
|
virReportErrorHelper(NULL, \
|
|
|
|
VIR_FROM_THIS, \
|
|
|
|
VIR_ERR_INVALID_ARG, \
|
|
|
|
__FILE__, \
|
|
|
|
__FUNCTION__, \
|
|
|
|
__LINE__, \
|
2010-05-20 19:25:41 +00:00
|
|
|
_("%s: unsupported flags (0x%lx)"), \
|
|
|
|
__FUNCTION__, __unsuppflags); \
|
2010-04-13 13:48:04 +00:00
|
|
|
return retval; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2011-01-28 21:03:24 +00:00
|
|
|
/* divide value by size, rounding up */
|
|
|
|
# define VIR_DIV_UP(value, size) (((value) + (size) - 1) / (size))
|
|
|
|
|
2006-03-15 12:13:25 +00:00
|
|
|
#endif /* __VIR_INTERNAL_H__ */
|