summaryrefslogtreecommitdiff
path: root/rld-process.h
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2012-05-07 08:47:11 +1000
committerChris Johns <chrisj@rtems.org>2012-05-07 08:47:11 +1000
commit75bb1e696321cf1b9ac6b124312b57560a06ff39 (patch)
tree510f1acc95a08ef2761aab7efba82ef5af894c8a /rld-process.h
Add to git.
Diffstat (limited to 'rld-process.h')
-rw-r--r--rld-process.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/rld-process.h b/rld-process.h
new file mode 100644
index 0000000..4f5be11
--- /dev/null
+++ b/rld-process.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2011, Chris Johns <chrisj@rtems.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/**
+ * @file
+ *
+ * @ingroup rtems-ld
+ *
+ * @brief Process execute and various supporting parts.
+ *
+ */
+
+#if !defined (_RLD_PEX_H_)
+#define _RLD_PEX_H_
+
+#include <list>
+#include <string>
+#include <vector>
+
+namespace rld
+{
+ namespace process
+ {
+ /**
+ * Manage temporary files. We keep these so we can delete them when
+ * we exit.
+ */
+ class temporary_files
+ {
+ public:
+ /**
+ * Container of temporary file names.
+ */
+ typedef std::list < std::string > tempfile_container;
+
+ /**
+ * Construct the temporary files.
+ */
+ temporary_files ();
+
+ /**
+ * Destruct cleaning up.
+ */
+ ~temporary_files ();
+
+ /**
+ * Get a new temporary file name.
+ */
+ const std::string get ();
+
+ /**
+ * Remove the temporary file.
+ */
+ void erase (const std::string& name);
+
+ /**
+ * Remove all temporary files.
+ */
+ void clean_up ();
+
+ private:
+
+ /*
+ * Delete the file.
+ */
+ void unlink (const std::string& name);
+
+ tempfile_container tempfiles; //< The temporary files.
+
+ };
+
+ /**
+ * The temporary files.
+ */
+ static temporary_files temporaries;
+
+ /**
+ * Handle the output files from the process.
+ */
+ class tempfile
+ {
+ public:
+
+ /**
+ * Get a temporary file name.
+ */
+ tempfile ();
+
+ /**
+ * Clean up the temporary file.
+ */
+ ~tempfile ();
+
+ /**
+ * Open the temporary file.
+ */
+ void open ();
+
+ /**
+ * Close the temporary file.
+ */
+ void close ();
+
+ /**
+ * The name of the temp file.
+ */
+ const std::string& name () const;
+
+ /**
+ * Size of the file.
+ */
+ size_t size ();
+
+ /**
+ * Get all the file.
+ */
+ void get (std::string& all);
+
+ /**
+ * Get time.
+ */
+ void getline (std::string& line);
+
+ /**
+ * Output the file.
+ */
+ void output (const std::string& prefix,
+ std::ostream& out,
+ bool line_numbers = false);
+
+ /**
+ * Output the file.
+ */
+ void output (std::ostream& out);
+
+ private:
+
+ std::string _name; //< The name of the file.
+ int fd; //< The file descriptor
+ char buf[256]; //< The read buffer.
+ int level; //< The level of data in the buffer.
+ };
+
+ /**
+ * The arguments containter has a single argument per element.
+ */
+ typedef std::vector < std::string > arg_container;
+
+ /**
+ * Execute result.
+ */
+ struct status
+ {
+ enum types
+ {
+ normal, //< The process terminated normally by a call to _exit(2) or exit(3).
+ signal, //< The process terminated due to receipt of a signal.
+ stopped //< The process has not terminated, but has stopped and can be restarted.
+ };
+
+ types type; //< Type of status.
+ int code; //< The status code returned.
+ };
+
+ /**
+ * Execute a process and capture stdout and stderr. The first element is
+ * the program name to run. Return an error code.
+ */
+ status execute (const std::string& pname,
+ const arg_container& args,
+ const std::string& outname,
+ const std::string& errname);
+
+ /**
+ * Execute a process and capture stdout and stderr given a command line
+ * string. Return an error code.
+ */
+ status execute (const std::string& pname,
+ const std::string& command,
+ const std::string& outname,
+ const std::string& errname);
+
+ /**
+ * Parse a command line into arguments. It support quoting.
+ */
+ void parse_command_line (const std::string& command, arg_container& args);
+ }
+}
+
+#endif