targets/Win32/plc_Win32_main_retain.c
changeset 2227 f150783ee8e7
parent 2178 bd0d13d10b8e
child 2499 68f4f2d4516b
equal deleted inserted replaced
2192:09d5d1456616 2227:f150783ee8e7
    13 #include <stdio.h>
    13 #include <stdio.h>
    14 #include <stdint.h>
    14 #include <stdint.h>
    15 #include <unistd.h>
    15 #include <unistd.h>
    16 #include "iec_types.h"
    16 #include "iec_types.h"
    17 
    17 
    18 int GetRetainSize();
    18 int GetRetainSize(void);
    19 
    19 
    20 /* Retain buffer.  */
    20 /* Retain buffer.  */
    21 FILE *retain_buffer;
    21 FILE *retain_buffer;
    22 const char rb_file[]      = "retain_buffer_file";
    22 const char rb_file[]      = "retain_buffer_file";
    23 const char rb_file_bckp[] = "retain_buffer_file.bak";
    23 const char rb_file_bckp[] = "retain_buffer_file.bak";
    77 	uint32_t calc_crc32 = 0;
    77 	uint32_t calc_crc32 = 0;
    78 	char data_block = 0;
    78 	char data_block = 0;
    79 
    79 
    80 	while(!feof(file_buffer)){
    80 	while(!feof(file_buffer)){
    81 		if (fread(&data_block, sizeof(data_block), 1, file_buffer))
    81 		if (fread(&data_block, sizeof(data_block), 1, file_buffer))
    82 			calc_crc32 = GenerateCRC32Sum(&data_block, sizeof(char), calc_crc32);
    82 			calc_crc32 = GenerateCRC32Sum(&data_block, sizeof(data_block), calc_crc32);
    83 	}
    83 	}
    84 
    84 
    85 	/* Compare crc result with a magic number.  */
    85 	/* Compare crc result with a magic number.  */
    86 	return (calc_crc32 == magic_number) ? 1 : 0;
    86 	return (calc_crc32 == magic_number) ? 1 : 0;
    87 }
    87 }
    88 
    88 
    89 /* Compare current hash with hash from file byte by byte.  */
    89 /* Compare current hash with hash from file byte by byte.  */
    90 int CheckFilehash(void)
    90 int CheckFilehash(void)
    91 {
    91 {
    92 	int k;
    92 	unsigned int k;
    93 	int offset = sizeof(retain_info.retain_size);
    93 	int offset = sizeof(retain_info.retain_size);
    94 
    94 
    95 	rewind(retain_buffer);
    95 	rewind(retain_buffer);
    96 	fseek(retain_buffer, offset , SEEK_SET);
    96 	fseek(retain_buffer, offset , SEEK_SET);
    97 
    97 
   100 	if (size != retain_info.hash_size)
   100 	if (size != retain_info.hash_size)
   101 		return 0;
   101 		return 0;
   102 
   102 
   103 	for(k = 0; k < retain_info.hash_size; k++){
   103 	for(k = 0; k < retain_info.hash_size; k++){
   104 		uint8_t file_digit;
   104 		uint8_t file_digit;
   105 		fread(&file_digit, sizeof(char), 1, retain_buffer);
   105 		fread(&file_digit, sizeof(file_digit), 1, retain_buffer);
   106 		if (file_digit != *(retain_info.hash+k))
   106 		if (file_digit != *(retain_info.hash+k))
   107 			return 0;
   107 			return 0;
   108 	}
   108 	}
   109 
   109 
   110 	return 1;
   110 	return 1;
   111 }
   111 }
   112 
   112 
   113 void InitRetain(void)
   113 void InitRetain(void)
   114 {
   114 {
   115 	int i;
   115 	unsigned int i;
   116 
   116 
   117 	/* Generate CRC32 lookup table.  */
   117 	/* Generate CRC32 lookup table.  */
   118 	GenerateCRC32Table();
   118 	GenerateCRC32Table();
   119 
   119 
   120 	/* Get retain size in bytes */
   120 	/* Get retain size in bytes */
   247 	if (!retain_buffer)
   247 	if (!retain_buffer)
   248 		return;
   248 		return;
   249 
   249 
   250 	/* Add retain data CRC to the end of buffer file.  */
   250 	/* Add retain data CRC to the end of buffer file.  */
   251 	fseek(retain_buffer, 0, SEEK_END);
   251 	fseek(retain_buffer, 0, SEEK_END);
   252 	fwrite(&retain_crc, sizeof(uint32_t), 1, retain_buffer);
   252 	fwrite(&retain_crc, sizeof(retain_crc), 1, retain_buffer);
   253 
   253 
   254 	/* Sync file buffer and close file.  */
   254 	/* Sync file buffer and close file.  */
   255 #ifdef __WIN32
   255 #ifdef __WIN32
   256 	fflush(retain_buffer);
   256 	fflush(retain_buffer);
   257 #else
   257 #else