# HG changeset patch # User Paul Boddie # Date 1627769220 -7200 # Node ID 73649ab3a61d05126b9140d1395f000ef6c28b46 # Parent efaffd8182eeb054b64cb9f7a0e8b77c8ff5e1ec Added filesystem factory interface provision and simplified the existing opening operation for filesystems to use a user structure. diff -r efaffd8182ee -r 73649ab3a61d libfsclient/include/fsclient/client.h --- a/libfsclient/include/fsclient/client.h Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsclient/include/fsclient/client.h Sun Aug 01 00:07:00 2021 +0200 @@ -29,8 +29,8 @@ /* Filesystem access operations. */ -l4_cap_idx_t client_open_for_user(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask); -l4_cap_idx_t client_open_for_user_using(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask, l4_cap_idx_t server); +l4_cap_idx_t client_open_for_user(user_t user); +l4_cap_idx_t client_open_for_user_using(user_t user, l4_cap_idx_t server); /* Opening and closing operations. */ diff -r efaffd8182ee -r 73649ab3a61d libfsclient/include/fsclient/file.h --- a/libfsclient/include/fsclient/file.h Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsclient/include/fsclient/file.h Sun Aug 01 00:07:00 2021 +0200 @@ -24,6 +24,7 @@ #include #include +#include @@ -77,8 +78,7 @@ /* Filesystem operations. */ -long file_open_for_user(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask, - l4_cap_idx_t server, l4_cap_idx_t *opener); +long file_open_for_user(user_t user, l4_cap_idx_t server, l4_cap_idx_t *opener); /* File operations. */ diff -r efaffd8182ee -r 73649ab3a61d libfsclient/lib/src/client.cc --- a/libfsclient/lib/src/client.cc Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsclient/lib/src/client.cc Sun Aug 01 00:07:00 2021 +0200 @@ -144,22 +144,22 @@ /* Open a file opening object. */ -l4_cap_idx_t client_open_for_user(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask) +l4_cap_idx_t client_open_for_user(user_t user) { l4_cap_idx_t server = l4re_env_get_cap("server"); - return client_open_for_user_using(uid, gid, umask, server); + return client_open_for_user_using(user, server); } /* Open a file opening object via a named capability. */ -l4_cap_idx_t client_open_for_user_using(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask, l4_cap_idx_t server) +l4_cap_idx_t client_open_for_user_using(user_t user, l4_cap_idx_t server) { if (l4_is_invalid_cap(server)) return L4_INVALID_CAP; l4_cap_idx_t opener; - long err = file_open_for_user(uid, gid, umask, server, &opener); + long err = file_open_for_user(user, server, &opener); if (err) return L4_INVALID_CAP; diff -r efaffd8182ee -r 73649ab3a61d libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsclient/lib/src/file.cc Sun Aug 01 00:07:00 2021 +0200 @@ -64,12 +64,11 @@ /* Obtain a reference to a file opener for the given user. */ -long file_open_for_user(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask, - l4_cap_idx_t server, l4_cap_idx_t *opener) +long file_open_for_user(user_t user, l4_cap_idx_t server, l4_cap_idx_t *opener) { client_Filesystem filesystem(server); - return filesystem.open_for_user(uid, gid, umask, opener); + return filesystem.open_for_user(user, opener); } diff -r efaffd8182ee -r 73649ab3a61d libfsserver/include/fsserver/ext2_filesystem.h --- a/libfsserver/include/fsserver/ext2_filesystem.h Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsserver/include/fsserver/ext2_filesystem.h Sun Aug 01 00:07:00 2021 +0200 @@ -43,8 +43,10 @@ /* Filesystem interface methods. */ - virtual long open_for_user(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask, - l4_cap_idx_t *opener); + virtual long open_for_user(ipc_varg_sys_uid_t uid, ipc_varg_sys_gid_t gid, + ipc_varg_sys_mode_t umask, l4_cap_idx_t *opener); + + virtual long open_for_user(user_t user, l4_cap_idx_t *opener); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r efaffd8182ee -r 73649ab3a61d libfsserver/include/fsserver/filesystem_resource.h --- a/libfsserver/include/fsserver/filesystem_resource.h Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsserver/include/fsserver/filesystem_resource.h Sun Aug 01 00:07:00 2021 +0200 @@ -22,14 +22,15 @@ #pragma once #include -#include +#include #include /* Support for providing access to user-specific filesystems. */ -class FilesystemResource : public Resource, public FilePaging, public Filesystem +class FilesystemResource : public Resource, public FilePaging, + public FilesystemObject { public: explicit FilesystemResource(Pages *pages); @@ -45,8 +46,10 @@ /* Filesystem interface methods. */ - virtual long open_for_user(sys_uid_t uid, sys_gid_t gid, sys_mode_t umask, - l4_cap_idx_t *opener) = 0; + virtual long open_for_user(ipc_varg_sys_uid_t uid, ipc_varg_sys_gid_t gid, + ipc_varg_sys_mode_t umask, l4_cap_idx_t *opener) = 0; + + virtual long open_for_user(user_t user, l4_cap_idx_t *opener) = 0; }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r efaffd8182ee -r 73649ab3a61d libfsserver/lib/Makefile --- a/libfsserver/lib/Makefile Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsserver/lib/Makefile Sun Aug 01 00:07:00 2021 +0200 @@ -15,6 +15,9 @@ # Compound interfaces. +filesystem_object_NAME = FilesystemObject +filesystem_object_INTERFACES = filesystem filesystem_factory + mapped_file_object_NAME = MappedFileObject mapped_file_object_INTERFACES = dataspace file flush mapped_file notification @@ -24,13 +27,13 @@ pipe_object_NAME = PipeObject pipe_object_INTERFACES = dataspace flush notification pipe -COMP_INTERFACES_CC = mapped_file_object opener_context_object pipe_object +COMP_INTERFACES_CC = filesystem_object mapped_file_object opener_context_object pipe_object # Individual interfaces. CLIENT_INTERFACES_CC = notifier -SERVER_INTERFACES_CC = filesystem opener pipe_opener $(call common_interfaces,$(COMP_INTERFACES_CC)) +SERVER_INTERFACES_CC = opener pipe_opener $(call common_interfaces,$(COMP_INTERFACES_CC)) # Generated and plain source files. diff -r efaffd8182ee -r 73649ab3a61d libfsserver/lib/files/ext2_filesystem.cc --- a/libfsserver/lib/files/ext2_filesystem.cc Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsserver/lib/files/ext2_filesystem.cc Sun Aug 01 00:07:00 2021 +0200 @@ -35,12 +35,20 @@ delete _ops; } +/* Return a file opener object for the given user details. */ + +long Ext2Filesystem::open_for_user(ipc_varg_sys_uid_t uid, ipc_varg_sys_gid_t gid, + ipc_varg_sys_mode_t umask, l4_cap_idx_t *ref) +{ + user_t user = (user_t) {uid.value, gid.value, umask.value}; + + return open_for_user(user, ref); +} + /* Return a file opener object for the given user. */ -long Ext2Filesystem::open_for_user(sys_uid_t uid, sys_gid_t gid, - sys_mode_t umask, l4_cap_idx_t *ref) +long Ext2Filesystem::open_for_user(user_t user, l4_cap_idx_t *ref) { - user_t user = (user_t) {uid, gid, umask}; Resource *resource = new Ext2FileOpener(this, _ops, user); /* Complete the initialisation and start a server in a new thread. diff -r efaffd8182ee -r 73649ab3a61d libfsserver/lib/files/filesystem_resource.cc --- a/libfsserver/lib/files/filesystem_resource.cc Fri Jul 30 00:45:24 2021 +0200 +++ b/libfsserver/lib/files/filesystem_resource.cc Sun Aug 01 00:07:00 2021 +0200 @@ -19,7 +19,7 @@ * Boston, MA 02110-1301, USA */ -#include "filesystem_server.h" +#include "filesystem_object_server.h" #include "filesystem_resource.h" /* Support for providing access to user-specific filesystems. */ @@ -31,12 +31,12 @@ int FilesystemResource::expected_items() { - return Filesystem_expected_items; + return FilesystemObject_expected_items; } ipc_server_handler_type FilesystemResource::handler() { - return (ipc_server_handler_type) handle_Filesystem; + return (ipc_server_handler_type) handle_FilesystemObject; } // vim: tabstop=4 expandtab shiftwidth=4 diff -r efaffd8182ee -r 73649ab3a61d tests/dstest_block_client_simple.cc --- a/tests/dstest_block_client_simple.cc Fri Jul 30 00:45:24 2021 +0200 +++ b/tests/dstest_block_client_simple.cc Sun Aug 01 00:07:00 2021 +0200 @@ -47,7 +47,7 @@ if (uid) { - l4_cap_idx_t opener = client_open_for_user(uid, uid, 0022); + l4_cap_idx_t opener = client_open_for_user((user_t) {uid, uid, 0022}); if (l4_is_invalid_cap(opener)) { diff -r efaffd8182ee -r 73649ab3a61d tests/dstest_file_client.cc --- a/tests/dstest_file_client.cc Fri Jul 30 00:45:24 2021 +0200 +++ b/tests/dstest_file_client.cc Sun Aug 01 00:07:00 2021 +0200 @@ -149,7 +149,7 @@ if (uid) { - l4_cap_idx_t opener = client_open_for_user(uid, uid, 0022); + l4_cap_idx_t opener = client_open_for_user((user_t) {uid, uid, 0022}); if (l4_is_invalid_cap(opener)) {