Title: [287080] trunk/Source/WTF
Revision
287080
Author
[email protected]
Date
2021-12-15 09:50:28 -0800 (Wed, 15 Dec 2021)

Log Message

[PlayStation] Use FileSystem instead of FileSystemPlayStation except several unsupported APIs
https://bugs.webkit.org/show_bug.cgi?id=234337

Reviewed by Don Olmstead.

PlayStation should use FileSystem as its current SDK supports std::filesystem.
We have to maintain FileSystemPlayStation for now to supply some of FileSystem APIs
because the following functions are not supported yet.
- std::filesystem::space
- std::filesystem::rename
- std::filesystem::canonical
- std::filesystem::directory_iterator
- std::filesystem::remove_all

The plan is to remove FileSystemPlayStation entirely after the SDK supports these functions.

This patch also fixes the incompatible issue of FileSystem::listDirectory of FileSystemPlayStation.
FileSystem::listDirectory is expected to return only the names, but it actually returns full paths.

Confirmed that there is no regression in FileSystem related testcases in TestWTF.

* wtf/FileSystem.cpp: Add PLATFORM(PLAYSTATION) guards not to use unsupported std::filesystem APIs.
* wtf/playstation/FileSystemPlayStation.cpp: Remove the functions duplicated with FileSystem.
Make FileSystem::listDirectory returns only names.
Add listDirectorySub which can return a full path because deleteNonEmptyDirectory depends on it.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (287079 => 287080)


--- trunk/Source/WTF/ChangeLog	2021-12-15 17:46:07 UTC (rev 287079)
+++ trunk/Source/WTF/ChangeLog	2021-12-15 17:50:28 UTC (rev 287080)
@@ -1,3 +1,31 @@
+2021-12-15  Tomoki Imai  <[email protected]>
+
+        [PlayStation] Use FileSystem instead of FileSystemPlayStation except several unsupported APIs
+        https://bugs.webkit.org/show_bug.cgi?id=234337
+
+        Reviewed by Don Olmstead.
+
+        PlayStation should use FileSystem as its current SDK supports std::filesystem.
+        We have to maintain FileSystemPlayStation for now to supply some of FileSystem APIs
+        because the following functions are not supported yet.
+        - std::filesystem::space
+        - std::filesystem::rename
+        - std::filesystem::canonical
+        - std::filesystem::directory_iterator
+        - std::filesystem::remove_all
+
+        The plan is to remove FileSystemPlayStation entirely after the SDK supports these functions.
+
+        This patch also fixes the incompatible issue of FileSystem::listDirectory of FileSystemPlayStation.
+        FileSystem::listDirectory is expected to return only the names, but it actually returns full paths.
+
+        Confirmed that there is no regression in FileSystem related testcases in TestWTF.
+
+        * wtf/FileSystem.cpp: Add PLATFORM(PLAYSTATION) guards not to use unsupported std::filesystem APIs.
+        * wtf/playstation/FileSystemPlayStation.cpp: Remove the functions duplicated with FileSystem.
+        Make FileSystem::listDirectory returns only names.
+        Add listDirectorySub which can return a full path because deleteNonEmptyDirectory depends on it.
+
 2021-12-15  Youenn Fablet  <[email protected]>
 
         Make use of PLATFORM(COCOA) in MediaRecorder WebPreference

Modified: trunk/Source/WTF/wtf/FileSystem.cpp (287079 => 287080)


--- trunk/Source/WTF/wtf/FileSystem.cpp	2021-12-15 17:46:07 UTC (rev 287079)
+++ trunk/Source/WTF/wtf/FileSystem.cpp	2021-12-15 17:50:28 UTC (rev 287080)
@@ -612,6 +612,7 @@
     return std::filesystem::remove(fsPath, ec);
 }
 
+#if !PLATFORM(PLAYSTATION)
 bool moveFile(const String& oldPath, const String& newPath)
 {
     auto fsOldPath = toStdFileSystemPath(oldPath);
@@ -629,6 +630,7 @@
         return false;
     return std::filesystem::remove_all(fsOldPath, ec);
 }
+#endif
 
 std::optional<uint64_t> fileSize(const String& path)
 {
@@ -639,6 +641,7 @@
     return size;
 }
 
