Commit cb7cf0e3 authored by Ryota Ozaki's avatar Ryota Ozaki Committed by Kevin Wolf
Browse files

qemu-nbd: Improve error reporting



- use err(3) instead of errx(3) if errno is available
  to report why failed
- let fail prior to daemon(3) if opening a nbd file
  is likely to fail after daemonizing to avoid silent
  failure exit
- add missing 'ret = 1' when unix_socket_outgoing failed

Signed-off-by: default avatarRyota Ozaki <ozaki.ryota@gmail.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 3abbc4d9
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -112,9 +112,12 @@ static int find_partition(BlockDriverState *bs, int partition,
    uint8_t data[512];
    int i;
    int ext_partnum = 4;
    int ret;

    if (bdrv_read(bs, 0, data, 1))
        errx(EXIT_FAILURE, "error while reading");
    if ((ret = bdrv_read(bs, 0, data, 1)) < 0) {
        errno = -ret;
        err(EXIT_FAILURE, "error while reading");
    }

    if (data[510] != 0x55 || data[511] != 0xaa) {
        errno = -EINVAL;
@@ -132,8 +135,10 @@ static int find_partition(BlockDriverState *bs, int partition,
            uint8_t data1[512];
            int j;

            if (bdrv_read(bs, mbr[i].start_sector_abs, data1, 1))
                errx(EXIT_FAILURE, "error while reading");
            if ((ret = bdrv_read(bs, mbr[i].start_sector_abs, data1, 1)) < 0) {
                errno = -ret;
                err(EXIT_FAILURE, "error while reading");
            }

            for (j = 0; j < 4; j++) {
                read_partition(&data1[446 + 16 * j], &ext[j]);
@@ -316,7 +321,7 @@ int main(int argc, char **argv)
    if (disconnect) {
        fd = open(argv[optind], O_RDWR);
        if (fd == -1)
            errx(EXIT_FAILURE, "Cannot open %s", argv[optind]);
            err(EXIT_FAILURE, "Cannot open %s", argv[optind]);

        nbd_disconnect(fd);

@@ -333,23 +338,30 @@ int main(int argc, char **argv)
    if (bs == NULL)
        return 1;

    if (bdrv_open(bs, argv[optind], flags, NULL) < 0)
        return 1;
    if ((ret = bdrv_open(bs, argv[optind], flags, NULL)) < 0) {
        errno = -ret;
        err(EXIT_FAILURE, "Failed to bdrv_open '%s'", argv[optind]);
    }

    fd_size = bs->total_sectors * 512;

    if (partition != -1 &&
        find_partition(bs, partition, &dev_offset, &fd_size))
        errx(EXIT_FAILURE, "Could not find partition %d", partition);
        err(EXIT_FAILURE, "Could not find partition %d", partition);

    if (device) {
        pid_t pid;
        int sock;

        /* want to fail before daemonizing */
        if (access(device, R_OK|W_OK) == -1) {
            err(EXIT_FAILURE, "Could not access '%s'", device);
        }

        if (!verbose) {
            /* detach client and server */
            if (daemon(0, 0) == -1) {
                errx(EXIT_FAILURE, "Failed to daemonize");
                err(EXIT_FAILURE, "Failed to daemonize");
            }
        }

@@ -372,8 +384,10 @@ int main(int argc, char **argv)
            do {
                sock = unix_socket_outgoing(socket);
                if (sock == -1) {
                    if (errno != ENOENT && errno != ECONNREFUSED)
                    if (errno != ENOENT && errno != ECONNREFUSED) {
                        ret = 1;
                        goto out;
                    }
                    sleep(1);	/* wait children */
                }
            } while (sock == -1);