+static size_t dir_hash(const char *name)
+{
+ return hash(name, strlen(name), 0);
+}
+
+static const char *manifest_name(const struct manifest *m)
+{
+ return m->dir;
+}
+
+static bool dir_cmp(const struct manifest *m, const char *dir)
+{
+ return strcmp(m->dir, dir) == 0;
+}
+
+HTABLE_DEFINE_TYPE(struct manifest, manifest_name, dir_hash, dir_cmp, manifest);
+static struct htable_manifest *manifests;
+
+const char *get_ccan_file_contents(struct ccan_file *f)
+{
+ if (!f->contents) {
+ f->contents = grab_file(f, f->fullname, &f->contents_size);
+ if (!f->contents)
+ err(1, "Reading file %s", f->fullname);
+ }
+ return f->contents;
+}
+