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