split snapshot tool properly
[project/fstools.git] / libfstools / snapshot.h
diff --git a/libfstools/snapshot.h b/libfstools/snapshot.h
new file mode 100644 (file)
index 0000000..636f004
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
+ *
+ * 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