+#if !PLATFORM(PLAYSTATION)
 std::optional<uint64_t> volumeFreeSpace(const String& path)
 {
     std::error_code ec;
@@ -647,6 +650,7 @@
         return std::nullopt;
     return spaceInfo.available;
 }
+#endif
 
 bool createSymbolicLink(const String& targetPath, const String& symbolicLinkPath)
 {
@@ -683,6 +687,7 @@
     return ec ? std::nullopt : std::make_optional(linkCount);
 }
 
+#if !PLATFORM(PLAYSTATION)
 bool deleteNonEmptyDirectory(const String& path)
 {
     std::error_code ec;
@@ -689,6 +694,7 @@
     std::filesystem::remove_all(toStdFileSystemPath(path), ec);
     return !ec;
 }
+#endif
 
 std::optional<WallTime> fileModificationTime(const String& path)
 {
@@ -756,6 +762,7 @@
     return fromStdFileSystemPath(toStdFileSystemPath(path).parent_path());
 }
 
+#if !PLATFORM(PLAYSTATION)
 String realPath(const String& path)
 {
     std::error_code ec;
@@ -762,7 +769,9 @@
     auto canonicalPath = std::filesystem::canonical(toStdFileSystemPath(path), ec);
     return ec ? path : fromStdFileSystemPath(canonicalPath);
 }
+#endif
 
+#if !PLATFORM(PLAYSTATION)
 Vector<String> listDirectory(const String& path)
 {
     Vector<String> fileNames;
@@ -775,6 +784,7 @@
     }
     return fileNames;
 }
+#endif
 
 #if !ENABLE(FILESYSTEM_POSIX_FAST_PATH)
 

Modified: trunk/Source/WTF/wtf/playstation/FileSystemPlayStation.cpp (287079 => 287080)


--- trunk/Source/WTF/wtf/playstation/FileSystemPlayStation.cpp	2021-12-15 17:46:07 UTC (rev 287079)
+++ trunk/Source/WTF/wtf/playstation/FileSystemPlayStation.cpp	2021-12-15 17:50:28 UTC (rev 287080)
@@ -30,15 +30,8 @@
 #include "config.h"
 #include <wtf/FileSystem.h>
 
-#if !HAVE(STD_FILESYSTEM) && !HAVE(STD_EXPERIMENTAL_FILESYSTEM)
-
 #include <dirent.h>
-#include <libgen.h>
 #include <sys/statvfs.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <wtf/SafeStrerror.h>
-#include <wtf/text/StringBuilder.h>
 
 namespace WTF {
 
@@ -64,47 +57,6 @@
     return FileType::Regular;
 }
 
-bool fileExists(const String& path)
-{
-    if (path.isNull())
-        return false;
-
-    CString fsRep = fileSystemRepresentation(path);
-
-    if (!fsRep.data() || fsRep.data()[0] == '\0')
-        return false;
-
-    return access(fsRep.data(), F_OK) != -1;
-}
-
-bool deleteFile(const String& path)
-{
-    CString fsRep = fileSystemRepresentation(path);
-
-    if (!fsRep.data() || fsRep.data()[0] == '\0') {
-        LOG_ERROR("File failed to delete. Failed to get filesystem representation to create CString from cfString or filesystem representation is a null value");
-        return false;
-    }
-
-    // unlink(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
-    bool unlinked = !unlink(fsRep.data());
-    if (!unlinked && errno != ENOENT)
-        LOG_ERROR("File failed to delete. Error message: %s", safeStrerror(errno).data());
-
-    return unlinked;
-}
-
-bool deleteEmptyDirectory(const String& path)
-{
-    CString fsRep = fileSystemRepresentation(path);
-
-    if (!fsRep.data() || fsRep.data()[0] == '\0')
-        return false;
-
-    // rmdir(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
-    return !rmdir(fsRep.data());
-}
-
 bool moveFile(const String& oldPath, const String& newPath)
 {
     auto oldFilename = fileSystemRepresentation(oldPath);
@@ -118,50 +70,6 @@
     return rename(oldFilename.data(), newFilename.data()) != -1;
 }
 
