From 580b6dfb456a3b3a8480c87cfe6cdea48ae0f29c Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Tue, 16 Nov 2004 20:49:27 +0000 Subject: [PATCH] 2004-11-16 Alain Magloire Fix for 27663, allow to exec with pty emulation. * library/Makefile * library/openpty.c(set_noecho): new function * library/opentpty.h: update header. * library/pty.c: refactor forkpyt to openMaster() * library/PTY.h: regenerate * library/spawner.c: add exec2() support * library/Spawner.h: regenerate * os/linux/x86/libpty.so * os/linux/x86/libspawner.so --- core/org.eclipse.cdt.core.linux/ChangeLog | 14 ++ .../library/Makefile | 2 +- core/org.eclipse.cdt.core.linux/library/PTY.h | 7 +- .../library/Spawner.h | 98 +++++------ .../library/exec_pty.c | 152 ++++++++++++++++++ .../library/openpty.c | 22 +++ .../library/openpty.h | 1 + core/org.eclipse.cdt.core.linux/library/pty.c | 5 +- .../library/spawner.c | 57 +++++++ .../os/linux/x86/libpty.so | Bin 10133 -> 9870 bytes .../os/linux/x86/libspawner.so | Bin 13801 -> 17367 bytes core/org.eclipse.cdt.core.solaris/ChangeLog | 11 ++ .../library/Makefile | 2 +- .../library/PTY.h | 7 +- .../library/Spawner.h | 98 +++++------ .../library/exec_pty.c | 152 ++++++++++++++++++ .../library/openpty.c | 19 +++ .../library/openpty.h | 1 + .../library/pty.c | 5 +- .../library/spawner.c | 60 ++++++- 20 files changed, 611 insertions(+), 102 deletions(-) create mode 100644 core/org.eclipse.cdt.core.linux/library/exec_pty.c create mode 100644 core/org.eclipse.cdt.core.solaris/library/exec_pty.c diff --git a/core/org.eclipse.cdt.core.linux/ChangeLog b/core/org.eclipse.cdt.core.linux/ChangeLog index f4fe5ee30be..e25cbe1f81b 100644 --- a/core/org.eclipse.cdt.core.linux/ChangeLog +++ b/core/org.eclipse.cdt.core.linux/ChangeLog @@ -1,3 +1,17 @@ +2004-11-16 Alain Magloire + + Fix for 27663, allow to exec with pty emulation. + * library/Makefile + * library/openpty.c(set_noecho): new function + * library/opentpty.h: update header. + * library/pty.c: refactor forkpyt to openMaster() + * library/PTY.h: regenerate + * library/spawner.c: add exec2() support + * library/Spawner.h: regenerate + + * os/linux/x86/libpty.so + * os/linux/x86/libspawner.so + 2004-07-12 Tom Tromey * library/Makefile (CFLAGS): Define _GNU_SOURCE. diff --git a/core/org.eclipse.cdt.core.linux/library/Makefile b/core/org.eclipse.cdt.core.linux/library/Makefile index a27ddf67987..02d519057b3 100644 --- a/core/org.eclipse.cdt.core.linux/library/Makefile +++ b/core/org.eclipse.cdt.core.linux/library/Makefile @@ -19,7 +19,7 @@ INSTALL_DIR = ../os/$(OS)/$(ARCH) LIB_NAME_SPAWNER = libspawner.so LIB_NAME_FULL_SPAWNER = $(INSTALL_DIR)/libspawner.so -OBJS_SPAWNER=spawner.o io.o exec_unix.o pfind.o +OBJS_SPAWNER=spawner.o io.o exec_unix.o exec_pty.o pfind.o openpty.o LIB_NAME_PTY = libpty.so LIB_NAME_FULL_PTY = $(INSTALL_DIR)/libpty.so diff --git a/core/org.eclipse.cdt.core.linux/library/PTY.h b/core/org.eclipse.cdt.core.linux/library/PTY.h index fabf58152d0..46a8dd9b622 100644 --- a/core/org.eclipse.cdt.core.linux/library/PTY.h +++ b/core/org.eclipse.cdt.core.linux/library/PTY.h @@ -7,12 +7,13 @@ #ifdef __cplusplus extern "C" { #endif +/* Inaccessible static: hasPTY */ /* * Class: org_eclipse_cdt_utils_pty_PTY - * Method: forkpty - * Signature: ()I + * Method: openMaster + * Signature: ()Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_forkpty +JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *, jobject); #ifdef __cplusplus diff --git a/core/org.eclipse.cdt.core.linux/library/Spawner.h b/core/org.eclipse.cdt.core.linux/library/Spawner.h index 01ffb3cc1b2..272366bad75 100644 --- a/core/org.eclipse.cdt.core.linux/library/Spawner.h +++ b/core/org.eclipse.cdt.core.linux/library/Spawner.h @@ -1,45 +1,53 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_qnx_tools_utils_spawner_Spawner */ - -#ifndef _Included_com_qnx_tools_utils_spawner_Spawner -#define _Included_com_qnx_tools_utils_spawner_Spawner -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray); - -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring); - -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: raise - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise - (JNIEnv *, jobject, jint, jint); - -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: waitFor - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor - (JNIEnv *, jobject, jint); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_eclipse_cdt_utils_spawner_Spawner */ + +#ifndef _Included_org_eclipse_cdt_utils_spawner_Spawner +#define _Included_org_eclipse_cdt_utils_spawner_Spawner +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec0 + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec1 + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec2 + * 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); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: raise + * Signature: (II)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise + (JNIEnv *, jobject, jint, jint); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: waitFor + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.linux/library/exec_pty.c b/core/org.eclipse.cdt.core.linux/library/exec_pty.c new file mode 100644 index 00000000000..d012cfb051c --- /dev/null +++ b/core/org.eclipse.cdt.core.linux/library/exec_pty.c @@ -0,0 +1,152 @@ +#include "exec0.h" +#include +#include +#include +#include +#include +#include +#include +#include + +/* from pfind.c */ +extern char *pfind(const char *name); + +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 pipe2[2]; + pid_t childpid; + char *full_path; + + /* + * 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); + if (full_path == NULL) { + fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); + return -1; + } + + /* + * Make sure we can create our pipes before forking. + */ + if (channels != NULL) { + if (pipe(pipe2) < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } + } + + childpid = fork(); + + if (childpid < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } else if (childpid == 0) { /* child */ + + chdir(dirpath); + + if (channels != NULL) { + int fds; + + fds = ptys_open(fdm, pts_name); + if (fds < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return -1; + } + + /* Close the read end of pipe2 */ + if (close(pipe2[0]) == -1) + perror("close(pipe2[0]))"); + + /* close the master, no need in the child */ + close(fdm); + + set_noecho(fds); + /* redirections */ + dup2(fds, STDIN_FILENO); /* dup stdin */ + dup2(fds, STDOUT_FILENO); /* dup stdout */ + dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + close(fds); /* done with fds. */ + } + + /* Close all the fd's in the child */ + { + int fdlimit = sysconf(_SC_OPEN_MAX); + int fd = 3; + + while (fd < fdlimit) + close(fd++); + } + + if (envp[0] == NULL) { + execv(full_path, argv); + } else { + execve(full_path, argv, envp); + } + + _exit(127); + + } else if (childpid != 0) { /* parent */ + + 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. */ + } + + free(full_path); + return childpid; + } + + free(full_path); + return -1; /*NOT REACHED */ +} +#ifdef __STAND_ALONE__ +int main(int argc, char **argv, char **envp) { + const char *path = "./bufferring_test"; + int channels[3] = { -1, -1, -1}; + int status; + FILE *app_stdin; + FILE *app_stdout; + FILE *app_stderr; + char pts_name[32]; + int fdm; + char buffer[32]; + + fdm = ptym_open(pts_name); + status = exec_pty(path, argv, envp, ".", channels, pts_name, fdm); + if (status >= 0) { + app_stdin = fdopen(channels[0], "w"); + app_stdout = fdopen(channels[1], "r"); + app_stderr = fdopen(channels[2], "r"); + if (app_stdout == NULL || app_stderr == NULL || app_stdin == NULL) { + fprintf(stderr, "PROBLEMS\n"); + } else { + fputs("foo\n", app_stdin); + fputs("bar\n", app_stdin); + while(fgets(buffer, sizeof buffer, app_stdout) != NULL) { + fprintf(stdout, "STDOUT: %s\n", buffer); + } + while(fgets(buffer, sizeof buffer, app_stderr) != NULL) { + fprintf(stdout, "STDERR: %s\n", buffer); + } + } + } + fputs("bye\n", stdout); + close(channels[0]); + close(channels[1]); + close(channels[2]); + return 0; +} +#endif diff --git a/core/org.eclipse.cdt.core.linux/library/openpty.c b/core/org.eclipse.cdt.core.linux/library/openpty.c index 28f5363cf1d..21c1ccfef09 100644 --- a/core/org.eclipse.cdt.core.linux/library/openpty.c +++ b/core/org.eclipse.cdt.core.linux/library/openpty.c @@ -24,6 +24,7 @@ int ptym_open (char *pts_name); int ptys_open (int fdm, char * pts_name); +void set_noecho(int fd); int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) @@ -38,6 +39,7 @@ openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct win close(*amaster); return -1; } + if (name) strcpy(name, line); #ifndef TCSAFLUSH @@ -52,6 +54,24 @@ openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct win return 0; } +void +set_noecho(int fd) +{ + struct termios stermios; + if (tcgetattr(fd, &stermios) < 0) { + return ; + } + + /* turn off echo */ + stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); + /* Turn off the NL to CR/NL mapping ou output. */ + /*stermios.c_oflag &= ~(ONLCR);*/ + + stermios.c_iflag |= (IGNCR); + + tcsetattr(fd, TCSANOW, &stermios); +} + int ptym_open(char * pts_name) { @@ -89,6 +109,7 @@ ptys_open(int fdm, char * pts_name) close(fdm); return -5; } +/* if (ioctl(fds, I_PUSH, "ptem") < 0) { printf("pterm:%s\n", strerror(errno)); close(fdm); @@ -101,5 +122,6 @@ ptys_open(int fdm, char * pts_name) close(fds); return -7; } +*/ return fds; } diff --git a/core/org.eclipse.cdt.core.linux/library/openpty.h b/core/org.eclipse.cdt.core.linux/library/openpty.h index fd7b7be1b2f..36cd52fd294 100644 --- a/core/org.eclipse.cdt.core.linux/library/openpty.h +++ b/core/org.eclipse.cdt.core.linux/library/openpty.h @@ -7,4 +7,5 @@ #define _OPENPTY_H int ptym_open (char *pts_name); int ptys_open (int fdm, char * pts_name); +void set_noecho(int fd); #endif diff --git a/core/org.eclipse.cdt.core.linux/library/pty.c b/core/org.eclipse.cdt.core.linux/library/pty.c index 4b9e682c3ee..245578632f3 100644 --- a/core/org.eclipse.cdt.core.linux/library/pty.c +++ b/core/org.eclipse.cdt.core.linux/library/pty.c @@ -7,7 +7,7 @@ * Signature: ()I */ JNIEXPORT jstring JNICALL -Java_org_eclipse_cdt_utils_pty_PTY_forkpty (JNIEnv *env, jobject jobj) { +Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj) { jfieldID fid; /* Store the field ID */ jstring jstr = NULL; int master = -1; @@ -18,6 +18,9 @@ Java_org_eclipse_cdt_utils_pty_PTY_forkpty (JNIEnv *env, jobject jobj) { master = ptym_open(line); if (master >= 0) { + // turn off echo + set_noecho(master); + /* Get a reference to the obj's class */ cls = (*env)->GetObjectClass(env, jobj); diff --git a/core/org.eclipse.cdt.core.linux/library/spawner.c b/core/org.eclipse.cdt.core.linux/library/spawner.c index 58bf85a74ed..fcb111a81f0 100644 --- a/core/org.eclipse.cdt.core.linux/library/spawner.c +++ b/core/org.eclipse.cdt.core.linux/library/spawner.c @@ -71,6 +71,63 @@ static void free_c_array(char **c_array) } +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec2 + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILorg/eclipse/cdt/utils/pty/PTY;)I + */ +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) +{ + 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; + int fd[3]; + pid_t pid = -1; + + if (channels == NULL) + goto bail_out; + + cmd = alloc_c_array(env, jcmd); + if (cmd == NULL) + goto bail_out; + + envp = alloc_c_array(env, jenv); + if (envp == NULL) + goto bail_out; + +#if DEBUGIT + fprintf(stderr, "command:"); + print_array(cmd); + fprintf(stderr, "Envp:"); + print_array(envp); + fprintf(stderr, "dirpath: %s\n", dirpath); + fprintf(stderr, "pts_name: %s\n", pts_name); +#endif + + pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD); + if (pid < 0) + goto bail_out; + + channels[0] = fd[0]; + channels[1] = fd[1]; + channels[2] = fd[2]; + + bail_out: + (*env)->ReleaseIntArrayElements(env, jchannels, channels, 0); + (*env)->ReleaseStringUTFChars(env, jdir, dirpath); + (*env)->ReleaseStringUTFChars(env, jslaveName, pts_name); + if (cmd) + free_c_array(cmd); + if (envp) + free_c_array(envp); + return pid; +} + + JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, jobjectArray jcmd, diff --git a/core/org.eclipse.cdt.core.linux/os/linux/x86/libpty.so b/core/org.eclipse.cdt.core.linux/os/linux/x86/libpty.so index 388ec4d4769dfa5d1b25ef814b96ecae00a9ab72..1dd15a52e4e108ec6eda07d90db949f7b597cb5d 100644 GIT binary patch literal 9870 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 Jy8@@dzX5WRXukje literal 10133 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 diff --git a/core/org.eclipse.cdt.core.linux/os/linux/x86/libspawner.so b/core/org.eclipse.cdt.core.linux/os/linux/x86/libspawner.so index 3755c35a56001651fb1feeafcbe90adedfc12978..63276413797bdce1930a2beb9d73e3d3edd0dc3a 100644 GIT binary patch literal 17367 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 literal 13801 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 R0eVq$^-ihWvEgE~`(Hn~Gi(3= diff --git a/core/org.eclipse.cdt.core.solaris/ChangeLog b/core/org.eclipse.cdt.core.solaris/ChangeLog index cd9ee7a22d4..c877818d19f 100644 --- a/core/org.eclipse.cdt.core.solaris/ChangeLog +++ b/core/org.eclipse.cdt.core.solaris/ChangeLog @@ -1,3 +1,14 @@ +2004-11-16 Alain Magloire + + Fix for 27663, allow to exec with pty emulation. + * library/Makefile + * library/openpty.c(set_noecho): new function + * library/opentpty.h: update header. + * library/pty.c: refactor forkpyt to openMaster() + * library/PTY.h: regenerate + * library/spawner.c: add exec2() support + * library/Spawner.h: regenerate + 2004-03-25 David Inglis Added platform attribute to processlist extension diff --git a/core/org.eclipse.cdt.core.solaris/library/Makefile b/core/org.eclipse.cdt.core.solaris/library/Makefile index 034a966cfb7..75d3a3cd5be 100644 --- a/core/org.eclipse.cdt.core.solaris/library/Makefile +++ b/core/org.eclipse.cdt.core.solaris/library/Makefile @@ -10,7 +10,7 @@ CFLAGS +=-fpic -D_REENTRANT LIB_NAME_SPAWNER = libspawner.so LIB_NAME_FULL_SPAWNER = ../os/solaris/sparc/libspawner.so -OBJS_SPAWNER=spawner.o io.o exec_unix.o pfind.o +OBJS_SPAWNER=spawner.o io.o exec_unix.o exec_pty.o openpty.o pfind.o LIB_NAME_PTY = libpty.so LIB_NAME_FULL_PTY = ../os/solaris/sparc/libpty.so diff --git a/core/org.eclipse.cdt.core.solaris/library/PTY.h b/core/org.eclipse.cdt.core.solaris/library/PTY.h index fabf58152d0..46a8dd9b622 100644 --- a/core/org.eclipse.cdt.core.solaris/library/PTY.h +++ b/core/org.eclipse.cdt.core.solaris/library/PTY.h @@ -7,12 +7,13 @@ #ifdef __cplusplus extern "C" { #endif +/* Inaccessible static: hasPTY */ /* * Class: org_eclipse_cdt_utils_pty_PTY - * Method: forkpty - * Signature: ()I + * Method: openMaster + * Signature: ()Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_forkpty +JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *, jobject); #ifdef __cplusplus diff --git a/core/org.eclipse.cdt.core.solaris/library/Spawner.h b/core/org.eclipse.cdt.core.solaris/library/Spawner.h index 01ffb3cc1b2..272366bad75 100644 --- a/core/org.eclipse.cdt.core.solaris/library/Spawner.h +++ b/core/org.eclipse.cdt.core.solaris/library/Spawner.h @@ -1,45 +1,53 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_qnx_tools_utils_spawner_Spawner */ - -#ifndef _Included_com_qnx_tools_utils_spawner_Spawner -#define _Included_com_qnx_tools_utils_spawner_Spawner -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray); - -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring); - -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: raise - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise - (JNIEnv *, jobject, jint, jint); - -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: waitFor - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor - (JNIEnv *, jobject, jint); - -#ifdef __cplusplus -} -#endif -#endif +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_eclipse_cdt_utils_spawner_Spawner */ + +#ifndef _Included_org_eclipse_cdt_utils_spawner_Spawner +#define _Included_org_eclipse_cdt_utils_spawner_Spawner +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec0 + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec1 + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec2 + * 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); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: raise + * Signature: (II)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise + (JNIEnv *, jobject, jint, jint); + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: waitFor + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.solaris/library/exec_pty.c b/core/org.eclipse.cdt.core.solaris/library/exec_pty.c new file mode 100644 index 00000000000..d012cfb051c --- /dev/null +++ b/core/org.eclipse.cdt.core.solaris/library/exec_pty.c @@ -0,0 +1,152 @@ +#include "exec0.h" +#include +#include +#include +#include +#include +#include +#include +#include + +/* from pfind.c */ +extern char *pfind(const char *name); + +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 pipe2[2]; + pid_t childpid; + char *full_path; + + /* + * 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); + if (full_path == NULL) { + fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); + return -1; + } + + /* + * Make sure we can create our pipes before forking. + */ + if (channels != NULL) { + if (pipe(pipe2) < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } + } + + childpid = fork(); + + if (childpid < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + free(full_path); + return -1; + } else if (childpid == 0) { /* child */ + + chdir(dirpath); + + if (channels != NULL) { + int fds; + + fds = ptys_open(fdm, pts_name); + if (fds < 0) { + fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return -1; + } + + /* Close the read end of pipe2 */ + if (close(pipe2[0]) == -1) + perror("close(pipe2[0]))"); + + /* close the master, no need in the child */ + close(fdm); + + set_noecho(fds); + /* redirections */ + dup2(fds, STDIN_FILENO); /* dup stdin */ + dup2(fds, STDOUT_FILENO); /* dup stdout */ + dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + close(fds); /* done with fds. */ + } + + /* Close all the fd's in the child */ + { + int fdlimit = sysconf(_SC_OPEN_MAX); + int fd = 3; + + while (fd < fdlimit) + close(fd++); + } + + if (envp[0] == NULL) { + execv(full_path, argv); + } else { + execve(full_path, argv, envp); + } + + _exit(127); + + } else if (childpid != 0) { /* parent */ + + 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. */ + } + + free(full_path); + return childpid; + } + + free(full_path); + return -1; /*NOT REACHED */ +} +#ifdef __STAND_ALONE__ +int main(int argc, char **argv, char **envp) { + const char *path = "./bufferring_test"; + int channels[3] = { -1, -1, -1}; + int status; + FILE *app_stdin; + FILE *app_stdout; + FILE *app_stderr; + char pts_name[32]; + int fdm; + char buffer[32]; + + fdm = ptym_open(pts_name); + status = exec_pty(path, argv, envp, ".", channels, pts_name, fdm); + if (status >= 0) { + app_stdin = fdopen(channels[0], "w"); + app_stdout = fdopen(channels[1], "r"); + app_stderr = fdopen(channels[2], "r"); + if (app_stdout == NULL || app_stderr == NULL || app_stdin == NULL) { + fprintf(stderr, "PROBLEMS\n"); + } else { + fputs("foo\n", app_stdin); + fputs("bar\n", app_stdin); + while(fgets(buffer, sizeof buffer, app_stdout) != NULL) { + fprintf(stdout, "STDOUT: %s\n", buffer); + } + while(fgets(buffer, sizeof buffer, app_stderr) != NULL) { + fprintf(stdout, "STDERR: %s\n", buffer); + } + } + } + fputs("bye\n", stdout); + close(channels[0]); + close(channels[1]); + close(channels[2]); + return 0; +} +#endif diff --git a/core/org.eclipse.cdt.core.solaris/library/openpty.c b/core/org.eclipse.cdt.core.solaris/library/openpty.c index e3908ff42d5..8fe4fe260af 100644 --- a/core/org.eclipse.cdt.core.solaris/library/openpty.c +++ b/core/org.eclipse.cdt.core.solaris/library/openpty.c @@ -105,3 +105,22 @@ ptys_open(int fdm, char * pts_name) } return fds; } + +void +set_noecho(int fd) +{ + struct termios stermios; + if (tcgetattr(fd, &stermios) < 0) { + return ; + } + + /* turn off echo */ + stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); + /* Turn off the NL to CR/NL mapping ou output. */ + /*stermios.c_oflag &= ~(ONLCR);*/ + + stermios.c_iflag |= (IGNCR); + + tcsetattr(fd, TCSANOW, &stermios); +} + diff --git a/core/org.eclipse.cdt.core.solaris/library/openpty.h b/core/org.eclipse.cdt.core.solaris/library/openpty.h index fd7b7be1b2f..36cd52fd294 100644 --- a/core/org.eclipse.cdt.core.solaris/library/openpty.h +++ b/core/org.eclipse.cdt.core.solaris/library/openpty.h @@ -7,4 +7,5 @@ #define _OPENPTY_H int ptym_open (char *pts_name); int ptys_open (int fdm, char * pts_name); +void set_noecho(int fd); #endif diff --git a/core/org.eclipse.cdt.core.solaris/library/pty.c b/core/org.eclipse.cdt.core.solaris/library/pty.c index 4b9e682c3ee..245578632f3 100644 --- a/core/org.eclipse.cdt.core.solaris/library/pty.c +++ b/core/org.eclipse.cdt.core.solaris/library/pty.c @@ -7,7 +7,7 @@ * Signature: ()I */ JNIEXPORT jstring JNICALL -Java_org_eclipse_cdt_utils_pty_PTY_forkpty (JNIEnv *env, jobject jobj) { +Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj) { jfieldID fid; /* Store the field ID */ jstring jstr = NULL; int master = -1; @@ -18,6 +18,9 @@ Java_org_eclipse_cdt_utils_pty_PTY_forkpty (JNIEnv *env, jobject jobj) { master = ptym_open(line); if (master >= 0) { + // turn off echo + set_noecho(master); + /* Get a reference to the obj's class */ cls = (*env)->GetObjectClass(env, jobj); diff --git a/core/org.eclipse.cdt.core.solaris/library/spawner.c b/core/org.eclipse.cdt.core.solaris/library/spawner.c index 2671bcd1f0c..fcb111a81f0 100644 --- a/core/org.eclipse.cdt.core.solaris/library/spawner.c +++ b/core/org.eclipse.cdt.core.solaris/library/spawner.c @@ -13,7 +13,7 @@ /* - * Header for class com_qnx_utils_spawner_Spawner + * Header for class org_eclipse_cdt_utils_spawner_Spawner */ @@ -71,6 +71,63 @@ static void free_c_array(char **c_array) } +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: exec2 + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILorg/eclipse/cdt/utils/pty/PTY;)I + */ +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) +{ + 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; + int fd[3]; + pid_t pid = -1; + + if (channels == NULL) + goto bail_out; + + cmd = alloc_c_array(env, jcmd); + if (cmd == NULL) + goto bail_out; + + envp = alloc_c_array(env, jenv); + if (envp == NULL) + goto bail_out; + +#if DEBUGIT + fprintf(stderr, "command:"); + print_array(cmd); + fprintf(stderr, "Envp:"); + print_array(envp); + fprintf(stderr, "dirpath: %s\n", dirpath); + fprintf(stderr, "pts_name: %s\n", pts_name); +#endif + + pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD); + if (pid < 0) + goto bail_out; + + channels[0] = fd[0]; + channels[1] = fd[1]; + channels[2] = fd[2]; + + bail_out: + (*env)->ReleaseIntArrayElements(env, jchannels, channels, 0); + (*env)->ReleaseStringUTFChars(env, jdir, dirpath); + (*env)->ReleaseStringUTFChars(env, jslaveName, pts_name); + if (cmd) + free_c_array(cmd); + if (envp) + free_c_array(envp); + return pid; +} + + JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, jobjectArray jcmd, @@ -80,7 +137,6 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); char **cmd; char **envp; - int fd[3]; pid_t pid = -1; cmd = alloc_c_array(env, jcmd);