Factored out Linux proc file reading into separate class.

Both NativeProcessLinux (in llgs branch) and Linux Host.cpp had similar code to handle /proc 
file reading.  I factored that out into a new Linux-specific ProcFileReader class and added a method
that the llgs branch will use for line-by-line parsing.

This change also adds numerous Linux-specific files to Xcode that were missing from the Xcode
project files.

Related to https://github.com/tfiala/lldb/issues/27

llvm-svn: 212015
diff --git a/lldb/source/Host/linux/Host.cpp b/lldb/source/Host/linux/Host.cpp
index 3c05243..b30e6d5 100644
--- a/lldb/source/Host/linux/Host.cpp
+++ b/lldb/source/Host/linux/Host.cpp
@@ -29,6 +29,7 @@
 
 #include "lldb/Core/ModuleSpec.h"
 #include "lldb/Symbol/ObjectFile.h"
+#include "Plugins/Process/Linux/ProcFileReader.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -52,67 +53,11 @@
 // Get the process info with additional information from /proc/$PID/stat (like process state, and tracer pid).
 static bool GetProcessAndStatInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info, ProcessStatInfo &stat_info, lldb::pid_t &tracerpid);
 
-
-namespace
-{
-
-lldb::DataBufferSP
-ReadProcPseudoFile (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);
-        }
-    }
-
-    return buf_sp;
-}
-
-} // anonymous namespace
-
 static bool
 ReadProcPseudoFileStat (lldb::pid_t pid, ProcessStatInfo& stat_info)
 {
     // Read the /proc/$PID/stat file.
-    lldb::DataBufferSP buf_sp = ReadProcPseudoFile (pid, "stat");
+    lldb::DataBufferSP buf_sp = ProcFileReader::ReadIntoDataBuffer (pid, "stat");
 
     // The filename of the executable is stored in parenthesis right after the pid. We look for the closing
     // parenthesis for the filename and work from there in case the name has something funky like ')' in it.
@@ -165,7 +110,7 @@
     uint32_t eGid = UINT32_MAX;     // Effective Group ID
 
     // Read the /proc/$PID/status file and parse the Uid:, Gid:, and TracerPid: fields.
-    lldb::DataBufferSP buf_sp = ReadProcPseudoFile (pid, "status");
+    lldb::DataBufferSP buf_sp = ProcFileReader::ReadIntoDataBuffer (pid, "status");
 
     static const char uid_token[] = "Uid:";
     char *buf_uid = strstr ((char *)buf_sp->GetBytes(), uid_token);
@@ -227,7 +172,7 @@
 lldb::DataBufferSP
 Host::GetAuxvData(lldb_private::Process *process)
 {
-    return ReadProcPseudoFile(process->GetID(), "auxv");
+    return ProcFileReader::ReadIntoDataBuffer (process->GetID(), "auxv");
 }
 
 static bool
@@ -391,7 +336,7 @@
     lldb::DataBufferSP buf_sp;
 
     // Get the process environment.
-    buf_sp = ReadProcPseudoFile(pid, "environ");
+    buf_sp = ProcFileReader::ReadIntoDataBuffer(pid, "environ");
     Args &info_env = process_info.GetEnvironmentEntries();
     char *next_var = (char *)buf_sp->GetBytes();
     char *end_buf = next_var + buf_sp->GetByteSize();
@@ -402,7 +347,7 @@
     }
 
     // Get the commond line used to start the process.
-    buf_sp = ReadProcPseudoFile(pid, "cmdline");
+    buf_sp = ProcFileReader::ReadIntoDataBuffer(pid, "cmdline");
 
     // Grab Arg0 first, if there is one.
     char *cmd = (char *)buf_sp->GetBytes();
@@ -458,7 +403,7 @@
     assert(tid != LLDB_INVALID_THREAD_ID);
 
     // Read /proc/$TID/comm file.
-    lldb::DataBufferSP buf_sp = ReadProcPseudoFile (tid, "comm");
+    lldb::DataBufferSP buf_sp = ProcFileReader::ReadIntoDataBuffer (tid, "comm");
     const char *comm_str = (const char *)buf_sp->GetBytes();
     const char *cr_str = ::strchr(comm_str, '\n');
     size_t length = cr_str ? (cr_str - comm_str) : strlen(comm_str);