-std::optional<uint64_t> fileSize(const String& path)
-{
-    CString fsRep = fileSystemRepresentation(path);
-
-    if (!fsRep.data() || fsRep.data()[0] == '\0')
-        return std::nullopt;
-
-    struct stat fileInfo;
-
-    if (stat(fsRep.data(), &fileInfo))
-        return std::nullopt;
-
-    return fileInfo.st_size;
-}
-
-bool makeAllDirectories(const String& path)
-{
-    CString fullPath = fileSystemRepresentation(path);
-    if (!access(fullPath.data(), F_OK))
-        return true;
-
-    char* p = fullPath.mutableData() + 1;
-    int length = fullPath.length();
-
-    if (p[length - 1] == '/')
-        p[length - 1] = '\0';
-    for (; *p; ++p) {
-        if (*p == '/') {
-            *p = '\0';
-            if (access(fullPath.data(), F_OK)) {
-                if (mkdir(fullPath.data(), S_IRWXU))
-                    return false;
-            }
-            *p = '/';
-        }
-    }
-    if (access(fullPath.data(), F_OK)) {
-        if (mkdir(fullPath.data(), S_IRWXU))
-            return false;
-    }
-
-    return true;
-}
-
 std::optional<uint64_t> volumeFreeSpace(const String& path)
 {
     struct statvfs fileSystemStat;
@@ -170,80 +78,45 @@
     return std::nullopt;
 }
 
-bool createSymbolicLink(const String& targetPath, const String& symbolicLinkPath)
+Vector<String> listDirectorySub(const String& path, bool fullPath)
 {
-    CString targetPathFSRep = fileSystemRepresentation(targetPath);
-    if (!targetPathFSRep.data() || targetPathFSRep.data()[0] == '\0')
-        return false;
+    Vector<String> entries;
+    CString cpath = fileSystemRepresentation(path);
+    DIR* dir = opendir(cpath.data());
+    if (dir) {
+        struct dirent* dp;
+        while ((dp = readdir(dir))) {
+            const char* name = dp->d_name;
+            if (!strcmp(name, ".") || !strcmp(name, ".."))
+                continue;
+            String newEntry;
+            if (fullPath) {
+                char filePath[PATH_MAX];
+                if (fullPath && static_cast<int>(sizeof(filePath) - 1) < snprintf(filePath, sizeof(filePath), "%s/%s", cpath.data(), name))
+                    continue; // buffer overflow
 
-    CString symbolicLinkPathFSRep = fileSystemRepresentation(symbolicLinkPath);
-    if (!symbolicLinkPathFSRep.data() || symbolicLinkPathFSRep.data()[0] == '\0')
-        return false;
+                newEntry = stringFromFileSystemRepresentation(filePath);
+            } else
+                newEntry = stringFromFileSystemRepresentation(name);
 
-    return !symlink(targetPathFSRep.data(), symbolicLinkPathFSRep.data());
+            // Some file system representations cannot be represented as a UTF-16 string,
+            // so this newEntry might be null.
+            if (!newEntry.isNull())
+                entries.append(WTFMove(newEntry));
+        }
+        closedir(dir);
+    }
+    return entries;
 }
 
-bool hardLink(const String& source, const String& destination)
+Vector<String> listDirectory(const String& path)
 {
-    if (source.isEmpty() || destination.isEmpty())
-        return false;
-
-    auto fsSource = fileSystemRepresentation(source);
-    if (!fsSource.data())
-        return false;
-
-    auto fsDestination = fileSystemRepresentation(destination);
-    if (!fsDestination.data())
-        return false;
-
-    return !link(fsSource.data(), fsDestination.data());
+    return listDirectorySub(path, false);
 }
 
