omap_lcdc: omap_ppm_save(): add error handling

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Luiz Capitulino 2012-05-24 11:24:34 -03:00
parent 8dc4cc7bb5
commit d9c7ebb100

View file

@ -224,18 +224,24 @@ static void omap_update_display(void *opaque)
omap_lcd->invalidate = 0; omap_lcd->invalidate = 0;
} }
static int omap_ppm_save(const char *filename, uint8_t *data, static void omap_ppm_save(const char *filename, uint8_t *data,
int w, int h, int linesize) int w, int h, int linesize, Error **errp)
{ {
FILE *f; FILE *f;
uint8_t *d, *d1; uint8_t *d, *d1;
unsigned int v; unsigned int v;
int y, x, bpp; int ret, y, x, bpp;
f = fopen(filename, "wb"); f = fopen(filename, "wb");
if (!f) if (!f) {
return -1; error_setg(errp, "failed to open file '%s': %s", filename,
fprintf(f, "P6\n%d %d\n%d\n", w, h, 255); strerror(errno));
return;
}
ret = fprintf(f, "P6\n%d %d\n%d\n", w, h, 255);
if (ret < 0) {
goto write_err;
}
d1 = data; d1 = data;
bpp = linesize / w; bpp = linesize / w;
for (y = 0; y < h; y ++) { 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; v = *(uint32_t *) d;
switch (bpp) { switch (bpp) {
case 2: case 2:
fputc((v >> 8) & 0xf8, f); ret = fputc((v >> 8) & 0xf8, f);
fputc((v >> 3) & 0xfc, f); if (ret == EOF) {
fputc((v << 3) & 0xf8, f); 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; break;
case 3: case 3:
case 4: case 4:
default: default:
fputc((v >> 16) & 0xff, f); ret = fputc((v >> 16) & 0xff, f);
fputc((v >> 8) & 0xff, f); if (ret == EOF) {
fputc((v) & 0xff, f); 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; break;
} }
d += bpp; d += bpp;
} }
d1 += linesize; d1 += linesize;
} }
out:
fclose(f); 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, 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)) if (omap_lcd && ds_get_data(omap_lcd->state))
omap_ppm_save(filename, ds_get_data(omap_lcd->state), omap_ppm_save(filename, ds_get_data(omap_lcd->state),
omap_lcd->width, omap_lcd->height, 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) { static void omap_invalidate_display(void *opaque) {