summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Salinas2013-01-15 10:26:51 (EST)
committerVivian Kong2013-01-15 10:26:51 (EST)
commit6180c7337f6a196afa0d1b782648d766d3338fe0 (patch)
tree9129aebaae45ccd98829aba5b39573a0a584fd88
parent0ffbc60710bfe86644bcbba8a8a824ac83db3341 (diff)
downloadorg.eclipse.cdt-6180c7337f6a196afa0d1b782648d766d3338fe0.zip
org.eclipse.cdt-6180c7337f6a196afa0d1b782648d766d3338fe0.tar.gz
org.eclipse.cdt-6180c7337f6a196afa0d1b782648d766d3338fe0.tar.bz2
Bug 393455 - Terminal sessions broken on AIX
-rw-r--r--core/org.eclipse.cdt.core.aix/META-INF/MANIFEST.MF2
-rw-r--r--core/org.eclipse.cdt.core.aix/library/PTY.h13
-rw-r--r--core/org.eclipse.cdt.core.aix/library/Spawner.h2
-rw-r--r--core/org.eclipse.cdt.core.aix/library/exec0.h13
-rw-r--r--core/org.eclipse.cdt.core.aix/library/exec_pty.c51
-rw-r--r--core/org.eclipse.cdt.core.aix/library/exec_unix.c21
-rw-r--r--core/org.eclipse.cdt.core.aix/library/openpty.c2
-rw-r--r--core/org.eclipse.cdt.core.aix/library/openpty.h7
-rw-r--r--core/org.eclipse.cdt.core.aix/library/pfind.c26
-rw-r--r--core/org.eclipse.cdt.core.aix/library/pty.c32
-rw-r--r--core/org.eclipse.cdt.core.aix/library/spawner.c19
-rw-r--r--core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.sobin11283 -> 12345 bytes
-rw-r--r--core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.sobin27910 -> 31528 bytes
-rw-r--r--core/org.eclipse.cdt.core.aix/pom.xml2
14 files changed, 140 insertions, 50 deletions
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 1ee36ed..77d526e 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.2.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 46a8dd9..f717942 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 272366b..e2fea94 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 f0e88f3..630e741 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 <unistd.h>
@@ -16,7 +17,13 @@
#include <errno.h>
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 9eb60cf..2c3a03e 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 <termios.h>
/* 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 a839964..8c71787 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 <stdlib.h>
/* 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 954b2b6..2207e68 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 d07317e..21c98ac 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 ba64f8d..b97942e 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<argc; i++) {
- fullpath = pfind(argv[i]);
+ fullpath = pfind(argv[i], NULL);
if (fullpath == NULL)
printf("Unable to find %s in $PATH.\n", argv[i]);
else
diff --git a/core/org.eclipse.cdt.core.aix/library/pty.c b/core/org.eclipse.cdt.core.aix/library/pty.c
index 0b924e9..5de705d 100644
--- a/core/org.eclipse.cdt.core.aix/library/pty.c
+++ b/core/org.eclipse.cdt.core.aix/library/pty.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,8 +8,9 @@
* Contributors:
* IBM Corporation - initial API and implementation
* QNX Software Systems
+ * IBM Corporation - port of 248071
*******************************************************************************/
-
+#include <sys/ioctl.h>
#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 b8707ca..710ae08 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 <unistd.h>
@@ -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 d5aed70..8caa860 100644
--- a/core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.so
+++ b/core/org.eclipse.cdt.core.aix/os/aix/ppc/libpty.so
Binary files 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 26dccd7..386d68c 100644
--- a/core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.so
+++ b/core/org.eclipse.cdt.core.aix/os/aix/ppc/libspawner.so
Binary files differ
diff --git a/core/org.eclipse.cdt.core.aix/pom.xml b/core/org.eclipse.cdt.core.aix/pom.xml
index 9fa6ba6..a4671b8 100644
--- a/core/org.eclipse.cdt.core.aix/pom.xml
+++ b/core/org.eclipse.cdt.core.aix/pom.xml
@@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath>
</parent>
- <version>5.1.1-SNAPSHOT</version>
+ <version>5.2.0-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.aix</artifactId>
<packaging>eclipse-plugin</packaging>