qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err()
@ 2015-02-12 13:33 Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err() Markus Armbruster
                   ` (9 more replies)
  0 siblings, 10 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Kevin Wolf, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Gerd Hoffmann, Stefan Hajnoczi, Andreas Färber

Tree-wide cleanup, but the tree-wide changes are mechanical.  If
nobody objects, I'll route it through my own tree.

Depends on my "[PATCH] vhost-scsi: Improve error reporting for invalid
vhostfd".

PATCH 01 introduces a helper function, PATCH 02 puts it to use.
Responsible for the bulk of the diffstat.  I could split off one or
more of block, arm, x86+pci, scsi, usb, char, net for maintainers to
pick up after the main patch got in.  Cc'ing a few maintainers who
might prefer that, to give them a chance to ask for it.

PATCH 03 gets rid of an unnecessary use of qerror_report_err().  This
is the patch that causes the dependency mentioned above.

The remaining patches clean up inappropriate uses of
qerror_report_err().

Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Andreas Färber <afaerber@suse.de>

v2:
* Split PATCH 01 into 01 and 02 [Eric, Kevin]
* Rebased, PATCH 02 picked up another hunk
* Remaining patches unchanged, R-by retained

Markus Armbruster (10):
  error: New convenience function error_report_err()
  error: Use error_report_err() where appropriate
  monitor: Clean up around monitor_handle_fd_param()
  monitor: Avoid qerror_report_err() outside QMP command handlers
  net: Avoid qerror_report_err() outside QMP command handlers
  numa: Avoid qerror_report_err() outside QMP command handlers
  tpm: Avoid qerror_report_err() outside QMP command handlers
  vl: Avoid qerror_report_err() outside QMP command handlers
  qemu-img: Avoid qerror_report_err() outside QMP command handlers
  qemu-char: Avoid qerror_report_err() outside QMP command handlers

 arch_init.c               |  3 +--
 block/sheepdog.c          | 39 +++++++++++++--------------------------
 blockdev.c                | 12 ++++--------
 hw/arm/exynos4210.c       |  4 ++--
 hw/arm/highbank.c         |  4 ++--
 hw/arm/integratorcp.c     |  4 ++--
 hw/arm/realview.c         |  6 +++---
 hw/arm/versatilepb.c      |  4 ++--
 hw/arm/vexpress.c         |  2 +-
 hw/arm/xilinx_zynq.c      |  8 ++++----
 hw/block/virtio-blk.c     |  3 +--
 hw/char/serial.c          |  6 ++----
 hw/i386/kvm/pci-assign.c  | 14 +++++---------
 hw/i386/pc.c              |  5 ++---
 hw/i386/smbios.c          | 14 +++++++-------
 hw/ide/qdev.c             |  3 +--
 hw/pci/pci-hotplug-old.c  |  3 +--
 hw/pci/pci.c              |  3 +--
 hw/scsi/vhost-scsi.c      |  2 +-
 hw/usb/dev-network.c      |  3 +--
 hw/usb/host-libusb.c      |  3 +--
 hw/usb/redirect.c         |  3 +--
 include/monitor/monitor.h |  3 +--
 include/qapi/error.h      |  5 +++++
 monitor.c                 | 18 ++----------------
 net/net.c                 |  9 +++------
 net/socket.c              |  4 +++-
 net/tap.c                 | 11 ++++++++---
 numa.c                    |  8 +++-----
 qemu-char.c               |  6 ++----
 qemu-img.c                |  9 +++------
 qemu-io.c                 |  3 +--
 qemu-nbd.c                | 12 ++++--------
 qom/cpu.c                 |  3 +--
 target-i386/cpu.c         |  3 +--
 target-sparc/cpu.c        |  3 +--
 tpm.c                     |  6 ++----
 util/error.c              | 14 ++++++++++----
 util/qemu-config.c        |  9 +++------
 vl.c                      | 21 ++++++++-------------
 40 files changed, 119 insertions(+), 176 deletions(-)

-- 
1.9.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err()
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 15:26   ` Eric Blake
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 02/10] error: Use error_report_err() where appropriate Markus Armbruster
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

I've typed error_report("%s", error_get_pretty(ERR)) too many times
already, and I've fixed too many instances of qerror_report_err(ERR)
to error_report("%s", error_get_pretty(ERR)) as well.  Capture the
pattern in a convenience function.

Since it's almost invariably followed by error_free(), stuff that into
the convenience function as well.

The next patch will put it to use.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qapi/error.h | 5 +++++
 util/error.c         | 6 ++++++
 2 files changed, 11 insertions(+)

