1.1 --- a/libfsserver/lib/generic/resource_registry.cc Wed Feb 09 22:30:29 2022 +0100
1.2 +++ b/libfsserver/lib/generic/resource_registry.cc Thu Feb 10 17:55:05 2022 +0100
1.3 @@ -49,14 +49,14 @@
1.4 /* Make a directory provider. */
1.5
1.6 long ResourceRegistry::make_directory_provider(FileOpening *opening,
1.7 - const char *path, flags_t flags,
1.8 + flags_t flags,
1.9 fileid_t fileid,
1.10 Provider **provider)
1.11 {
1.12 /* Make an accessor and a provider to encapsulate it. */
1.13
1.14 DirectoryAccessor *accessor;
1.15 - long err = opening->make_directory_accessor(path, flags, fileid, &accessor);
1.16 + long err = opening->make_directory_accessor(flags, fileid, &accessor);
1.17
1.18 if (err)
1.19 return err;
1.20 @@ -68,14 +68,14 @@
1.21 /* Make a file provider. */
1.22
1.23 long ResourceRegistry::make_file_provider(FileOpening *opening,
1.24 - const char *path, flags_t flags,
1.25 + flags_t flags,
1.26 fileid_t fileid,
1.27 Provider **provider)
1.28 {
1.29 /* Make an accessor, page mapper, and a provider to encapsulate them. */
1.30
1.31 Accessor *accessor;
1.32 - long err = opening->make_accessor(path, flags, fileid, &accessor);
1.33 + long err = opening->make_accessor(flags, fileid, &accessor);
1.34
1.35 if (err)
1.36 return err;
1.37 @@ -88,16 +88,16 @@
1.38 /* Make a provider of the appropriate type. */
1.39
1.40 long ResourceRegistry::make_provider(FileOpening *opening,
1.41 - const char *path, flags_t flags,
1.42 + flags_t flags,
1.43 fileid_t fileid,
1.44 Provider **provider)
1.45 {
1.46 long err = -L4_EIO;
1.47
1.48 - if (opening->accessing_directory(path, flags, fileid))
1.49 - err = make_directory_provider(opening, path, flags, fileid, provider);
1.50 - else if (opening->accessing_file(path, flags, fileid))
1.51 - err = make_file_provider(opening, path, flags, fileid, provider);
1.52 + if (opening->accessing_directory(flags, fileid))
1.53 + err = make_directory_provider(opening, flags, fileid, provider);
1.54 + else if (opening->accessing_file(flags, fileid))
1.55 + err = make_file_provider(opening, flags, fileid, provider);
1.56
1.57 if (err)
1.58 return err;
1.59 @@ -160,7 +160,7 @@
1.60 /* Make a new provider if necessary. */
1.61
1.62 if (err == -L4_ENOENT)
1.63 - err = make_provider(opening, path, flags, fileid, &provider);
1.64 + err = make_provider(opening, flags, fileid, &provider);
1.65
1.66 if (err)
1.67 return err;
1.68 @@ -200,9 +200,16 @@
1.69 if (err && (err != -L4_ENOENT))
1.70 return err;
1.71
1.72 + fileid_t parent_fileid;
1.73 +
1.74 + err = opening->get_parent(path, &parent_fileid);
1.75 +
1.76 + if (err)
1.77 + return err;
1.78 +
1.79 /* Unlink the object regardless of whether it can be removed. */
1.80
1.81 - err = opening->unlink_object(path, fileid);
1.82 + err = opening->unlink_object(parent_fileid, fileid);
1.83
1.84 if (err)
1.85 return err;
1.86 @@ -210,7 +217,7 @@
1.87 /* Without a provider being active, remove the object directly. */
1.88
1.89 if (err)
1.90 - return opening->remove_object(path, fileid);
1.91 + return opening->remove_object(fileid);
1.92
1.93 /* With a provider active, request the object's removal upon closure. */
1.94
1.95 @@ -240,7 +247,7 @@
1.96 directory. An empty directory will be replaced by the source
1.97 directory. */
1.98
1.99 - if (opening->accessing_directory(source, 0, source_fileid))
1.100 + if (opening->accessing_directory(0, source_fileid))
1.101 {
1.102 err = opening->get_fileid(target, 0, &target_fileid);
1.103
1.104 @@ -253,7 +260,7 @@
1.105 {
1.106 /* NOTE: Should really use the equivalent of ENOTDIR. */
1.107
1.108 - if (!opening->accessing_directory(target, 0, target_fileid))
1.109 + if (!opening->accessing_directory(0, target_fileid))
1.110 return -L4_EIO;
1.111
1.112 /* NOTE: Test for empty directory. */
1.113 @@ -269,13 +276,13 @@
1.114 /* The source directory is moved within the filesystem to the parent of
1.115 the indicated target. */
1.116
1.117 - return opening->rename_object(source, source_fileid, target);
1.118 + return opening->rename_object(source, target);
1.119 }
1.120
1.121 /* If source is a file, the target must be a new or existing file, not a
1.122 directory. An existing file will be replaced. */
1.123
1.124 - else if (opening->accessing_file(source, 0, source_fileid))
1.125 + else if (opening->accessing_file(0, source_fileid))
1.126 {
1.127 err = opening->get_fileid(target, 0, &target_fileid);
1.128
1.129 @@ -286,7 +293,7 @@
1.130 {
1.131 /* NOTE: Should really use the equivalent of EISDIR. */
1.132
1.133 - if (!opening->accessing_file(target, 0, target_fileid))
1.134 + if (!opening->accessing_file(0, target_fileid))
1.135 return -L4_EIO;
1.136
1.137 /* The existing file will be removed. */
1.138 @@ -300,7 +307,7 @@
1.139 /* The source file is moved within the filesystem to the parent of the
1.140 indicated target. */
1.141
1.142 - return opening->rename_object(source, source_fileid, target);
1.143 + return opening->rename_object(source, target);
1.144 }
1.145
1.146 /* NOTE: Other object types are to be supported. */