radiant: replace StringBuffer with std::string
[xonotic/netradiant.git] / libs / cmdlib / cmdlib.cpp
1 /*
2    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3    For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5    This file is part of GtkRadiant.
6
7    GtkRadiant is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    GtkRadiant is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GtkRadiant; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21
22 //
23 // start of shared cmdlib stuff
24 //
25
26 #include "cmdlib.h"
27 #include "globaldefs.h"
28
29 #include <string.h>
30 #include <stdio.h>
31
32 #include "string/string.h"
33 #include "os/path.h"
34 #include "container/array.h"
35
36
37 #if GDEF_OS_POSIX
38
39 #include <unistd.h>
40 #include <sys/types.h>
41 #include <sys/wait.h>
42
43 bool Q_Exec( const char *cmd, const char *cmdline, const char *, bool, bool waitfor ){
44         char fullcmd[2048];
45         char *pCmd;
46         pid_t pid;
47 #if GDEF_DEBUG
48         printf( "Q_Exec damnit\n" );
49 #endif
50         switch ( ( pid = fork() ) )
51         {
52         default:
53                 if ( waitfor ) {
54                         waitpid( pid, NULL, 0 );
55                 }
56                 break;
57         case -1:
58                 return true;
59                 break;
60         case 0:
61                 // always concat the command on linux
62                 if ( cmd ) {
63                         strcpy( fullcmd, cmd );
64                 }
65                 else{
66                         fullcmd[0] = '\0';
67                 }
68                 if ( cmdline ) {
69                         strcat( fullcmd, " " );
70                         strcat( fullcmd, cmdline );
71                 }
72                 pCmd = fullcmd;
73                 while ( *pCmd == ' ' )
74                         pCmd++;
75 #if GDEF_DEBUG
76                 printf( "Running system...\n" );
77                 printf( "Command: %s\n", pCmd );
78 #endif
79                 system( pCmd );
80 #if GDEF_DEBUG
81                 printf( "system() returned\n" );
82 #endif
83                 _exit( 0 );
84                 break;
85         }
86         return true;
87 }
88
89 #elif GDEF_OS_WINDOWS
90
91 #include <windows.h>
92
93 // NOTE TTimo windows is VERY nitpicky about the syntax in CreateProcess
94 bool Q_Exec( const char *cmd, const char *cmdline, const char *execdir, bool bCreateConsole, bool waitfor ){
95         PROCESS_INFORMATION ProcessInformation;
96         STARTUPINFO startupinfo = {0};
97         DWORD dwCreationFlags;
98         GetStartupInfo( &startupinfo );
99         if ( bCreateConsole ) {
100                 dwCreationFlags = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;
101         }
102         else{
103                 dwCreationFlags = DETACHED_PROCESS | NORMAL_PRIORITY_CLASS;
104         }
105         const char *pCmd = cmd;
106         if ( pCmd ) {
107                 while ( *pCmd == ' ' )
108                         pCmd++;
109         }
110         char *pCmdline = strdup(cmdline);
111         if ( pCmdline ) {
112                 while ( *pCmdline == ' ' )
113                         pCmdline++;
114         }
115
116         if ( CreateProcess(
117                          pCmd,
118                          pCmdline,
119                          NULL,
120                          NULL,
121                          FALSE,
122                          dwCreationFlags,
123                          NULL,
124                          execdir,
125                          &startupinfo,
126                          &ProcessInformation
127                          ) ) {
128                 if ( waitfor ) {
129                         WaitForSingleObject( ProcessInformation.hProcess, INFINITE );
130                 }
131                 free(pCmdline);
132                 return true;
133         }
134         free(pCmdline);
135         return false;
136 }
137
138 #endif