diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2012-02-08 15:40:15 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2012-02-21 10:36:05 +0100 |
commit | faa982232197c66e72c936baa617cd18ee02bc94 (patch) | |
tree | 2d078932d76f3902bc42ebbb4543cc0065bf5290 /ui/spice-core.c | |
parent | f1f5f4070ce2fc95f23e14d4f1e33ea75732af55 (diff) | |
download | qemu-faa982232197c66e72c936baa617cd18ee02bc94.zip |
spice: support ipv6 channel address in monitor events and in spice info
RHBZ #788444
CC: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'ui/spice-core.c')
-rw-r--r-- | ui/spice-core.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/ui/spice-core.c b/ui/spice-core.c index 05cb745be1..1308a3d886 100644 --- a/ui/spice-core.c +++ b/ui/spice-core.c @@ -220,10 +220,23 @@ static void channel_event(int event, SpiceChannelEventInfo *info) } client = qdict_new(); - add_addr_info(client, &info->paddr, info->plen); - server = qdict_new(); - add_addr_info(server, &info->laddr, info->llen); + +#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + if (info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) { + add_addr_info(client, (struct sockaddr *)&info->paddr_ext, + info->plen_ext); + add_addr_info(server, (struct sockaddr *)&info->laddr_ext, + info->llen_ext); + } else { + fprintf(stderr, "spice: %s, extended address is expected\n", + __func__); +#endif + add_addr_info(client, &info->paddr, info->plen); + add_addr_info(server, &info->laddr, info->llen); +#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + } +#endif if (event == SPICE_CHANNEL_EVENT_INITIALIZED) { qdict_put(server, "auth", qstring_from_str(auth)); @@ -376,16 +389,30 @@ static SpiceChannelList *qmp_query_spice_channels(void) QTAILQ_FOREACH(item, &channel_list, link) { SpiceChannelList *chan; char host[NI_MAXHOST], port[NI_MAXSERV]; + struct sockaddr *paddr; + socklen_t plen; chan = g_malloc0(sizeof(*chan)); chan->value = g_malloc0(sizeof(*chan->value)); - getnameinfo(&item->info->paddr, item->info->plen, +#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + if (item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT) { + paddr = (struct sockaddr *)&item->info->paddr_ext; + plen = item->info->plen_ext; + } else { +#endif + paddr = &item->info->paddr; + plen = item->info->plen; +#ifdef SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT + } +#endif + + getnameinfo(paddr, plen, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); chan->value->host = g_strdup(host); chan->value->port = g_strdup(port); - chan->value->family = g_strdup(inet_strfamily(item->info->paddr.sa_family)); + chan->value->family = g_strdup(inet_strfamily(paddr->sa_family)); chan->value->connection_id = item->info->connection_id; chan->value->channel_type = item->info->type; |