-bool hardLinkOrCopyFile(const String& source, const String& destination)
-{
-    if (hardLink(source, destination))
-        return true;
-
-    // Hard link failed. Perform a copy instead.
-    if (source.isEmpty() || destination.isEmpty())
-        return false;
-
-    auto fsSource = fileSystemRepresentation(source);
-    if (!fsSource.data())
-        return false;
-
-    auto fsDestination = fileSystemRepresentation(destination);
-    if (!fsDestination.data())
-        return false;
-
-    auto handle = open(fsDestination.data(), O_WRONLY | O_CREAT | O_EXCL, 0666);
-    if (handle == -1)
-        return false;
-
-    bool appendResult = appendFileContentsToFileHandle(source, handle);
-    close(handle);
-
-    // If the copy failed, delete the unusable file.
-    if (!appendResult)
-        unlink(fsDestination.data());
-
-    return appendResult;
-}
-
-std::optional<uint64_t> hardLinkCount(const String& path)
-{
-    auto linkPath = fileSystemRepresentation(path);
-    struct stat stat;
-    if (::stat(linkPath.data(), &stat) < 0)
-        return std::nullopt;
-
-    // Link count is 2 in the single client case (the blob file and a link).
-    return stat.st_nlink - 1;
-}
-
 bool deleteNonEmptyDirectory(const String& path)
 {
-    auto entries = listDirectory(path);
+    auto entries = listDirectorySub(path, true);
     for (auto& entry : entries) {
         if (fileTypePotentiallyFollowingSymLinks(entry, ShouldFollowSymbolicLinks::No) == FileType::Directory)
             deleteNonEmptyDirectory(entry);
@@ -253,64 +126,7 @@
     return deleteEmptyDirectory(path);
 }
 
-std::optional<WallTime> fileModificationTime(const String& path)
-{
-    CString fsRep = fileSystemRepresentation(path);
 
-    if (!fsRep.data() || fsRep.data()[0] == '\0')
-        return std::nullopt;
-
-    struct stat fileInfo;
-
-    if (stat(fsRep.data(), &fileInfo))
-        return std::nullopt;
-
-    return WallTime::fromRawSeconds(fileInfo.st_mtime);
-}
-
-bool updateFileModificationTime(const String& path)
-{
-    CString fsRep = fileSystemRepresentation(path);
-
-    if (!fsRep.data() || fsRep.data()[0] == '\0')
-        return false;
-
-    // Passing in null sets the modification time to now
-    return !utimes(fsRep.data(), nullptr);
-}
-
-bool isHiddenFile(const String& path)
-{
-    auto filename = pathFileName(path);
-
-    return !filename.isEmpty() && filename[0] == '.';
-}
-
-std::optional<FileType> fileType(const String& path)
-{
-    return fileTypePotentiallyFollowingSymLinks(path, ShouldFollowSymbolicLinks::No);
-}
-
-std::optional<FileType> fileTypeFollowingSymlinks(const String& path)
-{
-    return fileTypePotentiallyFollowingSymLinks(path, ShouldFollowSymbolicLinks::Yes);
-}
-
-String pathFileName(const String& path)
-{
-    return path.substring(path.reverseFind('/') + 1);
-}
-
-String parentPath(const String& path)
-{
-    CString fsRep = fileSystemRepresentation(path);
-
-    if (!fsRep.data() || fsRep.data()[0] == '\0')
-        return String();
-
-    return String::fromUTF8(dirname(fsRep.mutableData()));
-}
-
 String realPath(const String& filePath)
 {
     CString fsRep = fileSystemRepresentation(filePath);
@@ -319,50 +135,8 @@
     return result ? String::fromUTF8(result) : filePath;
 }
 
-String pathByAppendingComponent(const String& path, const String& component)
-{
-    if (path.endsWith('/'))
-        return path + component;
-    return path + "/" + component;
-}
 
-String pathByAppendingComponents(StringView path, const Vector<StringView>& components)
-{
-    StringBuilder builder;
-    builder.append(path);
-    for (auto& component : components)
-        builder.append('/', component);
-    return builder.toString();
-}
 
-Vector<String> listDirectory(const String& path)
-{
-    Vector<String> entries;
-    CString cpath = fileSystemRepresentation(path);
-    DIR* dir = opendir(cpath.data());
-    if (dir) {
-        struct dirent* dp;
-        while ((dp = readdir(dir))) {
-            const char* name = dp->d_name;
-            if (!strcmp(name, ".") || !strcmp(name, ".."))
-                continue;
-            char filePath[PATH_MAX];
-            if (static_cast<int>(sizeof(filePath) - 1) < snprintf(filePath, sizeof(filePath), "%s/%s", cpath.data(), name))
-                continue; // buffer overflow
-
-            auto string = stringFromFileSystemRepresentation(filePath);
-
-            // Some file system representations cannot be represented as a UTF-16 string,
-            // so this string might be null.
-            if (!string.isNull())
-                entries.append(WTFMove(string));
-        }
-        closedir(dir);
-    }
-    return entries;
-}
-
 } // namespace FileSystemImpl
 } // namespace WTF
 
-#endif // !HAVE(STD_FILESYSTEM) && !HAVE(STD_EXPERIMENTAL_FILESYSTEM)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to