error checks, bug fixes
authorMichael Gernoth <michael@gernoth.net>
Sun, 6 Jun 2010 10:23:22 +0000 (12:23 +0200)
committerMichael Gernoth <michael@gernoth.net>
Sun, 6 Jun 2010 10:23:22 +0000 (12:23 +0200)
png.c
rigol.c

diff --git a/png.c b/png.c
index 7606f2bb5f7868895b96fd811f242f9824f175a5..a85e7d701c99e92c4e0ca2c0017d956b8d5f30ae 100644 (file)
--- a/png.c
+++ b/png.c
@@ -68,7 +68,7 @@ unsigned char *lcd2png(unsigned char *lcd, int *len)
        unsigned char lut[256][3];
        unsigned char *screen_deflated;
        int deflated_size;
-       unsigned char *image;
+       unsigned char *image = NULL;
        unsigned char *outpos;
        static const unsigned char png[] = {137, 80, 78, 71, 13, 10, 26, 10};
        static unsigned char idat[] = {'I', 'D', 'A', 'T'};
@@ -117,6 +117,7 @@ unsigned char *lcd2png(unsigned char *lcd, int *len)
        strm.next_in = screen_conv;
 
        toalloc = 0;
+       strm.avail_out = 0;
        screen_deflated = NULL;
        flush = Z_NO_FLUSH;
 
@@ -147,7 +148,6 @@ unsigned char *lcd2png(unsigned char *lcd, int *len)
 
        deflateEnd(&strm);
 
-
        image = malloc(sizeof(png) +
                sizeof(ihdr) + 8 + /* 8 = length, csum */
                sizeof(idat) + deflated_size + 8 +
@@ -158,9 +158,12 @@ unsigned char *lcd2png(unsigned char *lcd, int *len)
        }
        
        outpos = image;
+
+       /* PNG signature */
        memcpy(outpos, png, sizeof(png));
        outpos += sizeof(png);
 
+       /* IHDR */
        l = htonl(sizeof(ihdr) - 4); /* "IHDR" is not counted */
        memcpy(outpos, &l, sizeof(l));
        outpos += sizeof(l);
@@ -170,6 +173,7 @@ unsigned char *lcd2png(unsigned char *lcd, int *len)
        memcpy(outpos, &l, sizeof(l));
        outpos += sizeof(l);
 
+       /* IDAT */
        l = htonl(deflated_size);
        memcpy(outpos, &l, sizeof(l));
        outpos += sizeof(l);
@@ -182,6 +186,7 @@ unsigned char *lcd2png(unsigned char *lcd, int *len)
        memcpy(outpos, &l, sizeof(l));
        outpos += sizeof(l);
 
+       /* IEND */
        l = htonl(sizeof(iend) - 4); /* "IEND" is not counted */
        memcpy(outpos, &l, sizeof(l));
        outpos += sizeof(l);
diff --git a/rigol.c b/rigol.c
index 818b7eac797ce22dad13eb170611604a7d13dd71..0e9ff9e9e5bbe226322a220eba4f904344dccff7 100644 (file)
--- a/rigol.c
+++ b/rigol.c
@@ -306,6 +306,7 @@ void do_get_screen(struct usb_dev_handle *sc)
        char filename[256];
        unsigned char *png;
        int imglen;
+       int ret;
        int l;
        int fd;
        pid_t display;
@@ -320,11 +321,26 @@ void do_get_screen(struct usb_dev_handle *sc)
                printf ("hmm. didnt' get %d bytes, but %d\n\n", sizeof(screen), l); 
        }
 
+       png = lcd2png(screen, &imglen);
+
+       lt = time(NULL);
        strftime(filename, sizeof(filename), "screen_%Y%m%d-%H%M%S.png", localtime(&lt));
        fd=open(filename, O_CREAT|O_WRONLY, 0644);
-       png = lcd2png(screen, &imglen);
-       write(fd, png, imglen);
+       if (fd == -1) {
+               perror("open");
+               exit(EXIT_FAILURE);
+       }
+
+       while(imglen > 0) {
+               ret = write(fd, png, imglen);
+               if (ret == -1) {
+                       perror("write");
+                       exit(EXIT_FAILURE);
+               }
+               imglen -= ret;
+       }
        close(fd);
+       free(png);
 
        printf("Waveform saved as %s\n", filename);
 
Impressum, Datenschutz