1.1 --- a/libfsserver/include/fsserver/file_object_registry.h Sat Oct 16 23:41:12 2021 +0200
1.2 +++ b/libfsserver/include/fsserver/file_object_registry.h Sun Oct 17 18:48:30 2021 +0200
1.3 @@ -37,35 +37,43 @@
1.4 protected:
1.5 Pages *_pages;
1.6
1.7 - /* Resource initialisation methods. */
1.8 -
1.9 map_flags_t get_flags(flags_t flags);
1.10
1.11 - long get_directory_provider(FileOpening *opening, const char *path,
1.12 - flags_t flags, fileid_t fileid,
1.13 - DirectoryProvider **directory_provider);
1.14 + /* Provider initialisation methods. */
1.15 +
1.16 + long make_directory_provider(FileOpening *opening, const char *path,
1.17 + flags_t flags, fileid_t fileid,
1.18 + Provider **provider);
1.19
1.20 - long get_file_provider(FileOpening *opening, const char *path,
1.21 - flags_t flags, fileid_t fileid,
1.22 - FileProvider **file_provider);
1.23 + long make_file_provider(FileOpening *opening, const char *path,
1.24 + flags_t flags, fileid_t fileid,
1.25 + Provider **provider);
1.26 +
1.27 + long make_provider(FileOpening *opening, const char *path,
1.28 + flags_t flags, fileid_t fileid,
1.29 + Provider **provider);
1.30
1.31 /* Resource initialisation methods. */
1.32
1.33 - long get_directory(FileOpening *opening, const char *path, flags_t flags,
1.34 - fileid_t fileid, offset_t *size, object_flags_t *object_flags,
1.35 - Resource **resource);
1.36 + long make_directory_resource(fileid_t fileid, offset_t *size,
1.37 + object_flags_t *object_flags,
1.38 + DirectoryProvider *provider,
1.39 + Resource **resource);
1.40
1.41 - long get_file(FileOpening *opening, const char *path, flags_t flags,
1.42 - fileid_t fileid, offset_t *size, object_flags_t *object_flags,
1.43 - Resource **resource);
1.44 + long make_file_resource(flags_t flags, fileid_t fileid, offset_t *size,
1.45 + object_flags_t *object_flags,
1.46 + FileProvider *provider, Resource **resource);
1.47 +
1.48 + long make_resource(flags_t flags, fileid_t fileid, offset_t *size,
1.49 + object_flags_t *object_flags,
1.50 + Provider *provider, Resource **resource);
1.51
1.52 public:
1.53 explicit FileObjectRegistry(Pages *pages);
1.54
1.55 /* Resource discovery methods. */
1.56
1.57 - long find_directory_provider(fileid_t fileid,
1.58 - DirectoryProvider **directory_provider);
1.59 + long find_provider(fileid_t fileid, Provider **provider);
1.60
1.61 /* Resource initialisation methods. */
1.62
2.1 --- a/libfsserver/lib/files/file_object_registry.cc Sat Oct 16 23:41:12 2021 +0200
2.2 +++ b/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 18:48:30 2021 +0200
2.3 @@ -46,77 +46,36 @@
2.4
2.5
2.6
2.7 -/* Obtain any active provider for 'fileid'. */
2.8 -
2.9 -long FileObjectRegistry::find_directory_provider(fileid_t fileid,
2.10 - DirectoryProvider **directory_provider)
2.11 -{
2.12 - /* Obtain any registered provider. */
2.13 -
2.14 - Accountable *provider = get(fileid);
2.15 -
2.16 - if (provider != NULL)
2.17 - {
2.18 - *directory_provider = dynamic_cast<DirectoryProvider *>(provider);
2.19 +/* Make a directory provider. */
2.20
2.21 - if ((*directory_provider) != NULL)
2.22 - return L4_EOK;
2.23 - else
2.24 - return -L4_EIO;
2.25 - }
2.26 -
2.27 - return -L4_ENOENT;
2.28 -}
2.29 -
2.30 -/* Obtain a provider for the 'fileid' or register a new one. */
2.31 -
2.32 -long FileObjectRegistry::get_directory_provider(FileOpening *opening,
2.33 - const char *path, flags_t flags,
2.34 - fileid_t fileid,
2.35 - DirectoryProvider **directory_provider)
2.36 +long FileObjectRegistry::make_directory_provider(FileOpening *opening,
2.37 + const char *path, flags_t flags,
2.38 + fileid_t fileid,
2.39 + Provider **provider)
2.40 {
2.41 - long err = find_directory_provider(fileid, directory_provider);
2.42 -
2.43 - if (err != -L4_ENOENT)
2.44 - return err;
2.45 -
2.46 /* Make an accessor and a provider to encapsulate it. */
2.47
2.48 DirectoryAccessor *accessor;
2.49 - err = opening->make_directory_accessor(path, flags, fileid, &accessor);
2.50 + long err = opening->make_directory_accessor(path, flags, fileid, &accessor);
2.51
2.52 if (err)
2.53 return err;
2.54
2.55 - *directory_provider = new DirectoryProvider(accessor);
2.56 + *provider = new DirectoryProvider(accessor);
2.57
2.58 /* Register the provider. */
2.59
2.60 - set(fileid, *directory_provider);
2.61 + set(fileid, *provider);
2.62 return L4_EOK;
2.63 }
2.64
2.65 -/* Obtain a provider for the 'fileid' or register a new one. */
2.66 -
2.67 -long FileObjectRegistry::get_file_provider(FileOpening *opening,
2.68 - const char *path, flags_t flags,
2.69 - fileid_t fileid,
2.70 - FileProvider **file_provider)
2.71 -{
2.72 - /* Obtain any registered provider. */
2.73 -
2.74 - Accountable *provider = get(fileid);
2.75 +/* Make a file provider. */
2.76
2.77 - if (provider != NULL)
2.78 - {
2.79 - *file_provider = dynamic_cast<FileProvider *>(provider);
2.80 -
2.81 - if ((*file_provider) != NULL)
2.82 - return L4_EOK;
2.83 - else
2.84 - return -L4_EIO;
2.85 - }
2.86 -
2.87 +long FileObjectRegistry::make_file_provider(FileOpening *opening,
2.88 + const char *path, flags_t flags,
2.89 + fileid_t fileid,
2.90 + Provider **provider)
2.91 +{
2.92 /* Make an accessor, page mapper, and a provider to encapsulate them. */
2.93
2.94 Accessor *accessor;
2.95 @@ -126,32 +85,38 @@
2.96 return err;
2.97
2.98 PageMapper *mapper = new PageMapper(accessor, _pages);
2.99 - *file_provider = new FileProvider(mapper);
2.100 + *provider = new FileProvider(mapper);
2.101
2.102 /* Register the provider. */
2.103
2.104 - set(fileid, *file_provider);
2.105 + set(fileid, *provider);
2.106 return L4_EOK;
2.107 }
2.108
2.109 +/* Make a provider of the appropriate type. */
2.110 +
2.111 +long FileObjectRegistry::make_provider(FileOpening *opening,
2.112 + const char *path, flags_t flags,
2.113 + fileid_t fileid,
2.114 + Provider **provider)
2.115 +{
2.116 + if (opening->accessing_directory(path, flags, fileid))
2.117 + return make_directory_provider(opening, path, flags, fileid, provider);
2.118 + else if (opening->accessing_file(path, flags, fileid))
2.119 + return make_file_provider(opening, path, flags, fileid, provider);
2.120 + else
2.121 + return -L4_EIO;
2.122 +}
2.123 +
2.124
2.125
2.126 /* Return a directory resource initialised with a provider. */
2.127
2.128 -long FileObjectRegistry::get_directory(FileOpening *opening, const char *path,
2.129 - flags_t flags, fileid_t fileid,
2.130 - offset_t *size, object_flags_t *object_flags,
2.131 - Resource **resource)
2.132 +long FileObjectRegistry::make_directory_resource(fileid_t fileid, offset_t *size,
2.133 + object_flags_t *object_flags,
2.134 + DirectoryProvider *provider,
2.135 + Resource **resource)
2.136 {
2.137 - /* Obtain any existing provider registered for the object, or make a new
2.138 - provider. */
2.139 -
2.140 - DirectoryProvider *provider;
2.141 - long err = get_directory_provider(opening, path, flags, fileid, &provider);
2.142 -
2.143 - if (err)
2.144 - return err;
2.145 -
2.146 /* Provide non-file values for certain outputs. */
2.147
2.148 *size = 0;
2.149 @@ -167,20 +132,12 @@
2.150
2.151 /* Return a file pager initialised with a provider, page mapper and accessor. */
2.152
2.153 -long FileObjectRegistry::get_file(FileOpening *opening, const char *path,
2.154 - flags_t flags, fileid_t fileid,
2.155 - offset_t *size, object_flags_t *object_flags,
2.156 - Resource **resource)
2.157 +long FileObjectRegistry::make_file_resource(flags_t flags, fileid_t fileid,
2.158 + offset_t *size,
2.159 + object_flags_t *object_flags,
2.160 + FileProvider *provider,
2.161 + Resource **resource)
2.162 {
2.163 - /* Obtain any existing provider registered for the file, or make a new
2.164 - provider. */
2.165 -
2.166 - FileProvider *provider;
2.167 - long err = get_file_provider(opening, path, flags, fileid, &provider);
2.168 -
2.169 - if (err)
2.170 - return err;
2.171 -
2.172 /* Initialise the pager with the provider and a reference to this object for
2.173 detaching from the provider. */
2.174
2.175 @@ -197,6 +154,26 @@
2.176 return L4_EOK;
2.177 }
2.178
2.179 +/* Make a resource of the appropriate type. */
2.180 +
2.181 +long FileObjectRegistry::make_resource(flags_t flags, fileid_t fileid,
2.182 + offset_t *size,
2.183 + object_flags_t *object_flags,
2.184 + Provider *provider, Resource **resource)
2.185 +{
2.186 + DirectoryProvider *dp = dynamic_cast<DirectoryProvider *>(provider);
2.187 +
2.188 + if (dp != NULL)
2.189 + return make_directory_resource(fileid, size, object_flags, dp, resource);
2.190 +
2.191 + FileProvider *fp = dynamic_cast<FileProvider *>(provider);
2.192 +
2.193 + if (fp != NULL)
2.194 + return make_file_resource(flags, fileid, size, object_flags, fp, resource);
2.195 +
2.196 + return -L4_EIO;
2.197 +}
2.198 +
2.199
2.200
2.201 /* Return a resource for a filesystem object. */
2.202 @@ -208,8 +185,8 @@
2.203 {
2.204 std::lock_guard<std::mutex> guard(_lock);
2.205
2.206 - /* Obtain an identifier for the file, even for new files (subject to use of
2.207 - the appropriate flag). */
2.208 + /* Obtain an identifier for the object, even for new files (subject to use
2.209 + of the appropriate flag). */
2.210
2.211 fileid_t fileid;
2.212 long err = opening->get_fileid(path, flags, &fileid);
2.213 @@ -217,14 +194,45 @@
2.214 if (err)
2.215 return err;
2.216
2.217 - /* Test for file and directory access. */
2.218 + /* Obtain a provider for the object. */
2.219 +
2.220 + Provider *provider;
2.221 + err = find_provider(fileid, &provider);
2.222 +
2.223 + /* Make a new provider if necessary. */
2.224 +
2.225 + if (err == -L4_ENOENT)
2.226 + err = make_provider(opening, path, flags, fileid, &provider);
2.227 +
2.228 + if (err)
2.229 + return err;
2.230 +
2.231 + /* Make a resource for the provider. */
2.232 +
2.233 + return make_resource(flags, fileid, size, object_flags, provider, resource);
2.234 +}
2.235 +
2.236 +
2.237
2.238 - if (opening->accessing_directory(path, flags, fileid))
2.239 - return get_directory(opening, path, flags, fileid, size, object_flags, resource);
2.240 - else if (opening->accessing_file(path, flags, fileid))
2.241 - return get_file(opening, path, flags, fileid, size, object_flags, resource);
2.242 - else
2.243 - return -L4_EIO;
2.244 +/* Obtain any active provider for the given 'fileid'. */
2.245 +
2.246 +long FileObjectRegistry::find_provider(fileid_t fileid, Provider **provider)
2.247 +{
2.248 + /* Obtain any registered provider. */
2.249 +
2.250 + Accountable *accountable = get(fileid);
2.251 +
2.252 + if (accountable != NULL)
2.253 + {
2.254 + *provider = dynamic_cast<Provider *>(accountable);
2.255 +
2.256 + if ((*provider) != NULL)
2.257 + return L4_EOK;
2.258 + else
2.259 + return -L4_EIO;
2.260 + }
2.261 +
2.262 + return -L4_ENOENT;
2.263 }
2.264
2.265 // vim: tabstop=4 expandtab shiftwidth=4