diff --git a/include/qapi/error.h b/include/qapi/error.h
index d712089..f44c451 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -83,6 +83,11 @@ Error *error_copy(const Error *err);
 const char *error_get_pretty(Error *err);
 
 /**
+ * Convenience function to error_report() and free an error object.
+ */
+void error_report_err(Error *);
+
+/**
  * Propagate an error to an indirect pointer to an error.  This function will
  * always transfer ownership of the error reference and handles the case where
  * dst_err is NULL correctly.  Errors after the first are discarded.
diff --git a/util/error.c b/util/error.c
index 2ace0d8..1ff6ae5 100644
--- a/util/error.c
+++ b/util/error.c
@@ -152,6 +152,12 @@ const char *error_get_pretty(Error *err)
     return err->msg;
 }
 
+void error_report_err(Error *err)
+{
+    error_report("%s", error_get_pretty(err));
+    error_free(err);
+}
+
 void error_free(Error *err)
 {
     if (err) {
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 02/10] error: Use error_report_err() where appropriate
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err() Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 15:29   ` Eric Blake
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 03/10] monitor: Clean up around monitor_handle_fd_param() Markus Armbruster
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

Coccinelle semantic patch:

    @@
    expression E;
    @@
    -    error_report("%s", error_get_pretty(E));
    -    error_free(E);
    +    error_report_err(E);
    @@
    expression E, S;
    @@
    -    error_report("%s", error_get_pretty(E));
    +    error_report_err(E);
    (
         exit(S);
    |
         abort();
    )

Trivial manual touch-ups in block/sheepdog.c.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 arch_init.c              |  3 +--
 block/sheepdog.c         | 39 +++++++++++++--------------------------
 blockdev.c               | 12 ++++--------
 hw/arm/exynos4210.c      |  4 ++--
 hw/arm/highbank.c        |  4 ++--
 hw/arm/integratorcp.c    |  4 ++--
 hw/arm/realview.c        |  6 +++---
 hw/arm/versatilepb.c     |  4 ++--
 hw/arm/vexpress.c        |  2 +-
 hw/arm/xilinx_zynq.c     |  8 ++++----
 hw/block/virtio-blk.c    |  3 +--
 hw/char/serial.c         |  6 ++----
 hw/i386/kvm/pci-assign.c |  9 +++------
 hw/i386/pc.c             |  5 ++---
 hw/i386/smbios.c         | 14 +++++++-------
 hw/ide/qdev.c            |  3 +--
 hw/pci/pci-hotplug-old.c |  3 +--
 hw/pci/pci.c             |  3 +--
 hw/usb/dev-network.c     |  3 +--
 hw/usb/host-libusb.c     |  3 +--
 hw/usb/redirect.c        |  3 +--
 qemu-char.c              |  3 +--
 qemu-img.c               |  6 ++----
 qemu-io.c                |  3 +--
 qemu-nbd.c               | 12 ++++--------
 qom/cpu.c                |  3 +--
 target-i386/cpu.c        |  3 +--
 target-sparc/cpu.c       |  3 +--
 util/error.c             |  8 ++++----
 util/qemu-config.c       |  9 +++------
 vl.c                     | 15 ++++++---------
 31 files changed, 79 insertions(+), 127 deletions(-)

diff --git a/arch_init.c b/arch_init.c
index 89c8fa4..8414726 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -1093,8 +1093,7 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id)
 
                             ret = qemu_ram_resize(block->offset, length, &local_err);
                             if (local_err) {
-                                error_report("%s", error_get_pretty(local_err));
-                                error_free(local_err);
+                                error_report_err(local_err);
                             }
                         }
                         break;
diff --git a/block/sheepdog.c b/block/sheepdog.c
index be3176f..6a4a3bd 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -726,8 +726,7 @@ static coroutine_fn void reconnect_to_sdog(void *opaque)
         s->fd = get_sheep_fd(s, &local_err);
         if (s->fd < 0) {
             DPRINTF("Wait for connection to be established\n");
-            error_report("%s", error_get_pretty(local_err));
-            error_free(local_err);
+            error_report_err(local_err);
             co_aio_sleep_ns(bdrv_get_aio_context(s->bs), QEMU_CLOCK_REALTIME,
                             1000000000ULL);
         }
@@ -1283,8 +1282,7 @@ static int reload_inode(BDRVSheepdogState *s, uint32_t snapid, const char *tag)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         return -EIO;
     }
 
@@ -1292,8 +1290,7 @@ static int reload_inode(BDRVSheepdogState *s, uint32_t snapid, const char *tag)
 
     ret = find_vdi_name(s, s->name, snapid, tag, &vid, false, &local_err);
     if (ret) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         goto out;
     }
 
@@ -1785,8 +1782,7 @@ static void sd_close(BlockDriverState *bs)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         return;
     }
 
@@ -1838,8 +1834,7 @@ static int sd_truncate(BlockDriverState *bs, int64_t offset)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         return fd;
     }
 
@@ -1912,8 +1907,7 @@ static bool sd_delete(BDRVSheepdogState *s)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         return false;
     }
 
@@ -1960,8 +1954,7 @@ static int sd_create_branch(BDRVSheepdogState *s)
     deleted = sd_delete(s);
     ret = do_sd_create(s, &vid, !deleted, &local_err);
     if (ret) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         goto out;
     }
 
@@ -1969,8 +1962,7 @@ static int sd_create_branch(BDRVSheepdogState *s)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         ret = fd;
         goto out;
     }
@@ -2218,8 +2210,7 @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
     /* refresh inode. */
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         ret = fd;
         goto cleanup;
     }
@@ -2234,8 +2225,7 @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
 
     ret = do_sd_create(s, &new_vid, 1, &local_err);
     if (ret < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         error_report("failed to create inode for snapshot. %s",
                      strerror(errno));
         goto cleanup;
@@ -2336,8 +2326,7 @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         ret = fd;
         goto out;
     }
@@ -2366,8 +2355,7 @@ static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         ret = fd;
         goto out;
     }
@@ -2429,8 +2417,7 @@ static int do_load_save_vmstate(BDRVSheepdogState *s, uint8_t *data,
 
     fd = connect_to_sdog(s, &local_err);
     if (fd < 0) {
-        error_report("%s", error_get_pretty(local_err));;
-        error_free(local_err);
+        error_report_err(local_err);
         return fd;
     }
 
diff --git a/blockdev.c b/blockdev.c
index 7d34960..5437955 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -728,8 +728,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
         qemu_opt_rename(all_opts, opt_renames[i].from, opt_renames[i].to,
                         &local_err);
         if (local_err) {
-            error_report("%s", error_get_pretty(local_err));
-            error_free(local_err);
+            error_report_err(local_err);
             return NULL;
         }
     }
@@ -767,8 +766,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
                                    &error_abort);
     qemu_opts_absorb_qdict(legacy_opts, bs_opts, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         goto fail;
     }
 
