Source code taken from cacert-20121211.tar.bz2
[cacert-devel.git] / includes / lib / general.php
index 25d2561..d91b24e 100644 (file)
@@ -47,4 +47,86 @@ function get_user_id_from_cert($serial, $issuer_cn)
        return -1;
 }
 
-?>
+/**
+ * Produces a log entry with the error message with log level E_USER_WARN
+ * and a random ID an returns a message that can be displayed to the user
+ * including the generated ID
+ *
+ * @param $errormessage string
+ *             The error message that should be logged
+ * @return string containing the generated ID that can be displayed to the
+ *             user
+ */
+function failWithId($errormessage) {
+       $errorId = rand();
+       trigger_error("$errormessage. ID: $errorId", E_USER_WARNING);
+       return sprintf(_("Something went wrong when processing your request. ".
+                               "Please contact %s for help and provide them with the ".
+                               "following ID: %d"),
+                       "<a href='mailto:support@cacert.org?subject=System%20Error%20-%20".
+                               "ID%3A%20$errorId'>support@cacert.org</a>",
+       $errorId);
+}
+
+
+/**
+ * Runs a command on the shell and return it's exit code and output
+ * 
+ * @param string $command
+ *             The command to run. Make sure that you escapeshellarg() any non-constant
+ *             parts as this is executed on a shell!
+ * @param string|bool $input
+ *             The input that is passed to the command via STDIN, if true the real
+ *             STDIN is passed through
+ * @param string|bool $output
+ *             The output the command wrote to STDOUT (this is passed as reference),
+ *             if true the output will be written to the real STDOUT. Output is ignored
+ *             by default
+ * @param string|bool $errors
+ *             The output the command wrote to STDERR (this is passed as reference),
+ *             if true (default) the output will be written to the real STDERR
+ * 
+ * @return int|bool
+ *             The exit code of the command, true if the execution of the command
+ *             failed (true because then
+ *             <code>if (runCommand('echo "foo"')) handle_error();</code> will work)
+ */
+function runCommand($command, $input = "", &$output = null, &$errors = true) {
+       $descriptorspec = array();
+       
+       if ($input !== true) {
+               $descriptorspec[0] = array("pipe", "r"); // STDIN for child
+       }
+       
+       if ($output !== true) {
+               $descriptorspec[1] = array("pipe", "w"); // STDOUT for child
+       }
+       
+       if ($errors !== true) {
+               $descriptorspec[2] = array("pipe", "w"); // STDERR for child
+       }
+       
+       $proc = proc_open($command, $descriptorspec, $pipes);
+       
+       if (is_resource($proc))
+       {
+               if ($input !== true) {
+                       fwrite($pipes[0], $input);
+                       fclose($pipes[0]);
+               }
+               
+               if ($output !== true) {
+                       $output = stream_get_contents($pipes[1]);
+               }
+               
+               if ($errors !== true) {
+                       $errors = stream_get_contents($pipes[2]);
+               }
+               
+               return proc_close($proc);
+               
+       } else {
+               return true;
+       }
+}
+