Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: native_client_sdk/src/libraries/nacl_io/html5fs/html5_fs.cc

Issue 320983002: [NaCl SDK] nacl_io: Allows subtree of html5fs to be mounted. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: native_client_sdk/src/libraries/nacl_io/html5fs/html5_fs.cc
diff --git a/native_client_sdk/src/libraries/nacl_io/html5fs/html5_fs.cc b/native_client_sdk/src/libraries/nacl_io/html5fs/html5_fs.cc
index 19fca59844e0f77564484a2daa924a64da36e1ea..f79b6fa94479db2dcb9e21e1a2c5b9fee44a3149 100644
--- a/native_client_sdk/src/libraries/nacl_io/html5fs/html5_fs.cc
+++ b/native_client_sdk/src/libraries/nacl_io/html5fs/html5_fs.cc
@@ -42,7 +42,7 @@ Error Html5Fs::Open(const Path& path, int open_flags, ScopedNode* out_node) {
return error;
PP_Resource fileref = ppapi()->GetFileRefInterface()->Create(
- filesystem_resource_, path.Join().c_str());
+ filesystem_resource_, GetFullPath(path).Join().c_str());
if (!fileref)
return ENOENT;
@@ -55,8 +55,15 @@ Error Html5Fs::Open(const Path& path, int open_flags, ScopedNode* out_node) {
return 0;
}
+Path Html5Fs::GetFullPath(const Path& path) {
+ Path full_path(path);
+ //if (!prefix_.empty())
binji 2014/06/09 20:54:29 remove
Sam Clegg 2014/06/10 17:20:58 Done.
+ full_path.Prepend(prefix_);
+ return full_path;
+}
+
Error Html5Fs::Unlink(const Path& path) {
- return Remove(path);
+ return RemoveInternal(path, REMOVE_FILE);
}
Error Html5Fs::Mkdir(const Path& path, int permissions) {
@@ -72,7 +79,7 @@ Error Html5Fs::Mkdir(const Path& path, int permissions) {
ScopedResource fileref_resource(
ppapi(),
ppapi()->GetFileRefInterface()->Create(filesystem_resource_,
- path.Join().c_str()));
+ GetFullPath(path).Join().c_str()));
if (!fileref_resource.pp_resource())
return ENOENT;
@@ -85,10 +92,14 @@ Error Html5Fs::Mkdir(const Path& path, int permissions) {
}
Error Html5Fs::Rmdir(const Path& path) {
- return Remove(path);
+ return RemoveInternal(path, REMOVE_DIR);
}
Error Html5Fs::Remove(const Path& path) {
+ return RemoveInternal(path, REMOVE_ALL);
+}
+
+Error Html5Fs::RemoveInternal(const Path& path, int remove_type) {
Error error = BlockUntilFilesystemOpen();
if (error)
return error;
@@ -96,10 +107,34 @@ Error Html5Fs::Remove(const Path& path) {
ScopedResource fileref_resource(
ppapi(),
ppapi()->GetFileRefInterface()->Create(filesystem_resource_,
- path.Join().c_str()));
+ GetFullPath(path).Join().c_str()));
if (!fileref_resource.pp_resource())
return ENOENT;
+ // Check file type
+ if (remove_type != REMOVE_ALL) {
+ PP_FileInfo file_info;
+ int32_t query_result = ppapi()->GetFileRefInterface()->Query(
+ fileref_resource.pp_resource(), &file_info, PP_BlockUntilComplete());
+ if (query_result != PP_OK) {
+ LOG_ERROR("Error querying file type");
+ return EINVAL;
+ }
+ switch (file_info.type) {
+ case PP_FILETYPE_DIRECTORY:
+ if (!(remove_type & REMOVE_DIR))
+ return EISDIR;
+ break;
+ case PP_FILETYPE_REGULAR:
+ if (!(remove_type & REMOVE_FILE))
+ return ENOTDIR;
+ break;
+ default:
+ LOG_ERROR("Invalid file type: %d", file_info.type);
+ return EINVAL;
+ }
+ }
+
int32_t result = ppapi()->GetFileRefInterface()->Delete(
fileref_resource.pp_resource(), PP_BlockUntilComplete());
if (result != PP_OK)
@@ -113,17 +148,19 @@ Error Html5Fs::Rename(const Path& path, const Path& newpath) {
if (error)
return error;
+ const char* oldpath_full = GetFullPath(path).Join().c_str();
ScopedResource fileref_resource(
ppapi(),
ppapi()->GetFileRefInterface()->Create(filesystem_resource_,
- path.Join().c_str()));
+ oldpath_full));
binji 2014/06/09 20:54:29 do these fit on the previous line now?
Sam Clegg 2014/06/10 17:20:58 Nope :(
if (!fileref_resource.pp_resource())
return ENOENT;
+ const char* newpath_full = GetFullPath(newpath).Join().c_str();
ScopedResource new_fileref_resource(
ppapi(),
ppapi()->GetFileRefInterface()->Create(filesystem_resource_,
- newpath.Join().c_str()));
+ newpath_full));
if (!new_fileref_resource.pp_resource())
return ENOENT;
@@ -164,6 +201,11 @@ Error Html5Fs::Init(const FsInitArgs& args) {
filesystem_type = PP_FILESYSTEMTYPE_LOCALPERSISTENT;
} else if (iter->second == "TEMPORARY") {
filesystem_type = PP_FILESYSTEMTYPE_LOCALTEMPORARY;
+ } else if (iter->second == "") {
binji 2014/06/09 20:54:29 why allow this? The default is LOCALPERSISTENT
Sam Clegg 2014/06/10 17:20:58 The unit tests rely on this.. maybe I should chang
binji 2014/06/10 18:00:58 I'd prefer it, it seems weird to add support for a
+ filesystem_type = PP_FILESYSTEMTYPE_LOCALPERSISTENT;
+ } else {
+ LOG_ERROR("html5fs: unknown type: '%s'", iter->second.c_str());
+ return EINVAL;
}
} else if (iter->first == "expected_size") {
expected_size = strtoull(iter->second.c_str(), NULL, 10);
@@ -174,6 +216,11 @@ Error Html5Fs::Init(const FsInitArgs& args) {
filesystem_resource_ = resource;
ppapi_->AddRefResource(filesystem_resource_);
+ } else if (iter->first == "SOURCE") {
+ prefix_ = iter->second;
+ } else {
+ LOG_ERROR("html5fs: bad param: %s", iter->first.c_str());
+ return EINVAL;
}
}

Powered by Google App Engine
This is Rietveld 408576698