targets/Linux/plc_Linux_main_retain.c
author Edouard Tisserant
Thu, 04 Apr 2019 13:59:22 +0200
branchrename_on_location_change
changeset 2575 aee08bd135d8
parent 2499 68f4f2d4516b
child 2634 4de945ddc223
permissions -rw-r--r--
Rename checkbox and immediately apply.
Added a checkbox in Location selection dialog (saved as user settings) to let user choose if variable is being renamed.
Also forced closing celle editor once new location is selected.
2178
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     1
/*
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     2
  This file is part of Beremiz, a Integrated Development Environment for
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     3
  programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     4
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     5
  See COPYING.runtime
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     6
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     7
  Copyright (C) 2018: Sergey Surkov <surkov.sv@summatechnology.ru>
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     8
  Copyright (C) 2018: Andrey Skvortsov <andrej.skvortzov@gmail.com>
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
     9
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
    10
*/
bd0d13d10b8e Add copyright headers to retain implementation for GNU/Linux and Win32
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2173
diff changeset
    11
2173
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    12
#ifndef HAVE_RETAIN
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    13
#include <stdio.h>
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    14
#include <stdint.h>
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    15
#include <unistd.h>
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    16
#include "iec_types.h"
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    17
2227
f150783ee8e7 Fix some compilation warnings for better ANSI C compliance
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2178
diff changeset
    18
