+ char *abspath = make_abs_path(path);
+
+ FSNode *node = node_cache[abspath];
+ if(!node) {
+ node = new FSNode;
+ node->path = path;
+
+ struct stat st;
+ if(stat(node->path, &st) == -1) {
+ fprintf(stderr, "failed to stat: %s\n", node->path.get_path());
+ delete node;
+ return 0;
+ }
+ node->size = st.st_size;
+
+ switch(st.st_mode & S_IFMT) {
+ case S_IFREG:
+ node->type = FSTYPE_FILE;
+ break;
+
+ case S_IFDIR:
+ node->type = FSTYPE_DIR;
+ break;
+
+ case S_IFBLK:
+ case S_IFCHR:
+ node->type = FSTYPE_DEV;
+ break;
+
+ default:
+ node->type = FSTYPE_UNKNOWN;
+ }
+ node_cache[abspath] = node;
+ }
+
+ return node;