free(node);
}
+static void
+cache_foreach(void (*cb)(struct cache_table *, struct cache_node *))
+{
+ struct cache_node *node, *tmp;
+
+ HASH_ITER(hh, cache.rsync.nodes, node, tmp)
+ cb(&cache.rsync, node);
+ HASH_ITER(hh, cache.https.nodes, node, tmp)
+ cb(&cache.https, node);
+ HASH_ITER(hh, cache.rrdp.nodes, node, tmp)
+ cb(&cache.rrdp, node);
+ HASH_ITER(hh, cache.fallback.nodes, node, tmp)
+ cb(&cache.fallback, node);
+}
+
char *
get_rsync_module(char const *url)
{
return error;
}
-static void
+static int
init_cache_metafile(void)
{
json_t *root;
goto invalid_cache;
json_decref(root);
- return;
+ return 0;
invalid_cache:
- pr_op_info("The cache seems to have been built by a different version of Fort. "
- "I'm going to clear it, just to be safe.");
- reset_cache_dir();
json_decref(root);
+ return EINVAL;
}
static void
"# https://bford.info/cachedir/\n");
}
-static int
-init_cache_dirs(void)
-{
- int error;
- error = file_mkdir("rsync", true);
- if (error)
- return error;
- error = file_mkdir("https", true);
- if (error)
- return error;
- error = file_mkdir("rrdp", true);
- if (error)
- return error;
- error = file_mkdir("fallback", true);
- if (error)
- return error;
- return file_mkdir(CACHE_TMPDIR, true);
-}
-
int
cache_setup(void)
{
return error;
}
- // XXX Lock the cache directory
init_tables();
- init_cache_metafile();
- init_cache_dirs();
- init_cachedir_tag();
return 0;
}
}
}
-static void
+static int
load_tal_json(void)
{
json_t *root;
json2tbl(root, &cache.rrdp);
json2tbl(root, &cache.fallback);
+ json_decref(root);
+ return 0;
+
end: json_decref(root);
+ return EINVAL;
}
-void
+int
cache_prepare(void)
{
- load_tal_json();
+ int error;
+
+ if (init_cache_metafile() != 0) {
+ error = reset_cache_dir();
+ if (error)
+ return error;
+ }
+ if (load_tal_json() != 0) {
+ error = reset_cache_dir();
+ if (error)
+ return error;
+ }
+
+ // XXX Lock the cache directory
+ error = file_mkdir("rsync", true);
+ if (error)
+ goto fail;
+ error = file_mkdir("https", true);
+ if (error)
+ goto fail;
+ error = file_mkdir("rrdp", true);
+ if (error)
+ goto fail;
+ error = file_mkdir("fallback", true);
+ if (error)
+ goto fail;
+ error = file_mkdir(CACHE_TMPDIR, true);
+ if (error)
+ goto fail;
+ init_cachedir_tag();
+
+ return 0;
+
+fail: cache_foreach(delete_node);
+ return error;
}
static json_t *
}
}
-static void
-cache_foreach(void (*cb)(struct cache_table *, struct cache_node *))
-{
- struct cache_node *node, *tmp;
-
- HASH_ITER(hh, cache.rsync.nodes, node, tmp)
- cb(&cache.rsync, node);
- HASH_ITER(hh, cache.https.nodes, node, tmp)
- cb(&cache.https, node);
- HASH_ITER(hh, cache.rrdp.nodes, node, tmp)
- cb(&cache.rrdp, node);
- HASH_ITER(hh, cache.fallback.nodes, node, tmp)
- cb(&cache.fallback, node);
-}
-
/*
* Deletes unknown and old untraversed cached files, writes metadata into XML.
*/