diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/applypatch/applypatch.c | 409 | ||||
-rw-r--r-- | tools/applypatch/freecache.c | 8 | ||||
-rw-r--r-- | tools/applypatch/imgdiff.c | 50 | ||||
-rw-r--r-- | tools/applypatch/imgpatch.c | 52 | ||||
-rw-r--r-- | tools/applypatch/main.c | 2 |
5 files changed, 282 insertions, 239 deletions
diff --git a/tools/applypatch/applypatch.c b/tools/applypatch/applypatch.c index 394c584..e69a2fb 100644 --- a/tools/applypatch/applypatch.c +++ b/tools/applypatch/applypatch.c @@ -21,6 +21,8 @@ #include <string.h> #include <sys/stat.h> #include <sys/statfs.h> +#include <sys/types.h> +#include <fcntl.h> #include <unistd.h> #include "mincrypt/sha.h" @@ -30,6 +32,7 @@ int SaveFileContents(const char* filename, FileContents file); int LoadMTDContents(const char* filename, FileContents* file); int ParseSha1(const char* str, uint8_t* digest); +size_t FileSink(unsigned char* data, size_t len, void* token); static int mtd_partitions_scanned = 0; @@ -45,7 +48,7 @@ int LoadFileContents(const char* filename, FileContents* file) { } if (stat(filename, &file->st) != 0) { - fprintf(stderr, "failed to stat \"%s\": %s\n", filename, strerror(errno)); + printf("failed to stat \"%s\": %s\n", filename, strerror(errno)); return -1; } @@ -54,7 +57,7 @@ int LoadFileContents(const char* filename, FileContents* file) { FILE* f = fopen(filename, "rb"); if (f == NULL) { - fprintf(stderr, "failed to open \"%s\": %s\n", filename, strerror(errno)); + printf("failed to open \"%s\": %s\n", filename, strerror(errno)); free(file->data); file->data = NULL; return -1; @@ -62,7 +65,7 @@ int LoadFileContents(const char* filename, FileContents* file) { size_t bytes_read = fread(file->data, 1, file->size, f); if (bytes_read != file->size) { - fprintf(stderr, "short read of \"%s\" (%d bytes of %d)\n", + printf("short read of \"%s\" (%d bytes of %d)\n", filename, bytes_read, file->size); free(file->data); file->data = NULL; @@ -108,7 +111,7 @@ int LoadMTDContents(const char* filename, FileContents* file) { char* copy = strdup(filename); const char* magic = strtok(copy, ":"); if (strcmp(magic, "MTD") != 0) { - fprintf(stderr, "LoadMTDContents called with bad filename (%s)\n", + printf("LoadMTDContents called with bad filename (%s)\n", filename); return -1; } @@ -122,7 +125,7 @@ int LoadMTDContents(const char* filename, FileContents* file) { } } if (colons < 3 || colons%2 == 0) { - fprintf(stderr, "LoadMTDContents called with bad filename (%s)\n", + printf("LoadMTDContents called with bad filename (%s)\n", filename); } @@ -135,7 +138,7 @@ int LoadMTDContents(const char* filename, FileContents* file) { const char* size_str = strtok(NULL, ":"); size[i] = strtol(size_str, NULL, 10); if (size[i] == 0) { - fprintf(stderr, "LoadMTDContents called with bad size (%s)\n", filename); + printf("LoadMTDContents called with bad size (%s)\n", filename); return -1; } sha1sum[i] = strtok(NULL, ":"); @@ -154,14 +157,14 @@ int LoadMTDContents(const char* filename, FileContents* file) { const MtdPartition* mtd = mtd_find_partition_by_name(partition); if (mtd == NULL) { - fprintf(stderr, "mtd partition \"%s\" not found (loading %s)\n", + printf("mtd partition \"%s\" not found (loading %s)\n", partition, filename); return -1; } MtdReadContext* ctx = mtd_read_partition(mtd); if (ctx == NULL) { - fprintf(stderr, "failed to initialize read of mtd partition \"%s\"\n", + printf("failed to initialize read of mtd partition \"%s\"\n", partition); return -1; } @@ -184,7 +187,7 @@ int LoadMTDContents(const char* filename, FileContents* file) { if (next > 0) { read = mtd_read_data(ctx, p, next); if (next != read) { - fprintf(stderr, "short read (%d bytes of %d) for partition \"%s\"\n", + printf("short read (%d bytes of %d) for partition \"%s\"\n", read, next, partition); free(file->data); file->data = NULL; @@ -201,7 +204,7 @@ int LoadMTDContents(const char* filename, FileContents* file) { const uint8_t* sha_so_far = SHA_final(&temp_ctx); if (ParseSha1(sha1sum[index[i]], parsed_sha) != 0) { - fprintf(stderr, "failed to parse sha1 %s in %s\n", + printf("failed to parse sha1 %s in %s\n", sha1sum[index[i]], filename); free(file->data); file->data = NULL; @@ -224,7 +227,7 @@ int LoadMTDContents(const char* filename, FileContents* file) { if (i == pairs) { // Ran off the end of the list of (size,sha1) pairs without // finding a match. - fprintf(stderr, "contents of MTD partition \"%s\" didn't match %s\n", + printf("contents of MTD partition \"%s\" didn't match %s\n", partition, filename); free(file->data); file->data = NULL; @@ -253,29 +256,29 @@ int LoadMTDContents(const char* filename, FileContents* file) { // Save the contents of the given FileContents object under the given // filename. Return 0 on success. int SaveFileContents(const char* filename, FileContents file) { - FILE* f = fopen(filename, "wb"); - if (f == NULL) { - fprintf(stderr, "failed to open \"%s\" for write: %s\n", + int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC); + if (fd < 0) { + printf("failed to open \"%s\" for write: %s\n", filename, strerror(errno)); return -1; } - size_t bytes_written = fwrite(file.data, 1, file.size, f); + size_t bytes_written = FileSink(file.data, file.size, &fd); if (bytes_written != file.size) { - fprintf(stderr, "short write of \"%s\" (%d bytes of %d)\n", - filename, bytes_written, file.size); + printf("short write of \"%s\" (%d bytes of %d) (%s)\n", + filename, bytes_written, file.size, strerror(errno)); + close(fd); return -1; } - fflush(f); - fsync(fileno(f)); - fclose(f); + fsync(fd); + close(fd); if (chmod(filename, file.st.st_mode) != 0) { - fprintf(stderr, "chmod of \"%s\" failed: %s\n", filename, strerror(errno)); + printf("chmod of \"%s\" failed: %s\n", filename, strerror(errno)); return -1; } if (chown(filename, file.st.st_uid, file.st.st_gid) != 0) { - fprintf(stderr, "chown of \"%s\" failed: %s\n", filename, strerror(errno)); + printf("chown of \"%s\" failed: %s\n", filename, strerror(errno)); return -1; } @@ -288,7 +291,7 @@ int WriteToMTDPartition(unsigned char* data, size_t len, const char* target_mtd) { char* partition = strchr(target_mtd, ':'); if (partition == NULL) { - fprintf(stderr, "bad MTD target name \"%s\"\n", target_mtd); + printf("bad MTD target name \"%s\"\n", target_mtd); return -1; } ++partition; @@ -306,33 +309,33 @@ int WriteToMTDPartition(unsigned char* data, size_t len, const MtdPartition* mtd = mtd_find_partition_by_name(partition); if (mtd == NULL) { - fprintf(stderr, "mtd partition \"%s\" not found for writing\n", partition); + printf("mtd partition \"%s\" not found for writing\n", partition); return -1; } MtdWriteContext* ctx = mtd_write_partition(mtd); if (ctx == NULL) { - fprintf(stderr, "failed to init mtd partition \"%s\" for writing\n", + printf("failed to init mtd partition \"%s\" for writing\n", partition); return -1; } size_t written = mtd_write_data(ctx, (char*)data, len); if (written != len) { - fprintf(stderr, "only wrote %d of %d bytes to MTD %s\n", + printf("only wrote %d of %d bytes to MTD %s\n", written, len, partition); mtd_write_close(ctx); return -1; } if (mtd_erase_blocks(ctx, -1) < 0) { - fprintf(stderr, "error finishing mtd write of %s\n", partition); + printf("error finishing mtd write of %s\n", partition); mtd_write_close(ctx); return -1; } if (mtd_write_close(ctx)) { - fprintf(stderr, "error closing mtd write of %s\n", partition); + printf("error closing mtd write of %s\n", partition); return -1; } @@ -381,7 +384,7 @@ int ParseShaArgs(int argc, char** argv, Patch** patches, int* num_patches) { int i; for (i = 0; i < *num_patches; ++i) { if (ParseSha1(argv[i], (*patches)[i].sha1) != 0) { - fprintf(stderr, "failed to parse sha1 \"%s\"\n", argv[i]); + printf("failed to parse sha1 \"%s\"\n", argv[i]); return -1; } if (argv[i][SHA_DIGEST_SIZE*2] == '\0') { @@ -389,7 +392,7 @@ int ParseShaArgs(int argc, char** argv, Patch** patches, int* num_patches) { } else if (argv[i][SHA_DIGEST_SIZE*2] == ':') { (*patches)[i].patch_filename = argv[i] + (SHA_DIGEST_SIZE*2+1); } else { - fprintf(stderr, "failed to parse filename \"%s\"\n", argv[i]); + printf("failed to parse filename \"%s\"\n", argv[i]); return -1; } } @@ -414,7 +417,7 @@ const Patch* FindMatchingPatch(uint8_t* sha1, Patch* patches, int num_patches) { // nonzero otherwise. int CheckMode(int argc, char** argv) { if (argc < 3) { - fprintf(stderr, "no filename given\n"); + printf("no filename given\n"); return 2; } @@ -432,7 +435,7 @@ int CheckMode(int argc, char** argv) { if (LoadFileContents(argv[2], &file) != 0 || (num_patches > 0 && FindMatchingPatch(file.sha1, patches, num_patches) == NULL)) { - fprintf(stderr, "file \"%s\" doesn't have any of expected " + printf("file \"%s\" doesn't have any of expected " "sha1 sums; checking cache\n", argv[2]); free(file.data); @@ -444,12 +447,12 @@ int CheckMode(int argc, char** argv) { // passes. if (LoadFileContents(CACHE_TEMP_SOURCE, &file) != 0) { - fprintf(stderr, "failed to load cache file\n"); + printf("failed to load cache file\n"); return 1; } if (FindMatchingPatch(file.sha1, patches, num_patches) == NULL) { - fprintf(stderr, "cache bits don't match any sha1 for \"%s\"\n", + printf("cache bits don't match any sha1 for \"%s\"\n", argv[2]); return 1; } @@ -465,7 +468,19 @@ int ShowLicenses() { } size_t FileSink(unsigned char* data, size_t len, void* token) { - return fwrite(data, 1, len, (FILE*)token); + int fd = *(int *)token; + ssize_t done = 0; + ssize_t wrote; + while (done < (ssize_t) len) { + wrote = write(fd, data+done, len-done); + if (wrote <= 0) { + printf("error writing %d bytes: %s\n", (int)(len-done), strerror(errno)); + return done; + } + done += wrote; + } + printf("wrote %d bytes to output\n", (int)done); + return done; } typedef struct { @@ -489,7 +504,7 @@ size_t MemorySink(unsigned char* data, size_t len, void* token) { size_t FreeSpaceForFile(const char* filename) { struct statfs sf; if (statfs(filename, &sf) != 0) { - fprintf(stderr, "failed to statfs %s: %s\n", filename, strerror(errno)); + printf("failed to statfs %s: %s\n", filename, strerror(errno)); return -1; } return sf.f_bsize * sf.f_bfree; @@ -583,8 +598,10 @@ int applypatch(int argc, char** argv) { target_filename = source_filename; } - if (ParseSha1(argv[3], target_sha1) != 0) { - fprintf(stderr, "failed to parse tgt-sha1 \"%s\"\n", argv[3]); + printf("\napplying patch to %s\n", source_filename); + + if (ParseSha1(argv[3], target_sha1) != 0) { + printf("failed to parse tgt-sha1 \"%s\"\n", argv[3]); return 1; } @@ -605,7 +622,7 @@ int applypatch(int argc, char** argv) { if (memcmp(source_file.sha1, target_sha1, SHA_DIGEST_SIZE) == 0) { // The early-exit case: the patch was already applied, this file // has the desired hash, nothing for us to do. - fprintf(stderr, "\"%s\" is already target; no patch needed\n", + printf("\"%s\" is already target; no patch needed\n", target_filename); return 0; } @@ -630,11 +647,11 @@ int applypatch(int argc, char** argv) { if (source_patch_filename == NULL) { free(source_file.data); - fprintf(stderr, "source file is bad; trying copy\n"); + printf("source file is bad; trying copy\n"); if (LoadFileContents(CACHE_TEMP_SOURCE, ©_file) < 0) { // fail. - fprintf(stderr, "failed to read copy file\n"); + printf("failed to read copy file\n"); return 1; } @@ -646,179 +663,205 @@ int applypatch(int argc, char** argv) { if (copy_patch_filename == NULL) { // fail. - fprintf(stderr, "copy file doesn't match source SHA-1s either\n"); + printf("copy file doesn't match source SHA-1s either\n"); return 1; } } - // Is there enough room in the target filesystem to hold the patched - // file? - - if (strncmp(target_filename, "MTD:", 4) == 0) { - // If the target is an MTD partition, we're actually going to - // write the output to /tmp and then copy it to the partition. - // statfs() always returns 0 blocks free for /tmp, so instead - // we'll just assume that /tmp has enough space to hold the file. - - // We still write the original source to cache, in case the MTD - // write is interrupted. - if (MakeFreeSpaceOnCache(source_file.size) < 0) { - fprintf(stderr, "not enough free space on /cache\n"); - return 1; - } - if (SaveFileContents(CACHE_TEMP_SOURCE, source_file) < 0) { - fprintf(stderr, "failed to back up source file\n"); - return 1; - } - made_copy = 1; + int retry = 1; + SHA_CTX ctx; + int output; + MemorySinkInfo msi; + FileContents* source_to_use; + char* outname; + + // assume that target_filename (eg "/system/app/Foo.apk") is located + // on the same filesystem as its top-level directory ("/system"). + // We need something that exists for calling statfs(). + char target_fs[strlen(target_filename)+1]; + char* slash = strchr(target_filename+1, '/'); + if (slash != NULL) { + int count = slash - target_filename; + strncpy(target_fs, target_filename, count); + target_fs[count] = '\0'; } else { - // assume that target_filename (eg "/system/app/Foo.apk") is located - // on the same filesystem as its top-level directory ("/system"). - // We need something that exists for calling statfs(). - char* target_fs = strdup(target_filename); - char* slash = strchr(target_fs+1, '/'); - if (slash != NULL) { - *slash = '\0'; - } + strcpy(target_fs, target_filename); + } - size_t free_space = FreeSpaceForFile(target_fs); - int enough_space = - free_space > (target_size * 3 / 2); // 50% margin of error - printf("target %ld bytes; free space %ld bytes; enough %d\n", - (long)target_size, (long)free_space, enough_space); - - if (!enough_space && source_patch_filename != NULL) { - // Using the original source, but not enough free space. First - // copy the source file to cache, then delete it from the original - // location. - - if (strncmp(source_filename, "MTD:", 4) == 0) { - // It's impossible to free space on the target filesystem by - // deleting the source if the source is an MTD partition. If - // we're ever in a state where we need to do this, fail. - fprintf(stderr, "not enough free space for target but source is MTD\n"); - return 1; - } + do { + // Is there enough room in the target filesystem to hold the patched + // file? + if (strncmp(target_filename, "MTD:", 4) == 0) { + // If the target is an MTD partition, we're actually going to + // write the output to /tmp and then copy it to the partition. + // statfs() always returns 0 blocks free for /tmp, so instead + // we'll just assume that /tmp has enough space to hold the file. + + // We still write the original source to cache, in case the MTD + // write is interrupted. if (MakeFreeSpaceOnCache(source_file.size) < 0) { - fprintf(stderr, "not enough free space on /cache\n"); + printf("not enough free space on /cache\n"); return 1; } - if (SaveFileContents(CACHE_TEMP_SOURCE, source_file) < 0) { - fprintf(stderr, "failed to back up source file\n"); + printf("failed to back up source file\n"); return 1; } made_copy = 1; - unlink(source_filename); + retry = 0; + } else { + int enough_space = 0; + if (retry > 0) { + size_t free_space = FreeSpaceForFile(target_fs); + int enough_space = + (free_space > (target_size * 3 / 2)); // 50% margin of error + printf("target %ld bytes; free space %ld bytes; retry %d; enough %d\n", + (long)target_size, (long)free_space, retry, enough_space); + } + + if (!enough_space) { + retry = 0; + } - size_t free_space = FreeSpaceForFile(target_fs); - printf("(now %ld bytes free for target)\n", (long)free_space); + if (!enough_space && source_patch_filename != NULL) { + // Using the original source, but not enough free space. First + // copy the source file to cache, then delete it from the original + // location. + + if (strncmp(source_filename, "MTD:", 4) == 0) { + // It's impossible to free space on the target filesystem by + // deleting the source if the source is an MTD partition. If + // we're ever in a state where we need to do this, fail. + printf("not enough free space for target but source is MTD\n"); + return 1; + } + + if (MakeFreeSpaceOnCache(source_file.size) < 0) { + printf("not enough free space on /cache\n"); + return 1; + } + + if (SaveFileContents(CACHE_TEMP_SOURCE, source_file) < 0) { + printf("failed to back up source file\n"); + return 1; + } + made_copy = 1; + unlink(source_filename); + + size_t free_space = FreeSpaceForFile(target_fs); + printf("(now %ld bytes free for target)\n", (long)free_space); + } } - } - FileContents* source_to_use; - const char* patch_filename; - if (source_patch_filename != NULL) { - source_to_use = &source_file; - patch_filename = source_patch_filename; - } else { - source_to_use = ©_file; - patch_filename = copy_patch_filename; - } + const char* patch_filename; + if (source_patch_filename != NULL) { + source_to_use = &source_file; + patch_filename = source_patch_filename; + } else { + source_to_use = ©_file; + patch_filename = copy_patch_filename; + } - char* outname = NULL; - FILE* output = NULL; - MemorySinkInfo msi; - SinkFn sink = NULL; - void* token = NULL; - if (strncmp(target_filename, "MTD:", 4) == 0) { - // We store the decoded output in memory. - msi.buffer = malloc(target_size); - if (msi.buffer == NULL) { - fprintf(stderr, "failed to alloc %ld bytes for output\n", - (long)target_size); - return 1; + SinkFn sink = NULL; + void* token = NULL; + output = -1; + outname = NULL; + if (strncmp(target_filename, "MTD:", 4) == 0) { + // We store the decoded output in memory. + msi.buffer = malloc(target_size); + if (msi.buffer == NULL) { + printf("failed to alloc %ld bytes for output\n", + (long)target_size); + return 1; + } + msi.pos = 0; + msi.size = target_size; + sink = MemorySink; + token = &msi; + } else { + // We write the decoded output to "<tgt-file>.patch". + outname = (char*)malloc(strlen(target_filename) + 10); + strcpy(outname, target_filename); + strcat(outname, ".patch"); + + output = open(outname, O_WRONLY | O_CREAT | O_TRUNC); + if (output < 0) { + printf("failed to open output file %s: %s\n", + outname, strerror(errno)); + return 1; + } + sink = FileSink; + token = &output; } - msi.pos = 0; - msi.size = target_size; - sink = MemorySink; - token = &msi; - } else { - // We write the decoded output to "<tgt-file>.patch". - outname = (char*)malloc(strlen(target_filename) + 10); - strcpy(outname, target_filename); - strcat(outname, ".patch"); - - output = fopen(outname, "wb"); - if (output == NULL) { - fprintf(stderr, "failed to open output file %s: %s\n", - outname, strerror(errno)); + +#define MAX_HEADER_LENGTH 8 + unsigned char header[MAX_HEADER_LENGTH]; + FILE* patchf = fopen(patch_filename, "rb"); + if (patchf == NULL) { + printf("failed to open patch file %s: %s\n", + patch_filename, strerror(errno)); return 1; } - sink = FileSink; - token = output; - } + int header_bytes_read = fread(header, 1, MAX_HEADER_LENGTH, patchf); + fclose(patchf); -#define MAX_HEADER_LENGTH 8 - unsigned char header[MAX_HEADER_LENGTH]; - FILE* patchf = fopen(patch_filename, "rb"); - if (patchf == NULL) { - fprintf(stderr, "failed to open patch file %s: %s\n", - patch_filename, strerror(errno)); - return 1; - } - int header_bytes_read = fread(header, 1, MAX_HEADER_LENGTH, patchf); - fclose(patchf); + SHA_init(&ctx); - SHA_CTX ctx; - SHA_init(&ctx); - - if (header_bytes_read >= 4 && - header[0] == 0xd6 && header[1] == 0xc3 && - header[2] == 0xc4 && header[3] == 0) { - // xdelta3 patches begin "VCD" (with the high bits set) followed - // by a zero byte (the version number). - fprintf(stderr, "error: xdelta3 patches no longer supported\n"); - return 1; - } else if (header_bytes_read >= 8 && - memcmp(header, "BSDIFF40", 8) == 0) { - int result = ApplyBSDiffPatch(source_to_use->data, source_to_use->size, - patch_filename, 0, sink, token, &ctx); - if (result != 0) { - fprintf(stderr, "ApplyBSDiffPatch failed\n"); - return result; + int result; + + if (header_bytes_read >= 4 && + header[0] == 0xd6 && header[1] == 0xc3 && + header[2] == 0xc4 && header[3] == 0) { + // xdelta3 patches begin "VCD" (with the high bits set) followed + // by a zero byte (the version number). + printf("error: xdelta3 patches no longer supported\n"); + return 1; + } else if (header_bytes_read >= 8 && + memcmp(header, "BSDIFF40", 8) == 0) { + result = ApplyBSDiffPatch(source_to_use->data, source_to_use->size, + patch_filename, 0, sink, token, &ctx); + } else if (header_bytes_read >= 8 && + memcmp(header, "IMGDIFF", 7) == 0 && + (header[7] == '1' || header[7] == '2')) { + result = ApplyImagePatch(source_to_use->data, source_to_use->size, + patch_filename, sink, token, &ctx); + } else { + printf("Unknown patch file format\n"); + return 1; } - } else if (header_bytes_read >= 8 && - memcmp(header, "IMGDIFF", 7) == 0 && - (header[7] == '1' || header[7] == '2')) { - int result = ApplyImagePatch(source_to_use->data, source_to_use->size, - patch_filename, sink, token, &ctx); - if (result != 0) { - fprintf(stderr, "ApplyImagePatch failed\n"); - return result; + + if (output >= 0) { + fsync(output); + close(output); } - } else { - fprintf(stderr, "Unknown patch file format\n"); - return 1; - } - if (output != NULL) { - fflush(output); - fsync(fileno(output)); - fclose(output); - } + if (result != 0) { + if (retry == 0) { + printf("applying patch failed\n"); + return result; + } else { + printf("applying patch failed; retrying\n"); + } + if (outname != NULL) { + unlink(outname); + } + } else { + // succeeded; no need to retry + break; + } + } while (retry-- > 0); const uint8_t* current_target_sha1 = SHA_final(&ctx); if (memcmp(current_target_sha1, target_sha1, SHA_DIGEST_SIZE) != 0) { - fprintf(stderr, "patch did not produce expected sha1\n"); + printf("patch did not produce expected sha1\n"); return 1; } - if (output == NULL) { + if (output < 0) { // Copy the temp file to the MTD partition. if (WriteToMTDPartition(msi.buffer, msi.pos, target_filename) != 0) { - fprintf(stderr, "write of patched data to %s failed\n", target_filename); + printf("write of patched data to %s failed\n", target_filename); return 1; } free(msi.buffer); @@ -826,18 +869,18 @@ int applypatch(int argc, char** argv) { // Give the .patch file the same owner, group, and mode of the // original source file. if (chmod(outname, source_to_use->st.st_mode) != 0) { - fprintf(stderr, "chmod of \"%s\" failed: %s\n", outname, strerror(errno)); + printf("chmod of \"%s\" failed: %s\n", outname, strerror(errno)); return 1; } if (chown(outname, source_to_use->st.st_uid, source_to_use->st.st_gid) != 0) { - fprintf(stderr, "chown of \"%s\" failed: %s\n", outname, strerror(errno)); + printf("chown of \"%s\" failed: %s\n", outname, strerror(errno)); return 1; } // Finally, rename the .patch file to replace the target file. if (rename(outname, target_filename) != 0) { - fprintf(stderr, "rename of .patch to \"%s\" failed: %s\n", + printf("rename of .patch to \"%s\" failed: %s\n", target_filename, strerror(errno)); return 1; } diff --git a/tools/applypatch/freecache.c b/tools/applypatch/freecache.c index ab71b81..9827fda 100644 --- a/tools/applypatch/freecache.c +++ b/tools/applypatch/freecache.c @@ -16,7 +16,7 @@ static int EliminateOpenFiles(char** files, int file_count) { struct dirent* de; d = opendir("/proc"); if (d == NULL) { - fprintf(stderr, "error opening /proc: %s\n", strerror(errno)); + printf("error opening /proc: %s\n", strerror(errno)); return -1; } while ((de = readdir(d)) != 0) { @@ -35,7 +35,7 @@ static int EliminateOpenFiles(char** files, int file_count) { struct dirent* fdde; fdd = opendir(path); if (fdd == NULL) { - fprintf(stderr, "error opening %s: %s\n", path, strerror(errno)); + printf("error opening %s: %s\n", path, strerror(errno)); continue; } while ((fdde = readdir(fdd)) != 0) { @@ -88,7 +88,7 @@ int FindExpendableFiles(char*** names, int* entries) { for (i = 0; i < sizeof(dirs)/sizeof(dirs[0]); ++i) { d = opendir(dirs[i]); if (d == NULL) { - fprintf(stderr, "error opening %s: %s\n", dirs[i], strerror(errno)); + printf("error opening %s: %s\n", dirs[i], strerror(errno)); continue; } @@ -143,7 +143,7 @@ int MakeFreeSpaceOnCache(size_t bytes_needed) { if (entries == 0) { // nothing we can delete to free up space! - fprintf(stderr, "no files can be deleted to free space on /cache\n"); + printf("no files can be deleted to free space on /cache\n"); return -1; } diff --git a/tools/applypatch/imgdiff.c b/tools/applypatch/imgdiff.c index 6ff9b6f..6b9ebee 100644 --- a/tools/applypatch/imgdiff.c +++ b/tools/applypatch/imgdiff.c @@ -179,14 +179,14 @@ unsigned char* ReadZip(const char* filename, int include_pseudo_chunk) { struct stat st; if (stat(filename, &st) != 0) { - fprintf(stderr, "failed to stat \"%s\": %s\n", filename, strerror(errno)); + printf("failed to stat \"%s\": %s\n", filename, strerror(errno)); return NULL; } unsigned char* img = malloc(st.st_size); FILE* f = fopen(filename, "rb"); if (fread(img, 1, st.st_size, f) != st.st_size) { - fprintf(stderr, "failed to read \"%s\" %s\n", filename, strerror(errno)); + printf("failed to read \"%s\" %s\n", filename, strerror(errno)); fclose(f); return NULL; } @@ -203,7 +203,7 @@ unsigned char* ReadZip(const char* filename, } // double-check: this archive consists of a single "disk" if (!(img[i+4] == 0 && img[i+5] == 0 && img[i+6] == 0 && img[i+7] == 0)) { - fprintf(stderr, "can't process multi-disk archive\n"); + printf("can't process multi-disk archive\n"); return NULL; } @@ -216,7 +216,7 @@ unsigned char* ReadZip(const char* filename, unsigned char* cd = img+cdoffset; for (i = 0; i < cdcount; ++i) { if (!(cd[0] == 0x50 && cd[1] == 0x4b && cd[2] == 0x01 && cd[3] == 0x02)) { - fprintf(stderr, "bad central directory entry %d\n", i); + printf("bad central directory entry %d\n", i); return NULL; } @@ -243,12 +243,12 @@ unsigned char* ReadZip(const char* filename, unsigned char* lh = img + hoffset; if (!(lh[0] == 0x50 && lh[1] == 0x4b && lh[2] == 0x03 && lh[3] == 0x04)) { - fprintf(stderr, "bad local file header entry %d\n", i); + printf("bad local file header entry %d\n", i); return NULL; } if (Read2(lh+26) != nlen || memcmp(lh+30, filename, nlen) != 0) { - fprintf(stderr, "central dir filename doesn't match local header\n"); + printf("central dir filename doesn't match local header\n"); return NULL; } @@ -320,7 +320,7 @@ unsigned char* ReadZip(const char* filename, strm.next_out = curr->data; ret = inflate(&strm, Z_NO_FLUSH); if (ret != Z_STREAM_END) { - fprintf(stderr, "failed to inflate \"%s\"; %d\n", curr->filename, ret); + printf("failed to inflate \"%s\"; %d\n", curr->filename, ret); return NULL; } @@ -369,14 +369,14 @@ unsigned char* ReadImage(const char* filename, int* num_chunks, ImageChunk** chunks) { struct stat st; if (stat(filename, &st) != 0) { - fprintf(stderr, "failed to stat \"%s\": %s\n", filename, strerror(errno)); + printf("failed to stat \"%s\": %s\n", filename, strerror(errno)); return NULL; } unsigned char* img = malloc(st.st_size + 4); FILE* f = fopen(filename, "rb"); if (fread(img, 1, st.st_size, f) != st.st_size) { - fprintf(stderr, "failed to read \"%s\" %s\n", filename, strerror(errno)); + printf("failed to read \"%s\" %s\n", filename, strerror(errno)); fclose(f); return NULL; } @@ -476,7 +476,7 @@ unsigned char* ReadImage(const char* filename, // the decompression. size_t footer_size = Read4(p-4); if (footer_size != curr[-2].len) { - fprintf(stderr, "Error: footer size %d != decompressed size %d\n", + printf("Error: footer size %d != decompressed size %d\n", footer_size, curr[-2].len); free(img); return NULL; @@ -522,7 +522,7 @@ int TryReconstruction(ImageChunk* chunk, unsigned char* out) { size_t p = 0; #if 0 - fprintf(stderr, "trying %d %d %d %d %d\n", + printf("trying %d %d %d %d %d\n", chunk->level, chunk->method, chunk->windowBits, chunk->memLevel, chunk->strategy); #endif @@ -565,7 +565,7 @@ int TryReconstruction(ImageChunk* chunk, unsigned char* out) { */ int ReconstructDeflateChunk(ImageChunk* chunk) { if (chunk->type != CHUNK_DEFLATE) { - fprintf(stderr, "attempt to reconstruct non-deflate chunk\n"); + printf("attempt to reconstruct non-deflate chunk\n"); return -1; } @@ -610,13 +610,13 @@ unsigned char* MakePatch(ImageChunk* src, ImageChunk* tgt, size_t* size) { int r = bsdiff(src->data, src->len, &(src->I), tgt->data, tgt->len, ptemp); if (r != 0) { - fprintf(stderr, "bsdiff() failed: %d\n", r); + printf("bsdiff() failed: %d\n", r); return NULL; } struct stat st; if (stat(ptemp, &st) != 0) { - fprintf(stderr, "failed to stat patch file %s: %s\n", + printf("failed to stat patch file %s: %s\n", ptemp, strerror(errno)); return NULL; } @@ -635,11 +635,11 @@ unsigned char* MakePatch(ImageChunk* src, ImageChunk* tgt, size_t* size) { FILE* f = fopen(ptemp, "rb"); if (f == NULL) { - fprintf(stderr, "failed to open patch %s: %s\n", ptemp, strerror(errno)); + printf("failed to open patch %s: %s\n", ptemp, strerror(errno)); return NULL; } if (fread(data, 1, st.st_size, f) != st.st_size) { - fprintf(stderr, "failed to read patch %s: %s\n", ptemp, strerror(errno)); + printf("failed to read patch %s: %s\n", ptemp, strerror(errno)); return NULL; } fclose(f); @@ -691,7 +691,7 @@ int AreChunksEqual(ImageChunk* a, ImageChunk* b) { memcmp(a->deflate_data, b->deflate_data, a->deflate_len) == 0; default: - fprintf(stderr, "unknown chunk type %d\n", a->type); + printf("unknown chunk type %d\n", a->type); return 0; } } @@ -774,7 +774,7 @@ void DumpChunks(ImageChunk* chunks, int num_chunks) { int main(int argc, char** argv) { if (argc != 4 && argc != 5) { usage: - fprintf(stderr, "usage: %s [-z] <src-img> <tgt-img> <patch-file>\n", + printf("usage: %s [-z] <src-img> <tgt-img> <patch-file>\n", argv[0]); return 2; } @@ -796,20 +796,20 @@ int main(int argc, char** argv) { if (zip_mode) { if (ReadZip(argv[1], &num_src_chunks, &src_chunks, 1) == NULL) { - fprintf(stderr, "failed to break apart source zip file\n"); + printf("failed to break apart source zip file\n"); return 1; } if (ReadZip(argv[2], &num_tgt_chunks, &tgt_chunks, 0) == NULL) { - fprintf(stderr, "failed to break apart target zip file\n"); + printf("failed to break apart target zip file\n"); return 1; } } else { if (ReadImage(argv[1], &num_src_chunks, &src_chunks) == NULL) { - fprintf(stderr, "failed to break apart source image\n"); + printf("failed to break apart source image\n"); return 1; } if (ReadImage(argv[2], &num_tgt_chunks, &tgt_chunks) == NULL) { - fprintf(stderr, "failed to break apart target image\n"); + printf("failed to break apart target image\n"); return 1; } @@ -824,7 +824,7 @@ int main(int argc, char** argv) { } if (num_src_chunks != num_tgt_chunks) { - fprintf(stderr, "source and target don't have same number of chunks!\n"); + printf("source and target don't have same number of chunks!\n"); printf("source chunks:\n"); DumpChunks(src_chunks, num_src_chunks); printf("target chunks:\n"); @@ -833,7 +833,7 @@ int main(int argc, char** argv) { } for (i = 0; i < num_src_chunks; ++i) { if (src_chunks[i].type != tgt_chunks[i].type) { - fprintf(stderr, "source and target don't have same chunk " + printf("source and target don't have same chunk " "structure! (chunk %d)\n", i); printf("source chunks:\n"); DumpChunks(src_chunks, num_src_chunks); @@ -901,7 +901,7 @@ int main(int argc, char** argv) { MergeAdjacentNormalChunks(src_chunks, &num_src_chunks); if (num_src_chunks != num_tgt_chunks) { // This shouldn't happen. - fprintf(stderr, "merging normal chunks went awry\n"); + printf("merging normal chunks went awry\n"); return 1; } } diff --git a/tools/applypatch/imgpatch.c b/tools/applypatch/imgpatch.c index 74b041f..5322817 100644 --- a/tools/applypatch/imgpatch.c +++ b/tools/applypatch/imgpatch.c @@ -40,13 +40,13 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, SinkFn sink, void* token, SHA_CTX* ctx) { FILE* f; if ((f = fopen(patch_filename, "rb")) == NULL) { - fprintf(stderr, "failed to open patch file\n"); + printf("failed to open patch file\n"); return -1; } unsigned char header[12]; if (fread(header, 1, 12, f) != 12) { - fprintf(stderr, "failed to read patch file header\n"); + printf("failed to read patch file header\n"); return -1; } @@ -54,7 +54,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, // IMGDIFF2 uses CHUNK_NORMAL, CHUNK_DEFLATE, and CHUNK_RAW. if (memcmp(header, "IMGDIFF", 7) != 0 || (header[7] != '1' && header[7] != '2')) { - fprintf(stderr, "corrupt patch file header (magic number)\n"); + printf("corrupt patch file header (magic number)\n"); return -1; } @@ -65,7 +65,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, // each chunk's header record starts with 4 bytes. unsigned char chunk[4]; if (fread(chunk, 1, 4, f) != 4) { - fprintf(stderr, "failed to read chunk %d record\n", i); + printf("failed to read chunk %d record\n", i); return -1; } @@ -74,7 +74,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, if (type == CHUNK_NORMAL) { unsigned char normal_header[24]; if (fread(normal_header, 1, 24, f) != 24) { - fprintf(stderr, "failed to read chunk %d normal header data\n", i); + printf("failed to read chunk %d normal header data\n", i); return -1; } @@ -82,7 +82,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, size_t src_len = Read8(normal_header+8); size_t patch_offset = Read8(normal_header+16); - fprintf(stderr, "CHUNK %d: normal patch offset %d\n", i, patch_offset); + printf("CHUNK %d: normal patch offset %d\n", i, patch_offset); ApplyBSDiffPatch(old_data + src_start, src_len, patch_filename, patch_offset, @@ -98,14 +98,14 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, // in their chunk header. unsigned char* gzip = malloc(64); if (fread(gzip, 1, 64, f) != 64) { - fprintf(stderr, "failed to read chunk %d initial gzip header data\n", + printf("failed to read chunk %d initial gzip header data\n", i); return -1; } size_t gzip_header_len = Read4(gzip+60); gzip = realloc(gzip, 64 + gzip_header_len + 8); if (fread(gzip+64, 1, gzip_header_len+8, f) != gzip_header_len+8) { - fprintf(stderr, "failed to read chunk %d remaining gzip header data\n", + printf("failed to read chunk %d remaining gzip header data\n", i); return -1; } @@ -122,14 +122,14 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, int gz_memLevel = Read4(gzip+52); int gz_strategy = Read4(gzip+56); - fprintf(stderr, "CHUNK %d: gzip patch offset %d\n", i, patch_offset); + printf("CHUNK %d: gzip patch offset %d\n", i, patch_offset); // Decompress the source data; the chunk header tells us exactly // how big we expect it to be when decompressed. unsigned char* expanded_source = malloc(expanded_len); if (expanded_source == NULL) { - fprintf(stderr, "failed to allocate %d bytes for expanded_source\n", + printf("failed to allocate %d bytes for expanded_source\n", expanded_len); return -1; } @@ -146,7 +146,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, int ret; ret = inflateInit2(&strm, -15); if (ret != Z_OK) { - fprintf(stderr, "failed to init source inflation: %d\n", ret); + printf("failed to init source inflation: %d\n", ret); return -1; } @@ -154,12 +154,12 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, // data, we expect one call to inflate() to suffice. ret = inflate(&strm, Z_SYNC_FLUSH); if (ret != Z_STREAM_END) { - fprintf(stderr, "source inflation returned %d\n", ret); + printf("source inflation returned %d\n", ret); return -1; } // We should have filled the output buffer exactly. if (strm.avail_out != 0) { - fprintf(stderr, "source inflation short by %d bytes\n", strm.avail_out); + printf("source inflation short by %d bytes\n", strm.avail_out); return -1; } inflateEnd(&strm); @@ -208,7 +208,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, size_t have = temp_size - strm.avail_out; if (sink(temp_data, have, token) != have) { - fprintf(stderr, "failed to write %d compressed bytes to output\n", + printf("failed to write %d compressed bytes to output\n", have); return -1; } @@ -226,29 +226,29 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, } else if (type == CHUNK_RAW) { unsigned char raw_header[4]; if (fread(raw_header, 1, 4, f) != 4) { - fprintf(stderr, "failed to read chunk %d raw header data\n", i); + printf("failed to read chunk %d raw header data\n", i); return -1; } size_t data_len = Read4(raw_header); - fprintf(stderr, "CHUNK %d: raw data %d\n", i, data_len); + printf("CHUNK %d: raw data %d\n", i, data_len); unsigned char* temp = malloc(data_len); if (fread(temp, 1, data_len, f) != data_len) { - fprintf(stderr, "failed to read chunk %d raw data\n", i); + printf("failed to read chunk %d raw data\n", i); return -1; } SHA_update(ctx, temp, data_len); if (sink(temp, data_len, token) != data_len) { - fprintf(stderr, "failed to write chunk %d raw data\n", i); + printf("failed to write chunk %d raw data\n", i); return -1; } } else if (type == CHUNK_DEFLATE) { // deflate chunks have an additional 60 bytes in their chunk header. unsigned char deflate_header[60]; if (fread(deflate_header, 1, 60, f) != 60) { - fprintf(stderr, "failed to read chunk %d deflate header data\n", i); + printf("failed to read chunk %d deflate header data\n", i); return -1; } @@ -263,14 +263,14 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, int memLevel = Read4(deflate_header+52); int strategy = Read4(deflate_header+56); - fprintf(stderr, "CHUNK %d: deflate patch offset %d\n", i, patch_offset); + printf("CHUNK %d: deflate patch offset %d\n", i, patch_offset); // Decompress the source data; the chunk header tells us exactly // how big we expect it to be when decompressed. unsigned char* expanded_source = malloc(expanded_len); if (expanded_source == NULL) { - fprintf(stderr, "failed to allocate %d bytes for expanded_source\n", + printf("failed to allocate %d bytes for expanded_source\n", expanded_len); return -1; } @@ -287,7 +287,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, int ret; ret = inflateInit2(&strm, -15); if (ret != Z_OK) { - fprintf(stderr, "failed to init source inflation: %d\n", ret); + printf("failed to init source inflation: %d\n", ret); return -1; } @@ -295,12 +295,12 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, // data, we expect one call to inflate() to suffice. ret = inflate(&strm, Z_SYNC_FLUSH); if (ret != Z_STREAM_END) { - fprintf(stderr, "source inflation returned %d\n", ret); + printf("source inflation returned %d\n", ret); return -1; } // We should have filled the output buffer exactly. if (strm.avail_out != 0) { - fprintf(stderr, "source inflation short by %d bytes\n", strm.avail_out); + printf("source inflation short by %d bytes\n", strm.avail_out); return -1; } inflateEnd(&strm); @@ -344,7 +344,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, size_t have = temp_size - strm.avail_out; if (sink(temp_data, have, token) != have) { - fprintf(stderr, "failed to write %d compressed bytes to output\n", + printf("failed to write %d compressed bytes to output\n", have); return -1; } @@ -355,7 +355,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size, free(temp_data); free(uncompressed_target_data); } else { - fprintf(stderr, "patch chunk %d is unknown type %d\n", i, type); + printf("patch chunk %d is unknown type %d\n", i, type); return -1; } } diff --git a/tools/applypatch/main.c b/tools/applypatch/main.c index e25c730..e08f5c1 100644 --- a/tools/applypatch/main.c +++ b/tools/applypatch/main.c @@ -44,7 +44,7 @@ extern int applypatch(int argc, char** argv); int main(int argc, char** argv) { int result = applypatch(argc, argv); if (result == 2) { - fprintf(stderr, + printf( "usage: %s <src-file> <tgt-file> <tgt-sha1> <tgt-size> " "[<src-sha1>:<patch> ...]\n" " or %s -c <file> [<sha1> ...]\n" |