mirror of
				https://github.com/falk-werner/webfuse
				synced 2025-06-13 12:54:15 +00:00 
			
		
		
		
	added close operation
This commit is contained in:
		
							parent
							
								
									1e4647356d
								
							
						
					
					
						commit
						f47868ded7
					
				| @ -41,6 +41,7 @@ add_library(fuse-wsfs | |||||||
| 	src/wsfs/operation/getattr.c | 	src/wsfs/operation/getattr.c | ||||||
| 	src/wsfs/operation/readdir.c | 	src/wsfs/operation/readdir.c | ||||||
| 	src/wsfs/operation/open.c | 	src/wsfs/operation/open.c | ||||||
|  | 	src/wsfs/operation/close.c | ||||||
| 	src/wsfs/operation/read.c | 	src/wsfs/operation/read.c | ||||||
| 	src/wsfs/response_parser.c | 	src/wsfs/response_parser.c | ||||||
| 	src/wsfs/server.c | 	src/wsfs/server.c | ||||||
|  | |||||||
| @ -73,13 +73,18 @@ class FileSystem { | |||||||
|         let entry = this._getEntry(path); |         let entry = this._getEntry(path); | ||||||
| 
 | 
 | ||||||
| 		if (entry.type == "file") { | 		if (entry.type == "file") { | ||||||
| 			result = ((mode & FileSystem.O_ACCMODE) == FileSystem.O_RDONLY) ? true : FileSystem.BAD_NOACCESS;			 | 			result = ((mode & FileSystem.O_ACCMODE) == FileSystem.O_RDONLY) ? {handle: 1337} : FileSystem.BAD_NOACCESS;			 | ||||||
| 		} | 		} | ||||||
| 	 | 	 | ||||||
| 		return result; | 		return result; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     read(path, offset, length) { |     close(path, handle, mode) { | ||||||
|  |         // do nothing
 | ||||||
|  | 		return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     read(path, handle, offset, length) { | ||||||
| 		let result = FileSystem.BAD_NOENTRY; | 		let result = FileSystem.BAD_NOENTRY; | ||||||
| 		let entry = this._getEntry(path); | 		let entry = this._getEntry(path); | ||||||
| 				 | 				 | ||||||
|  | |||||||
| @ -23,16 +23,40 @@ class FileSystemHandler { | |||||||
|                 switch(request.method) |                 switch(request.method) | ||||||
|                 { |                 { | ||||||
|                     case "getattr": |                     case "getattr": | ||||||
|                         result = this._fs.getattr(request.params[0]); |                     { | ||||||
|  |                         const path = request.params[0]; | ||||||
|  |                         result = this._fs.getattr(path); | ||||||
|  |                     } | ||||||
|                     break; |                     break; | ||||||
|                     case "readdir": |                     case "readdir": | ||||||
|                         result = this._fs.readdir(request.params[0]); |                     { | ||||||
|  |                         const path = request.params[0]; | ||||||
|  |                         result = this._fs.readdir(path); | ||||||
|  |                     } | ||||||
|                     break; |                     break; | ||||||
|                     case "open": |                     case "open": | ||||||
|                         result = this._fs.open(request.params[0], request.params[1]); |                     { | ||||||
|  |                         const path = request.params[0]; | ||||||
|  |                         const mode = request.params[1]; | ||||||
|  |                         result = this._fs.open(path, mode); | ||||||
|  |                     } | ||||||
|  |                     break; | ||||||
|  |                     case "close": | ||||||
|  |                     { | ||||||
|  |                         const path = request.params[0]; | ||||||
|  |                         const handle = request.params[1]; | ||||||
|  |                         const mode = request.params[2]; | ||||||
|  |                         result = this._fs.open(path, handle, mode); | ||||||
|  |                     } | ||||||
|                     break; |                     break; | ||||||
|                     case "read": |                     case "read": | ||||||
|                         result = this._fs.read(request.params[0], request.params[1], request.params[2]); |                     { | ||||||
|  |                         const path = request.params[0]; | ||||||
|  |                         const handle = request.params[1]; | ||||||
|  |                         const offset = request.params[2]; | ||||||
|  |                         const length = request.params[3]; | ||||||
|  |                         result = this._fs.read(path, handle, offset, length); | ||||||
|  |                     } | ||||||
|                     break; |                     break; | ||||||
|                     default: |                     default: | ||||||
|                         break; |                         break; | ||||||
|  | |||||||
| @ -49,7 +49,8 @@ function startup() { | |||||||
|         mode: 0755, |         mode: 0755, | ||||||
|         type: "dir", |         type: "dir", | ||||||
|         entries: { |         entries: { | ||||||
|             "hello": { mode: 0755, type: "file", /* size: 10 , */contents: "Hello, World!"} |             "hello.txt"   : { mode: 0444, type: "file", contents: "Hello, World!"}, | ||||||
|  |             "say_hello.sh": { mode: 0555, type: "file", contents: "#!/bin/sh\necho hello\n"} | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|     let handler = new FileSystemHandler(fs, connection); |     let handler = new FileSystemHandler(fs, connection); | ||||||
|  | |||||||
							
								
								
									
										25
									
								
								src/wsfs/operation/close.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/wsfs/operation/close.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | #include "wsfs/operations.h" | ||||||
|  | 
 | ||||||
|  | #include <limits.h> | ||||||
|  | 
 | ||||||
|  | #include <jansson.h> | ||||||
|  | #include "wsfs/jsonrpc.h" | ||||||
|  | 
 | ||||||
|  | int wsfs_operation_close( | ||||||
|  | 	char const *path, | ||||||
|  | 	struct fuse_file_info * file_info) | ||||||
|  | { | ||||||
|  | 	struct fuse_context * context = fuse_get_context(); | ||||||
|  |     struct wsfs_jsonrpc * rpc = context->private_data; | ||||||
|  | 
 | ||||||
|  | 	json_t * result = NULL; | ||||||
|  | 	int handle = (int) (file_info->fh & INT_MAX); | ||||||
|  | 	wsfs_status const status = wsfs_jsonrpc_invoke(rpc, &result, "close", "sii", path, handle, file_info->flags); | ||||||
|  | 	if (NULL != result) | ||||||
|  | 	{ | ||||||
|  | 		// unused
 | ||||||
|  | 		json_decref(result); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return wsfs_status_to_rc(status); | ||||||
|  | } | ||||||
| @ -11,10 +11,19 @@ int wsfs_operation_open( | |||||||
|     struct wsfs_jsonrpc * rpc = context->private_data; |     struct wsfs_jsonrpc * rpc = context->private_data; | ||||||
| 
 | 
 | ||||||
| 	json_t * result = NULL; | 	json_t * result = NULL; | ||||||
| 	wsfs_status const status = wsfs_jsonrpc_invoke(rpc, &result, "open", "si", path, file_info->flags); | 	wsfs_status status = wsfs_jsonrpc_invoke(rpc, &result, "open", "si", path, file_info->flags); | ||||||
| 	if (NULL != result) | 	if (NULL != result) | ||||||
| 	{ | 	{ | ||||||
| 		// unused
 |         json_t * handle_holder = json_object_get(result, "handle"); | ||||||
|  |         if ((NULL != handle_holder) && (json_is_integer(handle_holder)))  | ||||||
|  |         { | ||||||
|  |             file_info->fh = json_integer_value(handle_holder); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             status = WSFS_BAD_FORMAT; | ||||||
|  |         }         | ||||||
|  | 
 | ||||||
| 		json_decref(result); | 		json_decref(result); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| #include "wsfs/operations.h" | #include "wsfs/operations.h" | ||||||
| 
 | 
 | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <limits.h> | ||||||
| #include <jansson.h> | #include <jansson.h> | ||||||
| 
 | 
 | ||||||
| #include "wsfs/util.h" |  | ||||||
| #include "wsfs/jsonrpc.h" | #include "wsfs/jsonrpc.h" | ||||||
| 
 | 
 | ||||||
| #define WSFS_MAX_READ_LENGTH 4096 | #define WSFS_MAX_READ_LENGTH 4096 | ||||||
| @ -38,7 +38,7 @@ int wsfs_operation_read( | |||||||
|  	char * buffer, |  	char * buffer, | ||||||
| 	size_t buffer_size, | 	size_t buffer_size, | ||||||
| 	off_t  offset, | 	off_t  offset, | ||||||
| 	struct fuse_file_info * WSFS_UNUSED_PARAM(file_info)) | 	struct fuse_file_info * file_info) | ||||||
| { | { | ||||||
|     struct fuse_context * context = fuse_get_context(); |     struct fuse_context * context = fuse_get_context(); | ||||||
| 	struct wsfs_jsonrpc * rpc = context->private_data; | 	struct wsfs_jsonrpc * rpc = context->private_data; | ||||||
| @ -46,7 +46,8 @@ int wsfs_operation_read( | |||||||
| 	int const length = (buffer_size <= WSFS_MAX_READ_LENGTH) ? (int) buffer_size : WSFS_MAX_READ_LENGTH; | 	int const length = (buffer_size <= WSFS_MAX_READ_LENGTH) ? (int) buffer_size : WSFS_MAX_READ_LENGTH; | ||||||
| 	int result = 0; | 	int result = 0; | ||||||
| 	json_t * data = NULL; | 	json_t * data = NULL; | ||||||
| 	wsfs_status status = wsfs_jsonrpc_invoke(rpc, &data, "read", "sii", path, (int) offset, length); |     int handle = (file_info->fh & INT_MAX); | ||||||
|  | 	wsfs_status status = wsfs_jsonrpc_invoke(rpc, &data, "read", "siii", path, handle, (int) offset, length); | ||||||
| 	if (NULL != data) | 	if (NULL != data) | ||||||
| 	{ | 	{ | ||||||
| 		json_t * data_holder = json_object_get(data, "data"); | 		json_t * data_holder = json_object_get(data, "data"); | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ void wsfs_operations_init( | |||||||
| 	operations->getattr = &wsfs_operation_getattr; | 	operations->getattr = &wsfs_operation_getattr; | ||||||
| 	operations->readdir = &wsfs_operation_readdir; | 	operations->readdir = &wsfs_operation_readdir; | ||||||
| 	operations->open    = &wsfs_operation_open; | 	operations->open    = &wsfs_operation_open; | ||||||
|  | 	operations->release = &wsfs_operation_close; | ||||||
| 	operations->read    = &wsfs_operation_read; | 	operations->read    = &wsfs_operation_read; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -23,6 +23,10 @@ extern int wsfs_operation_open( | |||||||
| 	char const *path, | 	char const *path, | ||||||
| 	struct fuse_file_info * file_info); | 	struct fuse_file_info * file_info); | ||||||
| 
 | 
 | ||||||
|  | extern int wsfs_operation_close( | ||||||
|  | 	char const *path, | ||||||
|  | 	struct fuse_file_info * file_info); | ||||||
|  | 
 | ||||||
| extern int wsfs_operation_read( | extern int wsfs_operation_read( | ||||||
| 	const char * path, | 	const char * path, | ||||||
|  	char * buffer, |  	char * buffer, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user