[libvirt] PATCH: Fix many many win32 bugs

Daniel P. Berrange berrange at redhat.com
Wed Jul 22 20:09:25 UTC 2009


Latest GCC changed the meaning of 'printf' attribute annotation to refer
to the host platform's native format specifiers. On Win32/mingw32 this
means it is now validating against Microsoft's useless format specifiers.
We replace all the printf like functions on Win32 thanks to GNULIB and
thus should always validate against the GNU format specifiers.

This means we have to use the 'gnu_printf' annotation everywhere, but
only for GCC >= 4.4.

This also disables the 'pwd' and 'cd' commands in virsh because neither
of those build successfully on Win32.

Finally, disables the OpenNebula driver on Win32

Daniel

diff --git a/HACKING b/HACKING
index ca39d61..da28e98 100644
--- a/HACKING
+++ b/HACKING
@@ -312,7 +312,7 @@ gcc's printf attribute directive in the prototype.  For example, here's
 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
diff --git a/autobuild.sh b/autobuild.sh
index 54abede..d090e74 100755
--- a/autobuild.sh
+++ b/autobuild.sh
@@ -76,6 +76,7 @@ if [ -x /usr/bin/i686-pc-mingw32-gcc ]; then
     --without-uml \
     --without-vbox \
     --without-openvz \
+    --without-one \
     --without-libvirtd
 
   make
diff --git a/mingw32-libvirt.spec.in b/mingw32-libvirt.spec.in
index 271c6ca..9514032 100644
--- a/mingw32-libvirt.spec.in
+++ b/mingw32-libvirt.spec.in
@@ -52,6 +52,7 @@ MinGW Windows libvirt virtualization library.
   --without-uml \
   --without-vbox \
   --without-openvz \
+  --without-one \
   --without-libvirtd
 make
 
@@ -90,6 +91,7 @@ rm -rf $RPM_BUILD_ROOT
 %{_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
 
diff --git a/qemud/dispatch.h b/qemud/dispatch.h
index ab45b19..1d85df9 100644
--- a/qemud/dispatch.h
+++ b/qemud/dispatch.h
@@ -41,7 +41,7 @@ remoteDispatchClientRequest (struct qemud_server *server,
 
 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);
diff --git a/qemud/qemud.h b/qemud/qemud.h
index abacbbb..254db44 100644
--- a/qemud/qemud.h
+++ b/qemud/qemud.h
@@ -52,15 +52,61 @@
 #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
@@ -213,7 +259,7 @@ struct qemud_server {
 };
 
 void qemudLog(int priority, const char *fmt, ...)
-    ATTRIBUTE_FORMAT(printf,2,3);
+    ATTRIBUTE_FMT_PRINTF(2,3);
 
 
 
diff --git a/src/buf.h b/src/buf.h
index 0b78d17..7d31cb2 100644
--- a/src/buf.h
+++ b/src/buf.h
@@ -40,7 +40,7 @@ unsigned int virBufferUse(const virBufferPtr buf);
 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);
diff --git a/src/internal.h b/src/internal.h
index adb6507..cf7e196 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -67,8 +67,13 @@
 #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:
@@ -80,13 +85,21 @@
 #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
@@ -98,9 +111,15 @@
 #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__ */
 
 /*
diff --git a/src/logging.h b/src/logging.h
index 0b9ae79..f1e2525 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -121,6 +121,6 @@ extern int virLogParseFilters(const char *filters);
 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
diff --git a/src/security.h b/src/security.h
index 585caa0..5fc3086 100644
--- a/src/security.h
+++ b/src/security.h
@@ -82,7 +82,7 @@ virSecurityDriverVerify(virConnectPtr conn, virDomainDefPtr def);
 
 void
 virSecurityReportError(virConnectPtr conn, int code, const char *fmt, ...)
-    ATTRIBUTE_FORMAT(printf, 3, 4);
+    ATTRIBUTE_FMT_PRINTF(3, 4);
 
 /* Helpers */
 void virSecurityDriverInit(virSecurityDriverPtr drv);
diff --git a/src/sexpr.h b/src/sexpr.h
index c3d038e..1d9adaa 100644
--- a/src/sexpr.h
+++ b/src/sexpr.h
@@ -49,7 +49,7 @@ void sexpr_free(struct sexpr *sexpr);
 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
