SWUpdate library to be used with RPC.
Fork of SWUpdate by
Diff: SWUpdate.cpp
- Revision:
- 3:c69fff55fc60
- Parent:
- 1:208de08b1a19
- Child:
- 7:a7efbae7e02e
diff -r ef2ac9627546 -r c69fff55fc60 SWUpdate.cpp --- a/SWUpdate.cpp Sat Jun 14 16:15:30 2014 +0000 +++ b/SWUpdate.cpp Sat Jun 14 18:18:28 2014 +0000 @@ -25,8 +25,26 @@ #define INFO(x, ...) #endif -static bool PassesIntegrityCheck(const char * fname) { - return true; +static bool PassesIntegrityCheck(const char * fname, int cksum, int fsize) { + int res = false; // assume things go wrong... + int newCksum = 0; + int newFSize = 0; + FILE *fh = fopen(fname, "rb"); + INFO("IntegrityCheck(%s,%d,%d)", fname, cksum, fsize); + if (fh) { + char buf; + while (fread(&buf, 1, 1, fh)) { + newCksum = (newCksum + buf) & 0xFFFF; + newFSize++; + } + fclose(fh); + INFO(" Check(...,%d,%d)", newCksum, newFSize); + if (newCksum == cksum && newFSize == fsize) + res = true; + } else { + WARN("failed to open %s.", fname); + } + return res; } bool SoftwareUpdate(const char *url, const char * name, Reboot_T reboot) { @@ -36,7 +54,6 @@ char verfn[32]; // local version file char fwfn[32]; bool result = false; // many things can go wrong, assume failure - //char *verfn = "/local/VERSION.TXT"; char buf[50]; INFO("SoftwareUpdate(%s,%s)", url, name); @@ -57,50 +74,59 @@ HTTPResult r = http.get(fqurl, buf, sizeof(buf)); if (r == HTTP_OK) { int latest_ver = -1; + int cksum = 0; + int fsize = 0; + int parseCount; INFO(" read {%s}", buf); - sscanf(buf, "%d", &latest_ver); - INFO(" web version: %d", latest_ver); - if (inst_ver != latest_ver) { - INFO(" Downloading new firmware..."); - sprintf(fwfn, "/local/%s%d.BIN", name, latest_ver); - snprintf(fqurl, 150, "%s/%s.bin", url, name); - - HTTPFile latest(fwfn); - r = http.get(fqurl, &latest); - if (r == HTTP_OK) { - // Check the integrity of the freshly downloaded file, - // before swapping out the old version. - // ... to appear here ... - if (PassesIntegrityCheck(fwfn)) { - sprintf(fwfn, "/local/%s%d.BIN", name, inst_ver); - INFO(" Firmware downloaded, removing old version (%s).", fwfn); - if (remove(fwfn)) { - ERR(" *** Failed to remove old version. ***"); - } - INFO("Updating stored version number."); - fv = fopen(verfn, "w"); - if (fv) { - int fr = fputs(buf, fv); - if (fr < 0) { - ERR("Failed (%d) to update stored version number.", fr); - fclose( fv ); + parseCount = sscanf(buf, "%d,%d,%d", &latest_ver, &cksum, &fsize); + if (parseCount == 3) { + INFO(" web version: %d", latest_ver); + INFO(" checksum: %d", cksum); + INFO(" file size: %d", fsize); + if (inst_ver != latest_ver) { + INFO(" Downloading firmware ver %d ...", latest_ver); + sprintf(fwfn, "/local/%s%d.BIN", name, latest_ver); + snprintf(fqurl, 150, "%s/%s.bin", url, name); + + HTTPFile latest(fwfn); + r = http.get(fqurl, &latest); + if (r == HTTP_OK) { + // Check the integrity of the freshly downloaded file, + // before swapping out the old version. + // ... to appear here ... + if (PassesIntegrityCheck(fwfn, cksum, fsize)) { + sprintf(fwfn, "/local/%s%d.BIN", name, inst_ver); + INFO(" Firmware downloaded, removing old version (%s).", fwfn); + if (remove(fwfn)) { + ERR(" *** Failed to remove old version. ***"); + } + INFO("Updating stored version number."); + fv = fopen(verfn, "w"); + if (fv) { + int fr = fputs(buf, fv); + if (fr < 0) { + ERR("Failed (%d) to update stored version number.", fr); + fclose( fv ); + } else { + fclose( fv ); + if (reboot == AUTO_REBOOT) { + WARN("Resetting...\n"); + wait_ms(200); + mbed_reset(); + } + result = true; + } } else { - fclose( fv ); - if (reboot == AUTO_REBOOT) { - WARN("Resetting...\n"); - wait_ms(200); - mbed_reset(); - } - result = true; + WARN("Failed to update local version info in %s.", verfn); } } else { - WARN("Failed to update local version info in %s.", verfn); + WARN("New file {%s} did not pass integrity check.", fwfn); } } else { - WARN("New file {%s} did not pass integrity check.", fwfn); + WARN("Failed to download lastest firmware."); } } else { - WARN("Failed to download lastest firmware."); + WARN("Only %d parameters found in online version file.", parseCount); } } } else {