aboutsummaryrefslogtreecommitdiffstats
path: root/src/ea_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ea_map.c')
-rw-r--r--src/ea_map.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/ea_map.c b/src/ea_map.c
new file mode 100644
index 0000000..e8d103e
--- /dev/null
+++ b/src/ea_map.c
@@ -0,0 +1,79 @@
+#include "project.h"
+#include <db.h>
+
+static DB *ea_map_db = NULL;
+
+static int ea_map_init (void)
+{
+ int ret;
+
+ ret = db_create (&ea_map_db, NULL, 0);
+
+ if (ret) {
+ ea_map_db = NULL;
+ return -1;
+ }
+
+ ret = ea_map_db->open (ea_map_db, NULL, NULL, NULL, DB_BTREE, DB_CREATE, 0x600);
+
+ if (ret) {
+ ea_map_db->err (ea_map_db, ret, "ea_map_db");
+ ea_map_db->close (ea_map_db, 0);
+ ea_map_db = NULL;
+ return -1;
+ }
+
+ return 0;
+}
+
+int ea_map_lookup (blk64_t src_blk, blk64_t *dst_blk, blk64_t *len)
+{
+ DBT key = {0}, data = {0};
+ blk64_t *buf;
+
+ if (!ea_map_db)
+ return -1;
+
+ key.size = sizeof (src_blk);
+ key.data = &src_blk;
+
+ if (ea_map_db->get (ea_map_db, NULL, &key, &data, 0))
+ return -1;
+
+ if (data.size != (2 * sizeof (blk64_t)))
+ return -1;
+
+ buf = (blk64_t *) data.data;
+
+ *dst_blk = buf[0];
+ *len = buf[1];
+
+ return 0;
+}
+
+
+int ea_map_set (blk64_t src_blk, blk64_t dst_blk, blk64_t len)
+{
+ DBT key = {0}, data = {0};
+ blk64_t buf[2] = {dst_blk, len};
+ int ret;
+
+ if (!ea_map_db)
+ if (ea_map_init())
+ return -1;
+
+
+ key.size = sizeof (src_blk);
+ key.data = &src_blk;
+ data.size = 2 * sizeof (dst_blk);
+ data.data = buf;
+
+ ret = ea_map_db->put (ea_map_db, NULL, &key, &data, 0);
+
+ if (ret)
+ ea_map_db->err (ea_map_db, ret, "DB->put");
+
+ return ret;
+}
+
+