Vector<String> listDirectory(const String& path, const String& filter) { Vector<String> entries; CString cpath = fileSystemRepresentation(path); CString cfilter = fileSystemRepresentation(filter); 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; if (fnmatch(cfilter.data(), name, 0)) 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; }
bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result) { CString binaryPath = fileSystemRepresentation(executablePathOfPluginProcess()); CString pluginPathCString = fileSystemRepresentation(pluginPath); char* argv[4]; argv[0] = const_cast<char*>(binaryPath.data()); argv[1] = const_cast<char*>("-scanPlugin"); argv[2] = const_cast<char*>(pluginPathCString.data()); argv[3] = 0; gint status; gchar* stdOut; if (!g_spawn_sync(0, argv, 0, G_SPAWN_STDERR_TO_DEV_NULL, 0, 0, &stdOut, 0, &status, 0)) return false; if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS) return false; const unsigned kNumLinesExpected = 3; String lines[kNumLinesExpected]; unsigned lineIndex = 0; const UChar* current = reinterpret_cast<const UChar*>(stdOut); while (lineIndex < kNumLinesExpected) { const UChar* start = current; while (*current++ != UChar('\n')) { } lines[lineIndex++] = String(start, current - start - 1); } result.name.swap(lines[0]); result.description.swap(lines[1]); result.mimeDescription.swap(lines[2]); return !result.mimeDescription.isEmpty(); }
bool hardLinkOrCopyFile(const String& source, const String& destination) { if (source.isEmpty() || destination.isEmpty()) return false; CString fsSource = fileSystemRepresentation(source); if (!fsSource.data()) return false; CString fsDestination = fileSystemRepresentation(destination); if (!fsDestination.data()) return false; if (!link(fsSource.data(), fsDestination.data())) return true; // Hard link failed. Perform a copy instead. 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; }
bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result) { #if PLATFORM(GTK) || PLATFORM(EFL) CString binaryPath = fileSystemRepresentation(executablePathOfPluginProcess()); CString pluginPathCString = fileSystemRepresentation(pluginPath); char* argv[4]; argv[0] = const_cast<char*>(binaryPath.data()); argv[1] = const_cast<char*>("-scanPlugin"); argv[2] = const_cast<char*>(pluginPathCString.data()); argv[3] = 0; int status; GUniqueOutPtr<char> stdOut; // If the disposition of SIGCLD signal is set to SIG_IGN (default) // then the signal will be ignored and g_spawn_sync() will not be // able to return the status. // As a consequence, we make sure that the disposition is set to // SIG_DFL before calling g_spawn_sync(). #if defined(SIGCLD) struct sigaction action; sigaction(SIGCLD, 0, &action); if (action.sa_handler == SIG_IGN) { action.sa_handler = SIG_DFL; sigaction(SIGCLD, &action, 0); } #endif if (!g_spawn_sync(0, argv, 0, G_SPAWN_STDERR_TO_DEV_NULL, 0, 0, &stdOut.outPtr(), 0, &status, 0)) return false; if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS || !stdOut) return false; String stdOutString = String::fromUTF8(stdOut.get()); Vector<String> lines; stdOutString.split(UChar('\n'), true, lines); if (lines.size() < 3) return false; result.name.swap(lines[0]); result.description.swap(lines[1]); result.mimeDescription.swap(lines[2]); #if PLATFORM(GTK) if (lines.size() > 3) result.requiresGtk2 = lines[3] == "requires-gtk2"; #endif return !result.mimeDescription.isEmpty(); #else // PLATFORM(GTK) || PLATFORM(EFL) return false; #endif // PLATFORM(GTK) || PLATFORM(EFL) }
bool moveFile(const String& oldPath, const String& newPath) { auto oldFilename = fileSystemRepresentation(oldPath); if (oldFilename.isNull()) return false; auto newFilename = fileSystemRepresentation(newPath); if (newFilename.isNull()) return false; return rename(oldFilename.data(), newFilename.data()) != -1; }
bool createSymbolicLink(const String& targetPath, const String& symbolicLinkPath) { CString targetPathFSRep = fileSystemRepresentation(targetPath); if (!targetPathFSRep.data() || targetPathFSRep.data()[0] == '\0') return false; CString symbolicLinkPathFSRep = fileSystemRepresentation(symbolicLinkPath); if (!symbolicLinkPathFSRep.data() || symbolicLinkPathFSRep.data()[0] == '\0') return false; return !symlink(targetPathFSRep.data(), symbolicLinkPathFSRep.data()); }
bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result) { #if PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT)) CString binaryPath = fileSystemRepresentation(executablePathOfPluginProcess()); CString pluginPathCString = fileSystemRepresentation(pluginPath); char* argv[4]; argv[0] = const_cast<char*>(binaryPath.data()); argv[1] = const_cast<char*>("-scanPlugin"); argv[2] = const_cast<char*>(pluginPathCString.data()); argv[3] = 0; int status; char* stdOut = 0; // If the disposition of SIGCLD signal is set to SIG_IGN (default) // then the signal will be ignored and g_spawn_sync() will not be // able to return the status. // As a consequence, we make sure that the disposition is set to // SIG_DFL before calling g_spawn_sync(). struct sigaction action; sigaction(SIGCLD, 0, &action); if (action.sa_handler == SIG_IGN) { action.sa_handler = SIG_DFL; sigaction(SIGCLD, &action, 0); } if (!g_spawn_sync(0, argv, 0, G_SPAWN_STDERR_TO_DEV_NULL, 0, 0, &stdOut, 0, &status, 0)) return false; if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS || !stdOut) { free(stdOut); return false; } String stdOutString(reinterpret_cast<const UChar*>(stdOut)); free(stdOut); Vector<String> lines; stdOutString.split(UChar('\n'), lines); if (lines.size() < 3) return false; result.name.swap(lines[0]); result.description.swap(lines[1]); result.mimeDescription.swap(lines[2]); return !result.mimeDescription.isEmpty(); #else // PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT)) return false; #endif // PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT)) }
String realPath(const String& filePath) { CString fsRep = fileSystemRepresentation(filePath); char resolvedName[PATH_MAX]; const char* result = realpath(fsRep.data(), resolvedName); return result ? String::fromUTF8(result) : filePath; }
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; }
PassRefPtr<SharedBuffer> SharedBuffer::createWithContentsOfFile(const String& filePath) { if (filePath.isEmpty()) return 0; long long fileSize; if (!fileExists(filePath) || !getFileSize(filePath, fileSize)) return 0; RefPtr<SharedBuffer> result = create(); result->m_buffer.grow(fileSize); OwnPtr<IFileMgr> fileMgr = createInstance<IFileMgr>(AEECLSID_FILEMGR); CString filename = fileSystemRepresentation(filePath); OwnPtr<IFile> file(IFILEMGR_OpenFile(fileMgr.get(), filename.data(), _OFM_READ)); if (!file) { LOG_ERROR("Failed to open file %s to create shared buffer, errno(%i)", filePath.ascii().data(), IFILEMGR_GetLastError(fileMgr.get())); return 0; } size_t totalBytesRead = 0; int32 bytesRead; while ((bytesRead = IFILE_Read(file.get(), result->m_buffer.data() + totalBytesRead, fileSize - totalBytesRead)) > 0) totalBytesRead += bytesRead; result->m_size = totalBytesRead; if (totalBytesRead != fileSize) { LOG_ERROR("Failed to fully read contents of file %s - errno(%i)", filePath.ascii().data(), IFILEMGR_GetLastError(fileMgr.get())); return 0; } return result.release(); }
void ProcessLauncher::launchProcess() { GPid pid = 0; int sockets[2]; if (socketpair(AF_UNIX, SOCKET_TYPE, 0, sockets) < 0) { g_printerr("Creation of socket failed: %s.\n", g_strerror(errno)); ASSERT_NOT_REACHED(); return; } String executablePath, pluginPath; CString realExecutablePath, realPluginPath; if (m_launchOptions.processType == WebProcess) executablePath = executablePathOfWebProcess(); else { executablePath = executablePathOfPluginProcess(); pluginPath = m_launchOptions.extraInitializationData.get("plugin-path"); realPluginPath = fileSystemRepresentation(pluginPath); } realExecutablePath = fileSystemRepresentation(executablePath); GOwnPtr<gchar> socket(g_strdup_printf("%d", sockets[0])); char* argv[4]; argv[0] = const_cast<char*>(realExecutablePath.data()); argv[1] = socket.get(); argv[2] = const_cast<char*>(realPluginPath.data()); argv[3] = 0; GOwnPtr<GError> error; int spawnFlags = G_SPAWN_LEAVE_DESCRIPTORS_OPEN | G_SPAWN_DO_NOT_REAP_CHILD; if (!g_spawn_async(0, argv, 0, static_cast<GSpawnFlags>(spawnFlags), childSetupFunction, GINT_TO_POINTER(sockets[1]), &pid, &error.outPtr())) { g_printerr("Unable to fork a new WebProcess: %s.\n", error->message); ASSERT_NOT_REACHED(); } close(sockets[0]); m_processIdentifier = pid; // Monitor the child process, it calls waitpid to prevent the child process from becomming a zombie, // and it allows us to close the socket when the child process crashes. g_child_watch_add(m_processIdentifier, childFinishedFunction, GINT_TO_POINTER(sockets[1])); // We've finished launching the process, message back to the main run loop. RunLoop::main()->dispatch(bind(&ProcessLauncher::didFinishLaunchingProcess, this, m_processIdentifier, sockets[1])); }
bool getVolumeFreeSpace(const String& path, uint64_t& freeSpace) { struct statvfs fileSystemStat; if (statvfs(fileSystemRepresentation(path).data(), &fileSystemStat)) { freeSpace = fileSystemStat.f_bavail * fileSystemStat.f_frsize; return true; } return false; }
String directoryName(const String& path) { CString fsRep = fileSystemRepresentation(path); if (!fsRep.data() || fsRep.data()[0] == '\0') return String(); return dirname(fsRep.mutableData()); }
//SAMSUNG CHANGE HTML5 FILEAPI << bool deleteDirectory(const String& path) { CString fsRep1 = fileSystemRepresentation(path); if (!fsRep1.data() || fsRep1.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 !rmdir(fsRep1.data()); }
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; }
Optional<WallTime> getFileModificationTime(const String& path) { CString fsRep = fileSystemRepresentation(path); if (!fsRep.data() || fsRep.data()[0] == '\0') return WTF::nullopt; struct stat fileInfo; if (stat(fsRep.data(), &fileInfo)) return WTF::nullopt; return WallTime::fromRawSeconds(fileInfo.st_mtime); }
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); }
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 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; }
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; }
String FileChooser::basenameForWidth(const Font& font, int width) const { if (width <= 0) return String(); String string = fileButtonNoFileSelectedLabel(); if (m_filenames.size() == 1) { CString systemFilename = fileSystemRepresentation(m_filenames[0]); gchar* systemBasename = g_path_get_basename(systemFilename.data()); stringByAdoptingFileSystemRepresentation(systemBasename, string); } else if (m_filenames.size() > 1) return StringTruncator::rightTruncate(multipleFileUploadText(m_filenames.size()), width, font, false); return StringTruncator::centerTruncate(string, width, font, false); }
PassRefPtr<SharedBuffer> SharedBuffer::createWithContentsOfFile(const String& filePath) { if (filePath.isEmpty()) return 0; CString filename = fileSystemRepresentation(filePath); GOwnPtr<gchar> contents; gsize size; GOwnPtr<GError> error; if (!g_file_get_contents(filename.data(), &contents.outPtr(), &size, &error.outPtr())) { LOG_ERROR("Failed to fully read contents of file %s - %s", filenameForDisplay(filePath).utf8().data(), error->message); return 0; } RefPtr<SharedBuffer> result = SharedBuffer::create(contents.get(), size); return result.release(); }
Optional<WallTime> getFileCreationTime(const String& path) { #if OS(DARWIN) || OS(OPENBSD) || OS(NETBSD) || OS(FREEBSD) CString fsRep = fileSystemRepresentation(path); if (!fsRep.data() || fsRep.data()[0] == '\0') return WTF::nullopt; struct stat fileInfo; if (stat(fsRep.data(), &fileInfo)) return WTF::nullopt; return WallTime::fromRawSeconds(fileInfo.st_birthtime); #else UNUSED_PARAM(path); return WTF::nullopt; #endif }
PlatformFileHandle openFile(const String& path, FileOpenMode mode) { CString fsRep = fileSystemRepresentation(path); if (fsRep.isNull()) return invalidPlatformFileHandle; int platformFlag = 0; if (mode == FileOpenMode::Read) platformFlag |= O_RDONLY; else if (mode == FileOpenMode::Write) platformFlag |= (O_WRONLY | O_CREAT | O_TRUNC); #if OS(DARWIN) else if (mode == FileOpenMode::EventsOnly) platformFlag |= O_EVTONLY; #endif return open(fsRep.data(), platformFlag, 0666); }
void SoupNetworkSession::clearCache(const String& cacheDirectory) { CString cachePath = fileSystemRepresentation(cacheDirectory); GUniquePtr<char> cacheFile(g_build_filename(cachePath.data(), "soup.cache2", nullptr)); if (!g_file_test(cacheFile.get(), G_FILE_TEST_IS_REGULAR)) return; GUniquePtr<GDir> dir(g_dir_open(cachePath.data(), 0, nullptr)); if (!dir) return; while (const char* name = g_dir_read_name(dir.get())) { if (!g_str_has_prefix(name, "soup.cache") && !stringIsNumeric(name)) continue; GUniquePtr<gchar> filename(g_build_filename(cachePath.data(), name, nullptr)); if (g_file_test(filename.get(), G_FILE_TEST_IS_REGULAR)) g_unlink(filename.get()); } }
static Optional<FileMetadata> fileMetadataUsingFunction(const String& path, int (*statFunc)(const char*, struct stat*)) { CString fsRep = fileSystemRepresentation(path); if (!fsRep.data() || fsRep.data()[0] == '\0') return WTF::nullopt; struct stat fileInfo; if (statFunc(fsRep.data(), &fileInfo)) return WTF::nullopt; String filename = pathGetFileName(path); bool isHidden = !filename.isEmpty() && filename[0] == '.'; return FileMetadata { WallTime::fromRawSeconds(fileInfo.st_mtime), fileInfo.st_size, isHidden, toFileMetataType(fileInfo) }; }
static PassOwnPtr<BlobData> createBlobDataForFile(const String& path) { String type; LOGE("File:: createBlobDataForFile Path value is %s",path.utf8().data()); //SAMSUNG CHANGE HTML5 FILEAPI << CString newpath = fileSystemRepresentation(path); LOGE("File:: createBlobDataForFile NewPath value is %s",newpath.data()); String newpath1 = newpath.data(); int index = newpath1.reverseFind('.'); LOGE("File:: createBlobDataForFile index value is %d",index); String mimeext = newpath1.substring(index + 1); LOGE("File:: createBlobDataForFile Path value is %s",mimeext.utf8().data()); if (index != -1) //type = MIMETypeRegistry::getMIMETypeForExtension(path.substring(index + 1)); type = MIMETypeRegistry::getMIMETypeForExtension(mimeext); //SAMSUNG CHANGE HTML5 FILEAPI >> OwnPtr<BlobData> blobData = BlobData::create(); blobData->setContentType(type); blobData->appendFile(path); return blobData.release(); }
int SQLiteFileSystem::openDatabase(const String& filename, sqlite3** database, bool) { return sqlite3_open_v2(fileSystemRepresentation(filename).data(), database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_AUTOPROXY, nullptr); }
int SQLiteFileSystem::openDatabase(const String& filename, sqlite3** database, bool) { return sqlite3_open(fileSystemRepresentation(filename).data(), database); }
static RefPtr<HyphenationDictionary> createValueForKey(const AtomicString& dictionaryPath) { return HyphenationDictionary::create(fileSystemRepresentation(dictionaryPath.string())); }