qga_vss_fsfreeze() casts error_set_win32() from void (*)(Error **, int, ErrorClass, const char *, ...) to void (*)(void **, int, int, const char *, ...) The result is later called. Since the two types are not compatible, the call is undefined behavior. It works in practice anyway. However, there's no real need for trickery here. Clean it up as follows: * Declare struct Error, and fix the first parameter. * Switch to error_setg_win32(). This gets rid of the troublesome ErrorClass parameter. Requires converting error_setg_win32() from macro to function, but that's trivially easy, because this is the only user of error_set_win32(). Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
45 lines
1 KiB
C
45 lines
1 KiB
C
/*
|
|
* QEMU Guest Agent VSS requester declarations
|
|
*
|
|
* Copyright Hitachi Data Systems Corp. 2013
|
|
*
|
|
* Authors:
|
|
* Tomoki Sekiyama <tomoki.sekiyama@hds.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#ifndef VSS_WIN32_REQUESTER_H
|
|
#define VSS_WIN32_REQUESTER_H
|
|
|
|
#include <basetyps.h> /* STDAPI */
|
|
#include "qemu/compiler.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct Error;
|
|
|
|
/* Callback to set Error; used to avoid linking glib to the DLL */
|
|
typedef void (*ErrorSetFunc)(struct Error **errp, int win32_err,
|
|
const char *fmt, ...) GCC_FMT_ATTR(3, 4);
|
|
typedef struct ErrorSet {
|
|
ErrorSetFunc error_setg_win32;
|
|
struct Error **errp;
|
|
} ErrorSet;
|
|
|
|
STDAPI requester_init(void);
|
|
STDAPI requester_deinit(void);
|
|
|
|
typedef void (*QGAVSSRequesterFunc)(int *, ErrorSet *);
|
|
void requester_freeze(int *num_vols, ErrorSet *errset);
|
|
void requester_thaw(int *num_vols, ErrorSet *errset);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|