diff --git a/src/threads-win32.c b/src/threads-win32.c
index 10233b0..ef3f2ef 100644
--- a/src/threads-win32.c
+++ b/src/threads-win32.c
@@ -41,8 +41,10 @@ void virCondEventCleanup(void *data);
 
 int virThreadInitialize(void)
 {
-    virMutexInit(&virThreadLocalLock);
-    virThreadLocalInit(&virCondEvent, virCondEventCleanup);
+    if (virMutexInit(&virThreadLocalLock) < 0)
+        return -1;
+    if (virThreadLocalInit(&virCondEvent, virCondEventCleanup) < 0)
+        return -1;
 
     return 0;
 }
diff --git a/src/util.h b/src/util.h
index 1a7286c..43a5bbc 100644
--- a/src/util.h
+++ b/src/util.h
@@ -160,7 +160,7 @@ int virMacAddrCompare (const char *mac1, const char *mac2);
 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
diff --git a/src/virsh.c b/src/virsh.c
index fff73a1..6919292 100644
--- a/src/virsh.c
+++ b/src/virsh.c
@@ -202,7 +202,7 @@ typedef struct __vshControl {
 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);
@@ -272,9 +272,9 @@ static virStorageVolPtr vshCommandOptVolBy(vshControl *ctl, const vshCmd *cmd,
                            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__)
@@ -495,6 +495,8 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
     return ctl->conn ? TRUE : FALSE;
 }
 
+#ifndef WIN32
+
 /*
  * "console" command
  */
@@ -510,8 +512,6 @@ static const vshCmdOptDef opts_console[] = {
     {NULL, 0, 0, NULL}
 };
 
-#ifndef __MINGW32__
-
 static int
 cmdRunConsole(vshControl *ctl, virDomainPtr dom)
 {
@@ -574,17 +574,6 @@ 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)
 {
@@ -603,6 +592,9 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd)
     return ret;
 }
 
+#endif /* WIN32 */
+
+
 /*
  * "list" command
  */
@@ -931,7 +923,9 @@ static const vshCmdInfo info_create[] = {
 
 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}
 };
 
@@ -943,7 +937,9 @@ cmdCreate(vshControl *ctl, const vshCmd *cmd)
     int found;
     int ret = TRUE;
     char *buffer;
+#ifndef WIN32
     int console = vshCommandOptBool(cmd, "console");
+#endif
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
@@ -961,8 +957,10 @@ cmdCreate(vshControl *ctl, const vshCmd *cmd)
     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);
@@ -1083,7 +1081,9 @@ static const vshCmdInfo info_start[] = {
 
 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}
 };
 
@@ -1092,7 +1092,9 @@ cmdStart(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
     int ret = TRUE;
+#ifndef WIN32
     int console = vshCommandOptBool(cmd, "console");
+#endif
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
@@ -1109,8 +1111,10 @@ cmdStart(vshControl *ctl, const vshCmd *cmd)
     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));
@@ -6562,6 +6566,8 @@ editReadBackFile (vshControl *ctl, const char *filename)
     return ret;
 }
 
+
+#ifndef WIN32
 /*
  * "cd" command
  */
@@ -6603,6 +6609,9 @@ cmdCd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     return 0;
 }
 
+#endif
+
+#ifndef WIN32
 /*
  * "pwd" command
  */
@@ -6638,6 +6647,7 @@ cmdPwd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     free (cwd);
     return !err;
 }
+#endif
 
 /*
  * "edit" command
@@ -6802,9 +6812,13 @@ static const vshCmdDef commands[] = {
     {"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},
@@ -6882,7 +6896,9 @@ static const vshCmdDef commands[] = {
     {"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},
diff --git a/src/virterror_internal.h b/src/virterror_internal.h
index fe9a96f..da89de7 100644
--- a/src/virterror_internal.h
+++ b/src/virterror_internal.h
@@ -46,7 +46,7 @@ void virRaiseErrorFull(virConnectPtr conn,
                        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,              \
@@ -61,7 +61,7 @@ void virReportErrorHelper(virConnectPtr conn, int domcode, int errcode,
                           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,
@@ -70,7 +70,7 @@ void virReportSystemErrorFull(virConnectPtr conn,
                               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),                              \
diff --git a/src/xend_internal.c b/src/xend_internal.c
index 55ffd3f..e23ae2b 100644
--- a/src/xend_internal.c
+++ b/src/xend_internal.c
@@ -582,7 +582,7 @@ xend_op(virConnectPtr xend, const char *name, const char *key, ...)
  * 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, ...)


-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list