* [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 @ 2017-05-05 6:34 Markus Armbruster 2017-05-08 16:42 ` Stefan Hajnoczi 0 siblings, 1 reply; 5+ messages in thread From: Markus Armbruster @ 2017-05-05 6:34 UTC (permalink / raw) To: qemu-devel [v2]: Fix trailing space, note tweaks to PATCH 12 properly in the commit message The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60: Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100) are available in the git repository at: git://repo.or.cz/qemu/armbru.git tags/pull-qapi-2017-05-04-v2 for you to fetch changes up to 3cbba78072340a52a0720caf6d175ad4e3f79901: qmp-shell: improve help (2017-05-05 08:29:45 +0200) ---------------------------------------------------------------- QAPI patches for 2017-05-04 ---------------------------------------------------------------- Dr. David Alan Gilbert (1): tests/check-qdict: Fix missing brackets Eric Blake (10): pci: Use struct instead of QDict to pass back parameters pci: Reduce scope of error injection coccinelle: Add script to remove useless QObject casts qobject: Drop useless QObject casts qobject: Add helper macros for common scalar insertions qobject: Use simpler QDict/QList scalar insertion macros block: Simplify bdrv_append_temp_snapshot() logic QemuOpts: Simplify qemu_opts_to_qdict() fdc-test: Avoid deprecated 'change' command test-qga: Actually test 0xff sync bytes John Snow (1): qmp-shell: add persistent command history Marc-André Lureau (5): test-keyval: fix leaks qmp-shell: add -N option to skip negotiate qmp-shell: Cope with query-commands error qmp-shell: don't show version greeting if unavailable qmp-shell: improve help Markus Armbruster (11): sockets: Prepare vsock_parse() for flattened SocketAddress sockets: Prepare inet_parse() for flattened SocketAddress qapi: New QAPI_CLONE_MEMBERS() sockets: Rename SocketAddress to SocketAddressLegacy sockets: Rename SocketAddressFlat to SocketAddress sockets: Limit SocketAddressLegacy to external interfaces sockets: Delete unused helper socket_address_crumple() qmp: Improve QMP dispatch error messages qobject-input-visitor: Document full_name_nth() qapi: Document intended use of @name within alternate visits qobject-input-visitor: Catch misuse of end_struct vs. end_list MAINTAINERS | 1 + block.c | 70 ++++++-------- block/blkdebug.c | 8 +- block/blkverify.c | 11 +-- block/curl.c | 2 +- block/file-posix.c | 8 +- block/file-win32.c | 4 +- block/gluster.c | 48 +++++----- block/nbd.c | 77 ++++++++-------- block/nfs.c | 43 ++++----- block/null.c | 2 +- block/qcow2.c | 4 +- block/quorum.c | 16 ++-- block/rbd.c | 16 ++-- block/sheepdog.c | 20 ++-- block/snapshot.c | 2 +- block/ssh.c | 16 ++-- block/vvfat.c | 10 +- block/vxhs.c | 6 +- blockdev-nbd.c | 21 +++-- blockdev.c | 30 +++--- chardev/char-socket.c | 36 ++++---- chardev/char-udp.c | 20 ++-- hmp.c | 3 +- hw/block/xen_disk.c | 2 +- hw/pci/pcie_aer.c | 48 ++++++---- hw/usb/xen-usb.c | 12 +-- include/block/nbd.h | 3 + include/hw/pci/pcie_aer.h | 4 - include/io/channel-socket.h | 4 +- include/qapi/clone-visitor.h | 14 +++ include/qapi/qmp/qdict.h | 8 ++ include/qapi/qmp/qlist.h | 8 ++ include/qapi/visitor.h | 6 +- include/qemu/sockets.h | 16 ++-- io/dns-resolver.c | 17 ++-- migration/rdma.c | 4 +- migration/socket.c | 20 ++-- monitor.c | 23 +++-- qapi-schema.json | 35 +++---- qapi/block-core.json | 6 +- qapi/block.json | 2 +- qapi/qapi-clone-visitor.c | 13 +++ qapi/qmp-dispatch.c | 14 +-- qapi/qmp-event.c | 2 +- qapi/qobject-input-visitor.c | 32 ++++++- qemu-img.c | 6 +- qemu-io.c | 2 +- qemu-nbd.c | 11 +-- qga/main.c | 4 +- qobject/qdict.c | 2 +- scripts/coccinelle/qobject.cocci | 35 +++++++ scripts/qmp/qmp-shell | 44 ++++++++- target/s390x/cpu_models.c | 4 +- tests/check-qdict.c | 144 ++++++++++++++--------------- tests/check-qlist.c | 4 +- tests/device-introspect-test.c | 4 +- tests/fdc-test.c | 8 +- tests/libqtest.c | 8 ++ tests/test-io-channel-socket.c | 52 +++++------ tests/test-keyval.c | 4 + tests/test-qemu-opts.c | 4 +- tests/test-qga.c | 41 +++++++-- tests/test-qmp-commands.c | 30 +++--- tests/test-qmp-event.c | 30 +++--- tests/test-qobject-output-visitor.c | 6 +- ui/vnc-auth-sasl.c | 5 +- ui/vnc.c | 68 +++++++------- util/qemu-option.c | 6 +- util/qemu-sockets.c | 177 +++++++++++++++++------------------- 70 files changed, 800 insertions(+), 666 deletions(-) create mode 100644 scripts/coccinelle/qobject.cocci -- 2.7.4 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 2017-05-05 6:34 [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 Markus Armbruster @ 2017-05-08 16:42 ` Stefan Hajnoczi 2017-05-08 18:09 ` Eric Blake 0 siblings, 1 reply; 5+ messages in thread From: Stefan Hajnoczi @ 2017-05-08 16:42 UTC (permalink / raw) To: Markus Armbruster; +Cc: qemu-devel [-- Attachment #1: Type: text/plain, Size: 1809 bytes --] On Fri, May 05, 2017 at 08:34:42AM +0200, Markus Armbruster wrote: > [v2]: Fix trailing space, note tweaks to PATCH 12 properly in the > > commit message > The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60: > > Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100) > > are available in the git repository at: > > git://repo.or.cz/qemu/armbru.git tags/pull-qapi-2017-05-04-v2 make check fails when I apply this series: GTESTER tests/test-char GTester: last random seed: R02S47a681e3e741223084711f7aacacb19a GTester: last random seed: R02S739de30ffeb0f93caedc22b2863f60a7 Output from gdb is: /char/socket: Thread 1 "test-char" received signal SIGSEGV, Segmentation fault. 0x00005555555b8b09 in qdict_find (bucket=<optimized out>, key=0x5555555da9dd "port", qdict=0x0) at qobject/qdict.c:110 110 QLIST_FOREACH(entry, &qdict->table[bucket], next) (gdb) bt bt #0 0x00005555555b8b09 in qdict_find (bucket=<optimized out>, key=0x5555555da9dd "port", qdict=0x0) at qobject/qdict.c:110 #1 qdict_get (qdict=0x0, key=0x5555555da9dd "port") at qobject/qdict.c:157 #2 0x00005555555b8cf9 in qdict_get_str (qdict=<optimized out>, key=<optimized out>) at qobject/qdict.c:256 #3 0x0000555555565917 in char_socket_test () at tests/test-char.c:310 #4 0x00007ffff79327d1 in g_test_run_suite_internal () from /lib64/libglib-2.0.so.0 #5 0x00007ffff793299f in g_test_run_suite_internal () from /lib64/libglib-2.0.so.0 #6 0x00007ffff7932bae in g_test_run_suite () from /lib64/libglib-2.0.so.0 #7 0x00007ffff7932bd1 in g_test_run () from /lib64/libglib-2.0.so.0 #8 0x0000555555564c67 in main (argc=<optimized out>, argv=<optimized out>) at tests/test-char.c:608 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 455 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 2017-05-08 16:42 ` Stefan Hajnoczi @ 2017-05-08 18:09 ` Eric Blake 2017-05-08 19:57 ` Eric Blake 0 siblings, 1 reply; 5+ messages in thread From: Eric Blake @ 2017-05-08 18:09 UTC (permalink / raw) To: Stefan Hajnoczi, Markus Armbruster; +Cc: qemu-devel, Marc-André Lureau [-- Attachment #1: Type: text/plain, Size: 2221 bytes --] On 05/08/2017 11:42 AM, Stefan Hajnoczi wrote: > On Fri, May 05, 2017 at 08:34:42AM +0200, Markus Armbruster wrote: >> [v2]: Fix trailing space, note tweaks to PATCH 12 properly in the >> >> commit message >> The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60: >> >> Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100) >> >> are available in the git repository at: >> >> git://repo.or.cz/qemu/armbru.git tags/pull-qapi-2017-05-04-v2 > > make check fails when I apply this series: > > GTESTER tests/test-char > GTester: last random seed: R02S47a681e3e741223084711f7aacacb19a > GTester: last random seed: R02S739de30ffeb0f93caedc22b2863f60a7 I tried bisecting, and I hit compilation failures during: sockets: Rename SocketAddress to SocketAddressLegacy chardev/char-socket.c: In function ‘qmp_chardev_open_socket’: chardev/char-socket.c:948:13: error: implicit declaration of function ‘qapi_free_SocketAddress’ [-Werror=implicit-function-declaration] qapi_free_SocketAddress(s->addr); ^~~~~~~~~~~~~~~~~~~~~~~ and sockets: Rename SocketAddressFlat to SocketAddress chardev/char-socket.c: In function ‘qmp_chardev_open_socket’: chardev/char-socket.c:948:37: error: passing argument 1 of ‘qapi_free_SocketAddress’ from incompatible pointer type [-Werror=incompatible-pointer-types] qapi_free_SocketAddress(s->addr); ^ which places the failure(s) anywhere in this range: pick 70ae657 qapi: New QAPI_CLONE_MEMBERS() pick f031ce2 sockets: Rename SocketAddress to SocketAddressLegacy pick b1eb5e0 sockets: Rename SocketAddressFlat to SocketAddress pick a842861 sockets: Limit SocketAddressLegacy to external interfaces I don't see the failures when testing armbru/qapi-next in isolation. Probably just means you have to rebase your series on top of Marc-André's series which got merged first, although such a rebase is not necessarily trivial :( -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 604 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 2017-05-08 18:09 ` Eric Blake @ 2017-05-08 19:57 ` Eric Blake 2017-05-09 7:32 ` Markus Armbruster 0 siblings, 1 reply; 5+ messages in thread From: Eric Blake @ 2017-05-08 19:57 UTC (permalink / raw) To: Stefan Hajnoczi, Markus Armbruster; +Cc: Marc-André Lureau, qemu-devel [-- Attachment #1: Type: text/plain, Size: 4859 bytes --] On 05/08/2017 01:09 PM, Eric Blake wrote: > On 05/08/2017 11:42 AM, Stefan Hajnoczi wrote: >> On Fri, May 05, 2017 at 08:34:42AM +0200, Markus Armbruster wrote: >>> [v2]: Fix trailing space, note tweaks to PATCH 12 properly in the >>> >>> commit message >>> The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60: >>> >>> Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100) >>> >>> are available in the git repository at: >>> >>> git://repo.or.cz/qemu/armbru.git tags/pull-qapi-2017-05-04-v2 >> >> make check fails when I apply this series: >> >> GTESTER tests/test-char >> GTester: last random seed: R02S47a681e3e741223084711f7aacacb19a >> GTester: last random seed: R02S739de30ffeb0f93caedc22b2863f60a7 > > I tried bisecting, and I hit compilation failures during: > > sockets: Rename SocketAddress to SocketAddressLegacy > > chardev/char-socket.c: In function ‘qmp_chardev_open_socket’: > chardev/char-socket.c:948:13: error: implicit declaration of function > ‘qapi_free_SocketAddress’ [-Werror=implicit-function-declaration] > qapi_free_SocketAddress(s->addr); > ^~~~~~~~~~~~~~~~~~~~~~~ For this one, I got past by squashing in: diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 6b89209..1b99344 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -945,7 +945,7 @@ static void qmp_chardev_open_socket(Chardev *chr, goto error; } - qapi_free_SocketAddress(s->addr); + qapi_free_SocketAddressLegacy(s->addr); s->addr = socket_local_address(sioc->fd, errp); update_disconnected_filename(s); @@ -1051,7 +1051,7 @@ char_socket_get_addr(Object *obj, Visitor *v, const char *name, { SocketChardev *s = SOCKET_CHARDEV(obj); - visit_type_SocketAddress(v, name, &s->addr, errp); + visit_type_SocketAddressLegacy(v, name, &s->addr, errp); } static bool > > > and > sockets: Rename SocketAddressFlat to SocketAddress > > chardev/char-socket.c: In function ‘qmp_chardev_open_socket’: > chardev/char-socket.c:948:37: error: passing argument 1 of > ‘qapi_free_SocketAddress’ from incompatible pointer type > [-Werror=incompatible-pointer-types] > qapi_free_SocketAddress(s->addr); > ^ For this one, I squashed in: diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 69e6de6..8a321a1 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -945,7 +945,7 @@ static void qmp_chardev_open_socket(Chardev *chr, goto error; } - qapi_free_SocketAddressLegacy(s->addr); + qapi_free_SocketAddress(s->addr); s->addr = socket_local_address(sioc->fd, errp); update_disconnected_filename(s); @@ -1051,7 +1051,7 @@ char_socket_get_addr(Object *obj, Visitor *v, const char *name, { SocketChardev *s = SOCKET_CHARDEV(obj); - visit_type_SocketAddressLegacy(v, name, &s->addr, errp); + visit_type_SocketAddress(v, name, &s->addr, errp); } static bool diff --git a/tests/test-char.c b/tests/test-char.c index 773a1c3..124d0c5 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -291,7 +291,7 @@ static void char_socket_test(void) Chardev *chr = qemu_chr_new("server", "tcp:127.0.0.1:0,server,nowait"); Chardev *chr_client; QObject *addr; - QDict *qdict, *data; + QDict *qdict; const char *port; SocketIdleData d = { .chr = chr }; CharBackend be; @@ -306,8 +306,7 @@ static void char_socket_test(void) addr = object_property_get_qobject(OBJECT(chr), "addr", &error_abort); qdict = qobject_to_qdict(addr); - data = qdict_get_qdict(qdict, "data"); - port = qdict_get_str(data, "port"); + port = qdict_get_str(qdict, "port"); tmp = g_strdup_printf("tcp:127.0.0.1:%s", port); QDECREF(qdict); diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index ad3ce65..bee3646 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -1369,7 +1369,12 @@ SocketAddressLegacy *socket_address_crumple(SocketAddress *addr_flat) SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy) { - SocketAddress *addr = g_new(SocketAddress, 1); + SocketAddress *addr; + + if (!addr_legacy) { + return NULL; + } + addr = g_new(SocketAddress, 1); switch (addr_legacy->type) { case SOCKET_ADDRESS_LEGACY_KIND_INET: That was enough to get me back to a working 'make check'. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 604 bytes --] ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 2017-05-08 19:57 ` Eric Blake @ 2017-05-09 7:32 ` Markus Armbruster 0 siblings, 0 replies; 5+ messages in thread From: Markus Armbruster @ 2017-05-09 7:32 UTC (permalink / raw) To: Eric Blake; +Cc: Stefan Hajnoczi, Marc-André Lureau, qemu-devel Eric Blake <eblake@redhat.com> writes: > On 05/08/2017 01:09 PM, Eric Blake wrote: >> On 05/08/2017 11:42 AM, Stefan Hajnoczi wrote: >>> On Fri, May 05, 2017 at 08:34:42AM +0200, Markus Armbruster wrote: >>>> [v2]: Fix trailing space, note tweaks to PATCH 12 properly in the >>>> >>>> commit message >>>> The following changes since commit e619b14746e5d8c0e53061661fd0e1da01fd4d60: >>>> >>>> Merge remote-tracking branch 'sthibault/tags/samuel-thibault' into staging (2017-05-02 15:16:29 +0100) >>>> >>>> are available in the git repository at: >>>> >>>> git://repo.or.cz/qemu/armbru.git tags/pull-qapi-2017-05-04-v2 >>> >>> make check fails when I apply this series: >>> >>> GTESTER tests/test-char >>> GTester: last random seed: R02S47a681e3e741223084711f7aacacb19a >>> GTester: last random seed: R02S739de30ffeb0f93caedc22b2863f60a7 >> >> I tried bisecting, and I hit compilation failures during: >> >> sockets: Rename SocketAddress to SocketAddressLegacy >> >> chardev/char-socket.c: In function ‘qmp_chardev_open_socket’: >> chardev/char-socket.c:948:13: error: implicit declaration of function >> ‘qapi_free_SocketAddress’ [-Werror=implicit-function-declaration] >> qapi_free_SocketAddress(s->addr); >> ^~~~~~~~~~~~~~~~~~~~~~~ > > For this one, I got past by squashing in: > > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > index 6b89209..1b99344 100644 > --- a/chardev/char-socket.c > +++ b/chardev/char-socket.c > @@ -945,7 +945,7 @@ static void qmp_chardev_open_socket(Chardev *chr, > goto error; > } > > - qapi_free_SocketAddress(s->addr); > + qapi_free_SocketAddressLegacy(s->addr); > s->addr = socket_local_address(sioc->fd, errp); > update_disconnected_filename(s); > > @@ -1051,7 +1051,7 @@ char_socket_get_addr(Object *obj, Visitor *v, > const char *name, > { > SocketChardev *s = SOCKET_CHARDEV(obj); > > - visit_type_SocketAddress(v, name, &s->addr, errp); > + visit_type_SocketAddressLegacy(v, name, &s->addr, errp); > } > > static bool For completeness: @@ -1078,7 +1078,7 @@ static void char_socket_class_init(ObjectClass *oc, void *data) cc->chr_add_watch = tcp_chr_add_watch; cc->chr_update_read_handler = tcp_chr_update_read_handler; - object_class_property_add(oc, "addr", "SocketAddress", + object_class_property_add(oc, "addr", "SocketAddressLegacy", char_socket_get_addr, NULL, NULL, NULL, &error_abort); To be reverted in the next patch, like the other two. > > >> >> >> and >> sockets: Rename SocketAddressFlat to SocketAddress >> >> chardev/char-socket.c: In function ‘qmp_chardev_open_socket’: >> chardev/char-socket.c:948:37: error: passing argument 1 of >> ‘qapi_free_SocketAddress’ from incompatible pointer type >> [-Werror=incompatible-pointer-types] >> qapi_free_SocketAddress(s->addr); >> ^ > > For this one, I squashed in: > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > index 69e6de6..8a321a1 100644 > --- a/chardev/char-socket.c > +++ b/chardev/char-socket.c > @@ -945,7 +945,7 @@ static void qmp_chardev_open_socket(Chardev *chr, > goto error; > } > > - qapi_free_SocketAddressLegacy(s->addr); > + qapi_free_SocketAddress(s->addr); > s->addr = socket_local_address(sioc->fd, errp); > update_disconnected_filename(s); > > @@ -1051,7 +1051,7 @@ char_socket_get_addr(Object *obj, Visitor *v, > const char *name, > { > SocketChardev *s = SOCKET_CHARDEV(obj); > > - visit_type_SocketAddressLegacy(v, name, &s->addr, errp); > + visit_type_SocketAddress(v, name, &s->addr, errp); > } > > static bool Matching revert here. > diff --git a/tests/test-char.c b/tests/test-char.c > index 773a1c3..124d0c5 100644 > --- a/tests/test-char.c > +++ b/tests/test-char.c > @@ -291,7 +291,7 @@ static void char_socket_test(void) > Chardev *chr = qemu_chr_new("server", "tcp:127.0.0.1:0,server,nowait"); > Chardev *chr_client; > QObject *addr; > - QDict *qdict, *data; > + QDict *qdict; > const char *port; > SocketIdleData d = { .chr = chr }; > CharBackend be; > @@ -306,8 +306,7 @@ static void char_socket_test(void) > > addr = object_property_get_qobject(OBJECT(chr), "addr", &error_abort); > qdict = qobject_to_qdict(addr); > - data = qdict_get_qdict(qdict, "data"); > - port = qdict_get_str(data, "port"); > + port = qdict_get_str(qdict, "port"); > tmp = g_strdup_printf("tcp:127.0.0.1:%s", port); > QDECREF(qdict); > This one demonstrates why direct use of QDict sucks: neither grep nor the compiler help you with refactoring, only the debugger does. Visitors are much friendlier there. Going forward, I'd like to see less manual rummaging in QDicts. If you need efficiency, use C structs. If you need the malleability of QObject, use visitors. > diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c > index ad3ce65..bee3646 100644 > --- a/util/qemu-sockets.c > +++ b/util/qemu-sockets.c > @@ -1369,7 +1369,12 @@ SocketAddressLegacy > *socket_address_crumple(SocketAddress *addr_flat) > > SocketAddress *socket_address_flatten(SocketAddressLegacy *addr_legacy) > { > - SocketAddress *addr = g_new(SocketAddress, 1); > + SocketAddress *addr; > + > + if (!addr_legacy) { > + return NULL; > + } > + addr = g_new(SocketAddress, 1); > > switch (addr_legacy->type) { > case SOCKET_ADDRESS_LEGACY_KIND_INET: > > > That was enough to get me back to a working 'make check'. Needed because ChardevUdp member local is optional. I searched the changes between this pull request's base and current master for additional traps, but couldn't find any. New pull request coming. Thanks! ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-05-09 7:32 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-05-05 6:34 [Qemu-devel] [PULL v2 00/28] QAPI patches for 2017-05-04 Markus Armbruster 2017-05-08 16:42 ` Stefan Hajnoczi 2017-05-08 18:09 ` Eric Blake 2017-05-08 19:57 ` Eric Blake 2017-05-09 7:32 ` Markus Armbruster
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).