xref: /aosp_15_r20/external/mesa3d/src/util/u_process.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2003 Felix Kuehling
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2018 Advanced Micro Devices, Inc.
4*61046927SAndroid Build Coastguard Worker  * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining
7*61046927SAndroid Build Coastguard Worker  * a copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker  * the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15*61046927SAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16*61046927SAndroid Build Coastguard Worker  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17*61046927SAndroid Build Coastguard Worker  * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
18*61046927SAndroid Build Coastguard Worker  * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21*61046927SAndroid Build Coastguard Worker  * USE OR OTHER DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
24*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
25*61046927SAndroid Build Coastguard Worker  * of the Software.
26*61046927SAndroid Build Coastguard Worker  */
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include "util/os_misc.h"
29*61046927SAndroid Build Coastguard Worker #include "u_process.h"
30*61046927SAndroid Build Coastguard Worker #include "detect_os.h"
31*61046927SAndroid Build Coastguard Worker #include "macros.h"
32*61046927SAndroid Build Coastguard Worker #include <string.h>
33*61046927SAndroid Build Coastguard Worker #include <errno.h>
34*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker #if DETECT_OS_WINDOWS
37*61046927SAndroid Build Coastguard Worker #include <windows.h>
38*61046927SAndroid Build Coastguard Worker #else
39*61046927SAndroid Build Coastguard Worker #include <unistd.h>
40*61046927SAndroid Build Coastguard Worker #endif
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #if DETECT_OS_APPLE
43*61046927SAndroid Build Coastguard Worker #include <mach-o/dyld.h>
44*61046927SAndroid Build Coastguard Worker #endif
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker #if DETECT_OS_BSD
47*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
48*61046927SAndroid Build Coastguard Worker #include <sys/sysctl.h>
49*61046927SAndroid Build Coastguard Worker #endif
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker #if DETECT_OS_LINUX
52*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
53*61046927SAndroid Build Coastguard Worker #endif
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker #include "util/u_call_once.h"
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker #undef GET_PROGRAM_NAME_NOT_AVAILABLE
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker #if defined(__linux__) && defined(HAVE_PROGRAM_INVOCATION_NAME)
60*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()61*61046927SAndroid Build Coastguard Worker __getProgramName()
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker    char * arg = strrchr(program_invocation_name, '/');
64*61046927SAndroid Build Coastguard Worker    if (arg) {
65*61046927SAndroid Build Coastguard Worker       char *program_name = NULL;
66*61046927SAndroid Build Coastguard Worker       /* If the / character was found this is likely a linux path or
67*61046927SAndroid Build Coastguard Worker        * an invocation path for a 64-bit wine program.
68*61046927SAndroid Build Coastguard Worker        *
69*61046927SAndroid Build Coastguard Worker        * However, some programs pass command line arguments into argv[0].
70*61046927SAndroid Build Coastguard Worker        * Strip these arguments out by using the realpath only if it was
71*61046927SAndroid Build Coastguard Worker        * a prefix of the invocation name.
72*61046927SAndroid Build Coastguard Worker        */
73*61046927SAndroid Build Coastguard Worker       char *path = realpath("/proc/self/exe", NULL);
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker       if (path && strncmp(path, program_invocation_name, strlen(path)) == 0) {
76*61046927SAndroid Build Coastguard Worker          /* This shouldn't be null because path is a a prefix,
77*61046927SAndroid Build Coastguard Worker           * but check it anyway since path is static. */
78*61046927SAndroid Build Coastguard Worker          char * name = strrchr(path, '/');
79*61046927SAndroid Build Coastguard Worker          if (name)
80*61046927SAndroid Build Coastguard Worker             program_name = strdup(name + 1);
81*61046927SAndroid Build Coastguard Worker       }
82*61046927SAndroid Build Coastguard Worker       if (path) {
83*61046927SAndroid Build Coastguard Worker          free(path);
84*61046927SAndroid Build Coastguard Worker       }
85*61046927SAndroid Build Coastguard Worker       if (!program_name) {
86*61046927SAndroid Build Coastguard Worker          program_name = strdup(arg+1);
87*61046927SAndroid Build Coastguard Worker       }
88*61046927SAndroid Build Coastguard Worker       return program_name;
89*61046927SAndroid Build Coastguard Worker    }
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker    /* If there was no '/' at all we likely have a windows like path from
92*61046927SAndroid Build Coastguard Worker     * a wine application.
93*61046927SAndroid Build Coastguard Worker     */
94*61046927SAndroid Build Coastguard Worker    arg = strrchr(program_invocation_name, '\\');
95*61046927SAndroid Build Coastguard Worker    if (arg)
96*61046927SAndroid Build Coastguard Worker       return strdup(arg+1);
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    return strdup(program_invocation_name);
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker #elif defined(HAVE_PROGRAM_INVOCATION_NAME)
101*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()102*61046927SAndroid Build Coastguard Worker __getProgramName()
103*61046927SAndroid Build Coastguard Worker {
104*61046927SAndroid Build Coastguard Worker    return strdup(program_invocation_short_name);
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker #elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) || DETECT_OS_ANDROID || defined(__NetBSD__)
107*61046927SAndroid Build Coastguard Worker #if defined(__NetBSD__)
108*61046927SAndroid Build Coastguard Worker #    include <sys/param.h>
109*61046927SAndroid Build Coastguard Worker #endif
110*61046927SAndroid Build Coastguard Worker #if defined(__NetBSD_Version__) && (__NetBSD_Version__ < 106000100)
111*61046927SAndroid Build Coastguard Worker #define GET_PROGRAM_NAME_NOT_AVAILABLE
112*61046927SAndroid Build Coastguard Worker #else /* !(defined(__NetBSD_Version__) && (__NetBSD_Version__ < 106000100)) */
113*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()114*61046927SAndroid Build Coastguard Worker __getProgramName()
115*61046927SAndroid Build Coastguard Worker {
116*61046927SAndroid Build Coastguard Worker    const char *program_name = getprogname();
117*61046927SAndroid Build Coastguard Worker    if (program_name) {
118*61046927SAndroid Build Coastguard Worker       return strdup(program_name);
119*61046927SAndroid Build Coastguard Worker    }
120*61046927SAndroid Build Coastguard Worker    return NULL;
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker #endif /* defined(__NetBSD_Version__) && (__NetBSD_Version__ < 106000100) */
123*61046927SAndroid Build Coastguard Worker #elif defined(__sun)
124*61046927SAndroid Build Coastguard Worker /* Solaris has getexecname() which returns the full path - return just
125*61046927SAndroid Build Coastguard Worker    the basename to match BSD getprogname() */
126*61046927SAndroid Build Coastguard Worker #    include <libgen.h>
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()129*61046927SAndroid Build Coastguard Worker __getProgramName()
130*61046927SAndroid Build Coastguard Worker {
131*61046927SAndroid Build Coastguard Worker    char *progname = NULL;
132*61046927SAndroid Build Coastguard Worker    const char *e = getexecname();
133*61046927SAndroid Build Coastguard Worker    if (e != NULL) {
134*61046927SAndroid Build Coastguard Worker       /* Have to make a copy since getexecname can return a readonly
135*61046927SAndroid Build Coastguard Worker          string, but basename expects to be able to modify its arg. */
136*61046927SAndroid Build Coastguard Worker       char *n = strdup(e);
137*61046927SAndroid Build Coastguard Worker       if (n != NULL) {
138*61046927SAndroid Build Coastguard Worker          progname = strdup(basename(n));
139*61046927SAndroid Build Coastguard Worker          free(n);
140*61046927SAndroid Build Coastguard Worker       }
141*61046927SAndroid Build Coastguard Worker    }
142*61046927SAndroid Build Coastguard Worker    return progname;
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_WINDOWS
145*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()146*61046927SAndroid Build Coastguard Worker __getProgramName()
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker    char *progname;
149*61046927SAndroid Build Coastguard Worker    static char buf[MAX_PATH];
150*61046927SAndroid Build Coastguard Worker    GetModuleFileNameA(NULL, buf, sizeof(buf));
151*61046927SAndroid Build Coastguard Worker    progname = strrchr(buf, '\\');
152*61046927SAndroid Build Coastguard Worker    if (progname)
153*61046927SAndroid Build Coastguard Worker       progname++;
154*61046927SAndroid Build Coastguard Worker    else
155*61046927SAndroid Build Coastguard Worker       progname = buf;
156*61046927SAndroid Build Coastguard Worker    return strdup(progname);
157*61046927SAndroid Build Coastguard Worker }
158*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_HAIKU
159*61046927SAndroid Build Coastguard Worker #  include <kernel/OS.h>
160*61046927SAndroid Build Coastguard Worker #  include <kernel/image.h>
161*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()162*61046927SAndroid Build Coastguard Worker __getProgramName()
163*61046927SAndroid Build Coastguard Worker {
164*61046927SAndroid Build Coastguard Worker    image_info info;
165*61046927SAndroid Build Coastguard Worker    get_image_info(B_CURRENT_TEAM, &info);
166*61046927SAndroid Build Coastguard Worker    return strdup(info.name);
167*61046927SAndroid Build Coastguard Worker }
168*61046927SAndroid Build Coastguard Worker #else
169*61046927SAndroid Build Coastguard Worker #define GET_PROGRAM_NAME_NOT_AVAILABLE
170*61046927SAndroid Build Coastguard Worker #endif
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker #if defined(GET_PROGRAM_NAME_NOT_AVAILABLE)
173*61046927SAndroid Build Coastguard Worker #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__UCLIBC__) || DETECT_OS_ANDROID
174*61046927SAndroid Build Coastguard Worker /* This is a hack. It's said to work on OpenBSD, NetBSD and GNU.
175*61046927SAndroid Build Coastguard Worker  * Rogelio M.Serrano Jr. reported it's also working with UCLIBC. It's
176*61046927SAndroid Build Coastguard Worker  * used as a last resort, if there is no documented facility available. */
177*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()178*61046927SAndroid Build Coastguard Worker __getProgramName()
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker     extern const char *__progname;
181*61046927SAndroid Build Coastguard Worker     char * arg = strrchr(__progname, '/');
182*61046927SAndroid Build Coastguard Worker     if (arg)
183*61046927SAndroid Build Coastguard Worker         return strdup(arg+1);
184*61046927SAndroid Build Coastguard Worker     else
185*61046927SAndroid Build Coastguard Worker         return strdup(__progname);
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker #else
188*61046927SAndroid Build Coastguard Worker #pragma message ( "Warning: Per application configuration won't work with your OS version." )
189*61046927SAndroid Build Coastguard Worker static char *
__getProgramName()190*61046927SAndroid Build Coastguard Worker __getProgramName()
191*61046927SAndroid Build Coastguard Worker {
192*61046927SAndroid Build Coastguard Worker    return strdup("");
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker #endif
195*61046927SAndroid Build Coastguard Worker #endif /* GET_PROGRAM_NAME_NOT_AVAILABLE */
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker static char *program_name;
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker static void
free_program_name(void)200*61046927SAndroid Build Coastguard Worker free_program_name(void)
201*61046927SAndroid Build Coastguard Worker {
202*61046927SAndroid Build Coastguard Worker    free(program_name);
203*61046927SAndroid Build Coastguard Worker    program_name = NULL;
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker static void
util_get_process_name_callback(void)207*61046927SAndroid Build Coastguard Worker util_get_process_name_callback(void)
208*61046927SAndroid Build Coastguard Worker {
209*61046927SAndroid Build Coastguard Worker    const char *override_name = os_get_option("MESA_PROCESS_NAME");
210*61046927SAndroid Build Coastguard Worker    program_name = override_name ? strdup(override_name) : __getProgramName();
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker    if (program_name)
213*61046927SAndroid Build Coastguard Worker       atexit(free_program_name);
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker const char *
util_get_process_name(void)217*61046927SAndroid Build Coastguard Worker util_get_process_name(void)
218*61046927SAndroid Build Coastguard Worker {
219*61046927SAndroid Build Coastguard Worker    static util_once_flag once_state = UTIL_ONCE_FLAG_INIT;
220*61046927SAndroid Build Coastguard Worker    util_call_once(&once_state, util_get_process_name_callback);
221*61046927SAndroid Build Coastguard Worker    return program_name;
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker size_t
util_get_process_exec_path(char * process_path,size_t len)225*61046927SAndroid Build Coastguard Worker util_get_process_exec_path(char* process_path, size_t len)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker #if DETECT_OS_WINDOWS
228*61046927SAndroid Build Coastguard Worker    return GetModuleFileNameA(NULL, process_path, len);
229*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_APPLE
230*61046927SAndroid Build Coastguard Worker    uint32_t bufSize = len;
231*61046927SAndroid Build Coastguard Worker    int result = _NSGetExecutablePath(process_path, &bufSize);
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker    return (result == 0) ? strlen(process_path) : 0;
234*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_FREEBSD
235*61046927SAndroid Build Coastguard Worker    int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    (void) sysctl(mib, 4, process_path, &len, NULL, 0);
238*61046927SAndroid Build Coastguard Worker    process_path[len - 1] = '\0';
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker    return len;
241*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_POSIX
242*61046927SAndroid Build Coastguard Worker    ssize_t r;
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    if ((r = readlink("/proc/self/exe", process_path, len)) > 0)
245*61046927SAndroid Build Coastguard Worker       goto success;
246*61046927SAndroid Build Coastguard Worker    if ((r = readlink("/proc/curproc/exe", process_path, len)) > 0)
247*61046927SAndroid Build Coastguard Worker       goto success;
248*61046927SAndroid Build Coastguard Worker    if ((r = readlink("/proc/curproc/file", process_path, len)) > 0)
249*61046927SAndroid Build Coastguard Worker       goto success;
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker     return 0;
252*61046927SAndroid Build Coastguard Worker success:
253*61046927SAndroid Build Coastguard Worker    if (r == len)
254*61046927SAndroid Build Coastguard Worker       return 0;
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker     process_path[r] = '\0';
257*61046927SAndroid Build Coastguard Worker     return r;
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker #endif
260*61046927SAndroid Build Coastguard Worker    return 0;
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker bool
util_get_command_line(char * cmdline,size_t size)264*61046927SAndroid Build Coastguard Worker util_get_command_line(char *cmdline, size_t size)
265*61046927SAndroid Build Coastguard Worker {
266*61046927SAndroid Build Coastguard Worker #if DETECT_OS_WINDOWS
267*61046927SAndroid Build Coastguard Worker    const char *args = GetCommandLineA();
268*61046927SAndroid Build Coastguard Worker    if (args) {
269*61046927SAndroid Build Coastguard Worker       strncpy(cmdline, args, size);
270*61046927SAndroid Build Coastguard Worker       // make sure we terminate the string
271*61046927SAndroid Build Coastguard Worker       cmdline[size - 1] = 0;
272*61046927SAndroid Build Coastguard Worker       return true;
273*61046927SAndroid Build Coastguard Worker    }
274*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_LINUX
275*61046927SAndroid Build Coastguard Worker    int f = open("/proc/self/cmdline", O_RDONLY);
276*61046927SAndroid Build Coastguard Worker    if (f != -1) {
277*61046927SAndroid Build Coastguard Worker       const int n = read(f, cmdline, size - 1);
278*61046927SAndroid Build Coastguard Worker       int i;
279*61046927SAndroid Build Coastguard Worker       assert(n < size);
280*61046927SAndroid Build Coastguard Worker       // The arguments are separated by '\0' chars.  Convert them to spaces.
281*61046927SAndroid Build Coastguard Worker       for (i = 0; i < n; i++) {
282*61046927SAndroid Build Coastguard Worker          if (cmdline[i] == 0) {
283*61046927SAndroid Build Coastguard Worker             cmdline[i] = ' ';
284*61046927SAndroid Build Coastguard Worker          }
285*61046927SAndroid Build Coastguard Worker       }
286*61046927SAndroid Build Coastguard Worker       // terminate the string
287*61046927SAndroid Build Coastguard Worker       cmdline[n] = 0;
288*61046927SAndroid Build Coastguard Worker       close(f);
289*61046927SAndroid Build Coastguard Worker       return true;
290*61046927SAndroid Build Coastguard Worker    }
291*61046927SAndroid Build Coastguard Worker #elif DETECT_OS_BSD
292*61046927SAndroid Build Coastguard Worker    int mib[] = {
293*61046927SAndroid Build Coastguard Worker       CTL_KERN,
294*61046927SAndroid Build Coastguard Worker #if DETECT_OS_NETBSD || DETECT_OS_OPENBSD
295*61046927SAndroid Build Coastguard Worker       KERN_PROC_ARGS,
296*61046927SAndroid Build Coastguard Worker       getpid(),
297*61046927SAndroid Build Coastguard Worker       KERN_PROC_ARGV,
298*61046927SAndroid Build Coastguard Worker #else
299*61046927SAndroid Build Coastguard Worker       KERN_PROC,
300*61046927SAndroid Build Coastguard Worker       KERN_PROC_ARGS,
301*61046927SAndroid Build Coastguard Worker       getpid(),
302*61046927SAndroid Build Coastguard Worker #endif
303*61046927SAndroid Build Coastguard Worker    };
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    /* Like /proc/pid/cmdline each argument is separated by NUL byte */
306*61046927SAndroid Build Coastguard Worker    if (sysctl(mib, ARRAY_SIZE(mib), cmdline, &size, NULL, 0) == -1) {
307*61046927SAndroid Build Coastguard Worker       return false;
308*61046927SAndroid Build Coastguard Worker    }
309*61046927SAndroid Build Coastguard Worker 
310*61046927SAndroid Build Coastguard Worker    /* Replace NUL with space except terminating NUL */
311*61046927SAndroid Build Coastguard Worker    for (size_t i = 0; i < (size - 1); i++) {
312*61046927SAndroid Build Coastguard Worker       if (cmdline[i] == '\0')
313*61046927SAndroid Build Coastguard Worker          cmdline[i] = ' ';
314*61046927SAndroid Build Coastguard Worker    }
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    return true;
317*61046927SAndroid Build Coastguard Worker #endif
318*61046927SAndroid Build Coastguard Worker 
319*61046927SAndroid Build Coastguard Worker    /* XXX to-do: implement this function for other operating systems */
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker    cmdline[0] = 0;
322*61046927SAndroid Build Coastguard Worker    return false;
323*61046927SAndroid Build Coastguard Worker }
324