From 2775d42647d047bbf4d632d018368f0a03de081b Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 13 Apr 2019 23:23:20 +0200 Subject: [PATCH] adds filesystem name/id to request parameters --- README.md | 18 ++++++--- example/daemon/www/js/webfuse/client.js | 41 +++++++++++++------- lib/webfuse/adapter/impl/operation/close.c | 2 +- lib/webfuse/adapter/impl/operation/getattr.c | 2 +- lib/webfuse/adapter/impl/operation/lookup.c | 2 +- lib/webfuse/adapter/impl/operation/open.c | 2 +- lib/webfuse/adapter/impl/operation/read.c | 2 +- lib/webfuse/adapter/impl/operation/readdir.c | 2 +- 8 files changed, 46 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 725fe5c..b7d9803 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ Notfications are used to inform a receiver about something. Unlike requests, not Retrieve information about a filesystem entry by name. - webfuse daemon: {"method": "lookup", "params": [, ], "id": } + webfuse daemon: {"method": "lookup", "params": [, , ], "id": } fs provider: {"result": { "inode": , "mode" : , @@ -153,6 +153,7 @@ Retrieve information about a filesystem entry by name. | Item | Data type | Description | | ----------- | --------------- | ------------------------------------------- | +| filesystem | string | name of the filesystem | | parent | integer | inode of parent directory (1 = root) | | name | string | name of the filesystem object to look up | | inode | integer | inode of the filesystem object | @@ -167,7 +168,7 @@ Retrieve information about a filesystem entry by name. Get file attributes. - webfuse daemon: {"method": "getattr", "params": [], "id": } + webfuse daemon: {"method": "getattr", "params": [, ], "id": } fs provider: {"result": { "mode" : , "type" : , @@ -179,6 +180,7 @@ Get file attributes. | Item | Data type | Description | | ----------- | --------------- | ------------------------------------------- | +| filesystem | string | name of the filesystem | | inode | integer | inode of the filesystem object | | mode | integer | unix file mode | | type | "file" or "dir" | type of filesystem object | @@ -193,7 +195,7 @@ Read directory contents. Result is an array of name-inode pairs for each entry. The generic entries "." and ".." should also be provided. - webfuse daemon: {"method": "readdir", "params": [], "id": } + webfuse daemon: {"method": "readdir", "params": [, ], "id": } fs provider: {"result": [ {"name": , "inode": }, ... @@ -201,6 +203,7 @@ Result is an array of name-inode pairs for each entry. The generic entries | Item | Data type | Description | | ----------- | --------------- | ------------------------------ | +| filesystem | string | name of the filesystem | | dir_inode | integer | inode of the directory to read | | name | integer | name of the entry | | inode | integer | inode of the entry | @@ -209,11 +212,12 @@ Result is an array of name-inode pairs for each entry. The generic entries Open a file. - webfuse daemon: {"method": "readdir", "params": [, ], "id": } + webfuse daemon: {"method": "readdir", "params": [, , ], "id": } fs provider: {"result": {"handle": }, "id": } | Item | Data type | Description | | ----------- | ----------| ----------------------------- | +| filesystem | string | name of the filesystem | | inode | integer | inode of the file | | flags | integer | access mode flags (see below) | | handle | integer | handle of the file | @@ -236,10 +240,11 @@ Open a file. Informs filesystem provider, that a file is closed. Since `close` is a notification, it cannot fail. - webfuse daemon: {"method": "close", "params": [, , ], "id": } + webfuse daemon: {"method": "close", "params": [, , , ], "id": } | Item | Data type | Description | | ----------- | ----------| ---------------------------- | +| filesystem | string | name of the filesystem | | inode | integer | inode of the file | | handle | integer | handle of the file | | flags | integer | access mode flags (see open) | @@ -248,7 +253,7 @@ Since `close` is a notification, it cannot fail. Read from an open file. - webfuse daemon: {"method": "close", "params": [, , , ], "id": } + webfuse daemon: {"method": "close", "params": [, , , , ], "id": } fs provider: {"result": { "data": , "format": , @@ -257,6 +262,7 @@ Read from an open file. | Item | Data type | Description | | ----------- | ----------| ----------------------------- | +| filesystem | string | name of the filesystem | | inode | integer | inode of the file | | handle | integer | handle of the file | | offset | integer | Offet to start read operation | diff --git a/example/daemon/www/js/webfuse/client.js b/example/daemon/www/js/webfuse/client.js index 2505217..31deab3 100644 --- a/example/daemon/www/js/webfuse/client.js +++ b/example/daemon/www/js/webfuse/client.js @@ -35,7 +35,7 @@ export class Client { } addProvider(name, provider) { - this._provider = provider; + this._provider[name] = provider; const request = { "method": "add_filesystem", "params": [name], @@ -125,28 +125,43 @@ export class Client { } } - async _lookup([parent, name]) { - return this._provider.lookup(parent, name); + _getProvider(name) { + if (this._provider.hasOwnProperty(name)) { + return this._provider[name]; + } + else { + throw new Error('Unknown provider'); + } } - async _getattr([inode]) { - return this._provider.getattr(inode); + async _lookup([providerName, parent, name]) { + const provider = this._getProvider(providerName); + return provider.lookup(parent, name); } - async _readdir([inode]) { - return this._provider.readdir(inode); + async _getattr([providerName, inode]) { + const provider = this._getProvider(providerName); + return provider.getattr(inode); } - async _open([inode, mode]) { - return this._provider.open(inode, mode); + async _readdir([providerName, inode]) { + const provider = this._getProvider(providerName); + return provider.readdir(inode); } - _close([inode, handle, mode]) { - this._provider.close(inode, handle, mode); + async _open([providerName, inode, mode]) { + const provider = this._getProvider(providerName); + return provider.open(inode, mode); } - async _read([inode, handle, offset, length]) { - const data = await this._provider.read(inode, handle, offset, length); + _close([providerName, inode, handle, mode]) { + const provider = this._getProvider(providerName); + provider.close(inode, handle, mode); + } + + async _read([providerName, inode, handle, offset, length]) { + const provider = this._getProvider(providerName); + const data = await provider.read(inode, handle, offset, length); if ("string" === typeof(data)) { return { diff --git a/lib/webfuse/adapter/impl/operation/close.c b/lib/webfuse/adapter/impl/operation/close.c index 59cbf93..ca63a8e 100644 --- a/lib/webfuse/adapter/impl/operation/close.c +++ b/lib/webfuse/adapter/impl/operation/close.c @@ -18,7 +18,7 @@ void wf_impl_operation_close( if (NULL != rpc) { int handle = (int) (file_info->fh & INT_MAX); - wf_impl_jsonrpc_proxy_notify(rpc, "close", "iii", inode, handle, file_info->flags); + wf_impl_jsonrpc_proxy_notify(rpc, "close", "siii", user_data->name, inode, handle, file_info->flags); } fuse_reply_err(request, 0); diff --git a/lib/webfuse/adapter/impl/operation/getattr.c b/lib/webfuse/adapter/impl/operation/getattr.c index 647be3d..75736a2 100644 --- a/lib/webfuse/adapter/impl/operation/getattr.c +++ b/lib/webfuse/adapter/impl/operation/getattr.c @@ -91,7 +91,7 @@ void wf_impl_operation_getattr ( getattr_context->gid = context->gid; getattr_context->timeout = user_data->timeout; - wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "i", inode); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_getattr_finished, getattr_context, "getattr", "si", user_data->name, inode); } else { diff --git a/lib/webfuse/adapter/impl/operation/lookup.c b/lib/webfuse/adapter/impl/operation/lookup.c index 7e96f48..3749123 100644 --- a/lib/webfuse/adapter/impl/operation/lookup.c +++ b/lib/webfuse/adapter/impl/operation/lookup.c @@ -100,7 +100,7 @@ void wf_impl_operation_lookup ( lookup_context->gid = context->gid; lookup_context->timeout = user_data->timeout; - wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "is", (int) (parent & INT_MAX), name); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_lookup_finished, lookup_context, "lookup", "sis", user_data->name, (int) (parent & INT_MAX), name); } else { diff --git a/lib/webfuse/adapter/impl/operation/open.c b/lib/webfuse/adapter/impl/operation/open.c index dcac221..e82b865 100644 --- a/lib/webfuse/adapter/impl/operation/open.c +++ b/lib/webfuse/adapter/impl/operation/open.c @@ -51,7 +51,7 @@ void wf_impl_operation_open( if (NULL != rpc) { - wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "ii", inode, file_info->flags); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_open_finished, request, "open", "sii", user_data->name, inode, file_info->flags); } else { diff --git a/lib/webfuse/adapter/impl/operation/read.c b/lib/webfuse/adapter/impl/operation/read.c index 3e5bfbd..ea89eff 100644 --- a/lib/webfuse/adapter/impl/operation/read.c +++ b/lib/webfuse/adapter/impl/operation/read.c @@ -93,7 +93,7 @@ void wf_impl_operation_read( { int const length = (size <= WF_MAX_READ_LENGTH) ? (int) size : WF_MAX_READ_LENGTH; int handle = (file_info->fh & INT_MAX); - wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "iiii", inode, handle, (int) offset, length); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_read_finished, request, "read", "siiii", user_data->name, inode, handle, (int) offset, length); } else { diff --git a/lib/webfuse/adapter/impl/operation/readdir.c b/lib/webfuse/adapter/impl/operation/readdir.c index 617535d..85cfd5b 100644 --- a/lib/webfuse/adapter/impl/operation/readdir.c +++ b/lib/webfuse/adapter/impl/operation/readdir.c @@ -146,7 +146,7 @@ void wf_impl_operation_readdir ( readdir_context->size = size; readdir_context->offset = offset; - wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "i", inode); + wf_impl_jsonrpc_proxy_invoke(rpc, &wf_impl_operation_readdir_finished, readdir_context, "readdir", "si", user_data->name, inode); } else {