diff --git a/tools/virsh-network.c b/tools/virsh-network.c index 9b86ef8071d1527cc39ac6f26a571bb026f5d6fc..d5b3649050ef7bfb7f4367b3bc2199eb3e23bc44 100644 --- a/tools/virsh-network.c +++ b/tools/virsh-network.c @@ -1156,6 +1156,7 @@ struct virshNetEventData { bool loop; bool timestamp; int count; + virshNetworkEventCallback *cb; }; typedef struct virshNetEventData virshNetEventData; @@ -1195,6 +1196,12 @@ vshEventLifecyclePrint(virConnectPtr conn ATTRIBUTE_UNUSED, vshEventDone(data->ctl); } +virshNetworkEventCallback virshNetworkEventCallbacks[] = { + { "lifecycle", + VIR_NETWORK_EVENT_CALLBACK(vshEventLifecyclePrint), }, +}; +verify(VIR_NETWORK_EVENT_ID_LAST == ARRAY_CARDINALITY(virshNetworkEventCallbacks)); + static const vshCmdInfo info_network_event[] = { {.name = "help", .data = N_("Network Events") @@ -1246,7 +1253,7 @@ cmdNetworkEvent(vshControl *ctl, const vshCmd *cmd) size_t i; for (i = 0; i < VIR_NETWORK_EVENT_ID_LAST; i++) - vshPrint(ctl, "%s\n", virshNetworkEventIdTypeToString(i)); + vshPrint(ctl, "%s\n", virshNetworkEventCallbacks[i].name); return true; } @@ -1256,7 +1263,10 @@ cmdNetworkEvent(vshControl *ctl, const vshCmd *cmd) vshError(ctl, "%s", _("either --list or --event is required")); return false; } - if ((event = virshNetworkEventIdTypeFromString(eventName)) < 0) { + for (event = 0; event < VIR_NETWORK_EVENT_ID_LAST; event++) + if (STREQ(eventName, virshNetworkEventCallbacks[event].name)) + break; + if (event == VIR_NETWORK_EVENT_ID_LAST) { vshError(ctl, _("unknown event type %s"), eventName); return false; } @@ -1265,6 +1275,7 @@ cmdNetworkEvent(vshControl *ctl, const vshCmd *cmd) data.loop = vshCommandOptBool(cmd, "loop"); data.timestamp = vshCommandOptBool(cmd, "timestamp"); data.count = 0; + data.cb = &virshNetworkEventCallbacks[event]; if (vshCommandOptTimeoutToMs(ctl, cmd, &timeout) < 0) return false; @@ -1274,7 +1285,7 @@ cmdNetworkEvent(vshControl *ctl, const vshCmd *cmd) goto cleanup; if ((eventId = virConnectNetworkEventRegisterAny(priv->conn, net, event, - VIR_NETWORK_EVENT_CALLBACK(vshEventLifecyclePrint), + data.cb->cb, &data, NULL)) < 0) goto cleanup; switch (vshEventWait(ctl)) { diff --git a/tools/virsh-network.h b/tools/virsh-network.h index 0fff4b7748b3228b67742eb9204759ef6b899f06..9c86eb5bc9936a015f1c58df15dfbce1f290b2ce 100644 --- a/tools/virsh-network.h +++ b/tools/virsh-network.h @@ -32,6 +32,14 @@ virshCommandOptNetworkBy(vshControl *ctl, const vshCmd *cmd, virshCommandOptNetworkBy(_ctl, _cmd, _name, \ VIRSH_BYUUID | VIRSH_BYNAME) +struct virshNetworkEventCallback { + const char *name; + virConnectNetworkEventGenericCallback cb; +}; +typedef struct virshNetworkEventCallback virshNetworkEventCallback; + +extern virshNetworkEventCallback virshNetworkEventCallbacks[]; + extern const vshCmdDef networkCmds[]; #endif /* LIBVIRT_VIRSH_NETWORK_H */