diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:26:05 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:26:05 +0000 |
commit | 14f1b3e8826ce43b978db93a62d1166055db5394 (patch) | |
tree | 0a00ad8d3498783fe0193f3b656bca17c4c8697d /source/Plugins/Process/Linux/ProcFileReader.cpp | |
parent | 4ee8c119c71a06dcad1e0fecc8c675e480e59337 (diff) | |
download | src-test2-14f1b3e8826ce43b978db93a62d1166055db5394.tar.gz src-test2-14f1b3e8826ce43b978db93a62d1166055db5394.zip |
Notes
Diffstat (limited to 'source/Plugins/Process/Linux/ProcFileReader.cpp')
-rw-r--r-- | source/Plugins/Process/Linux/ProcFileReader.cpp | 139 |
1 files changed, 67 insertions, 72 deletions
diff --git a/source/Plugins/Process/Linux/ProcFileReader.cpp b/source/Plugins/Process/Linux/ProcFileReader.cpp index 4d1f231f4f9b..a1bb7a6e09d5 100644 --- a/source/Plugins/Process/Linux/ProcFileReader.cpp +++ b/source/Plugins/Process/Linux/ProcFileReader.cpp @@ -26,83 +26,78 @@ using namespace lldb_private; using namespace lldb_private::process_linux; -lldb::DataBufferSP -ProcFileReader::ReadIntoDataBuffer (lldb::pid_t pid, const char *name) -{ - int fd; - char path[PATH_MAX]; - - // Make sure we've got a nil terminated buffer for all the folks calling - // GetBytes() directly off our returned DataBufferSP if we hit an error. - lldb::DataBufferSP buf_sp (new DataBufferHeap(1, 0)); - - // Ideally, we would simply create a FileSpec and call ReadFileContents. - // However, files in procfs have zero size (since they are, in general, - // dynamically generated by the kernel) which is incompatible with the - // current ReadFileContents implementation. Therefore we simply stream the - // data into a DataBuffer ourselves. - if (snprintf (path, PATH_MAX, "/proc/%" PRIu64 "/%s", pid, name) > 0) - { - if ((fd = open (path, O_RDONLY, 0)) >= 0) - { - size_t bytes_read = 0; - std::unique_ptr<DataBufferHeap> buf_ap(new DataBufferHeap(1024, 0)); - - for (;;) - { - size_t avail = buf_ap->GetByteSize() - bytes_read; - ssize_t status = read (fd, buf_ap->GetBytes() + bytes_read, avail); - - if (status < 0) - break; - - if (status == 0) - { - buf_ap->SetByteSize (bytes_read); - buf_sp.reset (buf_ap.release()); - break; - } - - bytes_read += status; - - if (avail - status == 0) - buf_ap->SetByteSize (2 * buf_ap->GetByteSize()); - } - - close (fd); +lldb::DataBufferSP ProcFileReader::ReadIntoDataBuffer(lldb::pid_t pid, + const char *name) { + int fd; + char path[PATH_MAX]; + + // Make sure we've got a nil terminated buffer for all the folks calling + // GetBytes() directly off our returned DataBufferSP if we hit an error. + lldb::DataBufferSP buf_sp(new DataBufferHeap(1, 0)); + + // Ideally, we would simply create a FileSpec and call ReadFileContents. + // However, files in procfs have zero size (since they are, in general, + // dynamically generated by the kernel) which is incompatible with the + // current ReadFileContents implementation. Therefore we simply stream the + // data into a DataBuffer ourselves. + if (snprintf(path, PATH_MAX, "/proc/%" PRIu64 "/%s", pid, name) > 0) { + if ((fd = open(path, O_RDONLY, 0)) >= 0) { + size_t bytes_read = 0; + std::unique_ptr<DataBufferHeap> buf_ap(new DataBufferHeap(1024, 0)); + + for (;;) { + size_t avail = buf_ap->GetByteSize() - bytes_read; + ssize_t status = read(fd, buf_ap->GetBytes() + bytes_read, avail); + + if (status < 0) + break; + + if (status == 0) { + buf_ap->SetByteSize(bytes_read); + buf_sp.reset(buf_ap.release()); + break; } - } - - return buf_sp; -} -Error -ProcFileReader::ProcessLineByLine (lldb::pid_t pid, const char *name, std::function<bool (const std::string &line)> line_parser) -{ - Error error; - - // Try to open the /proc/{pid}/maps entry. - char filename [PATH_MAX]; - snprintf (filename, sizeof(filename), "/proc/%" PRIu64 "/%s", pid, name); - filename[sizeof (filename) - 1] = '\0'; - - std::ifstream proc_file (filename); - if (proc_file.fail ()) - { - error.SetErrorStringWithFormat ("failed to open file '%s'", filename); - return error; - } + bytes_read += status; - // Read the file line by line, processing until either end of file or when the line_parser returns false. - std::string line; - bool should_continue = true; + if (avail - status == 0) + buf_ap->SetByteSize(2 * buf_ap->GetByteSize()); + } - while (should_continue && std::getline (proc_file, line)) - { - // Pass the line over to the line_parser for processing. If the line_parser returns false, we - // stop processing. - should_continue = line_parser (line); + close(fd); } + } + + return buf_sp; +} +Error ProcFileReader::ProcessLineByLine( + lldb::pid_t pid, const char *name, + std::function<bool(const std::string &line)> line_parser) { + Error error; + + // Try to open the /proc/{pid}/maps entry. + char filename[PATH_MAX]; + snprintf(filename, sizeof(filename), "/proc/%" PRIu64 "/%s", pid, name); + filename[sizeof(filename) - 1] = '\0'; + + std::ifstream proc_file(filename); + if (proc_file.fail()) { + error.SetErrorStringWithFormat("failed to open file '%s'", filename); return error; + } + + // Read the file line by line, processing until either end of file or when the + // line_parser returns false. + std::string line; + bool should_continue = true; + + while (should_continue && std::getline(proc_file, line)) { + // Pass the line over to the line_parser for processing. If the line_parser + // returns false, we + // stop processing. + should_continue = line_parser(line); + } + + return error; } |