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