c4351c7910
Change the applypatch function to take meaningful arguments instead of argc and argv. Move all the parsing of arguments into main.c (for the standalone binary) and into install.c (for the updater function). applypatch() takes patches as Value objects, so we can pass in blobs extracted from the package without ever writing them to temp files. The patching code is changed to read the patch from memory instead of a file. A bunch of compiler warnings (mostly about signed vs unsigned types) are fixed. Support for the IMGDIFF1 format is dropped. (We've been generating IMGDIFF2 packages for some time now.) Change-Id: I217563c500012750f27110db821928a06211323f
85 lines
2.8 KiB
C
85 lines
2.8 KiB
C
/*
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef _APPLYPATCH_H
|
|
#define _APPLYPATCH_H
|
|
|
|
#include <sys/stat.h>
|
|
#include "mincrypt/sha.h"
|
|
#include "edify/expr.h"
|
|
|
|
typedef struct _Patch {
|
|
uint8_t sha1[SHA_DIGEST_SIZE];
|
|
const char* patch_filename;
|
|
} Patch;
|
|
|
|
typedef struct _FileContents {
|
|
uint8_t sha1[SHA_DIGEST_SIZE];
|
|
unsigned char* data;
|
|
ssize_t size;
|
|
struct stat st;
|
|
} FileContents;
|
|
|
|
// When there isn't enough room on the target filesystem to hold the
|
|
// patched version of the file, we copy the original here and delete
|
|
// it to free up space. If the expected source file doesn't exist, or
|
|
// is corrupted, we look to see if this file contains the bits we want
|
|
// and use it as the source instead.
|
|
#define CACHE_TEMP_SOURCE "/cache/saved.file"
|
|
|
|
typedef ssize_t (*SinkFn)(unsigned char*, ssize_t, void*);
|
|
|
|
// applypatch.c
|
|
int ShowLicenses();
|
|
size_t FreeSpaceForFile(const char* filename);
|
|
int CacheSizeCheck(size_t bytes);
|
|
int ParseSha1(const char* str, uint8_t* digest);
|
|
|
|
int applypatch(const char* source_filename,
|
|
const char* target_filename,
|
|
const char* target_sha1_str,
|
|
size_t target_size,
|
|
int num_patches,
|
|
char** const patch_sha1_str,
|
|
Value** patch_data);
|
|
int applypatch_check(const char* filename,
|
|
int num_patches,
|
|
char** const patch_sha1_str);
|
|
|
|
// Read a file into memory; store it and its associated metadata in
|
|
// *file. Return 0 on success.
|
|
int LoadFileContents(const char* filename, FileContents* file);
|
|
void FreeFileContents(FileContents* file);
|
|
|
|
// bsdiff.c
|
|
void ShowBSDiffLicense();
|
|
int ApplyBSDiffPatch(const unsigned char* old_data, ssize_t old_size,
|
|
const Value* patch, ssize_t patch_offset,
|
|
SinkFn sink, void* token, SHA_CTX* ctx);
|
|
int ApplyBSDiffPatchMem(const unsigned char* old_data, ssize_t old_size,
|
|
const Value* patch, ssize_t patch_offset,
|
|
unsigned char** new_data, ssize_t* new_size);
|
|
|
|
// imgpatch.c
|
|
int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size,
|
|
const Value* patch,
|
|
SinkFn sink, void* token, SHA_CTX* ctx);
|
|
|
|
// freecache.c
|
|
int MakeFreeSpaceOnCache(size_t bytes_needed);
|
|
|
|
#endif
|