]> git.cworth.org Git - vogl/blob - src/voglcore/vogl_applauncher.h
Don't attempt to build gltests nor OGLSuperBible directories.
[vogl] / src / voglcore / vogl_applauncher.h
1 /**************************************************************************
2  *
3  * Copyright 2013-2014 RAD Game Tools and Valve Software
4  * All Rights Reserved.
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
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
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26 #ifndef __VOGL_APPLAUNCHER_H__
27 #define __VOGL_APPLAUNCHER_H__
28
29 #include <unistd.h>
30 #include <stdio.h>
31 #include "vogl_dynamic_string.h"
32
33 // Example usage of this class. It launches glxinfo and grabs stdout.
34 #if 0
35     vogl::app_launcher launcher;
36     if (launcher.run("glxinfo", NULL, NULL, vogl::app_launcher::RUN_REMOVE_LD_PRELOAD_ENV))
37     {
38         vogl::dynamic_string output;
39         if (launcher.get_stdout(output, 16384))
40         {
41             printf("got stdout: %s\n", output.c_str());
42             launcher.stop();
43         }
44     }
45 #endif
46
47 namespace vogl
48 {
49
50 class app_launcher
51 {
52 public:
53     app_launcher();
54     ~app_launcher();
55
56     enum
57     {
58         RUN_REMOVE_LD_PRELOAD_ENV = 0x00000001, // Parse envp and remove LD_PRELOAD.
59     };
60     bool run(const char *file, const char *const argv[], const char *const envp[], uint flags);
61     bool stop();
62
63     bool is_running();
64
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);
68
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);
71
72 private:
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);
77
78     STATUS_CODE m_status_code;
79     int m_status;
80     pid_t m_child_pid; // Pid of child (could be a script).
81
82     int m_stdout_pipe[2];
83     int m_stderr_pipe[2];
84     FILE *m_stdout;
85     FILE *m_stderr;
86 };
87
88 } // namespace vogl
89
90 #endif // __VOGL_APPLAUNCHER_H__