With addition of events there will be alot of callbacks.
To avoid having to add many APIs to register callbacks,
provide them all at once in a big table
* src/qemu/qemu_driver.c: Pass in a callback table to QEMU
monitor code
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h Replace
the EOF and disk secret callbacks with a callback table
return ret;
}
+static qemuMonitorCallbacks monitorCallbacks = {
+ .eofNotify = qemuHandleMonitorEOF,
+ .diskSecretLookup = findVolumeQcowPassphrase,
+};
+
static int
qemuConnectMonitor(virDomainObjPtr vm)
{
if ((priv->mon = qemuMonitorOpen(vm,
priv->monConfig,
priv->monJSON,
- qemuHandleMonitorEOF)) == NULL) {
+ &monitorCallbacks)) == NULL) {
VIR_ERROR(_("Failed to connect monitor for %s\n"), vm->def->name);
return -1;
}
- qemuMonitorRegisterDiskSecretLookup(priv->mon,
- findVolumeQcowPassphrase);
-
return 0;
}
virDomainObjPtr vm;
- qemuMonitorEOFNotify eofCB;
- qemuMonitorDiskSecretLookup secretCB;
+ qemuMonitorCallbacksPtr cb;
/* If there's a command being processed this will be
* non-NULL */
* but is this safe ? I think it is, because the callback
* will try to acquire the virDomainObjPtr mutex next */
if (failed || quit) {
- qemuMonitorEOFNotify eofCB = mon->eofCB;
+ void (*eofNotify)(qemuMonitorPtr, virDomainObjPtr, int)
+ = mon->cb->eofNotify;
virDomainObjPtr vm = mon->vm;
/* Make sure anyone waiting wakes up now */
virCondSignal(&mon->notify);
if (qemuMonitorUnref(mon) > 0)
qemuMonitorUnlock(mon);
VIR_DEBUG("Triggering EOF callback error? %d", failed);
- (eofCB)(mon, vm, failed);
+ (eofNotify)(mon, vm, failed);
} else {
if (qemuMonitorUnref(mon) > 0)
qemuMonitorUnlock(mon);
qemuMonitorOpen(virDomainObjPtr vm,
virDomainChrDefPtr config,
int json,
- qemuMonitorEOFNotify eofCB)
+ qemuMonitorCallbacksPtr cb)
{
qemuMonitorPtr mon;
+ if (!cb || !cb->eofNotify) {
+ qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("EOF notify callback must be supplied"));
+ return NULL;
+ }
+
if (VIR_ALLOC(mon) < 0) {
virReportOOMError(NULL);
return NULL;
mon->fd = -1;
mon->refs = 1;
mon->vm = vm;
- mon->eofCB = eofCB;
mon->json = json;
+ mon->cb = cb;
qemuMonitorLock(mon);
switch (config->type) {
}
-void qemuMonitorRegisterDiskSecretLookup(qemuMonitorPtr mon,
- qemuMonitorDiskSecretLookup secretCB)
-{
- mon->secretCB = secretCB;
-}
-
-
int qemuMonitorSend(qemuMonitorPtr mon,
qemuMonitorMessagePtr msg)
{
char **secret,
size_t *secretLen)
{
+ int ret = -1;
*secret = NULL;
*secretLen = 0;
- return mon->secretCB(mon, conn, mon->vm, path, secret, secretLen);
+ qemuMonitorRef(mon);
+ qemuMonitorUnlock(mon);
+ if (mon->cb && mon->cb->diskSecretLookup)
+ ret = mon->cb->diskSecretLookup(mon, conn, mon->vm, path, secret, secretLen);
+ qemuMonitorLock(mon);
+ qemuMonitorUnref(mon);
+ return ret;
}
void *passwordOpaque;
};
-typedef void (*qemuMonitorEOFNotify)(qemuMonitorPtr mon,
- virDomainObjPtr vm,
- int withError);
-
-/* XXX we'd really like to avoid virCOnnectPtr here
- * It is required so the callback can find the active
- * secret driver. Need to change this to work like the
- * security drivers do, to avoid this
- */
-typedef int (*qemuMonitorDiskSecretLookup)(qemuMonitorPtr mon,
- virConnectPtr conn,
- virDomainObjPtr vm,
- const char *path,
- char **secret,
- size_t *secretLen);
+typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks;
+typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr;
+struct _qemuMonitorCallbacks {
+ void (*eofNotify)(qemuMonitorPtr mon,
+ virDomainObjPtr vm,
+ int withError);
+ /* XXX we'd really like to avoid virCOnnectPtr here
+ * It is required so the callback can find the active
+ * secret driver. Need to change this to work like the
+ * security drivers do, to avoid this
+ */
+ int (*diskSecretLookup)(qemuMonitorPtr mon,
+ virConnectPtr conn,
+ virDomainObjPtr vm,
+ const char *path,
+ char **secret,
+ size_t *secretLen);
+};
+
char *qemuMonitorEscapeArg(const char *in);
char *qemuMonitorEscapeShell(const char *in);
qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm,
virDomainChrDefPtr config,
int json,
- qemuMonitorEOFNotify eofCB);
+ qemuMonitorCallbacksPtr cb);
int qemuMonitorClose(qemuMonitorPtr mon);
int qemuMonitorRef(qemuMonitorPtr mon);
int qemuMonitorUnref(qemuMonitorPtr mon);
-void qemuMonitorRegisterDiskSecretLookup(qemuMonitorPtr mon,
- qemuMonitorDiskSecretLookup secretCB);
-
/* This API is for use by the internal Text/JSON monitor impl code only */
int qemuMonitorSend(qemuMonitorPtr mon,
qemuMonitorMessagePtr msg);