the one for virAsprintf, in util.h:
int virAsprintf(char **strp, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 2, 3);
+ ATTRIBUTE_FMT_PRINTF(2, 3);
This makes it so gcc's -Wformat and -Wformat-security options can do
their jobs and cross-check format strings with the number and types
--without-uml \
--without-vbox \
--without-openvz \
+ --without-one \
--without-libvirtd
make
--without-uml \
--without-vbox \
--without-openvz \
+ --without-one \
--without-libvirtd
make
%{_mingw32_datadir}/libvirt/schemas/storagevol.rng
%{_mingw32_datadir}/libvirt/schemas/nodedev.rng
%{_mingw32_datadir}/libvirt/schemas/capability.rng
+%{_mingw32_datadir}/libvirt/schemas/interface.rng
%{_mingw32_datadir}/locale/*/LC_MESSAGES/libvirt.mo
void remoteDispatchFormatError (remote_error *rerr,
const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 2, 3);
+ ATTRIBUTE_FMT_PRINTF(2, 3);
void remoteDispatchAuthError (remote_error *rerr);
void remoteDispatchGenericError (remote_error *rerr);
#ifdef HAVE_ANSIDECL_H
#include <ansidecl.h>
#endif
+
+#ifndef __GNUC_PREREQ
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+#define __GNUC_PREREQ(maj,min) 0
+#endif
+#endif
+
+/**
+ * ATTRIBUTE_UNUSED:
+ *
+ * Macro to flag conciously unused parameters to functions
+ */
#ifndef ATTRIBUTE_UNUSED
#define ATTRIBUTE_UNUSED __attribute__((__unused__))
#endif
-#ifndef ATTRIBUTE_FORMAT
-#define ATTRIBUTE_FORMAT(args...) __attribute__((__format__ (args)))
+
+/**
+ * ATTRIBUTE_FMT_PRINTF
+ *
+ * Macro used to check printf like functions, if compiling
+ * with gcc.
+ *
+ * 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
+ */
+#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
+
+#else
+#ifndef ATTRIBUTE_UNUSED
#define ATTRIBUTE_UNUSED
-#define ATTRIBUTE_FORMAT(...)
+#endif
+#ifndef ATTRIBUTE_FMT_PRINTF
+#define ATTRIBUTE_FMT_PRINTF(...)
+#endif
+#ifndef ATTRIBUTE_RETURN_CHECK
+#define ATTRIBUTE_RETURN_CHECK
+#endif
#endif
#define qemudDebug DEBUG
};
void qemudLog(int priority, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf,2,3);
+ ATTRIBUTE_FMT_PRINTF(2,3);
void virBufferAdd(const virBufferPtr buf, const char *str, int len);
void virBufferAddChar(const virBufferPtr buf, char c);
void virBufferVSprintf(const virBufferPtr buf, const char *format, ...)
- ATTRIBUTE_FORMAT(printf, 2, 3);
+ ATTRIBUTE_FMT_PRINTF(2, 3);
void virBufferStrcat(const virBufferPtr buf, ...);
void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);
void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
#ifdef __GNUC__
#ifndef __GNUC_PREREQ
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
#define __GNUC_PREREQ(maj,min) 0
#endif
+#endif
/**
* ATTRIBUTE_UNUSED:
#endif
/**
- * ATTRIBUTE_FORMAT
+ * ATTRIBUTE_FMT_PRINTF
*
- * Macro used to check printf/scanf-like functions, if compiling
+ * Macro used to check printf like functions, if compiling
* with gcc.
+ *
+ * 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
*/
-#ifndef ATTRIBUTE_FORMAT
-#define ATTRIBUTE_FORMAT(args...) __attribute__((__format__ (args)))
+#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
#endif
#else
+#ifndef ATTRIBUTE_UNUSED
#define ATTRIBUTE_UNUSED
-#define ATTRIBUTE_FORMAT(...)
+#endif
+#ifndef ATTRIBUTE_FMT_PRINTF
+#define ATTRIBUTE_FMT_PRINTF(...)
+#endif
+#ifndef ATTRIBUTE_RETURN_CHECK
#define ATTRIBUTE_RETURN_CHECK
+#endif
#endif /* __GNUC__ */
/*
extern int virLogParseOutputs(const char *output);
extern void virLogMessage(const char *category, int priority,
const char *funcname, long long linenr, int flags,
- const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 6, 7);
+ const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(6, 7);
#endif
void
virSecurityReportError(virConnectPtr conn, int code, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 3, 4);
+ ATTRIBUTE_FMT_PRINTF(3, 4);
/* Helpers */
void virSecurityDriverInit(virSecurityDriverPtr drv);
const char *sexpr_node(const struct sexpr *sexpr, const char *node);
int sexpr_node_copy(const struct sexpr *sexpr, const char *node, char **dst);
const char *sexpr_fmt_node(const struct sexpr *sexpr, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf,2,3);
+ ATTRIBUTE_FMT_PRINTF(2,3);
struct sexpr *sexpr_lookup(const struct sexpr *sexpr, const char *node);
int sexpr_has(const struct sexpr *sexpr, const char *node);
#endif
int virThreadInitialize(void)
{
- virMutexInit(&virThreadLocalLock);
- virThreadLocalInit(&virCondEvent, virCondEventCleanup);
+ if (virMutexInit(&virThreadLocalLock) < 0)
+ return -1;
+ if (virThreadLocalInit(&virCondEvent, virCondEventCleanup) < 0)
+ return -1;
return 0;
}
void virSkipSpaces(const char **str);
int virParseNumber(const char **str);
int virAsprintf(char **strp, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 2, 3);
+ ATTRIBUTE_FMT_PRINTF(2, 3);
#define VIR_MAC_BUFLEN 6
#define VIR_MAC_PREFIX_BUFLEN 3
static const vshCmdDef commands[];
static void vshError(vshControl *ctl, int doexit, const char *format, ...)
- ATTRIBUTE_FORMAT(printf, 3, 4);
+ ATTRIBUTE_FMT_PRINTF(3, 4);
static int vshInit(vshControl *ctl);
static int vshDeinit(vshControl *ctl);
static void vshUsage(void);
VSH_BYUUID|VSH_BYNAME)
static void vshPrintExtra(vshControl *ctl, const char *format, ...)
- ATTRIBUTE_FORMAT(printf, 2, 3);
+ ATTRIBUTE_FMT_PRINTF(2, 3);
static void vshDebug(vshControl *ctl, int level, const char *format, ...)
- ATTRIBUTE_FORMAT(printf, 3, 4);
+ ATTRIBUTE_FMT_PRINTF(3, 4);
/* XXX: add batch support */
#define vshPrint(_ctl, ...) fprintf(stdout, __VA_ARGS__)
return ctl->conn ? TRUE : FALSE;
}
+#ifndef WIN32
+
/*
* "console" command
*/
{NULL, 0, 0, NULL}
};
-#ifndef __MINGW32__
-
static int
cmdRunConsole(vshControl *ctl, virDomainPtr dom)
{
return ret;
}
-#else /* __MINGW32__ */
-
-static int
-cmdRunConsole(vshControl *ctl, virDomainPtr dom ATTRIBUTE_UNUSED)
-{
- vshError (ctl, FALSE, "%s", _("console not implemented on this platform"));
- return FALSE;
-}
-
-#endif /* __MINGW32__ */
-
static int
cmdConsole(vshControl *ctl, const vshCmd *cmd)
{
return ret;
}
+#endif /* WIN32 */
+
+
/*
* "list" command
*/
static const vshCmdOptDef opts_create[] = {
{"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file containing an XML domain description")},
+#ifndef WIN32
{"console", VSH_OT_BOOL, 0, gettext_noop("attach to console after creation")},
+#endif
{NULL, 0, 0, NULL}
};
int found;
int ret = TRUE;
char *buffer;
+#ifndef WIN32
int console = vshCommandOptBool(cmd, "console");
+#endif
if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
return FALSE;
if (dom != NULL) {
vshPrint(ctl, _("Domain %s created from %s\n"),
virDomainGetName(dom), from);
+#ifndef WIN32
if (console)
cmdRunConsole(ctl, dom);
+#endif
virDomainFree(dom);
} else {
vshError(ctl, FALSE, _("Failed to create domain from %s"), from);
static const vshCmdOptDef opts_start[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("name of the inactive domain")},
+#ifndef WIN32
{"console", VSH_OT_BOOL, 0, gettext_noop("attach to console after creation")},
+#endif
{NULL, 0, 0, NULL}
};
{
virDomainPtr dom;
int ret = TRUE;
+#ifndef WIN32
int console = vshCommandOptBool(cmd, "console");
+#endif
if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
return FALSE;
if (virDomainCreate(dom) == 0) {
vshPrint(ctl, _("Domain %s started\n"),
virDomainGetName(dom));
+#ifndef WIN32
if (console)
cmdRunConsole(ctl, dom);
+#endif
} else {
vshError(ctl, FALSE, _("Failed to start domain %s"),
virDomainGetName(dom));
return ret;
}
+
+#ifndef WIN32
/*
* "cd" command
*/
return 0;
}
+#endif
+
+#ifndef WIN32
/*
* "pwd" command
*/
free (cwd);
return !err;
}
+#endif
/*
* "edit" command
{"attach-interface", cmdAttachInterface, opts_attach_interface, info_attach_interface},
{"autostart", cmdAutostart, opts_autostart, info_autostart},
{"capabilities", cmdCapabilities, NULL, info_capabilities},
+#ifndef WIN32
{"cd", cmdCd, opts_cd, info_cd},
+#endif
{"connect", cmdConnect, opts_connect, info_connect},
+#ifndef WIN32
{"console", cmdConsole, opts_console, info_console},
+#endif
{"create", cmdCreate, opts_create, info_create},
{"start", cmdStart, opts_start, info_start},
{"destroy", cmdDestroy, opts_destroy, info_destroy},
{"pool-undefine", cmdPoolUndefine, opts_pool_undefine, info_pool_undefine},
{"pool-uuid", cmdPoolUuid, opts_pool_uuid, info_pool_uuid},
+#ifndef WIN32
{"pwd", cmdPwd, NULL, info_pwd},
+#endif
{"quit", cmdQuit, NULL, info_quit},
{"reboot", cmdReboot, opts_reboot, info_reboot},
{"restore", cmdRestore, opts_restore, info_restore},
int int1,
int int2,
const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 13, 14);
+ ATTRIBUTE_FMT_PRINTF(13, 14);
/* Includes 'dom' and 'net' for compatbility, but they're ignored */
#define virRaiseError(conn, dom, net, domain, code, level, \
const char *funcname ATTRIBUTE_UNUSED,
size_t linenr ATTRIBUTE_UNUSED,
const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 7, 8);
+ ATTRIBUTE_FMT_PRINTF(7, 8);
void virReportSystemErrorFull(virConnectPtr conn,
int domcode,
const char *funcname,
size_t linenr,
const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf, 7, 8);
+ ATTRIBUTE_FMT_PRINTF(7, 8);
#define virReportSystemError(conn, theerrno, fmt,...) \
virReportSystemErrorFull((conn), \
* Returns a parsed S-Expression in case of success, NULL in case of failure
*/
static struct sexpr *sexpr_get(virConnectPtr xend, const char *fmt, ...)
- ATTRIBUTE_FORMAT(printf,2,3);
+ ATTRIBUTE_FMT_PRINTF(2,3);
static struct sexpr *
sexpr_get(virConnectPtr xend, const char *fmt, ...)