internal.h 4.2 KB
Newer Older
1 2 3 4
/*
 * internal.h: internal definitions just used by code from the library
 */

5 6
#ifndef __VIR_INTERNAL_H__
#define __VIR_INTERNAL_H__
7

8
#include <errno.h>
9
#include <limits.h>
10
#include <verify.h>
11

12 13 14 15
#ifdef HAVE_SYS_SYSLIMITS_H
#include <sys/syslimits.h>
#endif

16 17 18 19 20 21
/* The library itself is allowed to use deprecated functions /
 * variables, so effectively undefine the deprecated attribute
 * which would otherwise be defined in libvirt.h.
 */
#define VIR_DEPRECATED /*empty*/

22 23
#include "gettext.h"

24 25 26
#include "libvirt/libvirt.h"
#include "libvirt/virterror.h"

27 28
#include "libvirt_internal.h"

29 30 31 32 33 34 35 36 37 38 39 40 41
/* 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).
 */
#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 256
#endif

#ifndef IF_NAMESIZE
#define IF_NAMESIZE 16
#endif
42

43 44 45 46
#ifndef INET_ADDRSTRLEN
#define INET_ADDRSTRLEN 16
#endif

47
#define _(str) dgettext(GETTEXT_PACKAGE, (str))
E
Eric Blake 已提交
48
#define N_(str) str
49

50
/* String equality tests, suggested by Jim Meyering. */
E
Eric Blake 已提交
51 52 53 54 55 56 57 58 59
#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)
60 61 62 63

#define NUL_TERMINATE(buf) do { (buf)[sizeof(buf)-1] = '\0'; } while (0)
#define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))

64
/* C99 uses __func__.  __FUNCTION__ is legacy. */
65
#ifndef __GNUC__
66
#define __FUNCTION__ __func__
67 68 69
#endif

#ifdef __GNUC__
70 71

#ifndef __GNUC_PREREQ
72 73 74 75
#if defined __GNUC__ && defined __GNUC_MINOR__
# define __GNUC_PREREQ(maj, min)                                        \
    ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
76 77
#define __GNUC_PREREQ(maj,min) 0
#endif
78 79 80 81

/* Work around broken limits.h on debian etch */
#if defined _GCC_LIMITS_H_ && ! defined ULLONG_MAX
#define ULLONG_MAX   ULONG_LONG_MAX
82
#endif
83

84 85
#endif /* __GNUC__ */

D
Daniel Veillard 已提交
86 87 88 89 90
/**
 * ATTRIBUTE_UNUSED:
 *
 * Macro to flag conciously unused parameters to functions
 */
91
#ifndef ATTRIBUTE_UNUSED
92
#define ATTRIBUTE_UNUSED __attribute__((__unused__))
93
#endif
94

95 96 97 98 99 100 101 102
/**
 * ATTRIBUTE_SENTINEL:
 *
 * Macro to check for NULL-terminated varargs lists
 */
#ifndef ATTRIBUTE_SENTINEL
#if __GNUC_PREREQ (4, 0)
#define ATTRIBUTE_SENTINEL __attribute__((__sentinel__))
103 104
#else
#define ATTRIBUTE_SENTINEL
105 106 107
#endif
#endif

108
/**
109
 * ATTRIBUTE_FMT_PRINTF
110
 *
111
 * Macro used to check printf like functions, if compiling
112
 * with gcc.
113 114 115 116
 *
 * 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
117
 */
118 119 120 121 122 123
#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
124 125
#endif

126 127 128 129 130 131 132 133
#ifndef ATTRIBUTE_RETURN_CHECK
#if __GNUC_PREREQ (3, 4)
#define ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__))
#else
#define ATTRIBUTE_RETURN_CHECK
#endif
#endif

134 135 136 137 138 139 140 141
#ifndef ATTRIBUTE_NONNULL
# if __GNUC_PREREQ (3, 3)
#  define ATTRIBUTE_NONNULL(m) __attribute__((__nonnull__(m)))
# else
#  define ATTRIBUTE_NONNULL(m)
# endif
#endif

142
#else
143
#ifndef ATTRIBUTE_UNUSED
144
#define ATTRIBUTE_UNUSED
145 146 147 148 149
#endif
#ifndef ATTRIBUTE_FMT_PRINTF
#define ATTRIBUTE_FMT_PRINTF(...)
#endif
#ifndef ATTRIBUTE_RETURN_CHECK
150
#define ATTRIBUTE_RETURN_CHECK
151
#endif
152
#endif				/* __GNUC__ */
153

154 155 156 157 158 159 160
/*
 * Use this when passing possibly-NULL strings to printf-a-likes.
 */
#define NULLSTR(s) \
    ((void)verify_true(sizeof *(s) == sizeof (char)), \
     (s) ? (s) : "(null)")

D
Daniel Veillard 已提交
161 162 163 164 165 166 167 168 169
/**
 * TODO:
 *
 * macro to flag unimplemented blocks
 */
#define TODO 								\
    fprintf(stderr, "Unimplemented block at %s:%d\n",			\
            __FILE__, __LINE__);

170
#endif                          /* __VIR_INTERNAL_H__ */