From: Tormod Volden <debian.tor...@gmail.com>

If a DFU file suffix is detected, it will be stripped off and
not sent to the device.

Signed-off-by: Tormod Volden <debian.tor...@gmail.com>
---

This is version 2 of the patch.

Tormod

 src/dfu_load.c |   39 +++++++++++++++++----------------------
 src/dfu_load.h |    4 ++--
 src/main.c     |    4 ++--
 3 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/src/dfu_load.c b/src/dfu_load.c
index 2d1fb26..cc4b1be 100644
--- a/src/dfu_load.c
+++ b/src/dfu_load.c
@@ -33,10 +33,11 @@
 #include "config.h"
 #include "dfu.h"
 #include "usb_dfu.h"
+#include "dfu_file.h"
 #include "dfu_load.h"
 #include "quirks.h"
 
-int dfuload_do_upload(struct dfu_if *dif, int xfer_size, int fd)
+int dfuload_do_upload(struct dfu_if *dif, int xfer_size, struct dfu_file file)
 {
        int total_bytes = 0;
        unsigned char *buf;
@@ -58,7 +59,7 @@ int dfuload_do_upload(struct dfu_if *dif, int xfer_size, int 
fd)
                        ret = rc;
                        goto out_free;
                }
-               write_rc = write(fd, buf, rc);
+               write_rc = write(file.fd, buf, rc);
                if (write_rc < rc) {
                        fprintf(stderr, "Short file write: %s\n",
                                strerror(errno));
@@ -87,12 +88,11 @@ out_free:
 
 #define PROGRESS_BAR_WIDTH 50
 
-int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, int fd)
+int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file file)
 {
        int bytes_sent = 0;
        unsigned int bytes_per_hash, hashes = 0;
        unsigned char *buf;
-       struct stat st;
        struct dfu_status dst;
        int ret;
 
@@ -100,34 +100,29 @@ int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, 
int fd)
        if (!buf)
                return -ENOMEM;
 
-       ret = fstat(fd, &st);
-       if (ret < 0) {
-               perror(NULL);
-               goto out_free;
-       }
-
-       if (st.st_size <= 0 /* + DFU_HDR */) {
-               fprintf(stderr, "File seems a bit too small...\n");
-               ret = -EINVAL;
-               goto out_free;  
-       }
-
-       bytes_per_hash = st.st_size / PROGRESS_BAR_WIDTH;
+       bytes_per_hash = (file.size - file.suffixlen) / PROGRESS_BAR_WIDTH;
        if (bytes_per_hash == 0)
                bytes_per_hash = 1;
        printf("bytes_per_hash=%u\n", bytes_per_hash);
 #if 0
-       read(fd, DFU_HDR);
+       read(file.fd, DFU_HDR);
 #endif
        printf("Copying data from PC to DFU device\n");
        printf("Starting download: [");
        fflush(stdout);
-       while (bytes_sent < st.st_size /* - DFU_HDR */) {
+       while (bytes_sent < file.size - file.suffixlen) {
                int hashes_todo;
-
-               ret = read(fd, buf, xfer_size);
+               int bytes_left;
+               int chunk_size;
+
+               bytes_left = file.size - file.suffixlen - bytes_sent;
+               if (bytes_left < xfer_size)
+                       chunk_size = bytes_left;
+               else
+                       chunk_size = xfer_size;
+               ret = read(file.fd, buf, chunk_size);
                if (ret < 0) {
-                       perror(NULL);
+                       perror(file.name);
                        goto out_free;
                }
                ret = dfu_download(dif->dev_handle, dif->interface, ret, ret ? 
buf : NULL);
diff --git a/src/dfu_load.h b/src/dfu_load.h
index ac33221..ba50506 100644
--- a/src/dfu_load.h
+++ b/src/dfu_load.h
@@ -1,7 +1,7 @@
 #ifndef _SAM7DFU_H
 #define _SAM7DFU_H
 
-int dfuload_do_upload(struct dfu_if *dif, int xfer_size, int fd);
-int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, int fd);
+int dfuload_do_upload(struct dfu_if *dif, int xfer_size, struct dfu_file file);
+int dfuload_do_dnload(struct dfu_if *dif, int xfer_size, struct dfu_file file);
 
 #endif
diff --git a/src/main.c b/src/main.c
index 2896723..d51b816 100644
--- a/src/main.c
+++ b/src/main.c
@@ -875,7 +875,7 @@ status_again:
                        perror(file.name);
                        exit(1);
                }
-               if (dfuload_do_upload(dif, transfer_size, file.fd) < 0)
+               if (dfuload_do_upload(dif, transfer_size, file) < 0)
                        exit(1);
                close(file.fd);
                break;
@@ -905,7 +905,7 @@ status_again:
                        fprintf(stderr, "Warning: File product ID %04x does "
                                "not match device\n", file.idProduct);
                }
-               if (dfuload_do_dnload(dif, transfer_size, file.fd) < 0)
+               if (dfuload_do_dnload(dif, transfer_size, file) < 0)
                        exit(1);
                close(file.fd);
                break;
-- 
1.7.0.4


_______________________________________________
devel mailing list
devel@lists.openmoko.org
https://lists.openmoko.org/mailman/listinfo/devel

Reply via email to