/* vrm functions */
long
SS_GetAvailableFreeSpace(const char *partition_name,
- SS_UINT32 *available_flash_size)
+ size_t *available_flash_size)
{
int result = 0;
char path[MAX_PATH] = { '\0' };
* \return S_SS_SUCCESS on success or an \ref SS_vRM_Errors.h error code
*******************************************************************************
*/
- long SS_GetAvailableFreeSpace(const char *path, SS_UINT32 * available_flash_size);
+ long SS_GetAvailableFreeSpace(const char *path, size_t * available_flash_size);
/*!
*******************************************************************************
do {
int enough_space = 0;
- SS_UINT32 free_space = 0;
+ size_t free_space = 0;
if (retry > 0) {
SS_GetAvailableFreeSpace(source_filename, &free_space);
}
}
}
- result = apply_patch_brotli((char *)source_filename, outname, tar_file, -1);
+ result = apply_patch_brotli((char *)source_filename, outname, tar_file, -1, &free_space);
if (output >= 0) {
fsync(output);
close(output);
int SS_LoadFile(const char *filename, FileInfo * file);
extern void SS_SetUpgradeState(int Val);
-extern long SS_GetAvailableFreeSpace(const char *partition_name, SS_UINT32 * available_flash_size);
+extern long SS_GetAvailableFreeSpace(const char *partition_name, size_t * available_flash_size);
extern int SS_ApplyBsdiff(char *oldfile, char *newfile, char *patch, SinkFn sink, void *token, SHA1_CTX * ctx1);
extern int SS_PatchSourceClear(char *patch_path);
extern long SS_WriteFile(long wHandle, SS_UINT32 dwPosition, unsigned char *pbBuffer, SS_UINT32 dwSize);
case KIND_BROTLI_PATCH:
{
struct dec_funcs funcs = { init_brotli, decompress_brotli, free_brotli };
- r = apply_patch(parsed.patch_orig, parsed.dest, tar, parsed.dest_size, &funcs);
+ r = apply_patch(parsed.patch_orig, parsed.dest, tar, parsed.dest_size, NULL, &funcs);
break;
}
}
return result;
}
-int read_header(struct dec_funcs *funcs, struct bs_data *data, uint8_t **buff_out_pos)
+int read_header(struct dec_funcs *funcs, struct bs_data *data, uint8_t **buff_out_pos, size_t *free_space)
{
assert(data);
assert(buff_out_pos);
size_t target_size = parse_ssint(*buff_out_pos);
fprintf(stderr, "target_size: 0x%zx (%zu)\n", target_size, target_size);
+ if ((free_space != NULL) && (*free_space <= target_size)) {
+ fprintf(stderr, "Not enough disk space (target: %zu, free: %zu)\n", target_size, *free_space);
+ return PF_NOT_ENOUGH_DISK_SPACE;
+ }
+
if (data->dest.len == -1) {
data->dest.len = target_size;
if (ftruncate(data->dest.fd, data->dest.len) == -1) {
return PF_OK;
}
-int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, struct dec_funcs *funcs)
+int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space, struct dec_funcs *funcs)
{
assert(source_file);
assert(dest_file);
uint8_t *buff_out_pos;
- if ((result = read_header(funcs, &data, &buff_out_pos)) != PF_OK)
+ if ((result = read_header(funcs, &data, &buff_out_pos, free_space)) != PF_OK)
goto exit;
int res;
#define PF_ERROR_INVALID_PATCH_FILE 3
#define PF_ERROR_DECOMPRESSION 4
#define PF_NEED_MORE_DATA 5
+#define PF_NOT_ENOUGH_DISK_SPACE 6
#define BUFF_OUT_LEN 4096
void (*clean)(struct bs_data *data);
};
-extern int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, struct dec_funcs *funcs);
+extern int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space, struct dec_funcs *funcs);
#include "brotli.h"
-int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size)
+int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space)
{
struct dec_funcs funcs = { init_brotli, decompress_brotli, free_brotli };
- return apply_patch(source_file, dest_file, patch_tar, dest_size, &funcs);
+ return apply_patch(source_file, dest_file, patch_tar, dest_size, free_space, &funcs);
}
#pragma once
#include <libtar.h>
-int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size);
+int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space);