/* * Copyright (C) 2014 John Crispin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _SNAPSHOT_H__ #define _SNAPSHOT_H__ #define PATH_MAX 256 #define OWRT 0x4f575254 #define DATA 0x44415441 #define CONF 0x434f4e46 struct file_header { uint32_t magic; uint32_t type; uint32_t seq; uint32_t length; uint32_t md5[4]; }; static inline int is_config(struct file_header *h) { return ((h->magic == OWRT) && (h->type == CONF)); } static inline int valid_file_size(int fs) { if ((fs > 8 * 1024 * 1204) || (fs <= 0)) return -1; return 0; } static inline void hdr_to_be32(struct file_header *hdr) { uint32_t *h = (uint32_t *) hdr; int i; for (i = 0; i < sizeof(struct file_header) / sizeof(uint32_t); i++) h[i] = cpu_to_be32(h[i]); } static inline void be32_to_hdr(struct file_header *hdr) { uint32_t *h = (uint32_t *) hdr; int i; for (i = 0; i < sizeof(struct file_header) / sizeof(uint32_t); i++) h[i] = be32_to_cpu(h[i]); } static inline int pad_file_size(struct volume *v, int size) { int mod; size += sizeof(struct file_header); mod = size % v->block_size; if (mod) { size -= mod; size += v->block_size; } return size; } int verify_file_hash(char *file, uint32_t *hash); int snapshot_next_free(struct volume *v, uint32_t *seq); int config_find(struct volume *v, struct file_header *conf, struct file_header *sentinel); int snapshot_write_file(struct volume *v, int block, char *file, uint32_t seq, uint32_t type); int snapshot_read_file(struct volume *v, int block, char *file, uint32_t type); int sentinel_write(struct volume *v, uint32_t _seq); int volatile_write(struct volume *v, uint32_t _seq); #endif