1 /**************************************************************************
3 * Copyright 2013-2014 RAD Game Tools and Valve Software
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 **************************************************************************/
26 #ifndef __VOGL_APPLAUNCHER_H__
27 #define __VOGL_APPLAUNCHER_H__
31 #include "vogl_dynamic_string.h"
33 // Example usage of this class. It launches glxinfo and grabs stdout.
35 vogl::app_launcher launcher;
36 if (launcher.run("glxinfo", NULL, NULL, vogl::app_launcher::RUN_REMOVE_LD_PRELOAD_ENV))
38 vogl::dynamic_string output;
39 if (launcher.get_stdout(output, 16384))
41 printf("got stdout: %s\n", output.c_str());
58 RUN_REMOVE_LD_PRELOAD_ENV = 0x00000001, // Parse envp and remove LD_PRELOAD.
60 bool run(const char *file, const char *const argv[], const char *const envp[], uint flags);
65 bool get_stdout(vogl::dynamic_string &output, size_t max_output = (size_t)-1); //SIZE_MAX);
66 bool get_stderr(vogl::dynamic_string &output, size_t max_output = (size_t)-1); //SIZE_MAX);
67 bool get_line(char **line_stdout, size_t *line_stdout_size, char **line_stderr, size_t *line_stderr_size);
69 enum STATUS_CODE { STATUS_ERROR = -1, STATUS_NOTLAUNCHED, STATUS_RUNNING, STATUS_EXITED, STATUS_DUMPED, STATUS_KILLED };
70 void get_status(STATUS_CODE *code, int *status, bool wait);
73 // Check for app exiting & update m_exit_status.
74 bool update_status(bool wait);
75 // Internal routine used for get_stdout and get_stderr.
76 bool get_output(int pipe, vogl::dynamic_string &output, size_t max_output);
78 STATUS_CODE m_status_code;
80 pid_t m_child_pid; // Pid of child (could be a script).
90 #endif // __VOGL_APPLAUNCHER_H__