#include "broadcast_feature.h"
#include "mbedtls/md5.h"
#include "mbedtls/error.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
#define MAX_FILE_NAME_LEN 256
#define MAX_FILE_CHECKSUM_STR_LEN (256 + 64)
return false;
}
-/*
- 校验状态
- 0 未校验
- 1 校验中
- 2 校验成功
- 3 校验失败
-*/
-bool resfile_checksum_thread(void)
-{
- uapi_dev_runtime_set_checkres_status(1);
- printf("resfile start check\r\n");
- char *readbuf = malloc(MAX_FILE_CHECKSUM_STR_LEN);
- if (readbuf == NULL)
- {
- printf("malloc fail, skip resfile check\r\n");
- uapi_dev_runtime_set_checkres_status(3);
- return false;
- }
- char *filename = malloc(MAX_FILE_NAME_LEN);
- if (filename == NULL)
- {
- free(readbuf);
- printf("malloc fail, skip resfile check\r\n");
- uapi_dev_runtime_set_checkres_status(3);
- return false;
- }
- FILE *file = fopen(RESFILE_CHECKSUM_FILE, "rb");
- if (file == NULL)
- {
- printf("checksum list file %s not exist, skip resfile check\r\n", RESFILE_CHECKSUM_FILE);
- free(readbuf);
- free(filename);
- uapi_dev_runtime_set_checkres_status(3);
- return false;
- }
- memset(readbuf, 0, MAX_FILE_CHECKSUM_STR_LEN);
- char tmp;
- int i = 0;
- FILE *diff_file = fopen(CHECK_DIFFERENTER_FILE, "w");
- if (diff_file == NULL)
- {
- printf("Failed to open differential file %s\r\n", CHECK_DIFFERENTER_FILE);
- fclose(file);
- free(readbuf);
- free(filename);
- uapi_dev_runtime_set_checkres_status(3);
- return false;
- }
+// 校验状态
+// 0 未校验
+// 1 校验中
+// 2 校验成功
+// 3 校验失败(文件不存在)
+// 4 校验失败(校验和错误)
- while (fread(&tmp, 1, 1, file) > 0)
- {
- if (i >= MAX_FILE_CHECKSUM_STR_LEN - 1) // 保留一个字符用于 '\0'
- {
- break;
- }
- if (tmp == '\n')
- {
- readbuf[i] = '\0'; // 结束字符串
- memset(filename, 0, MAX_FILE_NAME_LEN);
- if (check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN) == false)
- {
- printf("resfile %s is modified or deleted!\r\n", filename);
- fprintf(diff_file, "%s\n", filename); // 写文件并换行
- }
- i = 0;
- memset(readbuf, 0, MAX_FILE_CHECKSUM_STR_LEN);
- continue;
- }
- else
- {
- readbuf[i] = tmp;
- }
- i++;
- }
+// 检查内存分配
+void* safe_malloc(size_t size) {
+ void* ptr = malloc(size);
+ if (!ptr) {
+ printf("Memory allocation failed, skipping resfile check.\n");
+ }
+ return ptr;
+}
- // 处理最后一行
- if (i > 0 && i < MAX_FILE_CHECKSUM_STR_LEN)
- {
- readbuf[i] = '\0'; // 结束字符串
- memset(filename, 0, MAX_FILE_NAME_LEN);
- if (check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN) == false)
- {
- printf("resfile %s is modified or deleted!\r\n", filename);
- fprintf(diff_file, "%s\n", filename); // 写文件并换行
- }
- }
+// 主校验函数
+bool resfile_checksum_thread(void) {
+ uapi_dev_runtime_set_checkres_status(1);
+ printf("Starting resfile check...\n");
- fclose(diff_file);
- fclose(file);
- free(readbuf);
- free(filename);
- uapi_dev_runtime_set_checkres_status(2);
- printf("resfile check done\r\n");
+ char *readbuf = safe_malloc(MAX_FILE_CHECKSUM_STR_LEN);
+ char *filename = safe_malloc(MAX_FILE_NAME_LEN);
+ if (!readbuf || !filename) {
+ uapi_dev_runtime_set_checkres_status(readbuf ? 4 : 3);
+ free(readbuf);
+ free(filename);
+ return false;
+ }
- return true;
+ FILE *file = fopen(RESFILE_CHECKSUM_FILE, "rb");
+ if (!file) {
+ printf("Checksum list file %s does not exist, skipping resfile check.\n", RESFILE_CHECKSUM_FILE);
+ free(readbuf);
+ free(filename);
+ uapi_dev_runtime_set_checkres_status(4);
+ return false;
+ }
+
+ FILE *diff_file = fopen(CHECK_DIFFERENTER_FILE, "w");
+ if (!diff_file) {
+ printf("Failed to open differential file %s.\n", CHECK_DIFFERENTER_FILE);
+ fclose(file);
+ free(readbuf);
+ free(filename);
+ uapi_dev_runtime_set_checkres_status(3);
+ return false;
+ }
+
+ int i = 0;
+ char tmp;
+ while (fread(&tmp, 1, 1, file) > 0) {
+ if (tmp == '\n') {
+ readbuf[i] = '\0'; // 结束字符串
+
+ // 检查文件
+ memset(filename, 0, MAX_FILE_NAME_LEN);
+ if (!check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN)) {
+ printf("Resfile %s is modified or deleted!\n", filename);
+ fprintf(diff_file, "%s\n", filename); // 写文件并换行
+ }
+ i = 0; // 重置索引
+ } else if (i < MAX_FILE_CHECKSUM_STR_LEN - 1) {
+ readbuf[i++] = tmp; // 存储字符
+ }
+ }
+
+ // 处理最后一行
+ if (i > 0 && i < MAX_FILE_CHECKSUM_STR_LEN) {
+ readbuf[i] = '\0'; // 结束字符串
+ memset(filename, 0, MAX_FILE_NAME_LEN);
+ if (!check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN)) {
+ printf("Resfile %s is modified or deleted!\n", filename);
+ fprintf(diff_file, "%s\n", filename); // 写文件并换行
+ }
+ }
+
+ fclose(diff_file);
+ fclose(file);
+ free(readbuf);
+ free(filename);
+ uapi_dev_runtime_set_checkres_status(2);
+ printf("Resfile check done.\n");
+
+ return true;
}
\ No newline at end of file