xref: /aosp_15_r20/external/oj-libjdwp/src/solaris/back/exec_md.c (revision e82f7db8c62aed3c168547abe4f9f4aeceaebfc7)
1*e82f7db8SAndroid Build Coastguard Worker /*
2*e82f7db8SAndroid Build Coastguard Worker  * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
3*e82f7db8SAndroid Build Coastguard Worker  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*e82f7db8SAndroid Build Coastguard Worker  *
5*e82f7db8SAndroid Build Coastguard Worker  * This code is free software; you can redistribute it and/or modify it
6*e82f7db8SAndroid Build Coastguard Worker  * under the terms of the GNU General Public License version 2 only, as
7*e82f7db8SAndroid Build Coastguard Worker  * published by the Free Software Foundation.  Oracle designates this
8*e82f7db8SAndroid Build Coastguard Worker  * particular file as subject to the "Classpath" exception as provided
9*e82f7db8SAndroid Build Coastguard Worker  * by Oracle in the LICENSE file that accompanied this code.
10*e82f7db8SAndroid Build Coastguard Worker  *
11*e82f7db8SAndroid Build Coastguard Worker  * This code is distributed in the hope that it will be useful, but WITHOUT
12*e82f7db8SAndroid Build Coastguard Worker  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e82f7db8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*e82f7db8SAndroid Build Coastguard Worker  * version 2 for more details (a copy is included in the LICENSE file that
15*e82f7db8SAndroid Build Coastguard Worker  * accompanied this code).
16*e82f7db8SAndroid Build Coastguard Worker  *
17*e82f7db8SAndroid Build Coastguard Worker  * You should have received a copy of the GNU General Public License version
18*e82f7db8SAndroid Build Coastguard Worker  * 2 along with this work; if not, write to the Free Software Foundation,
19*e82f7db8SAndroid Build Coastguard Worker  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20*e82f7db8SAndroid Build Coastguard Worker  *
21*e82f7db8SAndroid Build Coastguard Worker  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22*e82f7db8SAndroid Build Coastguard Worker  * or visit www.oracle.com if you need additional information or have any
23*e82f7db8SAndroid Build Coastguard Worker  * questions.
24*e82f7db8SAndroid Build Coastguard Worker  */
25*e82f7db8SAndroid Build Coastguard Worker 
26*e82f7db8SAndroid Build Coastguard Worker #include <stdlib.h>
27*e82f7db8SAndroid Build Coastguard Worker #include <unistd.h>
28*e82f7db8SAndroid Build Coastguard Worker #include <string.h>
29*e82f7db8SAndroid Build Coastguard Worker #include <ctype.h>
30*e82f7db8SAndroid Build Coastguard Worker #include "sys.h"
31*e82f7db8SAndroid Build Coastguard Worker #include "util.h"
32*e82f7db8SAndroid Build Coastguard Worker 
33*e82f7db8SAndroid Build Coastguard Worker #if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX)
34*e82f7db8SAndroid Build Coastguard Worker   /* Linux, BSD, AIX */
35*e82f7db8SAndroid Build Coastguard Worker   #define FORK() fork()
36*e82f7db8SAndroid Build Coastguard Worker #else
37*e82f7db8SAndroid Build Coastguard Worker   /* Solaris (make sure we always get the POSIX-specified behavior) */
38*e82f7db8SAndroid Build Coastguard Worker   #define FORK() fork1()
39*e82f7db8SAndroid Build Coastguard Worker #endif
40*e82f7db8SAndroid Build Coastguard Worker 
skipWhitespace(char * p)41*e82f7db8SAndroid Build Coastguard Worker static char *skipWhitespace(char *p) {
42*e82f7db8SAndroid Build Coastguard Worker     while ((*p != '\0') && isspace(*p)) {
43*e82f7db8SAndroid Build Coastguard Worker         p++;
44*e82f7db8SAndroid Build Coastguard Worker     }
45*e82f7db8SAndroid Build Coastguard Worker     return p;
46*e82f7db8SAndroid Build Coastguard Worker }
47*e82f7db8SAndroid Build Coastguard Worker 
skipNonWhitespace(char * p)48*e82f7db8SAndroid Build Coastguard Worker static char *skipNonWhitespace(char *p) {
49*e82f7db8SAndroid Build Coastguard Worker     while ((*p != '\0') && !isspace(*p)) {
50*e82f7db8SAndroid Build Coastguard Worker         p++;
51*e82f7db8SAndroid Build Coastguard Worker     }
52*e82f7db8SAndroid Build Coastguard Worker     return p;
53*e82f7db8SAndroid Build Coastguard Worker }
54*e82f7db8SAndroid Build Coastguard Worker 
55*e82f7db8SAndroid Build Coastguard Worker int
dbgsysExec(char * cmdLine)56*e82f7db8SAndroid Build Coastguard Worker dbgsysExec(char *cmdLine)
57*e82f7db8SAndroid Build Coastguard Worker {
58*e82f7db8SAndroid Build Coastguard Worker     int i;
59*e82f7db8SAndroid Build Coastguard Worker     int argc;
60*e82f7db8SAndroid Build Coastguard Worker     pid_t pid_err = (pid_t)(-1); /* this is the error return value */
61*e82f7db8SAndroid Build Coastguard Worker     pid_t pid;
62*e82f7db8SAndroid Build Coastguard Worker     char **argv = NULL;
63*e82f7db8SAndroid Build Coastguard Worker     char *p;
64*e82f7db8SAndroid Build Coastguard Worker     char *args;
65*e82f7db8SAndroid Build Coastguard Worker 
66*e82f7db8SAndroid Build Coastguard Worker     /* Skip leading whitespace */
67*e82f7db8SAndroid Build Coastguard Worker     cmdLine = skipWhitespace(cmdLine);
68*e82f7db8SAndroid Build Coastguard Worker 
69*e82f7db8SAndroid Build Coastguard Worker     /*LINTED*/
70*e82f7db8SAndroid Build Coastguard Worker     args = jvmtiAllocate((jint)strlen(cmdLine)+1);
71*e82f7db8SAndroid Build Coastguard Worker     if (args == NULL) {
72*e82f7db8SAndroid Build Coastguard Worker         return SYS_NOMEM;
73*e82f7db8SAndroid Build Coastguard Worker     }
74*e82f7db8SAndroid Build Coastguard Worker     (void)strcpy(args, cmdLine);
75*e82f7db8SAndroid Build Coastguard Worker 
76*e82f7db8SAndroid Build Coastguard Worker     p = args;
77*e82f7db8SAndroid Build Coastguard Worker 
78*e82f7db8SAndroid Build Coastguard Worker     argc = 0;
79*e82f7db8SAndroid Build Coastguard Worker     while (*p != '\0') {
80*e82f7db8SAndroid Build Coastguard Worker         p = skipNonWhitespace(p);
81*e82f7db8SAndroid Build Coastguard Worker         argc++;
82*e82f7db8SAndroid Build Coastguard Worker         if (*p == '\0') {
83*e82f7db8SAndroid Build Coastguard Worker             break;
84*e82f7db8SAndroid Build Coastguard Worker         }
85*e82f7db8SAndroid Build Coastguard Worker         p = skipWhitespace(p);
86*e82f7db8SAndroid Build Coastguard Worker     }
87*e82f7db8SAndroid Build Coastguard Worker 
88*e82f7db8SAndroid Build Coastguard Worker     /*LINTED*/
89*e82f7db8SAndroid Build Coastguard Worker     argv = jvmtiAllocate((argc + 1) * (jint)sizeof(char *));
90*e82f7db8SAndroid Build Coastguard Worker     if (argv == 0) {
91*e82f7db8SAndroid Build Coastguard Worker         jvmtiDeallocate(args);
92*e82f7db8SAndroid Build Coastguard Worker         return SYS_NOMEM;
93*e82f7db8SAndroid Build Coastguard Worker     }
94*e82f7db8SAndroid Build Coastguard Worker 
95*e82f7db8SAndroid Build Coastguard Worker     for (i = 0, p = args; i < argc; i++) {
96*e82f7db8SAndroid Build Coastguard Worker         argv[i] = p;
97*e82f7db8SAndroid Build Coastguard Worker         p = skipNonWhitespace(p);
98*e82f7db8SAndroid Build Coastguard Worker         *p++ = '\0';
99*e82f7db8SAndroid Build Coastguard Worker         p = skipWhitespace(p);
100*e82f7db8SAndroid Build Coastguard Worker     }
101*e82f7db8SAndroid Build Coastguard Worker     argv[i] = NULL;  /* NULL terminate */
102*e82f7db8SAndroid Build Coastguard Worker 
103*e82f7db8SAndroid Build Coastguard Worker     if ((pid = FORK()) == 0) {
104*e82f7db8SAndroid Build Coastguard Worker         /* Child process */
105*e82f7db8SAndroid Build Coastguard Worker         int i;
106*e82f7db8SAndroid Build Coastguard Worker         long max_fd;
107*e82f7db8SAndroid Build Coastguard Worker 
108*e82f7db8SAndroid Build Coastguard Worker         /* close everything */
109*e82f7db8SAndroid Build Coastguard Worker         max_fd = sysconf(_SC_OPEN_MAX);
110*e82f7db8SAndroid Build Coastguard Worker         /*LINTED*/
111*e82f7db8SAndroid Build Coastguard Worker         for (i = 3; i < (int)max_fd; i++) {
112*e82f7db8SAndroid Build Coastguard Worker             (void)close(i);
113*e82f7db8SAndroid Build Coastguard Worker         }
114*e82f7db8SAndroid Build Coastguard Worker 
115*e82f7db8SAndroid Build Coastguard Worker         (void)execvp(argv[0], argv);
116*e82f7db8SAndroid Build Coastguard Worker 
117*e82f7db8SAndroid Build Coastguard Worker         exit(-1);
118*e82f7db8SAndroid Build Coastguard Worker     }
119*e82f7db8SAndroid Build Coastguard Worker     jvmtiDeallocate(args);
120*e82f7db8SAndroid Build Coastguard Worker     jvmtiDeallocate(argv);
121*e82f7db8SAndroid Build Coastguard Worker     if (pid == pid_err) {
122*e82f7db8SAndroid Build Coastguard Worker         return SYS_ERR;
123*e82f7db8SAndroid Build Coastguard Worker     } else {
124*e82f7db8SAndroid Build Coastguard Worker         return SYS_OK;
125*e82f7db8SAndroid Build Coastguard Worker     }
126*e82f7db8SAndroid Build Coastguard Worker }
127