/* build return data */
memset(&data, 0, sizeof(data));
make_nonnull_network(&data.net, net);
+ data.callbackID = callback->callbackID;
data.event = event;
data.detail = detail;
virNetMessagePtr msg ATTRIBUTE_UNUSED,
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
remote_connect_network_event_register_any_args *args,
- remote_connect_network_event_register_any_ret *ret ATTRIBUTE_UNUSED)
+ remote_connect_network_event_register_any_ret *ret)
{
int callbackID;
int rv = -1;
daemonClientEventCallbackPtr ref;
struct daemonClientPrivate *priv =
virNetServerClientGetPrivateData(client);
+ virNetworkPtr net = NULL;
if (!priv->conn) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
virMutexLock(&priv->lock);
+ if (args->net &&
+ !(net = get_nonnull_network(priv->conn, *args->net)))
+ goto cleanup;
+
if (args->eventID >= VIR_NETWORK_EVENT_ID_LAST || args->eventID < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unsupported network event ID %d"), args->eventID);
goto cleanup;
if ((callbackID = virConnectNetworkEventRegisterAny(priv->conn,
- NULL,
+ net,
args->eventID,
networkEventCallbacks[args->eventID],
ref,
}
ref->callbackID = callbackID;
+ ret->callbackID = callbackID;
rv = 0;
VIR_FREE(callback);
if (rv < 0)
virNetMessageSaveError(rerr);
+ if (net)
+ virNetworkFree(net);
virMutexUnlock(&priv->lock);
return rv;
}
virNetServerClientPtr client,
virNetMessagePtr msg ATTRIBUTE_UNUSED,
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
- remote_connect_network_event_deregister_any_args *args,
- remote_connect_network_event_deregister_any_ret *ret ATTRIBUTE_UNUSED)
+ remote_connect_network_event_deregister_any_args *args)
{
- int callbackID = -1;
int rv = -1;
size_t i;
struct daemonClientPrivate *priv =
virMutexLock(&priv->lock);
- if (args->eventID >= VIR_NETWORK_EVENT_ID_LAST || args->eventID < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("unsupported event ID %d"), args->eventID);
- goto cleanup;
- }
-
for (i = 0; i < priv->nnetworkEventCallbacks; i++) {
- if (priv->networkEventCallbacks[i]->eventID == args->eventID) {
- callbackID = priv->networkEventCallbacks[i]->callbackID;
+ if (priv->networkEventCallbacks[i]->callbackID == args->callbackID)
break;
- }
}
- if (callbackID < 0) {
+ if (i == priv->nnetworkEventCallbacks) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- _("network event %d not registered"), args->eventID);
+ _("network event callback %d not registered"),
+ args->callbackID);
goto cleanup;
}
- if (virConnectNetworkEventDeregisterAny(priv->conn, callbackID) < 0)
+ if (virConnectNetworkEventDeregisterAny(priv->conn, args->callbackID) < 0)
goto cleanup;
VIR_DELETE_ELEMENT(priv->networkEventCallbacks, i,
if (virNetworkEventsInitialize() < 0)
return -1;
- /* FIXME: All servers that support network events should also support
- * per-object filtering. */
return virObjectEventStateRegisterID(conn, state, net ? net->uuid : NULL,
virNetworkEventClass, eventID,
VIR_OBJECT_EVENT_CALLBACK(cb),
- opaque, freecb, callbackID, false);
+ opaque, freecb, callbackID, true);
}
int rv = -1;
struct private_data *priv = conn->privateData;
remote_connect_network_event_register_any_args args;
+ remote_connect_network_event_register_any_ret ret;
int callbackID;
int count;
+ remote_nonnull_network network;
remoteDriverLock(priv);
* events on the server */
if (count == 1) {
args.eventID = eventID;
+ if (net) {
+ make_nonnull_network(&network, net);
+ args.net = &network;
+ } else {
+ args.net = NULL;
+ }
+ memset(&ret, 0, sizeof(ret));
if (call(conn, priv, 0, REMOTE_PROC_CONNECT_NETWORK_EVENT_REGISTER_ANY,
(xdrproc_t) xdr_remote_connect_network_event_register_any_args, (char *) &args,
- (xdrproc_t) xdr_void, (char *)NULL) == -1) {
+ (xdrproc_t) xdr_remote_connect_network_event_register_any_ret, (char *) &ret) == -1) {
virObjectEventStateDeregisterID(conn, priv->eventState,
callbackID);
goto done;
}
+ virObjectEventStateSetRemote(conn, priv->eventState, callbackID,
+ ret.callbackID);
}
rv = callbackID;
/* If that was the last callback for this eventID, we need to disable
* events on the server */
if (count == 0) {
- args.eventID = eventID;
+ args.callbackID = remoteID;
if (call(conn, priv, 0, REMOTE_PROC_CONNECT_NETWORK_EVENT_DEREGISTER_ANY,
(xdrproc_t) xdr_remote_connect_network_event_deregister_any_args, (char *) &args,
msg->detail);
virNetworkFree(net);
- remoteEventQueue(priv, event, -1);
+ remoteEventQueue(priv, event, msg->callbackID);
}
* remote_internal driver and libvirtd. This protocol is
* internal and may change at any time.
*
- * Copyright (C) 2006-2013 Red Hat, Inc.
+ * Copyright (C) 2006-2014 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
struct remote_connect_network_event_register_any_args {
int eventID;
+ remote_network net;
};
struct remote_connect_network_event_register_any_ret {
- int cb_registered;
+ int callbackID;
};
struct remote_connect_network_event_deregister_any_args {
- int eventID;
-};
-
-struct remote_connect_network_event_deregister_any_ret {
- int cb_registered;
+ int callbackID;
};
struct remote_network_event_lifecycle_msg {
+ int callbackID;
remote_nonnull_network net;
int event;
int detail;
};
struct remote_connect_network_event_register_any_args {
int eventID;
+ remote_network net;
};
struct remote_connect_network_event_register_any_ret {
- int cb_registered;
+ int callbackID;
};
struct remote_connect_network_event_deregister_any_args {
- int eventID;
-};
-struct remote_connect_network_event_deregister_any_ret {
- int cb_registered;
+ int callbackID;
};
struct remote_network_event_lifecycle_msg {
+ int callbackID;
remote_nonnull_network net;
int event;
int detail;