@@ -983,8 +981,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
     bs_opts = NULL;
     if (!blk) {
         if (local_err) {
-            error_report("%s", error_get_pretty(local_err));
-            error_free(local_err);
+            error_report_err(local_err);
         }
         goto fail;
     } else {
@@ -1978,8 +1975,7 @@ int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
     aio_context_acquire(aio_context);
 
     if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         aio_context_release(aio_context);
         return -1;
     }
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index 97dafca..c55fab8 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -158,7 +158,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
         if (object_property_find(cpuobj, "has_el3", NULL)) {
             object_property_set_bool(cpuobj, false, "has_el3", &err);
             if (err) {
-                error_report("%s", error_get_pretty(err));
+                error_report_err(err);
                 exit(1);
             }
         }
@@ -168,7 +168,7 @@ Exynos4210State *exynos4210_init(MemoryRegion *system_mem,
                                 "reset-cbar", &error_abort);
         object_property_set_bool(cpuobj, true, "realized", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
     }
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index f67570a..a92cdc3 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -248,7 +248,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
         if (object_property_find(cpuobj, "has_el3", NULL)) {
             object_property_set_bool(cpuobj, false, "has_el3", &err);
             if (err) {
-                error_report("%s", error_get_pretty(err));
+                error_report_err(err);
                 exit(1);
             }
         }
@@ -259,7 +259,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
         }
         object_property_set_bool(cpuobj, true, "realized", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
         cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ);
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 8c48b68..949ae1e 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -500,14 +500,14 @@ static void integratorcp_init(MachineState *machine)
     if (object_property_find(cpuobj, "has_el3", NULL)) {
         object_property_set_bool(cpuobj, false, "has_el3", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
     }
 
     object_property_set_bool(cpuobj, true, "realized", &err);
     if (err) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         exit(1);
     }
 
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 50cb93d..ef2788d 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -108,7 +108,7 @@ static void realview_init(MachineState *machine,
         if (object_property_find(cpuobj, "has_el3", NULL)) {
             object_property_set_bool(cpuobj, false, "has_el3", &err);
             if (err) {
-                error_report("%s", error_get_pretty(err));
+                error_report_err(err);
                 exit(1);
             }
         }
@@ -116,14 +116,14 @@ static void realview_init(MachineState *machine,
         if (is_pb && is_mpcore) {
             object_property_set_int(cpuobj, periphbase, "reset-cbar", &err);
             if (err) {
-                error_report("%s", error_get_pretty(err));
+                error_report_err(err);
                 exit(1);
             }
         }
 
         object_property_set_bool(cpuobj, true, "realized", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
 
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index b1dae77..624fdb0 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -213,14 +213,14 @@ static void versatile_init(MachineState *machine, int board_id)
     if (object_property_find(cpuobj, "has_el3", NULL)) {
         object_property_set_bool(cpuobj, false, "has_el3", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
     }
 
     object_property_set_bool(cpuobj, true, "realized", &err);
     if (err) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         exit(1);
     }
 
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 84415c8..5933454 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -223,7 +223,7 @@ static void init_cpus(const char *cpu_model, const char *privdev,
         }
         object_property_set_bool(cpuobj, true, "realized", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
     }
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 06e6e24..5c37521 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -133,25 +133,25 @@ static void zynq_init(MachineState *machine)
     if (object_property_find(OBJECT(cpu), "has_el3", NULL)) {
         object_property_set_bool(OBJECT(cpu), false, "has_el3", &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
+            error_report_err(err);
             exit(1);
         }
     }
 
     object_property_set_int(OBJECT(cpu), ZYNQ_BOARD_MIDR, "midr", &err);
     if (err) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         exit(1);
     }
 
     object_property_set_int(OBJECT(cpu), MPCORE_PERIPHBASE, "reset-cbar", &err);
     if (err) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         exit(1);
     }
     object_property_set_bool(OBJECT(cpu), true, "realized", &err);
     if (err) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         exit(1);
     }
 
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
index 1a8a176..cb71772 100644
--- a/hw/block/virtio-blk.c
+++ b/hw/block/virtio-blk.c
@@ -858,8 +858,7 @@ static void virtio_blk_migration_state_changed(Notifier *notifier, void *data)
         virtio_blk_data_plane_create(VIRTIO_DEVICE(s), &s->conf,
                                      &s->dataplane, &err);
         if (err != NULL) {
-            error_report("%s", error_get_pretty(err));
-            error_free(err);
+            error_report_err(err);
         }
     }
 }
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 0491897..55011cf 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -906,8 +906,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     s->chr = chr;
     serial_realize_core(s, &err);
     if (err != NULL) {
-        error_report("%s", error_get_pretty(err));
-        error_free(err);
+        error_report_err(err);
         exit(1);
     }
 
@@ -970,8 +969,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
 
     serial_realize_core(s, &err);
     if (err != NULL) {
-        error_report("%s", error_get_pretty(err));
-        error_free(err);
+        error_report_err(err);
         exit(1);
     }
     vmstate_register(NULL, base, &vmstate_serial, s);
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index bb206da..29ce2c4 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -953,8 +953,7 @@ static void assigned_dev_update_irq_routing(PCIDevice *dev)
 
     r = assign_intx(assigned_dev, &err);
     if (r < 0) {
-        error_report("%s", error_get_pretty(err));
-        error_free(err);
+        error_report_err(err);
         err = NULL;
         qdev_unplug(&dev->qdev, &err);
         assert(!err);
@@ -1010,8 +1009,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
 
         assign_intx(assigned_dev, &local_err);
         if (local_err) {
-            error_report("%s", error_get_pretty(local_err));
-            error_free(local_err);
+            error_report_err(local_err);
         }
     }
 }
@@ -1158,8 +1156,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
 
         assign_intx(assigned_dev, &local_err);
         if (local_err) {
-            error_report("%s", error_get_pretty(local_err));
-            error_free(local_err);
+            error_report_err(local_err);
         }
     }
 }
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index c7af6aa..05008cb 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -414,7 +414,7 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
 
     set_boot_dev(s, boot_device, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
+        error_report_err(local_err);
         exit(1);
     }
 
