@@ -584,24 +584,44 @@ static void tcx_screen_dump(void *opaque, const char *filename, bool cswitch,
uint8_t *d, *d1, v;
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;
for(y = 0; y < s->height; y++) {
d = d1;
for(x = 0; x < s->width; x++) {
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;
+ }
+
d++;
}
d1 += MAXX;
}
+
+out:
fclose(f);
- return;
+ if (error_is_set(errp)) {
+ unlink(filename);
+ }
}
static void tcx24_screen_dump(void *opaque, const char *filename, bool cswitch,
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 | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-)