diff mbox

[6/9] omap_lcdc: omap_ppm_save(): add error handling

Message ID 1346269986-13539-7-git-send-email-lcapitulino@redhat.com
State New
Headers show

Commit Message

Luiz Capitulino Aug. 29, 2012, 7:53 p.m. UTC
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 hw/omap_lcdc.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 45 insertions(+), 14 deletions(-)

Comments

Peter Maydell Aug. 29, 2012, 9:28 p.m. UTC | #1
On 29 August 2012 20:53, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  hw/omap_lcdc.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 45 insertions(+), 14 deletions(-)
>
> diff --git a/hw/omap_lcdc.c b/hw/omap_lcdc.c
> index 3d6328f..e2ba108 100644
> --- a/hw/omap_lcdc.c
> +++ b/hw/omap_lcdc.c
> @@ -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;
> +    }

We don't use 'ret' in write_err, so why not just
      if (fprintf(f....)  < 0) {
          goto write_err;
      }

here and similarly below and drop the variable altogether?

-- PMM
Luiz Capitulino Aug. 30, 2012, 11:38 a.m. UTC | #2
On Wed, 29 Aug 2012 22:28:38 +0100
Peter Maydell <peter.maydell@linaro.org> wrote:

> On 29 August 2012 20:53, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > ---
> >  hw/omap_lcdc.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 45 insertions(+), 14 deletions(-)
> >
> > diff --git a/hw/omap_lcdc.c b/hw/omap_lcdc.c
> > index 3d6328f..e2ba108 100644
> > --- a/hw/omap_lcdc.c
> > +++ b/hw/omap_lcdc.c
> > @@ -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;
> > +    }
> 
> We don't use 'ret' in write_err, so why not just
>       if (fprintf(f....)  < 0) {
>           goto write_err;
>       }
> 
> here and similarly below and drop the variable altogether?

For clarity. This is probably a matter of taste, but I much more prefer
separate statements (vs. saving 4 bytes during the function call).
diff mbox

Patch

diff --git a/hw/omap_lcdc.c b/hw/omap_lcdc.c
index 3d6328f..e2ba108 100644
--- a/hw/omap_lcdc.c
+++ b/hw/omap_lcdc.c
@@ -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) {