@@ -1040,8 +1040,7 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
         cpu = pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i),
                          icc_bridge, &error);
         if (error) {
-            error_report("%s", error_get_pretty(error));
-            error_free(error);
+            error_report_err(error);
             exit(1);
         }
     }
diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c
index 12d2137..f2e9ab6 100644
--- a/hw/i386/smbios.c
+++ b/hw/i386/smbios.c
@@ -908,7 +908,7 @@ void smbios_entry_add(QemuOpts *opts)
 
         qemu_opts_validate(opts, qemu_smbios_file_opts, &local_err);
         if (local_err) {
-            error_report("%s", error_get_pretty(local_err));
+            error_report_err(local_err);
             exit(1);
         }
 
@@ -994,7 +994,7 @@ void smbios_entry_add(QemuOpts *opts)
         case 0:
             qemu_opts_validate(opts, qemu_smbios_type0_opts, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             save_opt(&type0.vendor, opts, "vendor");
@@ -1014,7 +1014,7 @@ void smbios_entry_add(QemuOpts *opts)
         case 1:
             qemu_opts_validate(opts, qemu_smbios_type1_opts, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             save_opt(&type1.manufacturer, opts, "manufacturer");
@@ -1036,7 +1036,7 @@ void smbios_entry_add(QemuOpts *opts)
         case 2:
             qemu_opts_validate(opts, qemu_smbios_type2_opts, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             save_opt(&type2.manufacturer, opts, "manufacturer");
@@ -1049,7 +1049,7 @@ void smbios_entry_add(QemuOpts *opts)
         case 3:
             qemu_opts_validate(opts, qemu_smbios_type3_opts, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             save_opt(&type3.manufacturer, opts, "manufacturer");
@@ -1061,7 +1061,7 @@ void smbios_entry_add(QemuOpts *opts)
         case 4:
             qemu_opts_validate(opts, qemu_smbios_type4_opts, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             save_opt(&type4.sock_pfx, opts, "sock_pfx");
@@ -1074,7 +1074,7 @@ void smbios_entry_add(QemuOpts *opts)
         case 17:
             qemu_opts_validate(opts, qemu_smbios_type17_opts, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             save_opt(&type17.loc_pfx, opts, "loc_pfx");
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 1ebb58d..b4103fa 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -172,8 +172,7 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
     if (kind != IDE_CD) {
         blkconf_geometry(&dev->conf, &dev->chs_trans, 65536, 16, 255, &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
-            error_free(err);
+            error_report_err(err);
             return -1;
         }
     }
diff --git a/hw/pci/pci-hotplug-old.c b/hw/pci/pci-hotplug-old.c
index 0c09c72..d07db25 100644
--- a/hw/pci/pci-hotplug-old.c
+++ b/hw/pci/pci-hotplug-old.c
@@ -132,8 +132,7 @@ static int scsi_hot_add(Monitor *mon, DeviceState *adapter,
                                         dinfo->unit, false, -1, NULL,
                                         &local_err);
     if (!scsidev) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         return -1;
     }
     dinfo->unit = scsidev->id;
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index d508930..31b222d 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2038,8 +2038,7 @@ int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
     ret = pci_add_capability2(pdev, cap_id, offset, size, &local_err);
     if (local_err) {
         assert(ret < 0);
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
     } else {
         /* success implies a positive offset in config space */
         assert(ret > 0);
diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index 5b95d5c..c49fde8 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -1399,8 +1399,7 @@ static USBDevice *usb_net_init(USBBus *bus, const char *cmdline)
 
     idx = net_client_init(opts, 0, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         return NULL;
     }
 
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index cff4f7c..38f7c72 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -878,8 +878,7 @@ static int usb_host_open(USBHostDevice *s, libusb_device *dev)
 
     usb_device_attach(udev, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         goto fail;
     }
 
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index 962d3f5..2416de8 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -1273,8 +1273,7 @@ static void usbredir_do_attach(void *opaque)
 
     usb_device_attach(&dev->dev, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         WARNING("rejecting device due to speed mismatch\n");
         usbredir_reject_device(dev);
     }
diff --git a/qemu-char.c b/qemu-char.c
index 98d4342..f901ed1 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -3753,8 +3753,7 @@ CharDriverState *qemu_chr_new(const char *label, const char *filename, void (*in
 
     chr = qemu_chr_new_from_opts(opts, init, &err);
     if (err) {
-        error_report("%s", error_get_pretty(err));
-        error_free(err);
+        error_report_err(err);
     }
     if (chr && qemu_opt_get_bool(opts, "mux", 0)) {
         qemu_chr_fe_claim_no_fail(chr);
diff --git a/qemu-img.c b/qemu-img.c
index e148af8..97d04bd 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -2004,8 +2004,7 @@ static ImageInfoList *collect_image_info_list(const char *filename,
 
         bdrv_query_image_info(bs, &info, &err);
         if (err) {
-            error_report("%s", error_get_pretty(err));
-            error_free(err);
+            error_report_err(err);
             blk_unref(blk);
             goto err;
         }
@@ -3053,8 +3052,7 @@ int main(int argc, char **argv)
     qemu_init_exec_dir(argv[0]);
 
     if (qemu_init_main_loop(&local_error)) {
-        error_report("%s", error_get_pretty(local_error));
-        error_free(local_error);
+        error_report_err(local_error);
         exit(EXIT_FAILURE);
     }
 
diff --git a/qemu-io.c b/qemu-io.c
index 91a445a..d7a32e4 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -464,8 +464,7 @@ int main(int argc, char **argv)
     }
 
     if (qemu_init_main_loop(&local_error)) {
-        error_report("%s", error_get_pretty(local_error));
-        error_free(local_error);
+        error_report_err(local_error);
         exit(1);
     }
 
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 4d8df08..2ba2d4c 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -228,8 +228,7 @@ static int tcp_socket_incoming(const char *address, uint16_t port)
     int fd = inet_listen(address_and_port, NULL, 0, SOCK_STREAM, 0, &local_err);
 
     if (local_err != NULL) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
     }
     return fd;
 }
@@ -240,8 +239,7 @@ static int unix_socket_incoming(const char *path)
     int fd = unix_listen(path, NULL, 0, &local_err);
 
     if (local_err != NULL) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
     }
     return fd;
 }
@@ -252,8 +250,7 @@ static int unix_socket_outgoing(const char *path)
     int fd = unix_connect(path, &local_err);
 
     if (local_err != NULL) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
     }
     return fd;
 }
@@ -681,8 +678,7 @@ int main(int argc, char **argv)
     }
 
     if (qemu_init_main_loop(&local_err)) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         exit(EXIT_FAILURE);
     }
     bdrv_init();
diff --git a/qom/cpu.c b/qom/cpu.c
index 9c68fa4..970377e 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -71,8 +71,7 @@ CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
 
 out:
     if (err != NULL) {
-        error_report("%s", error_get_pretty(err));
-        error_free(err);
+        error_report_err(err);
         object_unref(OBJECT(cpu));
         return NULL;
     }
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 3a9b32e..d543e2b 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2163,8 +2163,7 @@ X86CPU *cpu_x86_init(const char *cpu_model)
 
 out:
     if (error) {
-        error_report("%s", error_get_pretty(error));
-        error_free(error);
+        error_report_err(error);
         if (cpu != NULL) {
             object_unref(OBJECT(cpu));
             cpu = NULL;
diff --git a/target-sparc/cpu.c b/target-sparc/cpu.c
index aa7626c..a952097 100644
--- a/target-sparc/cpu.c
+++ b/target-sparc/cpu.c
@@ -111,8 +111,7 @@ static int cpu_sparc_register(SPARCCPU *cpu, const char *cpu_model)
     cc->parse_features(CPU(cpu), featurestr, &err);
     g_free(s);
     if (err) {
-        error_report("%s", error_get_pretty(err));
-        error_free(err);
+        error_report_err(err);
         return -1;
     }
 
diff --git a/util/error.c b/util/error.c
index 1ff6ae5..14f4351 100644
--- a/util/error.c
+++ b/util/error.c
@@ -41,7 +41,7 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
     err->err_class = err_class;
 
     if (errp == &error_abort) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         abort();
     }
 
@@ -77,7 +77,7 @@ void error_set_errno(Error **errp, int os_errno, ErrorClass err_class,
     err->err_class = err_class;
 
     if (errp == &error_abort) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         abort();
     }
 
@@ -122,7 +122,7 @@ void error_set_win32(Error **errp, int win32_err, ErrorClass err_class,
     err->err_class = err_class;
 
     if (errp == &error_abort) {
-        error_report("%s", error_get_pretty(err));
+        error_report_err(err);
         abort();
     }
 
@@ -169,7 +169,7 @@ void error_free(Error *err)
 void error_propagate(Error **dst_errp, Error *local_err)
 {
     if (local_err && dst_errp == &error_abort) {
-        error_report("%s", error_get_pretty(local_err));
+        error_report_err(local_err);
         abort();
     } else if (dst_errp && !*dst_errp) {
         *dst_errp = local_err;
diff --git a/util/qemu-config.c b/util/qemu-config.c
index ba375c0..b13efe2 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -32,8 +32,7 @@ QemuOptsList *qemu_find_opts(const char *group)
 
     ret = find_list(vm_config_groups, group, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
     }
 
     return ret;
@@ -314,8 +313,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
             /* group with id */
             list = find_list(lists, group, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
-                error_free(local_err);
+                error_report_err(local_err);
                 goto out;
             }
             opts = qemu_opts_create(list, id, 1, NULL);
@@ -325,8 +323,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
             /* group without id */
             list = find_list(lists, group, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
-                error_free(local_err);
+                error_report_err(local_err);
                 goto out;
             }
             opts = qemu_opts_create(list, NULL, 0, &error_abort);
diff --git a/vl.c b/vl.c
index 8c8f142..1e9aff6 100644
--- a/vl.c
+++ b/vl.c
@@ -2137,8 +2137,7 @@ static int chardev_init_func(QemuOpts *opts, void *opaque)
 
     qemu_chr_new_from_opts(opts, NULL, &local_err);
     if (local_err) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         return -1;
     }
     return 0;
@@ -2218,8 +2217,7 @@ static void monitor_parse(const char *optarg, const char *mode, bool pretty)
 
     opts = qemu_opts_create(qemu_find_opts("mon"), label, 1, &local_err);
     if (!opts) {
-        error_report("%s", error_get_pretty(local_err));
-        error_free(local_err);
+        error_report_err(local_err);
         exit(1);
     }
     qemu_opt_set(opts, "mode", mode);
@@ -3766,7 +3764,7 @@ int main(int argc, char **argv, char **envp)
     os_daemonize();
 
     if (qemu_init_main_loop(&main_loop_err)) {
-        error_report("%s", error_get_pretty(main_loop_err));
+        error_report_err(main_loop_err);
         exit(1);
     }
 
@@ -4033,8 +4031,7 @@ int main(int argc, char **argv, char **envp)
         Error *local_err = NULL;
         qtest_init(qtest_chrdev, qtest_log, &local_err);
         if (local_err) {
-            error_report("%s", error_get_pretty(local_err));
-            error_free(local_err);
+            error_report_err(local_err);
             exit(1);
         }
     }
@@ -4056,7 +4053,7 @@ int main(int argc, char **argv, char **envp)
         if (order) {
             validate_bootdevices(order, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             boot_order = order;
@@ -4066,7 +4063,7 @@ int main(int argc, char **argv, char **envp)
         if (once) {
             validate_bootdevices(once, &local_err);
             if (local_err) {
-                error_report("%s", error_get_pretty(local_err));
+                error_report_err(local_err);
                 exit(1);
             }
             normal_boot_order = g_strdup(boot_order);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 03/10] monitor: Clean up around monitor_handle_fd_param()
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err() Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 02/10] error: Use error_report_err() where appropriate Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 04/10] monitor: Avoid qerror_report_err() outside QMP command handlers Markus Armbruster
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

monitor_handle_fd_param() is a wrapper around
monitor_handle_fd_param2() that feeds errors to qerror_report_err()
instead of returning them.  qerror_report_err() is inappropriate in
many contexts.  monitor_handle_fd_param() looks simpler than
monitor_handle_fd_param2(), which tempts use.  Remove the temptation:
drop the wrapper and open-code the (trivial) error handling instead.

Replace the open-coded qerror_report_err() by error_report_err() in
places that already use error_report().  Turns out that's everywhere.

While there, rename monitor_handle_fd_param2() to monitor_fd_param().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 hw/i386/kvm/pci-assign.c  |  5 ++---
 hw/scsi/vhost-scsi.c      |  2 +-
 include/monitor/monitor.h |  3 +--
 monitor.c                 | 15 +--------------
 net/socket.c              |  4 +++-
 net/tap.c                 | 11 ++++++++---
 6 files changed, 16 insertions(+), 24 deletions(-)

diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
index 29ce2c4..bd92c69 100644
--- a/hw/i386/kvm/pci-assign.c
+++ b/hw/i386/kvm/pci-assign.c
@@ -552,9 +552,8 @@ static void get_real_device(AssignedDevice *pci_dev, Error **errp)
     snprintf(name, sizeof(name), "%sconfig", dir);
 
     if (pci_dev->configfd_name && *pci_dev->configfd_name) {
-        dev->config_fd = monitor_handle_fd_param2(cur_mon,
-                                                  pci_dev->configfd_name,
-                                                  &local_err);
+        dev->config_fd = monitor_fd_param(cur_mon, pci_dev->configfd_name,
+                                          &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             return;
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index 567f350..484f4a8 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -214,7 +214,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
     }
 
     if (vs->conf.vhostfd) {
-        vhostfd = monitor_handle_fd_param2(cur_mon, vs->conf.vhostfd, &err);
+        vhostfd = monitor_fd_param(cur_mon, vs->conf.vhostfd, &err);
         if (vhostfd == -1) {
             error_setg(errp, "vhost-scsi: unable to parse vhostfd: %s",
                        error_get_pretty(err));
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index 47606d0..1c06bed 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -34,8 +34,7 @@ int monitor_read_block_device_key(Monitor *mon, const char *device,
                                   void *opaque);
 
 int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp);
-int monitor_handle_fd_param(Monitor *mon, const char *fdname);
-int monitor_handle_fd_param2(Monitor *mon, const char *fdname, Error **errp);
+int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp);
 
 void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
     GCC_FMT_ATTR(2, 0);
diff --git a/monitor.c b/monitor.c
index c3cc060..ac2a4ab 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2570,20 +2570,7 @@ void monitor_fdset_dup_fd_remove(int dup_fd)
     monitor_fdset_dup_fd_find_remove(dup_fd, true);
 }
 
-int monitor_handle_fd_param(Monitor *mon, const char *fdname)
-{
-    int fd;
-    Error *local_err = NULL;
-
-    fd = monitor_handle_fd_param2(mon, fdname, &local_err);
-    if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
-    }
-    return fd;
-}
-
-int monitor_handle_fd_param2(Monitor *mon, const char *fdname, Error **errp)
+int monitor_fd_param(Monitor *mon, const char *fdname, Error **errp)
 {
     int fd;
     Error *local_err = NULL;
diff --git a/net/socket.c b/net/socket.c
index 68a93cd..c30e03f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -695,6 +695,7 @@ static int net_socket_udp_init(NetClientState *peer,
 int net_init_socket(const NetClientOptions *opts, const char *name,
                     NetClientState *peer)
 {
+    Error *err = NULL;
     const NetdevSocketOptions *sock;
 
     assert(opts->kind == NET_CLIENT_OPTIONS_KIND_SOCKET);
@@ -715,8 +716,9 @@ int net_init_socket(const NetClientOptions *opts, const char *name,
     if (sock->has_fd) {
         int fd;
 
-        fd = monitor_handle_fd_param(cur_mon, sock->fd);
+        fd = monitor_fd_param(cur_mon, sock->fd, &err);
         if (fd == -1) {
+            error_report_err(err);
             return -1;
         }
         qemu_set_nonblock(fd);
diff --git a/net/tap.c b/net/tap.c
index 1fe0edf..968df46 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -605,6 +605,7 @@ static int net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
                             const char *downscript, const char *vhostfdname,
                             int vnet_hdr, int fd)
 {
+    Error *err = NULL;
     TAPState *s;
     int vhostfd;
 
@@ -643,8 +644,9 @@ static int net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
         options.force = tap->has_vhostforce && tap->vhostforce;
 
         if (tap->has_vhostfd || tap->has_vhostfds) {
-            vhostfd = monitor_handle_fd_param(cur_mon, vhostfdname);
+            vhostfd = monitor_fd_param(cur_mon, vhostfdname, &err);
             if (vhostfd == -1) {
+                error_report_err(err);
                 return -1;
             }
         } else {
@@ -704,6 +706,7 @@ int net_init_tap(const NetClientOptions *opts, const char *name,
     /* for the no-fd, no-helper case */
     const char *script = NULL; /* suppress wrong "uninit'd use" gcc warning */
     const char *downscript = NULL;
+    Error *err = NULL;
     const char *vhostfdname;
     char ifname[128];
 
@@ -729,8 +732,9 @@ int net_init_tap(const NetClientOptions *opts, const char *name,
             return -1;
         }
 
-        fd = monitor_handle_fd_param(cur_mon, tap->fd);
+        fd = monitor_fd_param(cur_mon, tap->fd, &err);
         if (fd == -1) {
+            error_report_err(err);
             return -1;
         }
 
@@ -768,8 +772,9 @@ int net_init_tap(const NetClientOptions *opts, const char *name,
         }
 
         for (i = 0; i < nfds; i++) {
-            fd = monitor_handle_fd_param(cur_mon, fds[i]);
+            fd = monitor_fd_param(cur_mon, fds[i], &err);
             if (fd == -1) {
+                error_report_err(err);
                 return -1;
             }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 04/10] monitor: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (2 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 03/10] monitor: Clean up around monitor_handle_fd_param() Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 05/10] net: " Markus Armbruster
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err() in HMP command handler
hmp_trace_event().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 monitor.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/monitor.c b/monitor.c
index ac2a4ab..b109188 100644
--- a/monitor.c
+++ b/monitor.c
@@ -889,8 +889,7 @@ static void do_trace_event_set_state(Monitor *mon, const QDict *qdict)
 
     qmp_trace_event_set_state(tp_name, new_state, true, true, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
     }
 }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 05/10] net: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (3 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 04/10] monitor: Avoid qerror_report_err() outside QMP command handlers Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 06/10] numa: " Markus Armbruster
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err() in HMP command handler
hmp_host_net_add() and initial startup helpers net_init_client(),
net_init_netdev().  Keep it in QMP command handler qmp_netdev_add().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 net/net.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/net/net.c b/net/net.c
index 74e651e..ec6e581 100644
--- a/net/net.c
+++ b/net/net.c
@@ -974,8 +974,7 @@ void net_host_device_add(Monitor *mon, const QDict *qdict)
 
     net_client_init(opts, 0, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         monitor_printf(mon, "adding host network device %s failed\n", device);
     }
 }
@@ -1270,8 +1269,7 @@ static int net_init_client(QemuOpts *opts, void *dummy)
 
     net_client_init(opts, 0, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return -1;
     }
 
@@ -1285,8 +1283,7 @@ static int net_init_netdev(QemuOpts *opts, void *dummy)
 
     ret = net_client_init(opts, 1, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return -1;
     }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 06/10] numa: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (4 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 05/10] net: " Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 07/10] tpm: " Markus Armbruster
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err() in initial startup helper
numa_init_func() and board setup helper
memory_region_allocate_system_memory().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 numa.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/numa.c b/numa.c
index afd2866..f8fc377 100644
--- a/numa.c
+++ b/numa.c
@@ -146,8 +146,7 @@ int numa_init_func(QemuOpts *opts, void *opaque)
     return 0;
 
 error:
-    qerror_report_err(err);
-    error_free(err);
+    error_report_err(err);
 
     if (object) {
         QapiDeallocVisitor *dv = qapi_dealloc_visitor_new();
@@ -262,8 +261,7 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
          * regular RAM allocation.
          */
         if (err) {
-            qerror_report_err(err);
-            error_free(err);
+            error_report_err(err);
             memory_region_init_ram(mr, owner, name, ram_size, &error_abort);
         }
 #else
@@ -298,7 +296,7 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
         }
         MemoryRegion *seg = host_memory_backend_get_memory(backend, &local_err);
         if (local_err) {
-            qerror_report_err(local_err);
+            error_report_err(local_err);
             exit(1);
         }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 07/10] tpm: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (5 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 06/10] numa: " Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 08/10] vl: " Markus Armbruster
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err() in initial startup helper
configure_tpm().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tpm.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/tpm.c b/tpm.c
index c371023..4ffd9b9 100644
--- a/tpm.c
+++ b/tpm.c
@@ -162,8 +162,7 @@ static int configure_tpm(QemuOpts *opts)
     /* validate backend specific opts */
     qemu_opts_validate(opts, be->opts, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return 1;
     }
 
@@ -174,8 +173,7 @@ static int configure_tpm(QemuOpts *opts)
 
     tpm_backend_open(drv, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return 1;
     }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 08/10] vl: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (6 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 07/10] tpm: " Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 09/10] qemu-img: " Markus Armbruster
  2015-02-12 13:34 ` [Qemu-devel] [PATCH v2 10/10] qemu-char: " Markus Armbruster
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err() in initial startup helpers
machine_set_property() and object_create().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 vl.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/vl.c b/vl.c
index 1e9aff6..2a58c6b 100644
--- a/vl.c
+++ b/vl.c
@@ -2581,8 +2581,7 @@ static int machine_set_property(const char *name, const char *value,
     g_free(qom_name);
 
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return -1;
     }
 
@@ -2635,8 +2634,7 @@ out:
     g_free(type);
     g_free(dummy);
     if (err) {
-        qerror_report_err(err);
-        error_free(err);
+        error_report_err(err);
         return -1;
     }
     return 0;
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 09/10] qemu-img: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (7 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 08/10] vl: " Markus Armbruster
@ 2015-02-12 13:33 ` Markus Armbruster
  2015-02-12 13:34 ` [Qemu-devel] [PATCH v2 10/10] qemu-char: " Markus Armbruster
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:33 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 qemu-img.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/qemu-img.c b/qemu-img.c
index 97d04bd..25b1369 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -889,8 +889,7 @@ done:
     blk_unref(blk);
 
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return 1;
     }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v2 10/10] qemu-char: Avoid qerror_report_err() outside QMP command handlers
  2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
                   ` (8 preceding siblings ...)
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 09/10] qemu-img: " Markus Armbruster
@ 2015-02-12 13:34 ` Markus Armbruster
  9 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-12 13:34 UTC (permalink / raw)
  To: qemu-devel

qerror_report_err() is a transitional interface to help with
converting existing monitor commands to QMP.  It should not be used
elsewhere.  Replace by error_report_err() in legacy chardev parser
qemu_chr_parse_compat().  Legacy chardev syntax is not to be used in
QMP.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 qemu-char.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/qemu-char.c b/qemu-char.c
index f901ed1..8159462 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -3306,8 +3306,7 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename)
 
     opts = qemu_opts_create(qemu_find_opts("chardev"), label, 1, &local_err);
     if (local_err) {
-        qerror_report_err(local_err);
-        error_free(local_err);
+        error_report_err(local_err);
         return NULL;
     }
 
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err()
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err() Markus Armbruster
@ 2015-02-12 15:26   ` Eric Blake
  2015-02-13  8:08     ` Markus Armbruster
  0 siblings, 1 reply; 14+ messages in thread
From: Eric Blake @ 2015-02-12 15:26 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1791 bytes --]

On 02/12/2015 06:33 AM, Markus Armbruster wrote:
> I've typed error_report("%s", error_get_pretty(ERR)) too many times
> already, and I've fixed too many instances of qerror_report_err(ERR)
> to error_report("%s", error_get_pretty(ERR)) as well.  Capture the
> pattern in a convenience function.
> 
> Since it's almost invariably followed by error_free(), stuff that into
> the convenience function as well.
> 
> The next patch will put it to use.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  include/qapi/error.h | 5 +++++
>  util/error.c         | 6 ++++++
>  2 files changed, 11 insertions(+)

> +++ b/util/error.c
> @@ -152,6 +152,12 @@ const char *error_get_pretty(Error *err)
>      return err->msg;
>  }
>  
> +void error_report_err(Error *err)
> +{
> +    error_report("%s", error_get_pretty(err));
> +    error_free(err);

When I read v1, I wondered if it would make sense to allow:

Error *local_err = NULL;
error_report_err(local_err);

as a no-op, so that calling code can unconditionally use this function
rather than always burying it inside an 'if (problem)'.  But in
reviewing the rest of the patches, I wasn't sure it would save very many
lines, and it also seems like it would be a bit more confusing to see a
call to an error report function when there is no error to report.

So in the opposite direction of thought, I wonder if you should add:

assert(err);

and enforce that this function is only ever used on real error messages,
especially since error_get_pretty segfaults if called on no error.

But I can also live without the assert, so:

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v2 02/10] error: Use error_report_err() where appropriate
  2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 02/10] error: Use error_report_err() where appropriate Markus Armbruster
@ 2015-02-12 15:29   ` Eric Blake
  0 siblings, 0 replies; 14+ messages in thread
