+ BFiles bfs = xmalloc (sizeof(*bfs));
+ bfs->commit_area = NULL;
+ bfs->register_area = mf_init("register", spec);
+ bfs->lockDir = NULL;
+ return bfs;
+}
+
+void bfs_destroy (BFiles bfs)
+{
+ xfree (bfs->lockDir);
+ mf_destroy (bfs->commit_area);
+ mf_destroy (bfs->register_area);
+ xfree (bfs);
+}
+
+static FILE *open_cache (BFiles bfs, const char *flags)
+{
+ char cacheFilename[1024];
+ FILE *file;
+
+ sprintf (cacheFilename, "%scache",
+ bfs->lockDir ? bfs->lockDir : "");
+ file = fopen (cacheFilename, flags);
+ return file;
+}
+
+static void unlink_cache (BFiles bfs)
+{
+ char cacheFilename[1024];
+
+ sprintf (cacheFilename, "%scache",
+ bfs->lockDir ? bfs->lockDir : "");
+ unlink (cacheFilename);
+}
+
+void bf_lockDir (BFiles bfs, const char *lockDir)
+{
+ size_t len;
+
+ xfree (bfs->lockDir);
+ if (lockDir == NULL)
+ lockDir = "";
+ len = strlen(lockDir);
+ bfs->lockDir = xmalloc (len+2);
+ strcpy (bfs->lockDir, lockDir);
+
+ if (len > 0 && bfs->lockDir[len-1] != '/')
+ strcpy (bfs->lockDir + len, "/");
+}
+
+void bf_cache (BFiles bfs, const char *spec)
+{
+ if (spec)
+ {
+ if (!bfs->commit_area)
+ bfs->commit_area = mf_init ("shadow", spec);
+ }
+ else
+ bfs->commit_area = NULL;