From 129e4938baa4a0aea133d87b69d3ccdc2e228df3 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sun, 3 Apr 2016 21:21:37 +0100 Subject: [PATCH] Use 'error' function consistently throughout. Wherever we had code which did: if (something_bad) { perror (...); exit (EXIT_FAILURE); } replace this with use of the error(3) function: if (something_bad) error (EXIT_FAILURE, errno, ...); The error(3) function is supplied by glibc, or by gnulib on platforms which don't have it, and is much more flexible than perror(3). Since we already use error(3), there seems to be no downside to mandating it everywhere. Note there is one nasty catch with error(3): error (EXIT_SUCCESS, ...) does *not* exit! This is also the reason why error(3) cannot be marked as __attribute__((noreturn)). Because the examples can't use gnulib, I did not change them. To search for multiline patterns of the above form, pcregrep -M turns out to be very useful: pcregrep --buffer-size 10M -M '\bperror\b.*\n.*\bexit\b' `git ls-files` --- builder/index-validate.c | 7 +- cat/cat.c | 19 +- cat/filesystems.c | 67 +++---- cat/ls.c | 115 ++++-------- daemon/guestfsd.c | 10 +- daemon/ntfsclone.c | 8 +- daemon/proto.c | 25 +-- daemon/tar.c | 8 +- df/domains.c | 31 ++-- df/main.c | 49 ++--- diff/diff.c | 169 ++++++------------ edit/edit.c | 19 +- fish/config.c | 37 ++-- fish/events.c | 8 +- fish/fish.c | 73 +++----- fish/options.c | 31 ++-- fish/options.h | 6 +- fish/prep-boot.c | 26 ++- fish/prep-fs.c | 8 +- fish/prep-lv.c | 26 ++- fish/prep.c | 20 +-- fish/rc.c | 61 +++---- fish/tilde.c | 14 +- fish/windows.c | 19 +- format/format.c | 22 +-- fuse/guestmount.c | 19 +- fuse/guestunmount.c | 69 +++---- fuse/test-fuse.c | 32 ++-- fuse/test-guestmount-fd.c | 31 ++-- fuse/test-guestunmount-fd.c | 25 +-- inspector/inspector.c | 19 +- p2v/config.c | 7 +- p2v/conversion.c | 27 ++- p2v/gui.c | 61 +++---- p2v/kernel-cmdline.c | 13 +- p2v/kernel.c | 7 +- p2v/main.c | 79 +++----- p2v/ssh.c | 63 +++---- p2v/utils.c | 14 +- rescue/rescue.c | 25 +-- test-tool/test-tool.c | 14 +- tests/c-api/test-add-libvirt-dom.c | 8 +- tests/c-api/test-debug-to-file.c | 8 +- tests/c-api/test-user-cancel.c | 60 +++---- tests/c-api/tests-main.c | 32 ++-- tests/events/test-libvirt-auth-callbacks.c | 14 +- .../mountable/test-internal-parse-mountable.c | 12 +- tests/protocol/test-error-messages.c | 7 +- tests/qemu/qemu-boot.c | 7 +- tests/qemu/qemu-speed-test.c | 37 ++-- tests/regressions/rhbz1055452.c | 14 +- tests/regressions/rhbz790721.c | 7 +- tests/regressions/rhbz914931.c | 7 +- 53 files changed, 587 insertions(+), 1009 deletions(-) diff --git a/builder/index-validate.c b/builder/index-validate.c index 9bc2e7339..22e2ccd74 100644 --- a/builder/index-validate.c +++ b/builder/index-validate.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -108,10 +109,8 @@ main (int argc, char *argv[]) input = argv[optind++]; in = fopen (input, "r"); - if (in == NULL) { - perror (input); - exit (EXIT_FAILURE); - } + if (in == NULL) + error (EXIT_FAILURE, errno, "fopen: %s", input); ret = do_parse (&context, in); diff --git a/cat/cat.c b/cat/cat.c index bf8b371d1..c90fc06a0 100644 --- a/cat/cat.c +++ b/cat/cat.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -190,24 +191,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; diff --git a/cat/filesystems.c b/cat/filesystems.c index 3013115f5..6f083d313 100644 --- a/cat/filesystems.c +++ b/cat/filesystems.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -458,10 +459,8 @@ do_output_filesystems (void) guestfs_pop_error_handler (g); if (vfs_label == NULL) { vfs_label = strdup (""); - if (!vfs_label) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!vfs_label) + error (EXIT_FAILURE, errno, "strdup"); } } if ((columns & COLUMN_UUID)) { @@ -470,10 +469,8 @@ do_output_filesystems (void) guestfs_pop_error_handler (g); if (vfs_uuid == NULL) { vfs_uuid = strdup (""); - if (!vfs_uuid) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!vfs_uuid) + error (EXIT_FAILURE, errno, "strdup"); } } if ((columns & COLUMN_SIZE)) { @@ -518,10 +515,8 @@ do_output_lvs (void) } if ((columns & COLUMN_PARENTS)) { parent_name = strdup (lvs[i]); - if (parent_name == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (parent_name == NULL) + error (EXIT_FAILURE, errno, "strdup"); char *p = strrchr (parent_name, '/'); if (p) *p = '\0'; @@ -549,10 +544,8 @@ do_output_vgs (void) char uuid[33]; CLEANUP_FREE_STRING_LIST char **parents = NULL; - if (asprintf (&name, "/dev/%s", vgs->val[i].vg_name) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&name, "/dev/%s", vgs->val[i].vg_name) == -1) + error (EXIT_FAILURE, errno, "asprintf"); memcpy (uuid, vgs->val[i].vg_uuid, 32); uuid[32] = '\0'; @@ -719,10 +712,8 @@ no_parents (void) char **ret; ret = malloc (sizeof (char *)); - if (!ret) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (!ret) + error (EXIT_FAILURE, errno, "malloc"); ret[0] = NULL; @@ -760,10 +751,8 @@ parents_of_md (char *device) exit (EXIT_FAILURE); ret = malloc ((stats->len + 1) * sizeof (char *)); - if (!ret) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (!ret) + error (EXIT_FAILURE, errno, "malloc"); for (i = 0; i < stats->len; ++i) { ret[i] = guestfs_canonical_device_name (g, stats->val[i].mdstat_device); @@ -814,10 +803,8 @@ parents_of_vg (char *vg) n = guestfs_int_count_strings (pvuuids); ret = malloc ((n + 1) * sizeof (char *)); - if (!ret) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (!ret) + error (EXIT_FAILURE, errno, "malloc"); /* Resolve each PV UUID back to a PV. */ for (i = 0; i < n; ++i) { @@ -834,10 +821,8 @@ parents_of_vg (char *vg) else { fprintf (stderr, "%s: warning: unknown PV UUID ignored\n", __func__); ret[i] = strndup (pvuuids[i], 32); - if (!ret[i]) { - perror ("strndup"); - exit (EXIT_FAILURE); - } + if (!ret[i]) + error (EXIT_FAILURE, errno, "strndup"); } } @@ -978,18 +963,14 @@ add_row (char **strings, size_t len) assert (len <= NR_COLUMNS); row = malloc (sizeof (char *) * len); - if (row == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (row == NULL) + error (EXIT_FAILURE, errno, "malloc"); for (i = 0; i < len; ++i) { if (strings[i]) { row[i] = strdup (strings[i]); - if (row[i] == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (row[i] == NULL) + error (EXIT_FAILURE, errno, "strdup"); /* Keep a running total of the max width of each column. */ slen = strlen (strings[i]); @@ -1003,10 +984,8 @@ add_row (char **strings, size_t len) } rows = realloc (rows, sizeof (char **) * (nr_rows + 1)); - if (rows == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (rows == NULL) + error (EXIT_FAILURE, errno, "realloc"); rows[nr_rows] = row; nr_rows++; } diff --git a/cat/ls.c b/cat/ls.c index c49d1ceed..f92bda140 100644 --- a/cat/ls.c +++ b/cat/ls.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -291,24 +292,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; @@ -564,10 +559,8 @@ next_field (void) field++; if (field == 1) return; - if (putchar (c) == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar (c) == EOF) + error (EXIT_FAILURE, errno, "putchar"); } static void @@ -579,10 +572,8 @@ output_start_line (void) static void output_end_line (void) { - if (printf ("\n") < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("\n") < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -592,10 +583,8 @@ output_string (const char *s) if (!csv) { print_no_quoting: - if (printf ("%s", s) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%s", s) < 0) + error (EXIT_FAILURE, errno, "printf"); } else { /* Quote CSV string without requiring an external module. */ @@ -616,27 +605,19 @@ output_string (const char *s) goto print_no_quoting; /* Quoting for CSV fields. */ - if (putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); for (i = 0; i < len; ++i) { if (s[i] == '"') { - if (putchar ('"') == EOF || putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF || putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); } else { - if (putchar (s[i]) == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar (s[i]) == EOF) + error (EXIT_FAILURE, errno, "putchar"); } } - if (putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); } } @@ -648,10 +629,8 @@ output_string_link (const char *link) else { next_field (); - if (printf ("-> %s", link) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("-> %s", link) < 0) + error (EXIT_FAILURE, errno, "printf"); } } @@ -660,10 +639,8 @@ output_int64 (int64_t i) { next_field (); /* csv doesn't need escaping */ - if (printf ("%" PRIi64, i) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%" PRIi64, i) < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -690,10 +667,8 @@ output_int64_size (int64_t size) human_readable ((uintmax_t) size, buf, hopts, 1, 1)); } - if (r < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (r < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -701,10 +676,8 @@ output_int64_perms (int64_t i) { next_field (); /* csv doesn't need escaping */ - if (printf ("%04" PRIo64, (uint64_t) i) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%04" PRIo64, (uint64_t) i) < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -735,23 +708,17 @@ output_int64_time (int64_t secs, int64_t nsecs) struct tm *tm; tm = localtime (&t); - if (tm == NULL) { - perror ("localtime"); - exit (EXIT_FAILURE); - } + if (tm == NULL) + error (EXIT_FAILURE, errno, "localtime"); - if (strftime (buf, sizeof buf, "%F %T", tm) == 0) { - perror ("strftime"); - exit (EXIT_FAILURE); - } + if (strftime (buf, sizeof buf, "%F %T", tm) == 0) + error (EXIT_FAILURE, errno, "strftime"); r = printf ("%s", buf); } - if (r < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (r < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -759,10 +726,8 @@ output_int64_uid (int64_t i) { next_field (); /* csv doesn't need escaping */ - if (printf ("%4" PRIi64, i) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%4" PRIi64, i) < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -774,8 +739,6 @@ output_int64_dev (int64_t i) /* csv doesn't need escaping */ if (printf ("%ju:%ju", - (uintmax_t) major (dev), (uintmax_t) minor (dev)) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + (uintmax_t) major (dev), (uintmax_t) minor (dev)) < 0) + error (EXIT_FAILURE, errno, "printf"); } diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c index f4e0e560a..00b4a0a81 100644 --- a/daemon/guestfsd.c +++ b/daemon/guestfsd.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -300,8 +301,7 @@ main (int argc, char *argv[]) "output to the libguestfs developers, either in a bug report\n" "or on the libguestfs redhat com mailing list.\n" "\n"); - perror (channel); - exit (EXIT_FAILURE); + error (EXIT_FAILURE, errno, "open: %s", channel); } } } @@ -353,10 +353,8 @@ main (int argc, char *argv[]) xdrmem_create (&xdr, lenbuf, sizeof lenbuf, XDR_ENCODE); xdr_u_int (&xdr, &len); - if (xwrite (sock, lenbuf, sizeof lenbuf) == -1) { - perror ("xwrite"); - exit (EXIT_FAILURE); - } + if (xwrite (sock, lenbuf, sizeof lenbuf) == -1) + error (EXIT_FAILURE, errno, "xwrite"); xdr_destroy (&xdr); diff --git a/daemon/ntfsclone.c b/daemon/ntfsclone.c index a2391110a..f04017c77 100644 --- a/daemon/ntfsclone.c +++ b/daemon/ntfsclone.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include "read-file.h" @@ -42,10 +44,8 @@ read_error_file (char *error_file) str = read_file (error_file, &len); if (str == NULL) { str = strdup ("(no error)"); - if (str == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (str == NULL) + error (EXIT_FAILURE, errno, "strdup"); /* XXX */ len = strlen (str); } diff --git a/daemon/proto.c b/daemon/proto.c index 61d376e5f..c3972f144 100644 --- a/daemon/proto.c +++ b/daemon/proto.c @@ -26,6 +26,7 @@ #include #include #include +#include #include /* defines MIN */ #include #include @@ -231,10 +232,8 @@ reply_with_error_errno (int err, const char *fs, ...) r = vasprintf (&buf, fs, args); va_end (args); - if (r == -1) { - perror ("vasprintf"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, "vasprintf"); send_error (err, buf); } @@ -251,11 +250,9 @@ reply_with_perror_errno (int err, const char *fs, ...) r = vasprintf (&buf1, fs, args); va_end (args); - if (r == -1) { + if (r == -1) error: - perror ("vasprintf"); - exit (EXIT_FAILURE); - } + error (EXIT_FAILURE, errno, "vasprintf"); r = asprintf (&buf2, "%s: %s", buf1, strerror (err)); if (r == -1) @@ -287,10 +284,8 @@ send_error (int errnum, char *msg) msg[GUESTFS_ERROR_LEN] = '\0'; buf = malloc (GUESTFS_ERROR_LEN + 200); - if (!buf) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (!buf) + error (EXIT_FAILURE, errno, "malloc"); xdrmem_create (&xdr, buf, GUESTFS_ERROR_LEN + 200, XDR_ENCODE); memset (&hdr, 0, sizeof hdr); @@ -345,10 +340,8 @@ reply (xdrproc_t xdrp, char *ret) uint32_t len; buf = malloc (GUESTFS_MESSAGE_MAX); - if (!buf) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (!buf) + error (EXIT_FAILURE, errno, "malloc"); xdrmem_create (&xdr, buf, GUESTFS_MESSAGE_MAX, XDR_ENCODE); memset (&hdr, 0, sizeof hdr); diff --git a/daemon/tar.c b/daemon/tar.c index baa5403c1..6d0403a40 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include @@ -110,10 +112,8 @@ read_error_file (char *error_file) str = read_file (error_file, &len); if (str == NULL) { str = strdup ("(no error)"); - if (str == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (str == NULL) + error (EXIT_FAILURE, errno, "strdup"); /* XXX */ len = strlen (str); } diff --git a/df/domains.c b/df/domains.c index 9cb0a091b..2407eece6 100644 --- a/df/domains.c +++ b/df/domains.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #ifdef HAVE_LIBVIRT @@ -99,10 +100,8 @@ get_all_libvirt_domains (const char *libvirt_uri) } ids = malloc (sizeof (int) * n); - if (ids == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (ids == NULL) + error (EXIT_FAILURE, errno, "malloc"); n = virConnectListDomains (conn, ids, n); if (n == -1) { err = virGetLastError (); @@ -124,10 +123,8 @@ get_all_libvirt_domains (const char *libvirt_uri) } names = malloc (sizeof (char *) * n); - if (names == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (names == NULL) + error (EXIT_FAILURE, errno, "malloc"); n = virConnectListDefinedDomains (conn, names, n); if (n == -1) { err = virGetLastError (); @@ -187,10 +184,8 @@ add_domain (virDomainPtr dom) struct domain *domain; domains = realloc (domains, (nr_domains + 1) * sizeof (struct domain)); - if (domains == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (domains == NULL) + error (EXIT_FAILURE, errno, "realloc"); domain = &domains[nr_domains]; nr_domains++; @@ -198,18 +193,14 @@ add_domain (virDomainPtr dom) domain->dom = dom; domain->name = strdup (virDomainGetName (dom)); - if (domain->name == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (domain->name == NULL) + error (EXIT_FAILURE, errno, "strdup"); char uuid[VIR_UUID_STRING_BUFLEN]; if (virDomainGetUUIDString (dom, uuid) == 0) { domain->uuid = strdup (uuid); - if (domain->uuid == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (domain->uuid == NULL) + error (EXIT_FAILURE, errno, "strdup"); } else domain->uuid = NULL; diff --git a/df/main.c b/df/main.c index 5b9b00a36..88661514b 100644 --- a/df/main.c +++ b/df/main.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -216,24 +217,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; @@ -335,28 +330,22 @@ single_drive_display_name (struct drv *drvs) else name++; /* skip '/' character */ name = strdup (name); - if (name == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (name == NULL) + error (EXIT_FAILURE, errno, "strdup"); break; case drv_uri: name = strdup (drvs->uri.orig_uri); - if (name == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (name == NULL) + error (EXIT_FAILURE, errno, "strdup"); /* Try to shorten the URI to just the final element, if it will * still make sense. */ p = strrchr (name, '/'); if (p && strlen (p) > 1) { p = strdup (p+1); - if (!p) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!p) + error (EXIT_FAILURE, errno, "strdup"); free (name); name = p; } @@ -364,10 +353,8 @@ single_drive_display_name (struct drv *drvs) case drv_d: name = strdup (drvs->d.guest); - if (name == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (name == NULL) + error (EXIT_FAILURE, errno, "strdup"); break; } @@ -405,10 +392,8 @@ make_display_name (struct drv *drvs) len = strlen (ret); ret = realloc (ret, len + pluses + 1); - if (ret == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (ret == NULL) + error (EXIT_FAILURE, errno, "realloc"); for (i = len; i < len + pluses; ++i) ret[i] = '+'; ret[i] = '\0'; diff --git a/diff/diff.c b/diff/diff.c index 7589970a6..2e099dbf7 100644 --- a/diff/diff.c +++ b/diff/diff.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -709,20 +710,14 @@ diff (struct file *file1, guestfs_h *g1, struct file *file2, guestfs_h *g2) assert (is_reg (file1->stat->st_mode)); assert (is_reg (file2->stat->st_mode)); - if (asprintf (&tmpd, "%s/virtdiffXXXXXX", tmpdir) < 0) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } - if (mkdtemp (tmpd) == NULL) { - perror ("mkdtemp"); - exit (EXIT_FAILURE); - } + if (asprintf (&tmpd, "%s/virtdiffXXXXXX", tmpdir) < 0) + error (EXIT_FAILURE, errno, "asprintf"); + if (mkdtemp (tmpd) == NULL) + error (EXIT_FAILURE, errno, "mkdtemp"); if (asprintf (&tmpda, "%s/a", tmpd) < 0 || - asprintf (&tmpdb, "%s/b", tmpd) < 0) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + asprintf (&tmpdb, "%s/b", tmpd) < 0) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_download (g1, file1->path, tmpda) == -1) goto out; @@ -732,10 +727,8 @@ diff (struct file *file1, guestfs_h *g1, struct file *file2, guestfs_h *g2) /* Note that the tmpdir is safe, and the rest of the path * should not need quoting. */ - if (asprintf (&cmd, "diff -u '%s' '%s' | tail -n +3", tmpda, tmpdb) < 0) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&cmd, "diff -u '%s' '%s' | tail -n +3", tmpda, tmpdb) < 0) + error (EXIT_FAILURE, errno, "asprintf"); if (verbose) fprintf (stderr, "%s\n", cmd); @@ -838,10 +831,8 @@ next_field (void) field++; if (field == 1) return; - if (putchar (c) == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar (c) == EOF) + error (EXIT_FAILURE, errno, "putchar"); } static void @@ -853,19 +844,15 @@ output_start_line (void) static void output_end_line (void) { - if (printf ("\n") < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("\n") < 0) + error (EXIT_FAILURE, errno, "printf"); } static void output_flush (void) { - if (fflush (stdout) == EOF) { - perror ("fflush"); - exit (EXIT_FAILURE); - } + if (fflush (stdout) == EOF) + error (EXIT_FAILURE, errno, "fflush"); } static void @@ -875,10 +862,8 @@ output_string (const char *s) if (!csv) { print_no_quoting: - if (printf ("%s", s) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%s", s) < 0) + error (EXIT_FAILURE, errno, "printf"); } else { /* Quote CSV string without requiring an external module. */ @@ -899,27 +884,19 @@ output_string (const char *s) goto print_no_quoting; /* Quoting for CSV fields. */ - if (putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); for (i = 0; i < len; ++i) { if (s[i] == '"') { - if (putchar ('"') == EOF || putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF || putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); } else { - if (putchar (s[i]) == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar (s[i]) == EOF) + error (EXIT_FAILURE, errno, "putchar"); } } - if (putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); } } @@ -931,10 +908,8 @@ output_string_link (const char *link) else { next_field (); - if (printf ("-> %s", link) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("-> %s", link) < 0) + error (EXIT_FAILURE, errno, "printf"); } } @@ -949,15 +924,11 @@ output_binary (const char *s, size_t len) print_no_quoting: for (i = 0; i < len; ++i) { if (c_isprint (s[i])) { - if (putchar (s[i]) == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar (s[i]) == EOF) + error (EXIT_FAILURE, errno, "putchar"); } else { - if (printf ("\\x%02x", (unsigned char) s[i]) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("\\x%02x", (unsigned char) s[i]) < 0) + error (EXIT_FAILURE, errno, "putchar"); } } } @@ -977,34 +948,24 @@ output_binary (const char *s, size_t len) goto print_no_quoting; /* Quoting for CSV fields. */ - if (putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); for (i = 0; i < len; ++i) { if (s[i] == '"') { - if (putchar ('"') == EOF || putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF || putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); } else { if (c_isprint (s[i])) { - if (putchar (s[i]) == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar (s[i]) == EOF) + error (EXIT_FAILURE, errno, "putchar"); } else { - if (printf ("\\x%2x", (unsigned) s[i]) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("\\x%2x", (unsigned) s[i]) < 0) + error (EXIT_FAILURE, errno, "printf"); } } } - if (putchar ('"') == EOF) { - perror ("putchar"); - exit (EXIT_FAILURE); - } + if (putchar ('"') == EOF) + error (EXIT_FAILURE, errno, "putchar"); } } @@ -1013,10 +974,8 @@ output_int64 (int64_t i) { next_field (); /* csv doesn't need escaping */ - if (printf ("%" PRIi64, i) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%" PRIi64, i) < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -1043,10 +1002,8 @@ output_int64_size (int64_t size) human_readable ((uintmax_t) size, buf, hopts, 1, 1)); } - if (r < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (r < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -1054,10 +1011,8 @@ output_int64_perms (int64_t i) { next_field (); /* csv doesn't need escaping */ - if (printf ("%04" PRIo64, (uint64_t) i) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf ("%04" PRIo64, (uint64_t) i) < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -1088,23 +1043,17 @@ output_int64_time (int64_t secs, int64_t nsecs) struct tm *tm; tm = localtime (&t); - if (tm == NULL) { - perror ("localtime"); - exit (EXIT_FAILURE); - } + if (tm == NULL) + error (EXIT_FAILURE, errno, "localtime"); - if (strftime (buf, sizeof buf, "%F %T", tm) == 0) { - perror ("strftime"); - exit (EXIT_FAILURE); - } + if (strftime (buf, sizeof buf, "%F %T", tm) == 0) + error (EXIT_FAILURE, errno, "strftime"); r = printf ("%s", buf); } - if (r < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (r < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -1112,10 +1061,8 @@ output_int64_uid (int64_t i) { next_field (); /* csv doesn't need escaping */ - if (printf (csv ? "%" PRIi64 : "%4" PRIi64, i) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + if (printf (csv ? "%" PRIi64 : "%4" PRIi64, i) < 0) + error (EXIT_FAILURE, errno, "printf"); } static void @@ -1127,8 +1074,6 @@ output_int64_dev (int64_t i) /* csv doesn't need escaping */ if (printf ("%ju:%ju", - (uintmax_t) major (dev), (uintmax_t) minor (dev)) < 0) { - perror ("printf"); - exit (EXIT_FAILURE); - } + (uintmax_t) major (dev), (uintmax_t) minor (dev)) < 0) + error (EXIT_FAILURE, errno, "printf"); } diff --git a/edit/edit.c b/edit/edit.c index 90b004e9a..38af8a500 100644 --- a/edit/edit.c +++ b/edit/edit.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -225,24 +226,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; diff --git a/fish/config.c b/fish/config.c index 51014bf5a..4463d9fab 100644 --- a/fish/config.c +++ b/fish/config.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #ifdef HAVE_LIBCONFIG @@ -68,10 +69,8 @@ read_config_from_file (const char *filename) exit (EXIT_FAILURE); } - if (fclose (fp) == -1) { - perror (filename); - exit (EXIT_FAILURE); - } + if (fclose (fp) == -1) + error (EXIT_FAILURE, errno, "fclose: %s", filename); config_lookup_bool (&conf, "read_only", &read_only); @@ -101,10 +100,8 @@ parse_config (void) CLEANUP_FREE char *path = NULL; const char *dir = xdg_config_dirs[i - 1]; - if (asprintf (&path, "%s/libguestfs/" GLOBAL_CONFIG_FILENAME, dir) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&path, "%s/libguestfs/" GLOBAL_CONFIG_FILENAME, dir) == -1) + error (EXIT_FAILURE, errno, "asprintf"); read_config_from_file (path); } @@ -117,10 +114,8 @@ parse_config (void) /* Old-style configuration file first. */ CLEANUP_FREE char *path = NULL; - if (asprintf (&path, "%s/%s", home, home_filename) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&path, "%s/%s", home, home_filename) == -1) + error (EXIT_FAILURE, errno, "asprintf"); read_config_from_file (path); } @@ -131,24 +126,18 @@ parse_config (void) CLEANUP_FREE char *home_copy = strdup (home); const char *xdg_env; - if (home_copy == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (home_copy == NULL) + error (EXIT_FAILURE, errno, "strdup"); xdg_env = getenv ("XDG_CONFIG_HOME"); if (xdg_env == NULL) { if (asprintf (&path, "%s/.config/libguestfs/" GLOBAL_CONFIG_FILENAME, - home_copy) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + home_copy) == -1) + error (EXIT_FAILURE, errno, "asprintf"); } else { if (asprintf (&path, "%s/libguestfs/" GLOBAL_CONFIG_FILENAME, - xdg_env) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + xdg_env) == -1) + error (EXIT_FAILURE, errno, "asprintf"); } read_config_from_file (path); diff --git a/fish/events.c b/fish/events.c index 0349c5544..8660fc47a 100644 --- a/fish/events.c +++ b/fish/events.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include @@ -261,10 +263,8 @@ print_event_set (uint64_t event_bitmask, FILE *fp) fputs ("*", fp); else { CLEANUP_FREE char *str = guestfs_event_to_string (event_bitmask); - if (!str) { - perror ("guestfs_event_to_string"); - exit (EXIT_FAILURE); - } + if (!str) + error (EXIT_FAILURE, errno, "guestfs_event_to_string"); fputs (str, fp); } } diff --git a/fish/fish.c b/fish/fish.c index 1e2963974..6f9c78474 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -360,10 +361,8 @@ main (int argc, char *argv[]) exit (EXIT_SUCCESS); } drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_N; drv->nr_drives = -1; p = strchr (optarg, '='); @@ -371,16 +370,12 @@ main (int argc, char *argv[]) *p = '\0'; p = p+1; drv->N.filename = strdup (optarg); - if (drv->N.filename == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (drv->N.filename == NULL) + error (EXIT_FAILURE, errno, "strdup"); } else { if (asprintf (&drv->N.filename, "test%d.img", - next_prepared_drive) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + next_prepared_drive) == -1) + error (EXIT_FAILURE, errno, "asprintf"); p = optarg; } drv->N.data = create_prepared_file (p, drv->N.filename); @@ -448,24 +443,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; @@ -539,10 +528,8 @@ main (int argc, char *argv[]) /* -f (file) parameter? */ if (file) { close (0); - if (open (file, O_RDONLY|O_CLOEXEC) == -1) { - perror (file); - exit (EXIT_FAILURE); - } + if (open (file, O_RDONLY|O_CLOEXEC) == -1) + error (EXIT_FAILURE, errno, "open: %s", file); } /* Get the name of the input file, for error messages, and replace @@ -565,10 +552,8 @@ main (int argc, char *argv[]) if (progress_bars) { bar = progress_bar_init (0); - if (!bar) { - perror ("progress_bar_init"); - exit (EXIT_FAILURE); - } + if (!bar) + error (EXIT_FAILURE, errno, "progress_bar_init"); guestfs_set_event_callback (g, progress_callback, GUESTFS_EVENT_PROGRESS, 0, NULL); @@ -1481,30 +1466,24 @@ initialize_readline (void) if (str) { free (ps1); ps1 = strdup (str); - if (!ps1) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!ps1) + error (EXIT_FAILURE, errno, "strdup"); } str = getenv ("GUESTFISH_OUTPUT"); if (str) { free (ps_output); ps_output = strdup (str); - if (!ps_output) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!ps_output) + error (EXIT_FAILURE, errno, "strdup"); } str = getenv ("GUESTFISH_INIT"); if (str) { free (ps_init); ps_init = strdup (str); - if (!ps_init) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!ps_init) + error (EXIT_FAILURE, errno, "strdup"); } #endif } @@ -1557,10 +1536,8 @@ decode_ps1 (const char *str) * future. */ ret = malloc (len + 1); - if (!ret) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (!ret) + error (EXIT_FAILURE, errno, "malloc"); for (i = j = 0; i < len; ++i) { if (str[i] == '\\') { /* Start of an escape sequence. */ diff --git a/fish/options.c b/fish/options.c index 0dffff5be..cc3d4c000 100644 --- a/fish/options.c +++ b/fish/options.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "guestfs.h" @@ -37,20 +38,16 @@ option_a (const char *arg, const char *format, struct drv **drvsp) struct drv *drv; drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); if (parse_uri (arg, &uri) == -1) exit (EXIT_FAILURE); if (STREQ (uri.protocol, "file")) { /* Ordinary file. */ - if (access (uri.path, R_OK) != 0) { - perror (uri.path); - exit (EXIT_FAILURE); - } + if (access (uri.path, R_OK) != 0) + error (EXIT_FAILURE, errno, "access: %s", uri.path); drv->type = drv_a; drv->nr_drives = -1; @@ -83,10 +80,8 @@ option_d (const char *arg, struct drv **drvsp) struct drv *drv; drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->nr_drives = -1; @@ -115,10 +110,8 @@ add_drives_handle (guestfs_h *g, struct drv *drv, char next_drive) free (drv->device); drv->device = NULL; - if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) + error (EXIT_FAILURE, errno, "asprintf"); switch (drv->type) { case drv_a: @@ -299,10 +292,8 @@ display_mountpoints_on_failure (const char *mp_device, /* Reformat the internal btrfsvol string into a valid mount option */ if (device && subvolume) { - if (asprintf (&p, "%s:/:subvol=%s", device, subvolume) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&p, "%s:/:subvol=%s", device, subvolume) == -1) + error (EXIT_FAILURE, errno, "asprintf"); } else { p = guestfs_canonical_device_name (g, fses[i]); } diff --git a/fish/options.h b/fish/options.h index 0348676df..bbe38aa74 100644 --- a/fish/options.h +++ b/fish/options.h @@ -178,10 +178,8 @@ extern void display_long_options (const struct option *) __attribute__((noreturn #define OPTION_m \ mp = malloc (sizeof (struct mp)); \ - if (!mp) { \ - perror ("malloc"); \ - exit (EXIT_FAILURE); \ - } \ + if (!mp) \ + error (EXIT_FAILURE, errno, "malloc"); \ mp->fstype = NULL; \ mp->options = NULL; \ mp->mountpoint = (char *) "/"; \ diff --git a/fish/prep-boot.c b/fish/prep-boot.c index 8fdacfe77..45a5a8f11 100644 --- a/fish/prep-boot.c +++ b/fish/prep-boot.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include "fish.h" @@ -61,19 +63,15 @@ prep_postlaunch_bootroot (const char *filename, prep_data *data, const char *dev guestfs_last_error (g)); CLEANUP_FREE char *part; - if (asprintf (&part, "%s1", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part, "%s1", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_mkfs (g, data->params[0], part) == -1) prep_error (data, filename, _("failed to create boot filesystem: %s"), guestfs_last_error (g)); CLEANUP_FREE char *part2; - if (asprintf (&part2, "%s2", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part2, "%s2", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_mkfs (g, data->params[1], part2) == -1) prep_error (data, filename, _("failed to create root filesystem: %s"), guestfs_last_error (g)); @@ -120,19 +118,15 @@ prep_postlaunch_bootrootlv (const char *filename, prep_data *data, const char *d prep_error (data, filename, _("incorrect format for LV name, use '/dev/VG/LV'")); CLEANUP_FREE char *part; - if (asprintf (&part, "%s1", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part, "%s1", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_mkfs (g, data->params[1], part) == -1) prep_error (data, filename, _("failed to create boot filesystem: %s"), guestfs_last_error (g)); CLEANUP_FREE char *part2; - if (asprintf (&part2, "%s2", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part2, "%s2", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_pvcreate (g, part2) == -1) prep_error (data, filename, _("failed to create PV: %s: %s"), part2, guestfs_last_error (g)); diff --git a/fish/prep-fs.c b/fish/prep-fs.c index 55193ff66..6670aa66c 100644 --- a/fish/prep-fs.c +++ b/fish/prep-fs.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include "fish.h" @@ -43,10 +45,8 @@ prep_postlaunch_fs (const char *filename, prep_data *data, const char *device) guestfs_last_error (g)); CLEANUP_FREE char *part; - if (asprintf (&part, "%s1", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part, "%s1", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_mkfs (g, data->params[0], part) == -1) prep_error (data, filename, _("failed to create filesystem (%s): %s"), diff --git a/fish/prep-lv.c b/fish/prep-lv.c index d09f26e70..93de9aeec 100644 --- a/fish/prep-lv.c +++ b/fish/prep-lv.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include "fish.h" @@ -43,18 +45,14 @@ vg_lv_parse (const char *device, char **vg, char **lv) if (vg) { *vg = strndup (device, p - device); - if (*vg == NULL) { - perror ("strndup"); - exit (EXIT_FAILURE); - } + if (*vg == NULL) + error (EXIT_FAILURE, errno, "strndup"); } if (lv) { *lv = strdup (p+1); - if (*lv == NULL) { - perror ("strndup"); - exit (EXIT_FAILURE); - } + if (*lv == NULL) + error (EXIT_FAILURE, errno, "strndup"); } return 0; @@ -83,10 +81,8 @@ prep_postlaunch_lv (const char *filename, prep_data *data, const char *device) prep_error (data, filename, _("incorrect format for LV name, use '/dev/VG/LV'")); CLEANUP_FREE char *part; - if (asprintf (&part, "%s1", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part, "%s1", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_pvcreate (g, part) == -1) prep_error (data, filename, _("failed to create PV: %s: %s"), @@ -126,10 +122,8 @@ prep_postlaunch_lvfs (const char *filename, prep_data *data, const char *device) prep_error (data, filename, _("incorrect format for LV name, use '/dev/VG/LV'")); CLEANUP_FREE char *part; - if (asprintf (&part, "%s1", device) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&part, "%s1", device) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (guestfs_pvcreate (g, part) == -1) prep_error (data, filename, _("failed to create PV: %s: %s"), diff --git a/fish/prep.c b/fish/prep.c index 4dae4d61f..b8976e986 100644 --- a/fish/prep.c +++ b/fish/prep.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include "fish.h" @@ -106,19 +108,15 @@ Use 'guestfish -N help' to list possible values for the -N parameter.\n"), } prep_data *data = malloc (sizeof *data); - if (data == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (data == NULL) + error (EXIT_FAILURE, errno, "malloc"); data->prep = &preps[i]; data->orig_type_string = type_string; /* Set up the optional parameters to all-defaults. */ data->params = malloc (data->prep->nr_params * sizeof (char *)); - if (data->params == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (data->params == NULL) + error (EXIT_FAILURE, errno, "malloc"); for (i = 0; i < data->prep->nr_params; ++i) data->params[i] = (char *) data->prep->params[i].pdefault; @@ -131,10 +129,8 @@ Use 'guestfish -N help' to list possible values for the -N parameter.\n"), while (*p) { len = strcspn (p, ":"); data->params[i] = strndup (p, len); - if (data->params[i] == NULL) { - perror ("strndup"); - exit (EXIT_FAILURE); - } + if (data->params[i] == NULL) + error (EXIT_FAILURE, errno, "strndup"); p += len; if (*p) p++; /* skip colon char */ diff --git a/fish/rc.c b/fish/rc.c index d4d2015cd..ad673f8e5 100644 --- a/fish/rc.c +++ b/fish/rc.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -54,11 +55,9 @@ create_sockdir (void) /* Create the directory, and ensure it is owned by the user. */ snprintf (dir, sizeof dir, SOCKET_DIR, (uintmax_t) euid); r = mkdir (dir, 0700); - if (r == -1 && errno != EEXIST) { + if (r == -1 && errno != EEXIST) error: - perror (dir); - exit (EXIT_FAILURE); - } + error (EXIT_FAILURE, errno, "%s", dir); if (lstat (dir, &statbuf) == -1) goto error; if (!S_ISDIR (statbuf.st_mode) || @@ -99,10 +98,8 @@ receive_stdout (int s) if (NULL == cmptr) { cmptr = malloc (controllen); - if (NULL == cmptr) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (NULL == cmptr) + error (EXIT_FAILURE, errno, "malloc"); } /* Don't specify a source */ @@ -122,10 +119,8 @@ receive_stdout (int s) /* Read a message from the socket */ ssize_t n = recvmsg (s, &msg, 0); - if (n < 0) { - perror ("recvmsg stdout fd"); - exit (EXIT_FAILURE); - } + if (n < 0) + error (EXIT_FAILURE, errno, "recvmsg stdout fd"); h = CMSG_FIRSTHDR(&msg); if (NULL == h) { @@ -170,10 +165,8 @@ send_stdout (int s) /* Initialize the control data */ if (NULL == cmptr) { cmptr = malloc (controllen); - if (NULL == cmptr) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (NULL == cmptr) + error (EXIT_FAILURE, errno, "malloc"); } cmptr->cmsg_level = SOL_SOCKET; cmptr->cmsg_type = SCM_RIGHTS; @@ -187,10 +180,8 @@ send_stdout (int s) void *data = CMSG_DATA (cmptr); *(int *)data = STDOUT_FILENO; - if (sendmsg (s, &msg, 0) != 1) { - perror ("sendmsg stdout fd"); - exit (EXIT_FAILURE); - } + if (sendmsg (s, &msg, 0) != 1) + error (EXIT_FAILURE, errno, "sendmsg stdout fd"); } static void @@ -230,10 +221,8 @@ rc_listen (void) create_sockdir (); pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid > 0) { /* Parent process. */ @@ -260,19 +249,13 @@ rc_listen (void) create_sockpath (pid, sockpath, sizeof sockpath, &addr); sock = socket (AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0); - if (sock == -1) { - perror ("socket"); - exit (EXIT_FAILURE); - } + if (sock == -1) + error (EXIT_FAILURE, errno, "socket"); unlink (sockpath); - if (bind (sock, (struct sockaddr *) &addr, sizeof addr) == -1) { - perror (sockpath); - exit (EXIT_FAILURE); - } - if (listen (sock, 4) == -1) { - perror ("listen"); - exit (EXIT_FAILURE); - } + if (bind (sock, (struct sockaddr *) &addr, sizeof addr) == -1) + error (EXIT_FAILURE, errno, "bind: %s", sockpath); + if (listen (sock, 4) == -1) + error (EXIT_FAILURE, errno, "listen: %s", sockpath); /* Read commands and execute them. */ while (!quit) { @@ -309,10 +292,8 @@ rc_listen (void) /* We have to extend and NULL-terminate the argv array. */ argc = call.args.args_len; argv = realloc (call.args.args_val, (argc+1) * sizeof (char *)); - if (argv == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (argv == NULL) + error (EXIT_FAILURE, errno, "realloc"); call.args.args_val = argv; argv[argc] = NULL; diff --git a/fish/tilde.c b/fish/tilde.c index 058145c64..0d7dfa215 100644 --- a/fish/tilde.c +++ b/fish/tilde.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include "fish.h" @@ -59,10 +61,8 @@ try_tilde_expansion (char *str) if (home) { len = strlen (home) + strlen (rest) + 1; str = malloc (len); - if (str == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (str == NULL) + error (EXIT_FAILURE, errno, "malloc"); strcpy (str, home); strcat (str, rest); return str; @@ -93,10 +93,8 @@ expand_home (char *orig, const char *append) len = strlen (home) + (append ? strlen (append) : 0) + 1; str = malloc (len); - if (str == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (str == NULL) + error (EXIT_FAILURE, errno, "malloc"); strcpy (str, home); if (append) diff --git a/fish/windows.c b/fish/windows.c index fad5d3b87..063440639 100644 --- a/fish/windows.c +++ b/fish/windows.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -59,24 +60,18 @@ windows_path (guestfs_h *g, const char *root, const char *path, int readonly) /* This returns the newly allocated string. */ mount_drive_letter (g, drive_letter, root, readonly); ret = strdup (path + 2); - if (ret == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (ret == NULL) + error (EXIT_FAILURE, errno, "strdup"); } else if (!*path) { ret = strdup ("/"); - if (ret == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (ret == NULL) + error (EXIT_FAILURE, errno, "strdup"); } else { ret = strdup (path); - if (ret == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (ret == NULL) + error (EXIT_FAILURE, errno, "strdup"); } /* Blindly convert any backslashes into forward slashes. Is this good? */ diff --git a/format/format.c b/format/format.c index 23c44da87..781423f37 100644 --- a/format/format.c +++ b/format/format.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -163,7 +164,8 @@ main (int argc, char *argv[]) if (optarg == NULL) { vg = strdup ("VG"); lv = strdup ("LV"); - if (!vg || !lv) { perror ("strdup"); exit (EXIT_FAILURE); } + if (!vg || !lv) + error (EXIT_FAILURE, errno, "strdup"); } else if (STREQ (optarg, "none")) vg = lv = NULL; @@ -307,10 +309,8 @@ parse_vg_lv (const char *lvm) vg = strndup (lvm, i); lv = strdup (lvm + i + 1); - if (!vg || !lv) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!vg || !lv) + error (EXIT_FAILURE, errno, "strdup"); } else { cannot_parse: fprintf (stderr, _("%s: cannot parse --lvm option (%s)\n"), @@ -381,10 +381,8 @@ do_format (void) if (guestfs_part_disk (g, devices[i], ptype) == -1) exit (EXIT_FAILURE); - if (asprintf (&dev, "%s1", devices[i]) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&dev, "%s1", devices[i]) == -1) + error (EXIT_FAILURE, errno, "asprintf"); free_dev = 1; /* Set the partition type byte appropriately, otherwise Windows @@ -427,10 +425,8 @@ do_format (void) if (free_dev) free (dev); - if (asprintf (&dev, "/dev/%s/%s", vg, lv) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&dev, "/dev/%s/%s", vg, lv) == -1) + error (EXIT_FAILURE, errno, "asprintf"); free_dev = 1; } diff --git a/fuse/guestmount.c b/fuse/guestmount.c index 70fb87e23..6ab654a2d 100644 --- a/fuse/guestmount.c +++ b/fuse/guestmount.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -55,10 +56,8 @@ fuse_opt_add_opt_escaped (char **opts, const char *opt) unsigned oldlen = *opts ? strlen(*opts) : 0; char *d = realloc (*opts, oldlen + 1 + strlen(opt) * 2 + 1); - if (!d) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (!d) + error (EXIT_FAILURE, errno, "realloc"); *opts = d; if (oldlen) { @@ -419,10 +418,8 @@ main (int argc, char *argv[]) int fd; pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid != 0) { /* parent */ if (write_pid_file (pid_file, pid) == -1) @@ -434,10 +431,8 @@ main (int argc, char *argv[]) } /* Emulate what old fuse_daemonize used to do. */ - if (setsid () == -1) { - perror ("setsid"); - exit (EXIT_FAILURE); - } + if (setsid () == -1) + error (EXIT_FAILURE, errno, "setsid"); ignore_value (chdir ("/")); diff --git a/fuse/guestunmount.c b/fuse/guestunmount.c index 8be987636..06db4ef69 100644 --- a/fuse/guestunmount.c +++ b/fuse/guestunmount.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -92,7 +93,7 @@ main (int argc, char *argv[]) const char *mountpoint; struct sigaction sa; struct pollfd pollfd; - char *error = NULL; + char *error_str = NULL; size_t i; setlocale (LC_ALL, ""); @@ -172,10 +173,8 @@ main (int argc, char *argv[]) pollfd.events = POLLIN; pollfd.revents = 0; if (poll (&pollfd, 1, -1) == -1) { - if (errno != EAGAIN && errno != EINTR) { - perror ("poll"); - exit (EXIT_FAILURE); - } + if (errno != EAGAIN && errno != EINTR) + error (EXIT_FAILURE, errno, "poll"); } else { if ((pollfd.revents & POLLHUP) != 0) @@ -189,15 +188,15 @@ main (int argc, char *argv[]) if (i > 0) sleep (1 << (i-1)); - free (error); - error = NULL; + free (error_str); + error_str = NULL; - if (do_fusermount (mountpoint, &error) == 0) + if (do_fusermount (mountpoint, &error_str) == 0) goto done; /* Did fusermount fail because the mountpoint is not mounted? */ - if (error && - strstr (error, "fusermount: entry for") != NULL) { + if (error_str && + strstr (error_str, "fusermount: entry for") != NULL) { goto not_mounted; } } @@ -205,10 +204,10 @@ main (int argc, char *argv[]) /* fusermount failed after N retries */ if (!quiet) { fprintf (stderr, _("%s: failed to unmount %s: %s\n"), - guestfs_int_program_name, mountpoint, error); + guestfs_int_program_name, mountpoint, error_str); do_fuser (mountpoint); } - free (error); + free (error_str); exit (2); @@ -216,9 +215,9 @@ main (int argc, char *argv[]) not_mounted: if (!quiet) fprintf (stderr, _("%s: %s is not mounted: %s\n"), - guestfs_int_program_name, mountpoint, error); + guestfs_int_program_name, mountpoint, error_str); - free (error); + free (error_str); exit (3); @@ -236,20 +235,16 @@ do_fusermount (const char *mountpoint, char **error_rtn) char *buf = NULL; size_t allocsize = 0, len = 0; - if (pipe (fd) == -1) { - perror ("pipe"); - exit (EXIT_FAILURE); - } + if (pipe (fd) == -1) + error (EXIT_FAILURE, errno, "pipe"); if (verbose) fprintf (stderr, "%s: running: fusermount -u %s\n", guestfs_int_program_name, mountpoint); pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid == 0) { /* Child - run fusermount. */ close (fd[0]); @@ -277,18 +272,14 @@ do_fusermount (const char *mountpoint, char **error_rtn) if (len >= allocsize) { allocsize += 256; buf = realloc (buf, allocsize); - if (buf == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (buf == NULL) + error (EXIT_FAILURE, errno, "realloc"); } /* Leave space in the buffer for a terminating \0 character. */ r = read (fd[0], &buf[len], allocsize - len - 1); - if (r == -1) { - perror ("read"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, "read"); if (r == 0) break; @@ -296,10 +287,8 @@ do_fusermount (const char *mountpoint, char **error_rtn) len += r; } - if (close (fd[0]) == -1) { - perror ("close"); - exit (EXIT_FAILURE); - } + if (close (fd[0]) == -1) + error (EXIT_FAILURE, errno, "close"); if (buf) { /* Remove any trailing \n from the error message. */ @@ -313,10 +302,8 @@ do_fusermount (const char *mountpoint, char **error_rtn) buf[len] = '\0'; } - if (waitpid (pid, &r, 0) == -1) { - perror ("waitpid"); - exit (EXIT_FAILURE); - } + if (waitpid (pid, &r, 0) == -1) + error (EXIT_FAILURE, errno, "waitpid"); if (!WIFEXITED (r) || WEXITSTATUS (r) != 0) { if (verbose) @@ -343,10 +330,8 @@ do_fuser (const char *mountpoint) pid_t pid; pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid == 0) { /* Child - run fuser. */ #ifdef __linux__ diff --git a/fuse/test-fuse.c b/fuse/test-fuse.c index 95a2b3d3a..35d75d5ae 100644 --- a/fuse/test-fuse.c +++ b/fuse/test-fuse.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #ifdef HAVE_ACL #include @@ -86,16 +88,12 @@ main (int argc, char *argv[]) exit (77); } - if (access ("/dev/fuse", W_OK) == -1) { - perror ("/dev/fuse"); - exit (77); - } + if (access ("/dev/fuse", W_OK) == -1) + error (77, errno, "access: /dev/fuse"); g = guestfs_create (); - if (g == NULL) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (g == NULL) + error (EXIT_FAILURE, errno, "guestfs_create"); if (guestfs_add_drive_scratch (g, SIZE, -1) == -1) exit (EXIT_FAILURE); @@ -126,10 +124,8 @@ main (int argc, char *argv[]) /* Fork to run the next part of the test. */ pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid == 0) { /* Child. */ /* Move into the mountpoint for the tests. */ @@ -176,15 +172,11 @@ main (int argc, char *argv[]) exit (EXIT_FAILURE); /* Clean up and exit. */ - if (waitpid (pid, &r, 0) == -1) { - perror ("waitpid"); - exit (EXIT_FAILURE); - } + if (waitpid (pid, &r, 0) == -1) + error (EXIT_FAILURE, errno, "waitpid"); - if (rmdir (mountpoint) == -1) { - perror (mountpoint); - exit (EXIT_FAILURE); - } + if (rmdir (mountpoint) == -1) + error (EXIT_FAILURE, errno, "rmdir: %s", mountpoint); if (guestfs_shutdown (g) == -1) exit (EXIT_FAILURE); diff --git a/fuse/test-guestmount-fd.c b/fuse/test-guestmount-fd.c index f3456d94d..5f358bb78 100644 --- a/fuse/test-guestmount-fd.c +++ b/fuse/test-guestmount-fd.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -64,38 +65,28 @@ main (int argc, char *argv[]) } /* Skip the test if the test image can't be found. */ - if (access (TEST_IMAGE, R_OK) == -1) { - perror (TEST_IMAGE); - exit (77); - } + if (access (TEST_IMAGE, R_OK) == -1) + error (77, errno, "access: %s", TEST_IMAGE); /* Skip the test if /dev/fuse is not writable, because guestmount * will fail. */ - if (access ("/dev/fuse", W_OK) == -1) { - perror ("/dev/fuse"); - exit (77); - } + if (access ("/dev/fuse", W_OK) == -1) + error (77, errno, "access: %s", "/dev/fuse"); /* Create the pipe. */ - if (pipe (pipefd) == -1) { - perror ("pipe"); - exit (EXIT_FAILURE); - } + if (pipe (pipefd) == -1) + error (EXIT_FAILURE, errno, "pipe"); /* Create the mount point. */ ignore_value (rmdir (MOUNTPOINT)); - if (mkdir (MOUNTPOINT, 0700) == -1) { - perror ("mkdir: " MOUNTPOINT); - exit (EXIT_FAILURE); - } + if (mkdir (MOUNTPOINT, 0700) == -1) + error (EXIT_FAILURE, errno, "mkdir: %s", MOUNTPOINT); /* Create the guestmount subprocess. */ pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid == 0) { /* child - guestmount */ char fd_str[64]; diff --git a/fuse/test-guestunmount-fd.c b/fuse/test-guestunmount-fd.c index b09a60f67..a93789306 100644 --- a/fuse/test-guestunmount-fd.c +++ b/fuse/test-guestunmount-fd.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -60,17 +61,13 @@ main (int argc, char *argv[]) } /* Create the pipe. */ - if (pipe (pipefd) == -1) { - perror ("pipe"); - exit (EXIT_FAILURE); - } + if (pipe (pipefd) == -1) + error (EXIT_FAILURE, errno, "pipe"); /* Create the guestunmount subprocess. */ pid = fork (); - if (pid == -1) { - perror ("fork"); - exit (EXIT_FAILURE); - } + if (pid == -1) + error (EXIT_FAILURE, errno, "fork"); if (pid == 0) { /* child - guestunmount */ char fd_str[64]; @@ -92,10 +89,8 @@ main (int argc, char *argv[]) sleep (2); r = waitpid (pid, &status, WNOHANG); - if (r == -1) { - perror ("waitpid"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, "waitpid"); if (r != 0) { char status_string[80]; @@ -113,10 +108,8 @@ main (int argc, char *argv[]) close (pipefd[1]); r = waitpid (pid, &status, 0); - if (r == -1) { - perror ("waitpid"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, "waitpid"); if (!WIFEXITED (status) || WEXITSTATUS (status) != 3) { char status_string[80]; diff --git a/inspector/inspector.c b/inspector/inspector.c index 1dbef50fb..2e54924f5 100644 --- a/inspector/inspector.c +++ b/inspector/inspector.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -205,24 +206,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; diff --git a/p2v/config.c b/p2v/config.c index baa7b455d..9c0d76f00 100644 --- a/p2v/config.c +++ b/p2v/config.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -35,10 +36,8 @@ new_config (void) struct config *c; c = calloc (1, sizeof *c); - if (c == NULL) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (c == NULL) + error (EXIT_FAILURE, errno, "calloc"); #if FORCE_REMOTE_DEBUG c->verbose = 1; diff --git a/p2v/conversion.c b/p2v/conversion.c index d076718d0..103073e94 100644 --- a/p2v/conversion.c +++ b/p2v/conversion.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -101,11 +102,9 @@ set_conversion_error (const char *fs, ...) len = vasprintf (&msg, fs, args); va_end (args); - if (len < 0) { - perror ("vasprintf"); - fprintf (stderr, "original error format string: %s\n", fs); - exit (EXIT_FAILURE); - } + if (len < 0) + error (EXIT_FAILURE, errno, + "vasprintf (original error format string: %s)", fs); free (conversion_error); conversion_error = msg; @@ -185,10 +184,8 @@ start_conversion (struct config *config, set_cancel_requested (0); data_conns = malloc (sizeof (struct data_conn) * nr_disks); - if (data_conns == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (data_conns == NULL) + error (EXIT_FAILURE, errno, "malloc"); for (i = 0; config->disks[i] != NULL; ++i) { data_conns[i].h = NULL; @@ -205,10 +202,8 @@ start_conversion (struct config *config, CLEANUP_FREE char *msg; if (asprintf (&msg, _("Opening data connection for %s ..."), - config->disks[i]) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + config->disks[i]) == -1) + error (EXIT_FAILURE, errno, "asprintf"); notify_ui (NOTIFY_STATUS, msg); } @@ -910,10 +905,8 @@ generate_libvirt_xml (struct config *config, struct data_conn *data_conns) map_interface_to_network (config, config->interfaces[i]); if (asprintf (&mac_filename, "/sys/class/net/%s/address", - config->interfaces[i]) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + config->interfaces[i]) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (g_file_get_contents (mac_filename, &mac, NULL, NULL)) { size_t len = strlen (mac); diff --git a/p2v/gui.c b/p2v/gui.c index 88357932d..c5fbc9966 100644 --- a/p2v/gui.c +++ b/p2v/gui.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -800,24 +801,18 @@ populate_disks (GtkTreeView *disks_list) uint64_t size; if (asprintf (&size_filename, "/sys/block/%s/size", - all_disks[i]) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + all_disks[i]) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (g_file_get_contents (size_filename, &size_str, NULL, NULL) && sscanf (size_str, "%" SCNu64, &size) == 1) { size /= 2*1024*1024; /* size from kernel is given in sectors? */ - if (asprintf (&size_gb, "%" PRIu64, size) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&size_gb, "%" PRIu64, size) == -1) + error (EXIT_FAILURE, errno, "asprintf"); } if (asprintf (&model_filename, "/sys/block/%s/device/model", - all_disks[i]) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + all_disks[i]) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (g_file_get_contents (model_filename, &model, NULL, NULL)) { /* Need to chomp trailing \n from the content. */ size_t len = strlen (model); @@ -941,10 +936,8 @@ populate_interfaces (GtkTreeView *interfaces_list) "Identify interface", if_name, if_addr ? : _("Unknown"), - if_vendor ? : _("Unknown")) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if_vendor ? : _("Unknown")) == -1) + error (EXIT_FAILURE, errno, "asprintf"); gtk_list_store_append (interfaces_store, &iter); gtk_list_store_set (interfaces_store, &iter, @@ -1071,10 +1064,8 @@ maybe_identify_click (GtkWidget *interfaces_list, GdkEventButton *event, if_name = all_interfaces[row_index]; /* Issue the ethtool command in the background. */ - if (asprintf (&cmd, "ethtool --identify '%s' 10 &", if_name) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&cmd, "ethtool --identify '%s' 10 &", if_name) == -1) + error (EXIT_FAILURE, errno, "asprintf"); printf ("%s\n", cmd); ignore_value (system (cmd)); @@ -1108,10 +1099,8 @@ set_from_ui_generic (char **all, char ***ret, GtkTreeView *list) guestfs_int_free_string_list (*ret); *ret = malloc ((1 + guestfs_int_count_strings (all)) * sizeof (char *)); - if (*ret == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (*ret == NULL) + error (EXIT_FAILURE, errno, "malloc"); i = j = 0; b = gtk_tree_model_get_iter_first (model, &iter); @@ -1172,10 +1161,8 @@ set_network_map_from_ui (struct config *config) config->network_map = malloc ((1 + guestfs_int_count_strings (all_interfaces)) * sizeof (char *)); - if (config->network_map == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (config->network_map == NULL) + error (EXIT_FAILURE, errno, "malloc"); i = j = 0; b = gtk_tree_model_get_iter_first (model, &iter); @@ -1184,10 +1171,8 @@ set_network_map_from_ui (struct config *config) if (s) { assert (all_interfaces[i] != NULL); if (asprintf (&config->network_map[j], "%s:%s", - all_interfaces[i], s) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + all_interfaces[i], s) == -1) + error (EXIT_FAILURE, errno, "asprintf"); ++j; } b = gtk_tree_model_iter_next (model, &iter); @@ -1230,11 +1215,9 @@ concat_warning (char *warning, const char *fs, ...) if (warning == NULL) { warning = strdup (""); - if (warning == NULL) { + if (warning == NULL) malloc_fail: - perror ("malloc"); - exit (EXIT_FAILURE); - } + error (EXIT_FAILURE, errno, "malloc"); } len = strlen (warning); @@ -1410,10 +1393,8 @@ set_log_dir (const char *remote_dir) "is saved to this directory " "on the conversion server:\n" "%s"), - remote_dir ? remote_dir : "") == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + remote_dir ? remote_dir : "") == -1) + error (EXIT_FAILURE, errno, "asprintf"); gtk_label_set_text (GTK_LABEL (log_label), msg); } diff --git a/p2v/kernel-cmdline.c b/p2v/kernel-cmdline.c index 142108ace..ee4c0e9a2 100644 --- a/p2v/kernel-cmdline.c +++ b/p2v/kernel-cmdline.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "p2v.h" @@ -43,10 +44,8 @@ add_null (char ***argv, size_t *lenp) { (*lenp)++; *argv = realloc (*argv, *lenp * sizeof (char *)); - if (*argv == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (*argv == NULL) + error (EXIT_FAILURE, errno, "realloc"); (*argv)[(*lenp)-1] = NULL; } @@ -55,10 +54,8 @@ add_string (char ***argv, size_t *lenp, const char *str, size_t len) { add_null (argv, lenp); (*argv)[(*lenp)-1] = strndup (str, len); - if ((*argv)[(*lenp)-1] == NULL) { - perror ("strndup"); - exit (EXIT_FAILURE); - } + if ((*argv)[(*lenp)-1] == NULL) + error (EXIT_FAILURE, errno, "strndup"); } char ** diff --git a/p2v/kernel.c b/p2v/kernel.c index ab8a7bca0..61fbecd23 100644 --- a/p2v/kernel.c +++ b/p2v/kernel.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -282,10 +283,8 @@ run_command (int verbose, const char *stage, const char *command) } r = system (command); - if (r == -1) { - perror ("system"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, "system: %s", command); if ((WIFEXITED (r) && WEXITSTATUS (r) != 0) || !WIFEXITED (r)) { fprintf (stderr, "%s: %s: unexpected failure of external command\n", guestfs_int_program_name, stage); diff --git a/p2v/main.c b/p2v/main.c index a1cf3dc20..abec9bfcc 100644 --- a/p2v/main.c +++ b/p2v/main.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -228,10 +229,8 @@ set_config_defaults (struct config *config) if (gethostname (hostname, sizeof hostname) == -1) { perror ("gethostname"); /* Generate a simple random name. */ - if (guestfs_int_random_string (hostname, 8) == -1) { - perror ("/dev/urandom"); - exit (EXIT_FAILURE); - } + if (guestfs_int_random_string (hostname, 8) == -1) + error (EXIT_FAILURE, errno, "/dev/random"); } else { char *p; @@ -326,19 +325,15 @@ partition_parent (dev_t part_dev) if (asprintf (&path, "/sys/dev/block/%ju:%ju/../dev", (uintmax_t) major (part_dev), - (uintmax_t) minor (part_dev)) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + (uintmax_t) minor (part_dev)) == -1) + error (EXIT_FAILURE, errno, "asprintf"); fp = fopen (path, "r"); if (fp == NULL) return 0; - if (getline (&content, &len, fp) == -1) { - perror ("getline"); - exit (EXIT_FAILURE); - } + if (getline (&content, &len, fp) == -1) + error (EXIT_FAILURE, errno, "getline"); if (sscanf (content, "%u:%u", &parent_major, &parent_minor) != 2) return 0; @@ -361,10 +356,8 @@ device_contains (const char *dev, dev_t root_device) CLEANUP_FREE char *dev_name = NULL; dev_t root_device_parent; - if (asprintf (&dev_name, "/dev/%s", dev) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&dev_name, "/dev/%s", dev) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (stat (dev_name, &statbuf) == -1) return 0; @@ -399,10 +392,8 @@ find_all_disks (void) * matches the common patterns for disk names. */ dir = opendir ("/sys/block"); - if (!dir) { - perror ("opendir"); - exit (EXIT_FAILURE); - } + if (!dir) + error (EXIT_FAILURE, errno, "opendir"); for (;;) { errno = 0; @@ -422,10 +413,8 @@ find_all_disks (void) nr_disks++; all_disks = realloc (all_disks, sizeof (char *) * (nr_disks + 1)); - if (!all_disks) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (!all_disks) + error (EXIT_FAILURE, errno, "realloc"); all_disks[nr_disks-1] = strdup (d->d_name); @@ -439,26 +428,20 @@ find_all_disks (void) nr_removable++; all_removable = realloc (all_removable, sizeof (char *) * (nr_removable + 1)); - if (!all_removable) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (!all_removable) + error (EXIT_FAILURE, errno, "realloc"); all_removable[nr_removable-1] = strdup (d->d_name); all_removable[nr_removable] = NULL; } } /* Check readdir didn't fail */ - if (errno != 0) { - perror ("readdir: /sys/block"); - exit (EXIT_FAILURE); - } + if (errno != 0) + error (EXIT_FAILURE, errno, "readdir: %s", "/sys/block"); /* Close the directory handle */ - if (closedir (dir) == -1) { - perror ("closedir: /sys/block"); - exit (EXIT_FAILURE); - } + if (closedir (dir) == -1) + error (EXIT_FAILURE, errno, "closedir: %s", "/sys/block"); if (all_disks) qsort (all_disks, nr_disks, sizeof (char *), compare); @@ -477,10 +460,8 @@ find_all_interfaces (void) * /sys/class/net which matches some common patterns. */ dir = opendir ("/sys/class/net"); - if (!dir) { - perror ("opendir"); - exit (EXIT_FAILURE); - } + if (!dir) + error (EXIT_FAILURE, errno, "opendir: %s", "/sys/class/net"); for (;;) { errno = 0; @@ -499,26 +480,20 @@ find_all_interfaces (void) nr_interfaces++; all_interfaces = realloc (all_interfaces, sizeof (char *) * (nr_interfaces + 1)); - if (!all_interfaces) { - perror ("realloc"); - exit (EXIT_FAILURE); - } + if (!all_interfaces) + error (EXIT_FAILURE, errno, "realloc"); all_interfaces[nr_interfaces-1] = strdup (d->d_name); all_interfaces[nr_interfaces] = NULL; } } /* Check readdir didn't fail */ - if (errno != 0) { - perror ("readdir: /sys/class/net"); - exit (EXIT_FAILURE); - } + if (errno != 0) + error (EXIT_FAILURE, errno, "readdir: %s", "/sys/class/net"); /* Close the directory handle */ - if (closedir (dir) == -1) { - perror ("closedir: /sys/class/net"); - exit (EXIT_FAILURE); - } + if (closedir (dir) == -1) + error (EXIT_FAILURE, errno, "closedir: %s", "/sys/class/net"); if (all_interfaces) qsort (all_interfaces, nr_interfaces, sizeof (char *), compare); diff --git a/p2v/ssh.c b/p2v/ssh.c index 6aeafd710..6ddfcb28f 100644 --- a/p2v/ssh.c +++ b/p2v/ssh.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -78,11 +79,9 @@ set_ssh_error (const char *fs, ...) len = vasprintf (&msg, fs, args); va_end (args); - if (len < 0) { - perror ("vasprintf"); - fprintf (stderr, "original error format string: %s\n", fs); - exit (EXIT_FAILURE); - } + if (len < 0) + error (EXIT_FAILURE, errno, + "vasprintf (original error format string: %s)", fs); free (ssh_error); ssh_error = msg; @@ -177,15 +176,11 @@ curl_download (const char *url, const char *local_file) /* Use a secure curl config file because escaping is easier. */ fd = mkstemp (curl_config_file); - if (fd == -1) { - perror ("mkstemp"); - exit (EXIT_FAILURE); - } + if (fd == -1) + error (EXIT_FAILURE, errno, "mkstemp: %s", curl_config_file); fp = fdopen (fd, "w"); - if (fp == NULL) { - perror ("fdopen"); - exit (EXIT_FAILURE); - } + if (fp == NULL) + error (EXIT_FAILURE, errno, "fdopen: %s", curl_config_file); fprintf (fp, "url = \""); len = strlen (url); for (i = 0; i < len; ++i) { @@ -204,17 +199,13 @@ curl_download (const char *url, const char *local_file) /* Run curl to download the URL to a file. */ if (asprintf (&curl_cmd, "curl -f -o %s -K %s", - local_file, curl_config_file) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + local_file, curl_config_file) == -1) + error (EXIT_FAILURE, errno, "asprintf"); r = system (curl_cmd); /* unlink (curl_config_file); - useful for debugging */ - if (r == -1) { - perror ("system"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, "system: %s", curl_cmd); /* Did curl subprocess fail? */ if (WIFEXITED (r) && WEXITSTATUS (r) != 0) { @@ -246,15 +237,11 @@ cache_ssh_identity (struct config *config) /* Generate a random filename. */ free (config->identity_file); config->identity_file = strdup ("/tmp/id.XXXXXX"); - if (config->identity_file == NULL) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (config->identity_file == NULL) + error (EXIT_FAILURE, errno, "strdup"); fd = mkstemp (config->identity_file); - if (fd == -1) { - perror ("mkstemp"); - exit (EXIT_FAILURE); - } + if (fd == -1) + error (EXIT_FAILURE, errno, "mkstemp"); close (fd); /* Curl download URL to file. */ @@ -299,10 +286,8 @@ start_ssh (struct config *config, char **extra_args, int wait_prompt) else nr_args += 13; args = malloc (sizeof (char *) * nr_args); - if (args == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (args == NULL) + error (EXIT_FAILURE, errno, "malloc"); j = 0; args[j++] = "ssh"; @@ -716,16 +701,12 @@ add_option (const char *type, char ***drivers, const char *name, size_t len) n++; *drivers = realloc (*drivers, (n+1) * sizeof (char *)); - if (*drivers == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (*drivers == NULL) + error (EXIT_FAILURE, errno, "malloc"); (*drivers)[n-1] = strndup (name, len); - if ((*drivers)[n-1] == NULL) { - perror ("strndup"); - exit (EXIT_FAILURE); - } + if ((*drivers)[n-1] == NULL) + error (EXIT_FAILURE, errno, "strndup"); (*drivers)[n] = NULL; #if DEBUG_STDERR diff --git a/p2v/utils.c b/p2v/utils.c index 3781a8d00..183e4065a 100644 --- a/p2v/utils.c +++ b/p2v/utils.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include @@ -48,10 +50,8 @@ get_if_addr (const char *if_name) size_t len = 0; ssize_t n; - if (asprintf (&path, "/sys/class/net/%s/address", if_name) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&path, "/sys/class/net/%s/address", if_name) == -1) + error (EXIT_FAILURE, errno, "asprintf"); fp = fopen (path, "r"); if (fp == NULL) return NULL; @@ -78,10 +78,8 @@ get_if_vendor (const char *if_name, int truncate) ssize_t n; char vendor[5]; - if (asprintf (&path, "/sys/class/net/%s/device/vendor", if_name) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&path, "/sys/class/net/%s/device/vendor", if_name) == -1) + error (EXIT_FAILURE, errno, "asprintf"); fp = fopen (path, "r"); if (fp == NULL) { perror (path); diff --git a/rescue/rescue.c b/rescue/rescue.c index 8180ba002..37a0c3f92 100644 --- a/rescue/rescue.c +++ b/rescue/rescue.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -251,24 +252,18 @@ main (int argc, char *argv[]) if (strchr (argv[optind], '/') || access (argv[optind], F_OK) == 0) { /* simulate -a option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_a; drv->a.filename = strdup (argv[optind]); - if (!drv->a.filename) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!drv->a.filename) + error (EXIT_FAILURE, errno, "strdup"); drv->next = drvs; drvs = drv; } else { /* simulate -d option */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_d; drv->d.guest = argv[optind]; drv->next = drvs; @@ -530,10 +525,8 @@ add_scratch_disk (struct drv **drvs) /* Add the scratch disk to the drives list. */ drv = calloc (1, sizeof (struct drv)); - if (!drv) { - perror ("calloc"); - exit (EXIT_FAILURE); - } + if (!drv) + error (EXIT_FAILURE, errno, "calloc"); drv->type = drv_scratch; drv->nr_drives = -1; drv->scratch.size = INT64_C (10737418240); diff --git a/test-tool/test-tool.c b/test-tool/test-tool.c index 495316b17..1aa9bc43f 100644 --- a/test-tool/test-tool.c +++ b/test-tool/test-tool.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include #include @@ -366,10 +368,8 @@ set_qemu (guestfs_h *g, const char *path, int use_wrapper) } /* This should be a source directory, so check it. */ - if (asprintf (&buffer, "%s/pc-bios", path) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&buffer, "%s/pc-bios", path) == -1) + error (EXIT_FAILURE, errno, "asprintf"); if (stat (buffer, &statbuf) == -1 || !S_ISDIR (statbuf.st_mode)) { fprintf (stderr, @@ -382,10 +382,8 @@ set_qemu (guestfs_h *g, const char *path, int use_wrapper) /* Make a wrapper script. */ fd = mkstemp (qemuwrapper); - if (fd == -1) { - perror (qemuwrapper); - exit (EXIT_FAILURE); - } + if (fd == -1) + error (EXIT_FAILURE, errno, "mkstemp: %s", qemuwrapper); fchmod (fd, 0700); diff --git a/tests/c-api/test-add-libvirt-dom.c b/tests/c-api/test-add-libvirt-dom.c index 4c061ec3b..566a3de3d 100644 --- a/tests/c-api/test-add-libvirt-dom.c +++ b/tests/c-api/test-add-libvirt-dom.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include @@ -100,10 +102,8 @@ main (int argc, char *argv[]) * directory. */ fp = fopen ("test-add-libvirt-dom.xml", "w"); - if (fp == NULL) { - perror ("test-add-libvirt-dom.xml"); - exit (EXIT_FAILURE); - } + if (fp == NULL) + error (EXIT_FAILURE, errno, "fopen: %s", "test-add-libvirt-dom.xml"); make_test_xml (fp, cwd); fclose (fp); diff --git a/tests/c-api/test-debug-to-file.c b/tests/c-api/test-debug-to-file.c index 99e14e829..c36ae14db 100644 --- a/tests/c-api/test-debug-to-file.c +++ b/tests/c-api/test-debug-to-file.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include "guestfs.h" #include "guestfs-internal-frontend.h" @@ -54,10 +56,8 @@ main (int argc, char *argv[]) FILE *debugfp; debugfp = fopen (filename, "w"); - if (debugfp == NULL) { - perror (filename); - exit (EXIT_FAILURE); - } + if (debugfp == NULL) + error (EXIT_FAILURE, errno, "fopen: %s", filename); g = guestfs_create (); if (g == NULL) { diff --git a/tests/c-api/test-user-cancel.c b/tests/c-api/test-user-cancel.c index c0e2540e1..029c405e6 100644 --- a/tests/c-api/test-user-cancel.c +++ b/tests/c-api/test-user-cancel.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -99,17 +100,13 @@ main (int argc, char *argv[]) data.g = g; data.direction = DIRECTION_UP; - if (pipe (fds) == -1) { - perror ("pipe"); - exit (EXIT_FAILURE); - } + if (pipe (fds) == -1) + error (EXIT_FAILURE, errno, "pipe"); /* We don't want the pipe to be passed to subprocesses. */ if (fcntl (fds[0], F_SETFD, FD_CLOEXEC) == -1 || - fcntl (fds[1], F_SETFD, FD_CLOEXEC) == -1) { - perror ("fcntl"); - exit (EXIT_FAILURE); - } + fcntl (fds[1], F_SETFD, FD_CLOEXEC) == -1) + error (EXIT_FAILURE, errno, "fcntl"); data.fd = fds[1]; snprintf (dev_fd, sizeof dev_fd, "/dev/fd/%d", fds[0]); @@ -167,17 +164,13 @@ main (int argc, char *argv[]) data.g = g; data.direction = DIRECTION_DOWN; - if (pipe (fds) == -1) { - perror ("pipe"); - exit (EXIT_FAILURE); - } + if (pipe (fds) == -1) + error (EXIT_FAILURE, errno, "pipe"); /* We don't want the pipe to be passed to subprocesses. */ if (fcntl (fds[0], F_SETFD, FD_CLOEXEC) == -1 || - fcntl (fds[1], F_SETFD, FD_CLOEXEC) == -1) { - perror ("fcntl"); - exit (EXIT_FAILURE); - } + fcntl (fds[1], F_SETFD, FD_CLOEXEC) == -1) + error (EXIT_FAILURE, errno, "fcntl"); data.fd = fds[0]; snprintf (dev_fd, sizeof dev_fd, "/dev/fd/%d", fds[1]); @@ -241,10 +234,9 @@ start_test_thread (void *datav) n = MIN (sizeof buffer, (size_t) (data->cancel_posn - data->transfer_size)); r = write (data->fd, buffer, n); - if (r == -1) { - perror ("test thread: write to pipe before user cancel"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, + "test thread: write to pipe before user cancel"); data->transfer_size += r; } @@ -259,10 +251,9 @@ start_test_thread (void *datav) guestfs_user_cancel (data->g); r = write (data->fd, buffer, sizeof buffer); - if (r == -1) { - perror ("test thread: write to pipe after user cancel"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, + "test thread: write to pipe after user cancel"); data->transfer_size += r; } } else { /* thread is reading */ @@ -271,14 +262,12 @@ start_test_thread (void *datav) n = MIN (sizeof buffer, (size_t) (data->cancel_posn - data->transfer_size)); r = read (data->fd, buffer, n); - if (r == -1) { - perror ("test thread: read from pipe before user cancel"); - exit (EXIT_FAILURE); - } - if (r == 0) { - perror ("test thread: unexpected end of file before user cancel"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, + "test thread: read from pipe before user cancel"); + if (r == 0) + error (EXIT_FAILURE, errno, + "test thread: unexpected end of file before user cancel"); data->transfer_size += r; } @@ -288,10 +277,9 @@ start_test_thread (void *datav) /* Keep sinking data as long as the main thread is writing. */ while (1) { r = read (data->fd, buffer, sizeof buffer); - if (r == -1) { - perror ("test thread: read from pipe after user cancel"); - exit (EXIT_FAILURE); - } + if (r == -1) + error (EXIT_FAILURE, errno, + "test thread: read from pipe after user cancel"); if (r == 0) break; data->transfer_size += r; diff --git a/tests/c-api/tests-main.c b/tests/c-api/tests-main.c index 85208b16d..dd5c2b6dc 100644 --- a/tests/c-api/tests-main.c +++ b/tests/c-api/tests-main.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -271,18 +273,12 @@ md5sum (const char *filename, char *result) char cmd[256]; snprintf (cmd, sizeof cmd, "md5sum %s", filename); FILE *pp = popen (cmd, "r"); - if (pp == NULL) { - perror (cmd); - exit (EXIT_FAILURE); - } - if (fread (result, 1, 32, pp) != 32) { - perror ("md5sum: fread"); - exit (EXIT_FAILURE); - } - if (pclose (pp) != 0) { - perror ("pclose"); - exit (EXIT_FAILURE); - } + if (pp == NULL) + error (EXIT_FAILURE, errno, "popen: %s", cmd); + if (fread (result, 1, 32, pp) != 32) + error (EXIT_FAILURE, errno, "md5sum: fread"); + if (pclose (pp) != 0) + error (EXIT_FAILURE, errno, "pclose"); result[32] = '\0'; } @@ -382,17 +378,13 @@ substitute_srcdir (const char *path) exit (EXIT_FAILURE); } - if (asprintf (&ret, "%s%s", srcdir, path + 7) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&ret, "%s%s", srcdir, path + 7) == -1) + error (EXIT_FAILURE, errno, "asprintf"); } else { ret = strdup (path); - if (!ret) { - perror ("strdup"); - exit (EXIT_FAILURE); - } + if (!ret) + error (EXIT_FAILURE, errno, "strdup"); } return ret; diff --git a/tests/events/test-libvirt-auth-callbacks.c b/tests/events/test-libvirt-auth-callbacks.c index 383f20f70..86e26f8f6 100644 --- a/tests/events/test-libvirt-auth-callbacks.c +++ b/tests/events/test-libvirt-auth-callbacks.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include @@ -71,15 +73,11 @@ main (int argc, char *argv[]) } cwd = getcwd (NULL, 0); - if (cwd == NULL) { - perror ("getcwd"); - exit (EXIT_FAILURE); - } + if (cwd == NULL) + error (EXIT_FAILURE, errno, "getcwd"); - if (asprintf (&test_uri, "test://%s/%s/libvirt-auth.xml", cwd, srcdir) == -1) { - perror ("asprintf"); - exit (EXIT_FAILURE); - } + if (asprintf (&test_uri, "test://%s/%s/libvirt-auth.xml", cwd, srcdir) == -1) + error (EXIT_FAILURE, errno, "asprintf"); free (cwd); diff --git a/tests/mountable/test-internal-parse-mountable.c b/tests/mountable/test-internal-parse-mountable.c index ce2f62dd0..ab86ccb99 100644 --- a/tests/mountable/test-internal-parse-mountable.c +++ b/tests/mountable/test-internal-parse-mountable.c @@ -18,11 +18,13 @@ #include -#include -#include #include #include +#include #include +#include +#include +#include #include "guestfs.h" #include "guestfs-internal-all.h" @@ -44,10 +46,8 @@ main (int argc, char *argv[]) } g = guestfs_create (); - if (g == NULL) { - perror ("could not create handle"); - exit (EXIT_FAILURE); - } + if (g == NULL) + error (EXIT_FAILURE, errno, "guestfs_create"); if (guestfs_add_drive_scratch (g, 1024*1024*1024, -1) == -1) { error: diff --git a/tests/protocol/test-error-messages.c b/tests/protocol/test-error-messages.c index 3d668c043..57a4a21d8 100644 --- a/tests/protocol/test-error-messages.c +++ b/tests/protocol/test-error-messages.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "guestfs.h" #include "guestfs_protocol.h" /* For GUESTFS_ERROR_LEN. */ @@ -45,10 +46,8 @@ main (int argc, char *argv[]) char *args[2]; g = guestfs_create (); - if (g == NULL) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (g == NULL) + error (EXIT_FAILURE, errno, "guestfs_create"); if (guestfs_add_drive (g, "/dev/null") == -1) exit (EXIT_FAILURE); diff --git a/tests/qemu/qemu-boot.c b/tests/qemu/qemu-boot.c index 94d2f971a..fe7ce9592 100644 --- a/tests/qemu/qemu-boot.c +++ b/tests/qemu/qemu-boot.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "guestfs.h" @@ -197,10 +198,8 @@ run_test (size_t P) thread_data = malloc (sizeof (struct thread_data) * P); threads = malloc (sizeof (pthread_t) * P); - if (thread_data == NULL || threads == NULL) { - perror ("malloc"); - exit (EXIT_FAILURE); - } + if (thread_data == NULL || threads == NULL) + error (EXIT_FAILURE, errno, "malloc"); /* Start the worker threads. */ for (i = 0; i < P; ++i) { diff --git a/tests/qemu/qemu-speed-test.c b/tests/qemu/qemu-speed-test.c index 1d3c5a37e..375a9a41e 100644 --- a/tests/qemu/qemu-speed-test.c +++ b/tests/qemu/qemu-speed-test.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -253,24 +254,16 @@ test_virtio_serial (void) * source file is a regular file. */ fd = mkstemp (tmpfile); - if (fd == -1) { - perror ("mkstemp"); - exit (EXIT_FAILURE); - } - if (ftruncate (fd, TEST_SERIAL_MAX_SIZE) == -1) { - perror ("ftruncate"); - exit (EXIT_FAILURE); - } - if (close (fd) == -1) { - perror ("close"); - exit (EXIT_FAILURE); - } + if (fd == -1) + error (EXIT_FAILURE, errno, "mkstemp: %s", tmpfile); + if (ftruncate (fd, TEST_SERIAL_MAX_SIZE) == -1) + error (EXIT_FAILURE, errno, "ftruncate"); + if (close (fd) == -1) + error (EXIT_FAILURE, errno, "close"); g = guestfs_create (); - if (!g) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (!g) + error (EXIT_FAILURE, errno, "guestfs_create"); if (guestfs_add_drive_scratch (g, INT64_C (100*1024*1024), -1) == -1) exit (EXIT_FAILURE); @@ -395,19 +388,15 @@ test_block_device (void) snprintf (tbuf, sizeof tbuf, "%d", t); g = guestfs_create (); - if (!g) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (!g) + error (EXIT_FAILURE, errno, "guestfs_create"); /* Create a fully allocated backing file. Note we are not testing * the speed of allocation on the host. */ fd = mkstemp (tmpfile); - if (fd == -1) { - perror ("mkstemp"); - exit (EXIT_FAILURE); - } + if (fd == -1) + error (EXIT_FAILURE, errno, "mkstemp: %s", tmpfile); close (fd); if (guestfs_disk_create (g, tmpfile, "raw", diff --git a/tests/regressions/rhbz1055452.c b/tests/regressions/rhbz1055452.c index f65686184..79cd54033 100644 --- a/tests/regressions/rhbz1055452.c +++ b/tests/regressions/rhbz1055452.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "guestfs.h" #include "guestfs-internal-frontend.h" @@ -49,10 +51,8 @@ main (int argc, char *argv[]) setenv (var[i], value[j], 1); g = guestfs_create_flags (GUESTFS_CREATE_NO_ENVIRONMENT); - if (!g) { - perror ("guestfs_create_flags"); - exit (EXIT_FAILURE); - } + if (!g) + error (EXIT_FAILURE, errno, "guestfs_create_flags"); if (guestfs_parse_environment (g) == -1) exit (EXIT_FAILURE); @@ -66,10 +66,8 @@ main (int argc, char *argv[]) /* Check that guestfs_get_attach_method returns "appliance" ... */ g = guestfs_create (); - if (!g) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (!g) + error (EXIT_FAILURE, errno, "guestfs_create"); if (guestfs_set_backend (g, "direct") == -1) exit (EXIT_FAILURE); diff --git a/tests/regressions/rhbz790721.c b/tests/regressions/rhbz790721.c index 37f0754f1..ae44e68b2 100644 --- a/tests/regressions/rhbz790721.c +++ b/tests/regressions/rhbz790721.c @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -61,10 +62,8 @@ main (int argc, char *argv[]) /* Test is only meaningful if the backend "direct" is used. */ g = guestfs_create (); - if (!g) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (!g) + error (EXIT_FAILURE, errno, "guestfs_create"); backend = guestfs_get_backend (g); if (backend == NULL) { guestfs_close (g); diff --git a/tests/regressions/rhbz914931.c b/tests/regressions/rhbz914931.c index bce292452..61b81ba7e 100644 --- a/tests/regressions/rhbz914931.c +++ b/tests/regressions/rhbz914931.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "guestfs.h" #include "guestfs-internal-frontend.h" @@ -48,10 +49,8 @@ main (int argc, char *argv[]) } g = guestfs_create (); - if (!g) { - perror ("guestfs_create"); - exit (EXIT_FAILURE); - } + if (!g) + error (EXIT_FAILURE, errno, "guestfs_create"); if (guestfs_add_drive_opts (g, "/dev/null", GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",