From: Eric Blake @ 2015-02-12 15:29 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 715 bytes --]

On 02/12/2015 06:33 AM, Markus Armbruster wrote:
> Coccinelle semantic patch:
> 
>     @@
>     expression E;
>     @@
>     -    error_report("%s", error_get_pretty(E));
>     -    error_free(E);
>     +    error_report_err(E);
>     @@
>     expression E, S;
>     @@
>     -    error_report("%s", error_get_pretty(E));
>     +    error_report_err(E);
>     (
>          exit(S);
>     |
>          abort();
>     )
> 
> Trivial manual touch-ups in block/sheepdog.c.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err()
  2015-02-12 15:26   ` Eric Blake
@ 2015-02-13  8:08     ` Markus Armbruster
  0 siblings, 0 replies; 14+ messages in thread
From: Markus Armbruster @ 2015-02-13  8:08 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> On 02/12/2015 06:33 AM, Markus Armbruster wrote:
>> I've typed error_report("%s", error_get_pretty(ERR)) too many times
>> already, and I've fixed too many instances of qerror_report_err(ERR)
>> to error_report("%s", error_get_pretty(ERR)) as well.  Capture the
>> pattern in a convenience function.
>> 
>> Since it's almost invariably followed by error_free(), stuff that into
>> the convenience function as well.
>> 
>> The next patch will put it to use.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  include/qapi/error.h | 5 +++++
>>  util/error.c         | 6 ++++++
>>  2 files changed, 11 insertions(+)
>
>> +++ b/util/error.c
>> @@ -152,6 +152,12 @@ const char *error_get_pretty(Error *err)
>>      return err->msg;
>>  }
>>  
>> +void error_report_err(Error *err)
>> +{
>> +    error_report("%s", error_get_pretty(err));
>> +    error_free(err);
>
> When I read v1, I wondered if it would make sense to allow:
>
> Error *local_err = NULL;
> error_report_err(local_err);
>
> as a no-op, so that calling code can unconditionally use this function
> rather than always burying it inside an 'if (problem)'.  But in
> reviewing the rest of the patches, I wasn't sure it would save very many
> lines, and it also seems like it would be a bit more confusing to see a
> call to an error report function when there is no error to report.

I like my cleanup functions to work unconditionally, like free() does.
But error_report_err() isn't just cleanup, it's called for its very
visible side effect.  Calling it unconditionally would be confusing
indeed.

> So in the opposite direction of thought, I wonder if you should add:
>
> assert(err);
>
> and enforce that this function is only ever used on real error messages,
> especially since error_get_pretty segfaults if called on no error.

I wouldn't mind, but I'm reluctant to respin just for that.

> But I can also live without the assert, so:
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2015-02-13  8:08 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-12 13:33 [Qemu-devel] [PATCH v2 00/10] Clean up around error_get_pretty(), qerror_report_err() Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 01/10] error: New convenience function error_report_err() Markus Armbruster
2015-02-12 15:26   ` Eric Blake
2015-02-13  8:08     ` Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 02/10] error: Use error_report_err() where appropriate Markus Armbruster
2015-02-12 15:29   ` Eric Blake
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 03/10] monitor: Clean up around monitor_handle_fd_param() Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 04/10] monitor: Avoid qerror_report_err() outside QMP command handlers Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 05/10] net: " Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 06/10] numa: " Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 07/10] tpm: " Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 08/10] vl: " Markus Armbruster
2015-02-12 13:33 ` [Qemu-devel] [PATCH v2 09/10] qemu-img: " Markus Armbruster
2015-02-12 13:34 ` [Qemu-devel] [PATCH v2 10/10] qemu-char: " 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).