void tm_fs_destroy(tm_fs_ent* /* ~ */ ent) { switch (ent->type) { case VFS_TYPE_RAW_FILE: if (ent->parent) { tm_fs_dir_remove(ent->parent, ent); } if (ent->file.data_owned) { free(ent->file.data); } break; case VFS_TYPE_DIR: if (ent->parent) { tm_fs_dir_remove(ent->parent, ent); } for (unsigned i=0; i<ent->dir.num_entries; i++) { tm_fs_direntry* entry = &ent->dir.entries[i]; free((void*) entry->name); tm_fs_destroy(entry->ent); } free(ent->dir.entries); break; case VFS_TYPE_MOUNT_FAT: //TODO break; case VFS_TYPE_INVALID: break; } free(ent); }
int tm_fs_open(tm_fs_file_handle* /* -> ~<'s> */ out, tm_fs_ent* /* &'s */ root, const char* /* & */ pathname, unsigned flags) { tm_fs_ent* ent = 0; int r = tm_fs_lookup(root, pathname, &ent); if ((flags & TM_CREAT) && r == -ENOENT && ent != 0) { tm_fs_ent* parent = ent; ent = tm_fs_raw_file_create(); r = tm_fs_dir_append(parent, pathname, ent); if (r) { tm_fs_destroy(ent); return r; } } else if (r != 0) { return r; } else if (flags & TM_EXCL) { return -EEXIST; } switch (ent->type) { case VFS_TYPE_RAW_FILE: if (flags & TM_TRUNC) { free(ent->file.data); ent->file.length = 0; ent->file.data = 0; } out->ent = ent; out->position = 0; return 0; case VFS_TYPE_DIR: return -EISDIR; default: return -EINVAL; } }
int tm_fs_rename (tm_fs_ent* root, const char* oldname, const char* newname) { int r = 0; // Lookup old file tm_fs_ent* oldent = 0; r = tm_fs_lookup(root, oldname, &oldent); if (r != 0) { return r; } // Lookup and possibly new file location. tm_fs_ent* newdir = 0; r = tm_fs_lookup(root, newname, &newdir); if (r == 0) { tm_fs_ent* overwritten = newdir; newdir = overwritten->parent; tm_fs_destroy(overwritten); } else if (r == -ENOENT && newdir != 0) { // noop, folder exists } else { return -ENOENT; } tm_fs_dir_remove(oldent->parent, oldent); tm_fs_dir_append(newdir, tm_fs_basename(newname), oldent); return 0; }
static int l_tm_fs_destroy (lua_State* L) { const char *pathname = (const char *) colony_toutf8(L, 1); #ifdef TM_FS_vfs tm_fs_ent* ent = NULL; int r = tm_fs_lookup(tm_fs_root, pathname, &ent); if (r != ENOENT) { ent->file.data_owned = 0; // ent->file.data = malloc(0); tm_fs_destroy(ent); } int ret = -r; #else int ret = tm_fs_destroy(pathname); #endif lua_pushnumber(L, ret); return 1; }