int GetRetainSize(void);
2173
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    19
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    20
/* Retain buffer.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    21
FILE *retain_buffer;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    22
const char rb_file[]      = "retain_buffer_file";
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    23
const char rb_file_bckp[] = "retain_buffer_file.bak";
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    24
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    25
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    26
/* Retain header struct.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    27
struct retain_info_t {
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    28
	uint32_t retain_size;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    29
	uint32_t hash_size;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    30
	uint8_t* hash;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    31
	uint32_t header_offset;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    32
	uint32_t header_crc;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    33
};
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    34
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    35
/* Init retain info structure.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    36
struct retain_info_t retain_info;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    37
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    38
/* CRC lookup table and initial state.  */
2499
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    39
static const uint32_t crc32_table[256] = {
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    40
	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    41
	0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    42
	0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    43
	0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    44
	0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    45
	0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    46
	0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    47
	0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    48
	0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    49
	0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    50
	0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    51
	0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    52
	0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    53
	0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    54
	0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    55
	0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    56
	0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    57
	0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    58
	0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    59
	0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    60
	0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    61
	0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    62
	0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    63
	0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    64
	0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    65
	0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    66
	0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    67
	0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    68
	0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    69
	0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    70
	0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    71
	0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
68f4f2d4516b use pregenerated CRC32 lookup tables for retain on Win32 and GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 2227
diff changeset
    72
};
2173
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    73
uint32_t retain_crc;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    74
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    75
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    76
/* Calculate CRC32 for len bytes from pointer buf with init starting value.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    77
uint32_t GenerateCRC32Sum(const void* buf, unsigned int len, uint32_t init)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    78
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    79
	uint32_t crc = ~init;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    80
	unsigned char* current = (unsigned char*) buf;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    81
	while (len--)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    82
		crc = crc32_table[(crc ^ *current++) & 0xFF] ^ (crc >> 8);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    83
	return ~crc;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    84
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    85
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    86
/* Calc CRC32 for retain file byte by byte.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    87
int CheckFileCRC(FILE* file_buffer)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    88
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    89
	/* Set the magic constant for one-pass CRC calc according to ZIP CRC32.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    90
	const uint32_t magic_number = 0x2144df1c;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    91
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    92
	/* CRC initial state.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    93
	uint32_t calc_crc32 = 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    94
	char data_block = 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    95
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    96
	while(!feof(file_buffer)){
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    97
		if (fread(&data_block, sizeof(data_block), 1, file_buffer))
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    98
			calc_crc32 = GenerateCRC32Sum(&data_block, sizeof(char), calc_crc32);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
    99
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   100
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   101
	/* Compare crc result with a magic number.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   102
	return (calc_crc32 == magic_number) ? 1 : 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   103
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   104
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   105
/* Compare current hash with hash from file byte by byte.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   106
int CheckFilehash(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   107
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   108
	int k;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   109
	int offset = sizeof(retain_info.retain_size);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   110
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   111
	rewind(retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   112
	fseek(retain_buffer, offset , SEEK_SET);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   113
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   114
	uint32_t size;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   115
	fread(&size, sizeof(size), 1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   116
	if (size != retain_info.hash_size)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   117
		return 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   118
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   119
	for(k = 0; k < retain_info.hash_size; k++){
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   120
		uint8_t file_digit;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   121
		fread(&file_digit, sizeof(char), 1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   122
		if (file_digit != *(retain_info.hash+k))
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   123
			return 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   124
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   125
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   126
	return 1;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   127
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   128
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   129
void InitRetain(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   130
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   131
	int i;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   132
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   133
	/* Get retain size in bytes */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   134
	retain_info.retain_size = GetRetainSize();
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   135
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   136
	/* Hash stored in retain file as array of char in hex digits
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   137
	   (that's why we divide strlen in two).  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   138
	retain_info.hash_size = PLC_ID ? strlen(PLC_ID)/2 : 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   139
	//retain_info.hash_size = 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   140
	retain_info.hash = malloc(retain_info.hash_size);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   141
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   142
	/* Transform hash string into byte sequence.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   143
	for (i = 0; i < retain_info.hash_size; i++) {
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   144
		int byte = 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   145
		sscanf((PLC_ID + i*2), "%02X", &byte);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   146
		retain_info.hash[i] = byte;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   147
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   148
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   149
	/* Calc header offset.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   150
	retain_info.header_offset = sizeof(retain_info.retain_size) + \
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   151
		sizeof(retain_info.hash_size) + \
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   152
		retain_info.hash_size;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   153
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   154
	/*  Set header CRC initial state.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   155
	retain_info.header_crc = 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   156
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   157
	/* Calc crc for header.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   158
	retain_info.header_crc = GenerateCRC32Sum(
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   159
		&retain_info.retain_size,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   160
		sizeof(retain_info.retain_size),
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   161
		retain_info.header_crc);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   162
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   163
	retain_info.header_crc = GenerateCRC32Sum(
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   164
		&retain_info.hash_size,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   165
		sizeof(retain_info.hash_size),
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   166
		retain_info.header_crc);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   167
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   168
	retain_info.header_crc = GenerateCRC32Sum(
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   169
		retain_info.hash,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   170
		retain_info.hash_size,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   171
		retain_info.header_crc);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   172
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   173
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   174
void CleanupRetain(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   175
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   176
	/* Free hash memory.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   177
	free(retain_info.hash);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   178
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   179
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   180
int CheckRetainFile(const char * file)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   181
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   182
	retain_buffer = fopen(file, "rb");
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   183
	if (retain_buffer) {
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   184
		/* Check CRC32 and hash.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   185
		if (CheckFileCRC(retain_buffer))
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   186
			if (CheckFilehash())
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   187
				return 1;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   188
		fclose(retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   189
		retain_buffer = NULL;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   190
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   191
	return 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   192
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   193
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   194
int CheckRetainBuffer(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   195
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   196
	retain_buffer = NULL;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   197
	if (!retain_info.retain_size)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   198
		return 1;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   199
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   200
	/* Check latest retain file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   201
	if (CheckRetainFile(rb_file))
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   202
		return 1;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   203
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   204
	/* Check if we have backup.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   205
	if (CheckRetainFile(rb_file_bckp))
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   206
		return 1;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   207
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   208
	/* We don't have any valid retain buffer - nothing to remind.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   209
	return 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   210
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   211
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   212
#ifndef FILE_RETAIN_SAVE_PERIOD_S
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   213
#define FILE_RETAIN_SAVE_PERIOD_S 1.0
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   214
#endif
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   215
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   216
static double CalcDiffSeconds(IEC_TIME* t1, IEC_TIME *t2)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   217
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   218
	IEC_TIME dt ={
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   219
		t1->tv_sec  - t2->tv_sec,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   220
		t1->tv_nsec - t2->tv_nsec
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   221
	};
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   222
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   223
	if ((dt.tv_nsec < -1000000000) || ((dt.tv_sec > 0) && (dt.tv_nsec < 0))){
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   224
		dt.tv_sec--;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   225
		dt.tv_nsec += 1000000000;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   226
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   227
	if ((dt.tv_nsec > +1000000000) || ((dt.tv_sec < 0) && (dt.tv_nsec > 0))){
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   228
		dt.tv_sec++;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   229
		dt.tv_nsec -= 1000000000;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   230
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   231
	return dt.tv_sec + 1e-9*dt.tv_nsec;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   232
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   233
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   234
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   235
int RetainSaveNeeded(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   236
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   237
	int ret = 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   238
	static IEC_TIME last_save;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   239
	IEC_TIME now;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   240
	double diff_s;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   241
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   242
	/* no retain */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   243
	if (!retain_info.retain_size)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   244
		return 0;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   245
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   246
	/* periodic retain flush to avoid high I/O load */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   247
	PLC_GetTime(&now);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   248
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   249
	diff_s = CalcDiffSeconds(&now, &last_save);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   250
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   251
	if ((diff_s > FILE_RETAIN_SAVE_PERIOD_S) || ForceSaveRetainReq()) {
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   252
		ret = 1;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   253
		last_save = now;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   254
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   255
	return ret;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   256
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   257
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   258
void ValidateRetainBuffer(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   259
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   260
	if (!retain_buffer)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   261
		return;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   262
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   263
	/* Add retain data CRC to the end of buffer file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   264
	fseek(retain_buffer, 0, SEEK_END);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   265
	fwrite(&retain_crc, sizeof(uint32_t), 1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   266
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   267
	/* Sync file buffer and close file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   268
#ifdef __WIN32
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   269
	fflush(retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   270
#else
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   271
	fsync(fileno(retain_buffer));
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   272
#endif
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   273
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   274
	fclose(retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   275
	retain_buffer = NULL;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   276
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   277
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   278
void InValidateRetainBuffer(void)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   279
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   280
	if (!RetainSaveNeeded())
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   281
		return;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   282
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   283
	/* Rename old retain file into *.bak if it exists.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   284
	rename(rb_file, rb_file_bckp);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   285
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   286
	/* Set file CRC initial value.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   287
	retain_crc = retain_info.header_crc;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   288
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   289
	/* Create new retain file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   290
	retain_buffer = fopen(rb_file, "wb+");
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   291
	if (!retain_buffer) {
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   292
		fprintf(stderr, "Failed to create retain file : %s\n", rb_file);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   293
		return;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   294
	}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   295
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   296
	/* Write header to the new file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   297
	fwrite(&retain_info.retain_size,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   298
		sizeof(retain_info.retain_size), 1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   299
	fwrite(&retain_info.hash_size,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   300
		sizeof(retain_info.hash_size),   1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   301
	fwrite(retain_info.hash ,
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   302
		sizeof(char), retain_info.hash_size, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   303
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   304
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   305
void Retain(unsigned int offset, unsigned int count, void *p)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   306
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   307
	if (!retain_buffer)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   308
		return;
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   309
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   310
	/* Generate CRC 32 for each data block.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   311
	retain_crc = GenerateCRC32Sum(p, count, retain_crc);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   312
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   313
	/* Save current var in file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   314
	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   315
	fwrite(p, count, 1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   316
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   317
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   318
void Remind(unsigned int offset, unsigned int count, void *p)
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   319
{
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   320
	/* Remind variable from file.  */
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   321
	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   322
	fread((void *)p, count, 1, retain_buffer);
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   323
}
976841968d74 Add retain basic implementation on GNU/Linux
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
diff changeset
   324
#endif // !HAVE_RETAIN