status_t fs_create_file(const char *path, filehandle **handle, uint64_t len) { char temppath[FS_MAX_PATH_LEN]; strlcpy(temppath, path, sizeof(temppath)); fs_normalize_path(temppath); const char *newpath; struct fs_mount *mount = find_mount(temppath, &newpath); if (!mount) return ERR_NOT_FOUND; if (!mount->api->create) { put_mount(mount); return ERR_NOT_SUPPORTED; } filecookie *cookie; status_t err = mount->api->create(mount->cookie, newpath, &cookie, len); if (err < 0) { put_mount(mount); return err; } filehandle *f = malloc(sizeof(*f)); f->cookie = cookie; f->mount = mount; *handle = f; return 0; }
status_t fs_open_dir(const char *path, dirhandle **handle) { char temppath[FS_MAX_PATH_LEN]; strlcpy(temppath, path, sizeof(temppath)); fs_normalize_path(temppath); LTRACEF("path %s temppath %s\n", path, temppath); const char *newpath; struct fs_mount *mount = find_mount(temppath, &newpath); if (!mount) return ERR_NOT_FOUND; LTRACEF("path %s temppath %s newpath %s\n", path, temppath, newpath); if (!mount->api->opendir) { put_mount(mount); return ERR_NOT_SUPPORTED; } dircookie *cookie; status_t err = mount->api->opendir(mount->cookie, newpath, &cookie); if (err < 0) { put_mount(mount); return err; } dirhandle *d = malloc(sizeof(*d)); d->cookie = cookie; d->mount = mount; *handle = d; return 0; }
void put_handle (struct shim_handle * hdl) { int ref_count = REF_DEC(hdl->ref_count); #ifdef DEBUG_REF debug("put handle %p(%s) (ref_count = %d)\n", hdl, __handle_name(hdl), ref_count); #endif if (!ref_count) { if (hdl->fs && hdl->fs->fs_ops && hdl->fs->fs_ops->hput) hdl->fs->fs_ops->hput(hdl); qstrfree(&hdl->path); qstrfree(&hdl->uri); if (hdl->pal_handle) DkObjectClose(hdl->pal_handle); if (hdl->dentry) put_dentry(hdl->dentry); if (hdl->fs) put_mount(hdl->fs); destroy_handle(hdl); } }
status_t fs_open_file(const char *path, filehandle **handle) { char temppath[FS_MAX_PATH_LEN]; strlcpy(temppath, path, sizeof(temppath)); fs_normalize_path(temppath); LTRACEF("path %s temppath %s\n", path, temppath); const char *newpath; struct fs_mount *mount = find_mount(temppath, &newpath); if (!mount) return ERR_NOT_FOUND; LTRACEF("path %s temppath %s newpath %s\n", path, temppath, newpath); filecookie *cookie; status_t err = mount->api->open(mount->cookie, newpath, &cookie); if (err < 0) { put_mount(mount); return err; } filehandle *f = malloc(sizeof(*f)); f->cookie = cookie; f->mount = mount; *handle = f; return 0; }
status_t fs_unmount(const char *path) { char temppath[FS_MAX_PATH_LEN]; strlcpy(temppath, path, sizeof(temppath)); fs_normalize_path(temppath); struct fs_mount *mount = find_mount(temppath, NULL); if (!mount) return ERR_NOT_FOUND; // return the ref that find_mount added and one extra put_mount(mount); put_mount(mount); return 0; }
status_t fs_close_file(filehandle *handle) { status_t err = handle->mount->api->close(handle->cookie); if (err < 0) return err; put_mount(handle->mount); free(handle); return 0; }
status_t fs_close_dir(dirhandle *handle) { if (!handle->mount->api->closedir) return ERR_NOT_SUPPORTED; status_t err = handle->mount->api->closedir(handle->cookie); if (err < 0) return err; put_mount(handle->mount); free(handle); return 0; }
status_t fs_make_dir(const char *path) { char temppath[FS_MAX_PATH_LEN]; strlcpy(temppath, path, sizeof(temppath)); fs_normalize_path(temppath); const char *newpath; struct fs_mount *mount = find_mount(temppath, &newpath); if (!mount) return ERR_NOT_FOUND; if (!mount->api->mkdir) { put_mount(mount); return ERR_NOT_SUPPORTED; } status_t err = mount->api->mkdir(mount->cookie, newpath); put_mount(mount); return err; }
static status_t mount(const char *path, const char *device, const struct fs_api *api) { struct fs_mount *mount; char temppath[FS_MAX_PATH_LEN]; strlcpy(temppath, path, sizeof(temppath)); fs_normalize_path(temppath); if (temppath[0] != '/') return ERR_BAD_PATH; /* see if there's already something at this path, abort if there is */ mount = find_mount(temppath, NULL); if (mount) { put_mount(mount); return ERR_ALREADY_MOUNTED; } /* open a bio device if the string is nonnull */ bdev_t *dev = NULL; if (device && device[0] != '\0') { dev = bio_open(device); if (!dev) return ERR_NOT_FOUND; } /* call into the fs implementation */ fscookie *cookie; status_t err = api->mount(dev, &cookie); if (err < 0) { if (dev) bio_close(dev); return err; } /* create the mount structure and add it to the list */ mount = malloc(sizeof(struct fs_mount)); mount->path = strdup(temppath); mount->dev = dev; mount->cookie = cookie; mount->ref = 1; mount->api = api; list_add_head(&mounts, &mount->node); return 0; }