// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef FILE_UTILS_H_ #define FILE_UTILS_H_ #include <dirent.h> #include <sys/types.h> #include <unistd.h> #include <functional> #include <map> #include <memory> #include "logging.h" namespace file_utils { // RAII classes for auto-releasing fd/dirs. template <typename RESOURCE_TYPE, int (*CLOSE_FN)(RESOURCE_TYPE)> struct ScopedResource { explicit ScopedResource(RESOURCE_TYPE r) : r_(r) { CHECK(r); } ~ScopedResource() { CLOSE_FN(r_); } RESOURCE_TYPE r_; }; using ScopedFD = ScopedResource<int, close>; using ScopedDir = ScopedResource<DIR*, closedir>; // Invokes predicate(pid) for each folder in |proc_path|/[0-9]+ which has // a numeric name (typically pids and tids). void ForEachPidInProcPath(const char* proc_path, std::function<void(int)> predicate); // Reads the contents of |path| fully into |buf| up to |length| chars. // |buf| is guaranteed to be null terminated. ssize_t ReadFile(const char* path, char* buf, size_t length); // Reads a single-line file, stripping out any \0, \r, \n and replacing // non-printable charcters with '?'. |buf| is guaranteed to be null terminated. bool ReadFileTrimmed(const char* path, char* buf, size_t length); // Convenience wrappers for /proc/|pid|/|proc_file| paths. ssize_t ReadProcFile(int pid, const char* proc_file, char* buf, size_t length); bool ReadProcFileTrimmed(int pid, const char* proc_file, char* buf, size_t length); // Takes a C string buffer and chunks it into lines without creating any // copies. It modifies the original buffer, by replacing \n with \0. class LineReader { public: LineReader(char* buf, size_t size); ~LineReader(); const char* NextLine(); private: char* ptr_; char* end_; }; } // namespace file_utils #endif // FILE_UTILS_H_