@@ -613,10 +613,14 @@ static void tcx24_screen_dump(void *opaque, const char *filename, bool cswitch,
uint32_t *s24, *cptr, dval;
int y, x;
- f = fopen(filename, "wb");
- if (!f)
+ f = qemu_fopen_err(filename, "wb", errp);
+ if (error_is_set(errp)) {
return;
- fprintf(f, "P6\n%d %d\n%d\n", s->width, s->height, 255);
+ }
+ qemu_fprintf_err(errp, f, "P6\n%d %d\n%d\n", s->width, s->height, 255);
+ if (error_is_set(errp)) {
+ goto out;
+ }
d1 = s->vram;
s24 = s->vram24;
cptr = s->cplane;
@@ -625,20 +629,46 @@ static void tcx24_screen_dump(void *opaque, const char *filename, bool cswitch,
for(x = 0; x < s->width; x++, d++, s24++) {
if ((*cptr++ & 0xff000000) == 0x03000000) { // 24-bit direct
dval = *s24 & 0x00ffffff;
- fputc((dval >> 16) & 0xff, f);
- fputc((dval >> 8) & 0xff, f);
- fputc(dval & 0xff, f);
+ qemu_fputc_err((dval >> 16) & 0xff, f, errp);
+ if (error_is_set(errp)) {
+ goto out;
+ }
+
+ qemu_fputc_err((dval >> 8) & 0xff, f, errp);
+ if (error_is_set(errp)) {
+ goto out;
+ }
+
+ qemu_fputc_err(dval & 0xff, f, errp);
+ if (error_is_set(errp)) {
+ goto out;
+ }
} else {
v = *d;
- fputc(s->r[v], f);
- fputc(s->g[v], f);
- fputc(s->b[v], f);
+ qemu_fputc_err(s->r[v], f, errp);
+ if (error_is_set(errp)) {
+ goto out;
+ }
+
+ qemu_fputc_err(s->g[v], f, errp);
+ if (error_is_set(errp)) {
+ goto out;
+ }
+
+ qemu_fputc_err(s->b[v], f, errp);
+ if (error_is_set(errp)) {
+ goto out;
+ }
}
}
d1 += MAXX;
}
+
+out:
fclose(f);
- return;
+ if (error_is_set(errp)) {
+ unlink(filename);
+ }
}
static Property tcx_properties[] = {
This is done by using qemu_fopen_err(), qemu_fputc_err() and handling errors appropriately (eg. removing the screendump file if the operation fails). Note that the error is not passed up yet, as vga_hw_screen_dump() still calls consoles[0]->hw_screen_dump() with errp=NULL. The error will be propagated up when screendump is converted to the QAPI. That will be done by a later commit. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> --- hw/tcx.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-)