diff --git a/CMakeLists.txt b/CMakeLists.txt index 4686de9..b7b7e18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ set(WSFS_PROVIDER_SOURCES lib/wsfsp/client.c lib/wsfsp/client_protocol.c lib/wsfsp/provider.c + lib/wsfsp/request.c lib/wsfsp/operation/error.c lib/wsfsp/operation/lookup.c lib/wsfsp/operation/getattr.c diff --git a/lib/wsfsp/operation/error.c b/lib/wsfsp/operation/error.c index 4614e95..c26b7e2 100644 --- a/lib/wsfsp/operation/error.c +++ b/lib/wsfsp/operation/error.c @@ -1,11 +1,19 @@ #include "wsfsp/operation/error.h" +#include +#include "wsfsp/request.h" void wsfsp_respond_error( struct wsfsp_request * request, int status) { - (void) request; - (void) status; + json_t * response = json_object(); + json_t * error = json_object(); + json_object_set_new(error, "code", json_integer(status)); + json_object_set_new(response, "error", error); + json_object_set_new(response, "id", json_integer(request->id)); - // ToDo: implement me + request->respond(response, request->user_data); + + json_decref(response); + wsfsp_request_dispose(request); } diff --git a/lib/wsfsp/operation/getattr.c b/lib/wsfsp/operation/getattr.c index 4f204f4..62827b0 100644 --- a/lib/wsfsp/operation/getattr.c +++ b/lib/wsfsp/operation/getattr.c @@ -9,11 +9,19 @@ void wsfsp_getattr( json_t * params, int id) { - (void) context; - (void) params; - (void) id; - - puts("getattr"); + size_t const count = json_array_size(params); + if (1 == count) + { + json_t * inode_holder = json_array_get(params, 0); + + if ((NULL != inode_holder) && (json_is_integer(inode_holder))) + { + ino_t inode = (ino_t) json_integer_value(inode_holder); + struct wsfsp_request * request = wsfsp_request_create(context->request, id); + + context->provider->getattr(request, inode, context->user_data); + } + } } void wsfsp_getattr_default( diff --git a/lib/wsfsp/provider_intern.h b/lib/wsfsp/provider_intern.h index b48d857..9f61a5f 100644 --- a/lib/wsfsp/provider_intern.h +++ b/lib/wsfsp/provider_intern.h @@ -2,6 +2,8 @@ #define WSFSP_PROVIDER_INTERN_H #include "wsfsp/provider.h" +#include "wsfsp/request.h" + #include struct wsfsp_invokation_context diff --git a/lib/wsfsp/request.c b/lib/wsfsp/request.c new file mode 100644 index 0000000..fe1ac71 --- /dev/null +++ b/lib/wsfsp/request.c @@ -0,0 +1,24 @@ +#include "wsfsp/request.h" + +#include + +struct wsfsp_request * wsfsp_request_create( + struct wsfsp_request * prototype, + int id) +{ + struct wsfsp_request * request = malloc(sizeof(struct wsfsp_request)); + if (NULL != request) + { + request->respond = prototype->respond; + request->user_data = prototype->user_data; + request->id = id; + } + + return request; +} + +void wsfsp_request_dispose( + struct wsfsp_request * request) +{ + free(request); +} \ No newline at end of file diff --git a/lib/wsfsp/request.h b/lib/wsfsp/request.h index 2165099..49142d4 100644 --- a/lib/wsfsp/request.h +++ b/lib/wsfsp/request.h @@ -12,7 +12,24 @@ struct wsfsp_request { wsfsp_request_respond_fn * respond; void * user_data; + int id; }; +#ifdef __cplusplus +extern "C" +{ +#endif + +extern struct wsfsp_request * wsfsp_request_create( + struct wsfsp_request * prototype, + int id); + +extern void wsfsp_request_dispose( + struct wsfsp_request * request); + +#ifdef __cplusplus +} +#endif + #endif