1.1 --- a/libfsserver/lib/files/file_object_registry.cc Sat Oct 16 23:41:12 2021 +0200
1.2 +++ b/libfsserver/lib/files/file_object_registry.cc Sun Oct 17 18:48:30 2021 +0200
1.3 @@ -46,77 +46,36 @@
1.4
1.5
1.6
1.7 -/* Obtain any active provider for 'fileid'. */
1.8 -
1.9 -long FileObjectRegistry::find_directory_provider(fileid_t fileid,
1.10 - DirectoryProvider **directory_provider)
1.11 -{
1.12 - /* Obtain any registered provider. */
1.13 -
1.14 - Accountable *provider = get(fileid);
1.15 -
1.16 - if (provider != NULL)
1.17 - {
1.18 - *directory_provider = dynamic_cast<DirectoryProvider *>(provider);
1.19 +/* Make a directory provider. */
1.20
1.21 - if ((*directory_provider) != NULL)
1.22 - return L4_EOK;
1.23 - else
1.24 - return -L4_EIO;
1.25 - }
1.26 -
1.27 - return -L4_ENOENT;
1.28 -}
1.29 -
1.30 -/* Obtain a provider for the 'fileid' or register a new one. */
1.31 -
1.32 -long FileObjectRegistry::get_directory_provider(FileOpening *opening,
1.33 - const char *path, flags_t flags,
1.34 - fileid_t fileid,
1.35 - DirectoryProvider **directory_provider)
1.36 +long FileObjectRegistry::make_directory_provider(FileOpening *opening,
1.37 + const char *path, flags_t flags,
1.38 + fileid_t fileid,
1.39 + Provider **provider)
1.40 {
1.41 - long err = find_directory_provider(fileid, directory_provider);
1.42 -
1.43 - if (err != -L4_ENOENT)
1.44 - return err;
1.45 -
1.46 /* Make an accessor and a provider to encapsulate it. */
1.47
1.48 DirectoryAccessor *accessor;
1.49 - err = opening->make_directory_accessor(path, flags, fileid, &accessor);
1.50 + long err = opening->make_directory_accessor(path, flags, fileid, &accessor);
1.51
1.52 if (err)
1.53 return err;
1.54
1.55 - *directory_provider = new DirectoryProvider(accessor);
1.56 + *provider = new DirectoryProvider(accessor);
1.57
1.58 /* Register the provider. */
1.59
1.60 - set(fileid, *directory_provider);
1.61 + set(fileid, *provider);
1.62 return L4_EOK;
1.63 }
1.64
1.65 -/* Obtain a provider for the 'fileid' or register a new one. */
1.66 -
1.67 -long FileObjectRegistry::get_file_provider(FileOpening *opening,
1.68 - const char *path, flags_t flags,
1.69 - fileid_t fileid,
1.70 - FileProvider **file_provider)
1.71 -{
1.72 - /* Obtain any registered provider. */
1.73 -
1.74 - Accountable *provider = get(fileid);
1.75 +/* Make a file provider. */
1.76
1.77 - if (provider != NULL)
1.78 - {
1.79 - *file_provider = dynamic_cast<FileProvider *>(provider);
1.80 -
1.81 - if ((*file_provider) != NULL)
1.82 - return L4_EOK;
1.83 - else
1.84 - return -L4_EIO;
1.85 - }
1.86 -
1.87 +long FileObjectRegistry::make_file_provider(FileOpening *opening,
1.88 + const char *path, flags_t flags,
1.89 + fileid_t fileid,
1.90 + Provider **provider)
1.91 +{
1.92 /* Make an accessor, page mapper, and a provider to encapsulate them. */
1.93
1.94 Accessor *accessor;
1.95 @@ -126,32 +85,38 @@
1.96 return err;
1.97
1.98 PageMapper *mapper = new PageMapper(accessor, _pages);
1.99 - *file_provider = new FileProvider(mapper);
1.100 + *provider = new FileProvider(mapper);
1.101
1.102 /* Register the provider. */
1.103
1.104 - set(fileid, *file_provider);
1.105 + set(fileid, *provider);
1.106 return L4_EOK;
1.107 }
1.108
1.109 +/* Make a provider of the appropriate type. */
1.110 +
1.111 +long FileObjectRegistry::make_provider(FileOpening *opening,
1.112 + const char *path, flags_t flags,
1.113 + fileid_t fileid,
1.114 + Provider **provider)
1.115 +{
1.116 + if (opening->accessing_directory(path, flags, fileid))
1.117 + return make_directory_provider(opening, path, flags, fileid, provider);
1.118 + else if (opening->accessing_file(path, flags, fileid))
1.119 + return make_file_provider(opening, path, flags, fileid, provider);
1.120 + else
1.121 + return -L4_EIO;
1.122 +}
1.123 +
1.124
1.125
1.126 /* Return a directory resource initialised with a provider. */
1.127
1.128 -long FileObjectRegistry::get_directory(FileOpening *opening, const char *path,
1.129 - flags_t flags, fileid_t fileid,
1.130 - offset_t *size, object_flags_t *object_flags,
1.131 - Resource **resource)
1.132 +long FileObjectRegistry::make_directory_resource(fileid_t fileid, offset_t *size,
1.133 + object_flags_t *object_flags,
1.134 + DirectoryProvider *provider,
1.135 + Resource **resource)
1.136 {
1.137 - /* Obtain any existing provider registered for the object, or make a new
1.138 - provider. */
1.139 -
1.140 - DirectoryProvider *provider;
1.141 - long err = get_directory_provider(opening, path, flags, fileid, &provider);
1.142 -
1.143 - if (err)
1.144 - return err;
1.145 -
1.146 /* Provide non-file values for certain outputs. */
1.147
1.148 *size = 0;
1.149 @@ -167,20 +132,12 @@
1.150
1.151 /* Return a file pager initialised with a provider, page mapper and accessor. */
1.152
1.153 -long FileObjectRegistry::get_file(FileOpening *opening, const char *path,
1.154 - flags_t flags, fileid_t fileid,
1.155 - offset_t *size, object_flags_t *object_flags,
1.156 - Resource **resource)
1.157 +long FileObjectRegistry::make_file_resource(flags_t flags, fileid_t fileid,
1.158 + offset_t *size,
1.159 + object_flags_t *object_flags,
1.160 + FileProvider *provider,
1.161 + Resource **resource)
1.162 {
1.163 - /* Obtain any existing provider registered for the file, or make a new
1.164 - provider. */
1.165 -
1.166 - FileProvider *provider;
1.167 - long err = get_file_provider(opening, path, flags, fileid, &provider);
1.168 -
1.169 - if (err)
1.170 - return err;
1.171 -
1.172 /* Initialise the pager with the provider and a reference to this object for
1.173 detaching from the provider. */
1.174
1.175 @@ -197,6 +154,26 @@
1.176 return L4_EOK;
1.177 }
1.178
1.179 +/* Make a resource of the appropriate type. */
1.180 +
1.181 +long FileObjectRegistry::make_resource(flags_t flags, fileid_t fileid,
1.182 + offset_t *size,
1.183 + object_flags_t *object_flags,
1.184 + Provider *provider, Resource **resource)
1.185 +{
1.186 + DirectoryProvider *dp = dynamic_cast<DirectoryProvider *>(provider);
1.187 +
1.188 + if (dp != NULL)
1.189 + return make_directory_resource(fileid, size, object_flags, dp, resource);
1.190 +
1.191 + FileProvider *fp = dynamic_cast<FileProvider *>(provider);
1.192 +
1.193 + if (fp != NULL)
1.194 + return make_file_resource(flags, fileid, size, object_flags, fp, resource);
1.195 +
1.196 + return -L4_EIO;
1.197 +}
1.198 +
1.199
1.200
1.201 /* Return a resource for a filesystem object. */
1.202 @@ -208,8 +185,8 @@
1.203 {
1.204 std::lock_guard<std::mutex> guard(_lock);
1.205
1.206 - /* Obtain an identifier for the file, even for new files (subject to use of
1.207 - the appropriate flag). */
1.208 + /* Obtain an identifier for the object, even for new files (subject to use
1.209 + of the appropriate flag). */
1.210
1.211 fileid_t fileid;
1.212 long err = opening->get_fileid(path, flags, &fileid);
1.213 @@ -217,14 +194,45 @@
1.214 if (err)
1.215 return err;
1.216
1.217 - /* Test for file and directory access. */
1.218 + /* Obtain a provider for the object. */
1.219 +
1.220 + Provider *provider;
1.221 + err = find_provider(fileid, &provider);
1.222 +
1.223 + /* Make a new provider if necessary. */
1.224 +
1.225 + if (err == -L4_ENOENT)
1.226 + err = make_provider(opening, path, flags, fileid, &provider);
1.227 +
1.228 + if (err)
1.229 + return err;
1.230 +
1.231 + /* Make a resource for the provider. */
1.232 +
1.233 + return make_resource(flags, fileid, size, object_flags, provider, resource);
1.234 +}
1.235 +
1.236 +
1.237
1.238 - if (opening->accessing_directory(path, flags, fileid))
1.239 - return get_directory(opening, path, flags, fileid, size, object_flags, resource);
1.240 - else if (opening->accessing_file(path, flags, fileid))
1.241 - return get_file(opening, path, flags, fileid, size, object_flags, resource);
1.242 - else
1.243 - return -L4_EIO;
1.244 +/* Obtain any active provider for the given 'fileid'. */
1.245 +
1.246 +long FileObjectRegistry::find_provider(fileid_t fileid, Provider **provider)
1.247 +{
1.248 + /* Obtain any registered provider. */
1.249 +
1.250 + Accountable *accountable = get(fileid);
1.251 +
1.252 + if (accountable != NULL)
1.253 + {
1.254 + *provider = dynamic_cast<Provider *>(accountable);
1.255 +
1.256 + if ((*provider) != NULL)
1.257 + return L4_EOK;
1.258 + else
1.259 + return -L4_EIO;
1.260 + }
1.261 +
1.262 + return -L4_ENOENT;
1.263 }
1.264
1.265 // vim: tabstop=4 expandtab shiftwidth=4