diff --git a/core/org.eclipse.cdt.core.aix/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core.aix/META-INF/MANIFEST.MF index 1ee36ed73f0..3faa5d1c085 100644 --- a/core/org.eclipse.cdt.core.aix/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core.aix/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %fragmentName.aix Bundle-SymbolicName: org.eclipse.cdt.core.aix; singleton:=true -Bundle-Version: 5.1.1.qualifier +Bundle-Version: 5.3.0.qualifier Bundle-Vendor: %providerName Fragment-Host: org.eclipse.cdt.core;bundle-version="[5.0.0,6.0.0)" Bundle-Localization: plugin diff --git a/core/org.eclipse.cdt.core.aix/library/PTY.h b/core/org.eclipse.cdt.core.aix/library/PTY.h index 46a8dd9b622..f717942a01d 100644 --- a/core/org.eclipse.cdt.core.aix/library/PTY.h +++ b/core/org.eclipse.cdt.core.aix/library/PTY.h @@ -7,14 +7,21 @@ #ifdef __cplusplus extern "C" { #endif -/* Inaccessible static: hasPTY */ /* * Class: org_eclipse_cdt_utils_pty_PTY * Method: openMaster - * Signature: ()Ljava/lang/String; + * Signature: (Z)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster - (JNIEnv *, jobject); + (JNIEnv *, jobject, jboolean); + +/* + * Class: org_eclipse_cdt_utils_pty_PTY + * Method: change_window_size + * Signature: (III)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size + (JNIEnv *, jobject, jint, jint, jint); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.aix/library/Spawner.h b/core/org.eclipse.cdt.core.aix/library/Spawner.h index 272366bad75..e2fea946912 100644 --- a/core/org.eclipse.cdt.core.aix/library/Spawner.h +++ b/core/org.eclipse.cdt.core.aix/library/Spawner.h @@ -29,7 +29,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILjava/lang/String;I)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray, jstring, jint); + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray, jstring, jint, jboolean); /* * Class: org_eclipse_cdt_utils_spawner_Spawner diff --git a/core/org.eclipse.cdt.core.aix/library/exec0.h b/core/org.eclipse.cdt.core.aix/library/exec0.h index f0e88f36efe..630e741a582 100644 --- a/core/org.eclipse.cdt.core.aix/library/exec0.h +++ b/core/org.eclipse.cdt.core.aix/library/exec0.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2008 IBM Corporation and others. + * Copyright (c) 2003, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * IBM Corporation - port of 248071 *******************************************************************************/ #include @@ -16,7 +17,13 @@ #include extern pid_t exec0(const char *path, char *const argv[], - char *const envp[], const char *dirpath, - int channels[3] ); + char *const envp[], const char *dirpath, + int channels[3]); + + +extern pid_t exec_pty(const char *path, char *const argv[], + char *const envp[], const char *dirpath, + int channels[3], const char *pts_name, int fdm, + int console); extern int wait0(pid_t pid); diff --git a/core/org.eclipse.cdt.core.aix/library/exec_pty.c b/core/org.eclipse.cdt.core.aix/library/exec_pty.c index 9eb60cf17e1..2c3a03ee0d4 100644 --- a/core/org.eclipse.cdt.core.aix/library/exec_pty.c +++ b/core/org.eclipse.cdt.core.aix/library/exec_pty.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004 QNX Software Systems and others. + * Copyright (c) 2004, 2013 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * QNX Software Systems - initial API and implementation + * IBM Corporation - port of 248071 *******************************************************************************/ #include "exec0.h" @@ -20,11 +21,11 @@ #include /* from pfind.c */ -extern char *pfind(const char *name); +extern char *pfind(const char *name, char * const envp[]); pid_t exec_pty(const char *path, char *const argv[], char *const envp[], - const char *dirpath, int channels[3], const char *pts_name, int fdm) + const char *dirpath, int channels[3], const char *pts_name, int fdm, int console) { int pipe2[2]; pid_t childpid; @@ -34,7 +35,7 @@ exec_pty(const char *path, char *const argv[], char *const envp[], * We use pfind() to check that the program exists and is an executable. * If not pass the error up. Also execve() wants a full path. */ - full_path = pfind(path); + full_path = pfind(path, envp); if (full_path == NULL) { fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); return -1; @@ -43,7 +44,7 @@ exec_pty(const char *path, char *const argv[], char *const envp[], /* * Make sure we can create our pipes before forking. */ - if (channels != NULL) { + if (channels != NULL && console) { if (pipe(pipe2) < 0) { fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); free(full_path); @@ -64,6 +65,11 @@ exec_pty(const char *path, char *const argv[], char *const envp[], if (channels != NULL) { int fds; + if (!console && setsid() < 0) { + perror("setsid()"); + return -1; + } + fds = ptys_open(fdm, pts_name); if (fds < 0) { fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); @@ -71,17 +77,28 @@ exec_pty(const char *path, char *const argv[], char *const envp[], } /* Close the read end of pipe2 */ - if (close(pipe2[0]) == -1) + if (console && close(pipe2[0]) == -1) perror("close(pipe2[0]))"); /* close the master, no need in the child */ close(fdm); - set_noecho(fds); + if (console) { + set_noecho(fds); + if (setpgid(getpid(), getpid()) < 0) { + perror("setpgid()"); + return -1; + } + } + /* redirections */ dup2(fds, STDIN_FILENO); /* dup stdin */ dup2(fds, STDOUT_FILENO); /* dup stdout */ - dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + if (console) { + dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + } else { + dup2(fds, STDERR_FILENO); /* dup stderr */ + } close(fds); /* done with fds. */ } @@ -104,16 +121,20 @@ exec_pty(const char *path, char *const argv[], char *const envp[], } else if (childpid != 0) { /* parent */ - set_noecho(fdm); + if (console) { + set_noecho(fdm); + } if (channels != NULL) { - /* close the write end of pipe1 */ - if (close(pipe2[1]) == -1) - perror("close(pipe2[1])"); - channels[0] = fdm; /* Input Stream. */ channels[1] = fdm; /* Output Stream. */ - channels[2] = pipe2[0]; /* stderr Stream. */ - /*channels[2] = fdm; Input Stream. */ + if (console) { + /* close the write end of pipe1 */ + if (close(pipe2[1]) == -1) + perror("close(pipe2[1])"); + channels[2] = pipe2[0]; /* stderr Stream. */ + } else { + channels[2] = fdm; /* Error Stream. */ + } } free(full_path); diff --git a/core/org.eclipse.cdt.core.aix/library/exec_unix.c b/core/org.eclipse.cdt.core.aix/library/exec_unix.c index a8399643a39..8c71787b618 100644 --- a/core/org.eclipse.cdt.core.aix/library/exec_unix.c +++ b/core/org.eclipse.cdt.core.aix/library/exec_unix.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2008 IBM Corporation and others. + * Copyright (c) 2003, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * IBM Corporation - port of 248071 *******************************************************************************/ #include "exec0.h" @@ -19,7 +20,7 @@ #include /* from pfind.c */ -extern char *pfind(const char *name); +extern char *pfind(const char *name, char * const envp[]); pid_t exec0(const char *path, char *const argv[], char *const envp[], @@ -33,7 +34,7 @@ exec0(const char *path, char *const argv[], char *const envp[], * We use pfind() to check that the program exists and is an executable. * If not pass the error up. Also execve() wants a full path. */ - full_path = pfind(path); + full_path = pfind(path, envp); if (full_path == NULL) { fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); return -1; @@ -91,6 +92,8 @@ exec0(const char *path, char *const argv[], char *const envp[], close(fd++); } + setpgid(getpid(), getpid()); + if (envp[0] == NULL) { execv(full_path, argv); } else { @@ -135,9 +138,19 @@ int wait0(pid_t pid) int status; int val = -1; - if (pid < 0 || waitpid(pid, &status, 0) < 0) + if (pid < 0) return -1; + for (;;) { + if (waitpid(pid, &status, 0) < 0) { + if (errno == EINTR) { + // interrupted system call - retry + continue; + } + } + break; + } + if (WIFEXITED(status)) { val = WEXITSTATUS(status); } diff --git a/core/org.eclipse.cdt.core.aix/library/openpty.c b/core/org.eclipse.cdt.core.aix/library/openpty.c index 954b2b6b852..2207e682532 100644 --- a/core/org.eclipse.cdt.core.aix/library/openpty.c +++ b/core/org.eclipse.cdt.core.aix/library/openpty.c @@ -30,7 +30,7 @@ */ int ptym_open (char *pts_name); -int ptys_open (int fdm, char * pts_name); +int ptys_open (int fdm, const char * pts_name); void set_noecho(int fd); int diff --git a/core/org.eclipse.cdt.core.aix/library/openpty.h b/core/org.eclipse.cdt.core.aix/library/openpty.h index d07317e883b..21c98ac82fd 100644 --- a/core/org.eclipse.cdt.core.aix/library/openpty.h +++ b/core/org.eclipse.cdt.core.aix/library/openpty.h @@ -1,5 +1,5 @@ -/******************************************************************************* - * Copyright (c) 2003, 2008 IBM Corporation and others. +/****************************************************************************** + * Copyright (c) 2003, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -8,11 +8,12 @@ * Contributors: * IBM Corporation - initial API and implementation * QNX Software Systems + * IBM Corporation - port of 248071 *******************************************************************************/ #ifndef _OPENPTY_H #define _OPENPTY_H int ptym_open (char *pts_name); -int ptys_open (int fdm, char * pts_name); +int ptys_open (int fdm, const char * pts_name); void set_noecho(int fd); #endif diff --git a/core/org.eclipse.cdt.core.aix/library/pfind.c b/core/org.eclipse.cdt.core.aix/library/pfind.c index ba64f8d6e7d..b97942e298d 100644 --- a/core/org.eclipse.cdt.core.aix/library/pfind.c +++ b/core/org.eclipse.cdt.core.aix/library/pfind.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2008 IBM Corporation and others. + * Copyright (c) 2003, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * IBM Corporation - port of 248071 *******************************************************************************/ /* @@ -23,8 +24,25 @@ #define PATH_MAX 1024 #endif +#define PATH_DEF "PATH=" +const int path_def_len = 5; /* strlen(PATH_DEF); */ +char * path_val(char * const envp[]) +{ + int i; + if (envp == NULL || envp[0] == NULL) + return getenv("PATH" ); + + for(i = 0; envp[i] != NULL; i++){ + char* p = envp[i]; + if(!strncmp(PATH_DEF, p, path_def_len)){ + return p + path_def_len; + } + } + + return NULL; +} -char * pfind(const char *name) +char * pfind(const char *name, char * const envp[]) { char *tok; char *sp; @@ -46,7 +64,7 @@ char * pfind(const char *name) } /* Search in the PATH environment. */ - path = getenv("PATH" ); + path = path_val( envp ); if (path == NULL || strlen(path) <= 0) { fprintf(stderr, "Unable to get $PATH.\n"); @@ -79,7 +97,7 @@ int main(int argc, char **argv) char *fullpath; for (i=1; i #include "PTY.h" #include "openpty.h" @@ -19,7 +20,7 @@ * Signature: ()I */ JNIEXPORT jstring JNICALL -Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj) { +Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj, jboolean console) { jfieldID fid; /* Store the field ID */ jstring jstr = NULL; int master = -1; @@ -30,8 +31,10 @@ Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj) { master = ptym_open(line); if (master >= 0) { - /* turn off echo */ - set_noecho(master); + // turn off echo + if (console) { + set_noecho(master); + } /* Get a reference to the obj's class */ cls = (*env)->GetObjectClass(env, jobj); @@ -48,3 +51,22 @@ Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj) { } return jstr; } + +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size + (JNIEnv *env, jobject jobj, jint fdm, jint width, jint height) +{ +#ifdef TIOCGWINSZ + struct winsize win; + + win.ws_col = width; + win.ws_row = height; + win.ws_xpixel = 0; + win.ws_ypixel = 0; + + return ioctl(fdm, TIOCSWINSZ, &win); +#else + return 0; +#endif +} + + diff --git a/core/org.eclipse.cdt.core.aix/library/spawner.c b/core/org.eclipse.cdt.core.aix/library/spawner.c index b8707ca0e2b..710ae08e1de 100644 --- a/core/org.eclipse.cdt.core.aix/library/spawner.c +++ b/core/org.eclipse.cdt.core.aix/library/spawner.c @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2008 IBM Corporation and others. + * Copyright (c) 2003, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -8,6 +8,7 @@ * Contributors: * IBM Corporation - initial API and implementation * QNX Software Systems + * IBM Corporation - port of 248071 *******************************************************************************/ #include @@ -90,13 +91,13 @@ static void free_c_array(char **c_array) */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 (JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, jstring jdir, jintArray jchannels, - jstring jslaveName, jint masterFD) + jstring jslaveName, jint masterFD, jboolean console) { jint *channels = (*env)->GetIntArrayElements(env, jchannels, 0); const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); const char *pts_name = (*env)->GetStringUTFChars(env, jslaveName, NULL); - char **cmd; - char **envp; + char **cmd = NULL; + char **envp = NULL; int fd[3]; pid_t pid = -1; @@ -120,7 +121,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 fprintf(stderr, "pts_name: %s\n", pts_name); #endif - pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD); + pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD, console); if (pid < 0) goto bail_out; @@ -147,8 +148,8 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, jstring jdir) { const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); - char **cmd; - char **envp; + char **cmd = NULL; + char **envp = NULL; pid_t pid = -1; cmd = alloc_c_array(env, jcmd); @@ -194,8 +195,8 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv * env, jobject jobj, { jint *channels = (*env)->GetIntArrayElements(env, jchannels, 0); const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); - char **cmd; - char **envp; + char **cmd = NULL; + char **envp = NULL; int fd[3]; pid_t pid = -1; diff --git a/core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.so b/core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.so index d5aed7004d4..8caa860f81b 100644 Binary files a/core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.so and b/core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.so differ diff --git a/core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.so b/core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.so index 26dccd762c1..386d68ced3a 100644 Binary files a/core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.so and b/core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.so differ diff --git a/core/org.eclipse.cdt.core.aix/pom.xml b/core/org.eclipse.cdt.core.aix/pom.xml index 10b13960c8a..e2d76453c16 100644 --- a/core/org.eclipse.cdt.core.aix/pom.xml +++ b/core/org.eclipse.cdt.core.aix/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 5.1.1-SNAPSHOT + 5.3.0-SNAPSHOT org.eclipse.cdt.core.aix eclipse-plugin