示例#1
0
文件: vfs.c 项目: Olegas/runtime
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);
}
示例#2
0
文件: vfs.c 项目: Olegas/runtime
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;
	}
}
示例#3
0
文件: vfs.c 项目: Olegas/runtime
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;
}
示例#4
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;
}