g364fb: g364fb_screen_dump(): add error handling

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Luiz Capitulino 2012-05-24 11:28:17 -03:00
parent d9c7ebb100
commit 61a3f955c1

View file

@ -293,7 +293,7 @@ static void g364fb_screen_dump(void *opaque, const char *filename, bool cswitch,
Error **errp) Error **errp)
{ {
G364State *s = opaque; G364State *s = opaque;
int y, x; int ret, y, x;
uint8_t index; uint8_t index;
uint8_t *data_buffer; uint8_t *data_buffer;
FILE *f; FILE *f;
@ -301,35 +301,63 @@ static void g364fb_screen_dump(void *opaque, const char *filename, bool cswitch,
qemu_flush_coalesced_mmio_buffer(); qemu_flush_coalesced_mmio_buffer();
if (s->depth != 8) { if (s->depth != 8) {
error_report("g364: unknown guest depth %d", s->depth); error_setg(errp, "g364: unknown guest depth %d", s->depth);
return; return;
} }
f = fopen(filename, "wb"); f = fopen(filename, "wb");
if (!f) if (!f) {
error_setg(errp, "failed to open file '%s': %s", filename,
strerror(errno));
return; return;
}
if (s->ctla & CTLA_FORCE_BLANK) { if (s->ctla & CTLA_FORCE_BLANK) {
/* blank screen */ /* blank screen */
fprintf(f, "P4\n%d %d\n", ret = fprintf(f, "P4\n%d %d\n", s->width, s->height);
s->width, s->height); if (ret < 0) {
goto write_err;
}
for (y = 0; y < s->height; y++) for (y = 0; y < s->height; y++)
for (x = 0; x < s->width; x++) for (x = 0; x < s->width; x++) {
fputc(0, f); ret = fputc(0, f);
if (ret == EOF) {
goto write_err;
}
}
} else { } else {
data_buffer = s->vram + s->top_of_screen; data_buffer = s->vram + s->top_of_screen;
fprintf(f, "P6\n%d %d\n%d\n", ret = fprintf(f, "P6\n%d %d\n%d\n", s->width, s->height, 255);
s->width, s->height, 255); if (ret < 0) {
goto write_err;
}
for (y = 0; y < s->height; y++) for (y = 0; y < s->height; y++)
for (x = 0; x < s->width; x++, data_buffer++) { for (x = 0; x < s->width; x++, data_buffer++) {
index = *data_buffer; index = *data_buffer;
fputc(s->color_palette[index][0], f); ret = fputc(s->color_palette[index][0], f);
fputc(s->color_palette[index][1], f); if (ret == EOF) {
fputc(s->color_palette[index][2], f); goto write_err;
}
ret = fputc(s->color_palette[index][1], f);
if (ret == EOF) {
goto write_err;
}
ret = fputc(s->color_palette[index][2], f);
if (ret == EOF) {
goto write_err;
}
} }
} }
out:
fclose(f); fclose(f);
return;
write_err:
error_setg(errp, "failed to write to file '%s': %s", filename,
strerror(errno));
unlink(filename);
goto out;
} }
/* called for accesses to io ports */ /* called for accesses to io ports */