+ 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)