# HG changeset patch # User Paul Boddie # Date 1628457154 -7200 # Node ID ac9e90982166740f888d024843cc5e70afc8d06e # Parent d39c8916cc3d0fa8bce55b5b6f388c4cff5aafca Changed open operations to provide flags describing features of each referenced object, modifying the file data structure and client library so that file-like and pipe-like objects can be distinguished and handled accordingly. diff -r d39c8916cc3d -r ac9e90982166 libfsclient/include/fsclient/file.h --- a/libfsclient/include/fsclient/file.h Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsclient/include/fsclient/file.h Sun Aug 08 23:12:34 2021 +0200 @@ -56,13 +56,9 @@ offset_t size; - /* Arbitrary memory mapping support. */ - - int can_mmap; + /* Support for arbitrary memory mapping and explicit object size. */ - /* Explicit size support. */ - - int has_size; + object_flags_t object_flags; /* Blocking accesses. */ diff -r d39c8916cc3d -r ac9e90982166 libfsclient/lib/src/client.cc --- a/libfsclient/lib/src/client.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsclient/lib/src/client.cc Sun Aug 08 23:12:34 2021 +0200 @@ -42,7 +42,7 @@ { long err; - if (file->can_mmap) + if (file->object_flags & OBJECT_SUPPORTS_MMAP) { /* Where the position is outside the current region, re-map. */ @@ -147,7 +147,7 @@ { if (file->memory == NULL) { - if (file->can_mmap) + if (file->object_flags & OBJECT_SUPPORTS_MMAP) return client_mmap(file, client_tell(file), count); else if (pipe_current(file)) return NULL; @@ -551,7 +551,7 @@ offset_t needed_size = file_data_current_position(file) + count; - if (file->has_size) + if (file->object_flags & OBJECT_HAS_SIZE) { if (file->size < needed_size) { diff -r d39c8916cc3d -r ac9e90982166 libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsclient/lib/src/file.cc Sun Aug 08 23:12:34 2021 +0200 @@ -84,8 +84,7 @@ file->end_pos = 0; file->data_end = 0; file->data_current = 0; - file->can_mmap = 1; - file->has_size = 1; + file->object_flags = 0; file->can_block = 0; file->notifications = 0; } @@ -173,7 +172,7 @@ { client_OpenerContext openercontext(context->ref); file_init(file); - return openercontext.open(flags, &file->size, &file->ref); + return openercontext.open(flags, &file->size, &file->ref, &file->object_flags); } @@ -223,7 +222,7 @@ long file_resize(file_t *file, offset_t size) { - if (!file->has_size) + if (!file->object_flags & OBJECT_HAS_SIZE) return -L4_EIO; client_File _file(file->ref); @@ -434,13 +433,6 @@ file_init(reader); file_init(writer); - /* Pipes can usually only be accessed via region navigation. */ - - reader->can_mmap = 0; - reader->has_size = 0; - writer->can_mmap = 0; - writer->has_size = 0; - long err = opener.pipe(size, &reader->ref, &writer->ref); if (err) return err; diff -r d39c8916cc3d -r ac9e90982166 libfsserver/include/fsserver/ext2_file_opener.h --- a/libfsserver/include/fsserver/ext2_file_opener.h Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/include/fsserver/ext2_file_opener.h Sun Aug 08 23:12:34 2021 +0200 @@ -52,7 +52,9 @@ /* Convenience methods obtaining different pager types. */ - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap); + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, + offset_t *size, l4_cap_idx_t *cap, + object_flags_t *object_flags); public: explicit Ext2FileOpener(FilePaging *paging, Ext2FileOperations *ops, user_t user) diff -r d39c8916cc3d -r ac9e90982166 libfsserver/include/fsserver/host_file_opener.h --- a/libfsserver/include/fsserver/host_file_opener.h Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/include/fsserver/host_file_opener.h Sun Aug 08 23:12:34 2021 +0200 @@ -56,7 +56,9 @@ /* Convenience methods obtaining different pager types. */ - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap); + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, + offset_t *size, l4_cap_idx_t *cap, + object_flags_t *object_flags); public: explicit HostFileOpener(FilePaging *paging) diff -r d39c8916cc3d -r ac9e90982166 libfsserver/include/fsserver/opener_context_resource.h --- a/libfsserver/include/fsserver/opener_context_resource.h Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/include/fsserver/opener_context_resource.h Sun Aug 08 23:12:34 2021 +0200 @@ -57,7 +57,8 @@ /* Opener context interface methods. */ - long open(flags_t flags, offset_t *size, l4_cap_idx_t *file); + long open(flags_t flags, offset_t *size, l4_cap_idx_t *file, + object_flags_t *object_flags); /* Pager/dataspace methods. */ diff -r d39c8916cc3d -r ac9e90982166 libfsserver/include/fsserver/opener_resource.h --- a/libfsserver/include/fsserver/opener_resource.h Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/include/fsserver/opener_resource.h Sun Aug 08 23:12:34 2021 +0200 @@ -44,9 +44,13 @@ /* Convenience methods obtaining different pager types. */ - virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap); + virtual long get_directory(const char *path, flags_t flags, fileid_t fileid, + offset_t *size, l4_cap_idx_t *cap, + object_flags_t *object_flags); - virtual long get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap); + virtual long get_file(const char *path, flags_t flags, fileid_t fileid, + offset_t *size, l4_cap_idx_t *cap, + object_flags_t *object_flags); /* Preparation of resources for pagers. */ @@ -68,7 +72,8 @@ /* Direct access methods. */ - long open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap); + long open(const char *path, flags_t flags, offset_t *size, + l4_cap_idx_t *cap, object_flags_t *object_flags); /* Opener interface methods. */ diff -r d39c8916cc3d -r ac9e90982166 libfsserver/lib/files/ext2_file_opener.cc --- a/libfsserver/lib/files/ext2_file_opener.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/lib/files/ext2_file_opener.cc Sun Aug 08 23:12:34 2021 +0200 @@ -118,8 +118,12 @@ // NOTE: This is mostly the same as the HostFileOpener implementation. -long Ext2FileOpener::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap) +long Ext2FileOpener::get_directory(const char *path, flags_t flags, + fileid_t fileid, offset_t *size, + l4_cap_idx_t *cap, object_flags_t *object_flags) { + /* The file identifier is used to obtain the directory. */ + (void) path; (void) flags; file_t *reader, *writer; @@ -134,6 +138,7 @@ *size = reader->size; *cap = reader->ref; + *object_flags = 0; /* does not support mmap, has no fixed size */ /* Spawn a independent thread for reading the directory details and writing them to the pipe. */ diff -r d39c8916cc3d -r ac9e90982166 libfsserver/lib/files/host_file_opener.cc --- a/libfsserver/lib/files/host_file_opener.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/lib/files/host_file_opener.cc Sun Aug 08 23:12:34 2021 +0200 @@ -91,8 +91,14 @@ return (st.st_mode & S_IFREG) ? true : false; } -long HostFileOpener::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap) +long HostFileOpener::get_directory(const char *path, flags_t flags, + fileid_t fileid, offset_t *size, + l4_cap_idx_t *cap, object_flags_t *object_flags) { + /* The path is used to obtain the directory. */ + + (void) flags; (void) fileid; + file_t *reader, *writer; // NOTE: Might be more appropriate to use lower-level file operations to @@ -105,6 +111,7 @@ *size = reader->size; *cap = reader->ref; + *object_flags = 0; /* does not support mmap, has no fixed size */ /* Discard the reader structure but preserve the capability. */ diff -r d39c8916cc3d -r ac9e90982166 libfsserver/lib/files/opener_context_resource.cc --- a/libfsserver/lib/files/opener_context_resource.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/lib/files/opener_context_resource.cc Sun Aug 08 23:12:34 2021 +0200 @@ -67,21 +67,22 @@ /* Opener context interface methods. */ -long OpenerContextResource::open(flags_t flags, offset_t *size, l4_cap_idx_t *file) +long OpenerContextResource::open(flags_t flags, offset_t *size, + l4_cap_idx_t *file, object_flags_t *object_flags) { char *path = get_path(); if (path == NULL) return -L4_EINVAL; - long err = _opener->open(path, flags, size, file); + long err = _opener->open(path, flags, size, file, object_flags); /* Handle propagated capabilities. By indicating the special status, the operation is first completed and then the capability is discarded. */ if (err == IPC_MESSAGE_SENT) { - complete_OpenerContext_open(*size, *file); + complete_OpenerContext_open(*size, *file, *object_flags); ipc_cap_free_um(*file); return IPC_MESSAGE_SENT; } diff -r d39c8916cc3d -r ac9e90982166 libfsserver/lib/files/opener_resource.cc --- a/libfsserver/lib/files/opener_resource.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/libfsserver/lib/files/opener_resource.cc Sun Aug 08 23:12:34 2021 +0200 @@ -48,7 +48,8 @@ /* Return a pager object for the given path and flags. */ -long OpenerResource::open(const char *path, flags_t flags, offset_t *size, l4_cap_idx_t *cap) +long OpenerResource::open(const char *path, flags_t flags, offset_t *size, + l4_cap_idx_t *cap, object_flags_t *object_flags) { /* Obtain an identifier for the file, even for new files. */ @@ -61,9 +62,9 @@ /* Test for file and directory access. */ if (accessing_directory(path, flags, fileid)) - return get_directory(path, flags, fileid, size, cap); + return get_directory(path, flags, fileid, size, cap, object_flags); else if (accessing_file(path, flags, fileid)) - return get_file(path, flags, fileid, size, cap); + return get_file(path, flags, fileid, size, cap, object_flags); else return -L4_EIO; } @@ -72,15 +73,19 @@ /* Return a directory pager. */ -long OpenerResource::get_directory(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap) +long OpenerResource::get_directory(const char *path, flags_t flags, + fileid_t fileid, offset_t *size, + l4_cap_idx_t *cap, object_flags_t *object_flags) { - (void) path; (void) flags; (void) fileid; (void) size; (void) cap; + (void) path; (void) flags; (void) fileid; (void) size; (void) cap; (void) object_flags; return -L4_EIO; } /* Return a file pager. */ -long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, offset_t *size, l4_cap_idx_t *cap) +long OpenerResource::get_file(const char *path, flags_t flags, fileid_t fileid, + offset_t *size, l4_cap_idx_t *cap, + object_flags_t *object_flags) { Pager *pager; long err = _paging->get_pager(this, path, flags, fileid, &pager); @@ -88,6 +93,8 @@ if (err) return err; + *object_flags = OBJECT_SUPPORTS_MMAP | OBJECT_HAS_SIZE; + return resource_for_pager(pager, size, cap); } diff -r d39c8916cc3d -r ac9e90982166 tests/dstest_file_readdir.cc --- a/tests/dstest_file_readdir.cc Sat Aug 07 23:19:20 2021 +0200 +++ b/tests/dstest_file_readdir.cc Sun Aug 08 23:12:34 2021 +0200 @@ -109,12 +109,6 @@ static long open_directory(file_t *file) { - // NOTE: To be replaced by a proper mechanism identifying the nature of each - // NOTE: obtained object. - - file->can_mmap = 0; - file->has_size = 0; - /* Register the reader for notification. */ return client_set_blocking(file, NOTIFY_CONTENT_AVAILABLE | NOTIFY_PEER_CLOSED);