diff --git a/src/bee-dep.c b/src/bee-dep.c
index a40a999..65f53a0 100644
--- a/src/bee-dep.c
+++ b/src/bee-dep.c
@@ -34,6 +34,8 @@
 #include <libgen.h>
 #include <unistd.h>
 #include <getopt.h>
+#include <errno.h>
+#include <assert.h>
 
 #include "graph.h"
 
@@ -157,24 +159,37 @@ static FILE *open_and_lock(char *filename, char *mode)
     return f;
 }
 
+/* create all directories in path with mode mode */
 int mkdirp(char *path, mode_t mode)
 {
-    char *dir, *pdir;
-    struct stat st;
+    char *dir, *pdir, *end;
+    int ret;
 
-    if(path == NULL) {
-        return -1;
-    }
+    assert(path);
 
-    dir = strdup(path);
-    pdir = dirname(dir);
-    if(stat(pdir, &st) == -1) {
-        mkdirp(pdir, mode);
-    }
+    dir = end = path;
+
+    while(*dir) {
+        /* skip "/" */
+        dir = end + strspn(end, "/");
+
+        /* skip non-"/" */
+        end = dir + strcspn(dir, "/");
+
+        /* grab everything in path till current end */
+        if(!(pdir = strndup(path, end - path)))
+            return -1;
 
-    free(dir);
+        /* create the directory ; ignore err if it already exists */
+        ret = mkdir(pdir, mode);
 
-    return mkdir(path, mode);
+        free(pdir);
+
+        if(ret == -1 && errno != EEXIST)
+            return -1;
+  }
+
+  return 0;
 }
 
 int main(int argc, char *argv[])
@@ -182,7 +197,7 @@ int main(int argc, char *argv[])
     int c, help, rebuild, update, remove, print, options;
     char found;
     char cachefile[PATH_MAX + 1], path[PATH_MAX + 1], tmp[PATH_MAX + 1];
-    char *bee_metadir, *bee_cachedir, *dir, *pkgname;
+    char *bee_metadir, *bee_cachedir, *pkgname;
     struct hash *graph;
     struct stat st;
     FILE *cache;
@@ -257,18 +272,11 @@ int main(int argc, char *argv[])
         exit(EXIT_FAILURE);
     }
 
-    dir = strdup(cachefile);
-    dir = dirname(dir);
-
-    if (stat(dir, &st) == -1 && mkdirp(dir, 0755) == -1) {
-        perror("bee-dep: mkdir");
+    if (mkdirp(bee_cachedir, 0755) == -1) {
+        perror("bee-dep: mkdirp");
         exit(EXIT_FAILURE);
     }
 
-    free(dir);
-
-    graph = NULL;
-
     found = (stat(cachefile, &st) != -1 && S_ISREG(st.st_mode));
 
     graph = hash_new();