Commit d9c7ebb1 authored by Luiz Capitulino's avatar Luiz Capitulino
Browse files

omap_lcdc: omap_ppm_save(): add error handling

parent 8dc4cc7b
Loading
Loading
Loading
Loading
+45 −14
Original line number Diff line number Diff line
@@ -224,18 +224,24 @@ static void omap_update_display(void *opaque)
    omap_lcd->invalidate = 0;
}

static int omap_ppm_save(const char *filename, uint8_t *data,
                    int w, int h, int linesize)
static void omap_ppm_save(const char *filename, uint8_t *data,
                    int w, int h, int linesize, Error **errp)
{
    FILE *f;
    uint8_t *d, *d1;
    unsigned int v;
    int y, x, bpp;
    int ret, y, x, bpp;

    f = fopen(filename, "wb");
    if (!f)
        return -1;
    fprintf(f, "P6\n%d %d\n%d\n", w, h, 255);
    if (!f) {
        error_setg(errp, "failed to open file '%s': %s", filename,
                   strerror(errno));
        return;
    }
    ret = fprintf(f, "P6\n%d %d\n%d\n", w, h, 255);
    if (ret < 0) {
        goto write_err;
    }
    d1 = data;
    bpp = linesize / w;
    for (y = 0; y < h; y ++) {
@@ -244,24 +250,49 @@ static int omap_ppm_save(const char *filename, uint8_t *data,
            v = *(uint32_t *) d;
            switch (bpp) {
            case 2:
                fputc((v >> 8) & 0xf8, f);
                fputc((v >> 3) & 0xfc, f);
                fputc((v << 3) & 0xf8, f);
                ret = fputc((v >> 8) & 0xf8, f);
                if (ret == EOF) {
                    goto write_err;
                }
                ret = fputc((v >> 3) & 0xfc, f);
                if (ret == EOF) {
                    goto write_err;
                }
                ret = fputc((v << 3) & 0xf8, f);
                if (ret == EOF) {
                    goto write_err;
                }
                break;
            case 3:
            case 4:
            default:
                fputc((v >> 16) & 0xff, f);
                fputc((v >> 8) & 0xff, f);
                fputc((v) & 0xff, f);
                ret = fputc((v >> 16) & 0xff, f);
                if (ret == EOF) {
                    goto write_err;
                }
                ret = fputc((v >> 8) & 0xff, f);
                if (ret == EOF) {
                    goto write_err;
                }
                ret = fputc((v) & 0xff, f);
                if (ret == EOF) {
                    goto write_err;
                }
                break;
            }
            d += bpp;
        }
        d1 += linesize;
    }
out:
    fclose(f);
    return 0;
    return;

write_err:
    error_setg(errp, "failed to write to file '%s': %s", filename,
               strerror(errno));
    unlink(filename);
    goto out;
}

static void omap_screen_dump(void *opaque, const char *filename, bool cswitch,
@@ -273,7 +304,7 @@ static void omap_screen_dump(void *opaque, const char *filename, bool cswitch,
    if (omap_lcd && ds_get_data(omap_lcd->state))
        omap_ppm_save(filename, ds_get_data(omap_lcd->state),
                    omap_lcd->width, omap_lcd->height,
                    ds_get_linesize(omap_lcd->state));
                    ds_get_linesize(omap_lcd->state), errp);
}

static void omap_invalidate_display(void *opaque) {