123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- /*
- * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
- * Copyright (C) 2012 Sony Computer Entertainment Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include "config.h"
- #include "FileSystem.h"
- #include "NotImplemented.h"
- #include <dirent.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <libgen.h>
- #include <stdio.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <wtf/text/CString.h>
- #if OS(PS3)
- #include <fnmatch.h>
- #endif
- namespace WebCore {
- bool fileExists(const String& path)
- {
- if (path.isNull())
- return false;
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- struct stat fileInfo;
- // stat(...) returns 0 on successful stat'ing of the file, and non-zero in any case where the file doesn't exist or cannot be accessed
- return !stat(fsRep.data(), &fileInfo);
- }
- bool deleteFile(const String& path)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- 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)
- return !unlink(fsRep.data());
- }
- PlatformFileHandle openFile(const String& path, FileOpenMode mode)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (fsRep.isNull())
- return invalidPlatformFileHandle;
- int platformFlag = 0;
- if (mode == OpenForRead)
- platformFlag |= O_RDONLY;
- else if (mode == OpenForWrite)
- platformFlag |= (O_WRONLY | O_CREAT | O_TRUNC);
- return open(fsRep.data(), platformFlag, 0666);
- }
- void closeFile(PlatformFileHandle& handle)
- {
- if (isHandleValid(handle)) {
- close(handle);
- handle = invalidPlatformFileHandle;
- }
- }
- long long seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin)
- {
- int whence = SEEK_SET;
- switch (origin) {
- case SeekFromBeginning:
- whence = SEEK_SET;
- break;
- case SeekFromCurrent:
- whence = SEEK_CUR;
- break;
- case SeekFromEnd:
- whence = SEEK_END;
- break;
- default:
- ASSERT_NOT_REACHED();
- }
- return static_cast<long long>(lseek(handle, offset, whence));
- }
- bool truncateFile(PlatformFileHandle handle, long long offset)
- {
- // ftruncate returns 0 to indicate the success.
- return !ftruncate(handle, offset);
- }
- int writeToFile(PlatformFileHandle handle, const char* data, int length)
- {
- do {
- int bytesWritten = write(handle, data, static_cast<size_t>(length));
- if (bytesWritten >= 0)
- return bytesWritten;
- } while (errno == EINTR);
- return -1;
- }
- int readFromFile(PlatformFileHandle handle, char* data, int length)
- {
- do {
- int bytesRead = read(handle, data, static_cast<size_t>(length));
- if (bytesRead >= 0)
- return bytesRead;
- } while (errno == EINTR);
- return -1;
- }
- 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 getFileSize(const String& path, long long& result)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- struct stat fileInfo;
- if (stat(fsRep.data(), &fileInfo))
- return false;
- result = fileInfo.st_size;
- return true;
- }
- bool getFileModificationTime(const String& path, time_t& result)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return false;
- struct stat fileInfo;
- if (stat(fsRep.data(), &fileInfo))
- return false;
- result = fileInfo.st_mtime;
- return true;
- }
- String pathByAppendingComponent(const String& path, const String& component)
- {
- if (path.endsWith("/"))
- return path + component;
- return path + "/" + component;
- }
- bool makeAllDirectories(const String& path)
- {
- struct stat fileInfo;
- CString fullPath = fileSystemRepresentation(path);
- if (!stat(fullPath.data(), &fileInfo))
- return true;
- char* p = fullPath.mutableData() + 1;
- int length = fullPath.length();
- #if OS(ORBIS)
- const mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;
- #else
- const mode_t mode = S_IRWXU;
- #endif
- if (p[length - 1] == '/')
- p[length - 1] = '\0';
- for (; *p; ++p)
- if (*p == '/') {
- *p = '\0';
- if (stat(fullPath.data(), &fileInfo))
- if (mkdir(fullPath.data(), mode))
- return false;
- *p = '/';
- }
- if (stat(fullPath.data(), &fileInfo))
- if (mkdir(fullPath.data(), mode))
- return false;
- return true;
- }
- String pathGetFileName(const String& path)
- {
- return path.substring(path.reverseFind('/') + 1);
- }
- String directoryName(const String& path)
- {
- CString fsRep = fileSystemRepresentation(path);
- if (!fsRep.data() || fsRep.data()[0] == '\0')
- return String();
- return dirname(fsRep.mutableData());
- }
- Vector<String> listDirectory(const String& path, const String& filter)
- {
- Vector<String> entries;
- CString cpath = path.utf8();
- CString cfilter = filter.utf8();
- DIR* dir = opendir(cpath.data());
- if (dir) {
- struct dirent* dp;
- #if OS(PSP2) || OS(ORBIS)
- dirent de;
- while (!readdir_r(dir, &de, &dp) && dp) {
- #else
- while ((dp = readdir(dir))) {
- #endif
- const char* name = dp->d_name;
- if (!strcmp(name, ".") || !strcmp(name, ".."))
- continue;
- #if OS(PS3)
- if (fnmatch(cfilter.data(), name, 0))
- continue;
- #endif
- char filePath[1024];
- if (static_cast<int>(sizeof(filePath) - 1) < snprintf(filePath, sizeof(filePath), "%s/%s", cpath.data(), name))
- continue; // buffer overflow
- entries.append(filePath);
- }
- closedir(dir);
- }
- return entries;
- }
- String openTemporaryFile(const String& prefix, PlatformFileHandle& handle)
- {
- notImplemented();
- return String();
- }
- String homeDirectoryPath()
- {
- #if OS(PSP2)
- return String("host0:");
- #else
- return String(getenv("WEBKIT_HOME_DIR"));
- #endif
- }
- CString fileSystemRepresentation(const String& string)
- {
- return string.utf8();
- }
- bool unloadModule(PlatformModule)
- {
- return false;
- }
- bool getFileMetadata(const String& path, FileMetadata& metadata)
- {
- notImplemented();
- return false;
- }
- } // namespace WebCore
|