allow path lookup for pipestream
[libi2ncommon] / src / pipestream.hxx
index fe9e8c0..f53f474 100644 (file)
@@ -29,12 +29,15 @@ on this file might be covered by the GNU General Public License.
 
 #include <stdio.h>
 
+#include <cstring>
 #include <string>
 #include <streambuf>
 #include <istream>
 #include <ostream>
 #include <vector>
 
+#include <stringfunc.hxx>
+
 struct ExecResult
 {
     /** if the program exited normally and returned a return code */
@@ -51,14 +54,27 @@ struct ExecResult
 
     /** errormessage if we have one */
     std::string error_message;
+
+    inline std::string format (void) const
+    {
+        return std::string ("(")
+            + "(normal_exit " + (this->normal_exit ? "T" : "F") + ") "
+              "(return_code '" + I2n::to_string ((int)this->return_code) + "') "
+              "(signal " + (this->terminated_by_signal
+                            ? strsignal (this->signal)
+                            : "<nil>") + "))"
+            ;
+    };
 };
 typedef struct ExecResult ExecResult;
 
 std::string capture_exec(const std::string& command, ExecResult &rescode);
 std::string capture_exec(const char *const *command, ExecResult &rescode,
-                         const bool out=true, const bool err=false);
+                         const bool out=true, const bool err=false,
+                         const bool path=false);
 std::string capture_exec(const std::vector<std::string>& command, ExecResult &rescode,
-                         const bool out=true, const bool err=false);
+                         const bool out=true, const bool err=false,
+                         const bool path=false);
 
 inline std::string capture_exec (const std::string &command)
 {
@@ -93,6 +109,7 @@ protected:
     char buffer;
 
     FILE *pipe;
+    pid_t pid;
 
     // "callback" variables for destructor to store exit status
     bool *status_set;
@@ -100,11 +117,11 @@ protected:
 
 public:
     inpipebuf(const std::string& command,
-              const bool out, const bool err);
+              const bool out, const bool err, const bool path);
     inpipebuf(const char *const *command,
-              const bool out, const bool err);
+              const bool out, const bool err, const bool path);
     inpipebuf(const std::vector<std::string> &command,
-              const bool out, const bool err);
+              const bool out, const bool err, const bool path);
 
     ~inpipebuf();
 
@@ -114,8 +131,10 @@ protected:
     virtual int_type underflow();
 
 private:
-    FILE *init_without_shell (const char *const *argv,
-                              const bool out, const bool err) const;
+    std::pair <pid_t, FILE *>
+    init_without_shell (const char *const *argv,
+                        const bool out, const bool err,
+                        const bool path) const;
 };
 
 /** @brief stream around inpipebuf -- see comment there */
@@ -126,18 +145,21 @@ protected:
 
 public:
     inpipestream(const std::string& command,
-                 const bool out=true, const bool err=false)
-            : std::istream(&buf), buf(command, out, err)
+                 const bool out=true, const bool err=false,
+                 const bool path=false)
+            : std::istream(&buf), buf(command, out, err, path)
     {}
 
     inpipestream(const char *const command[],
-                 const bool out=true, const bool err=false)
-            : std::istream(&buf), buf(command, out, err)
+                 const bool out=true, const bool err=false,
+                 const bool path=false)
+            : std::istream(&buf), buf(command, out, err, path)
     {}
 
     inpipestream(const std::vector<std::string> &command,
-                 const bool out=true, const bool err=false)
-            : std::istream(&buf), buf(command, out, err)
+                 const bool out=true, const bool err=false,
+                 const bool path=false)
+            : std::istream(&buf), buf(command, out, err, path)
     {}
 
     void store_exit_status(bool *_status_set, int *_exit_status)