mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 21:35:40 +02:00
new pty supprt for spawner
This commit is contained in:
parent
d3fe28291c
commit
71be97ba3e
6 changed files with 141 additions and 11 deletions
|
@ -7,12 +7,13 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
/* Inaccessible static: hasPTY */
|
||||||
/*
|
/*
|
||||||
* Class: org_eclipse_cdt_utils_pty_PTY
|
* Class: org_eclipse_cdt_utils_pty_PTY
|
||||||
* Method: forkpty
|
* Method: openMaster
|
||||||
* Signature: ()I
|
* 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);
|
(JNIEnv *, jobject);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
* Signature: ()I
|
* Signature: ()I
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jstring JNICALL
|
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 */
|
jfieldID fid; /* Store the field ID */
|
||||||
jstring jstr = NULL;
|
jstring jstr = NULL;
|
||||||
int master = -1;
|
int master = -1;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
/* Header for class com_qnx_tools_utils_spawner_Spawner */
|
/* Header for class org_eclipse_cdt_utils_spawner_Spawner */
|
||||||
|
|
||||||
#ifndef _Included_com_qnx_tools_utils_spawner_Spawner
|
#ifndef _Included_org_eclipse_cdt_utils_spawner_Spawner
|
||||||
#define _Included_com_qnx_tools_utils_spawner_Spawner
|
#define _Included_org_eclipse_cdt_utils_spawner_Spawner
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -17,12 +17,20 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: org_eclipse_cdt_utils_spawner_Spawner
|
* Class: org_eclipse_cdt_utils_spawner_Spawner
|
||||||
* Method: exec0
|
* Method: exec1
|
||||||
* Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I
|
* Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)I
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1
|
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1
|
||||||
(JNIEnv *, jobject, jobjectArray, jobjectArray, jstring);
|
(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
|
* Class: org_eclipse_cdt_utils_spawner_Spawner
|
||||||
* Method: raise
|
* Method: raise
|
||||||
|
|
|
@ -205,6 +205,127 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2
|
||||||
|
(JNIEnv * env, jobject proc, jobjectArray cmdArray, jobjectArray envp, jstring dir, jintArray channels, jstring jslave, jint master)
|
||||||
|
{
|
||||||
|
int fd_map[3]; /* File descriptors. */
|
||||||
|
int fd_ret[3]; /* File descriptors that we return to Java. */
|
||||||
|
int fd[2]; /* Pipe open structure. */
|
||||||
|
int i;
|
||||||
|
int nParms = 0;/* Number of parameters. */
|
||||||
|
int nEnvs = 0;/* Number of environment variables. */
|
||||||
|
char ** pParms = NULL; /* Parameters. */
|
||||||
|
char ** pEnvs = NULL; /* Environment variables. */
|
||||||
|
char * pCommand = NULL; /* Command to execute. */
|
||||||
|
char cwd[PATH_MAX + 1]; /* Current working directory. */
|
||||||
|
pid_t pid; /* Process ID. */
|
||||||
|
struct inheritance inherit;
|
||||||
|
|
||||||
|
if ((cmdArray == NULL) || ((nParms = (*env)->GetArrayLength(env, cmdArray)) == 0)) {
|
||||||
|
ThrowByName(env, "java/lang/IOException", "No command line specified");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
char *pts_name = (char *)(*env)->GetStringUTFChars(env, jslave, 0);
|
||||||
|
int fds = ptys_open(master, pts_name);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jslave, pts_name);
|
||||||
|
if (fds == -1) {
|
||||||
|
ThrowByName(env, "java/io/IOException", "Cannot create pipe for spawner");
|
||||||
|
}
|
||||||
|
if (EOK != pipe(fd)) {
|
||||||
|
ThrowByName(env, "java/io/IOException", "Cannot create pipe for spawner");
|
||||||
|
}
|
||||||
|
fd_map[0] = fd_map[1] = fds;
|
||||||
|
fd_map[2] = fd[1];
|
||||||
|
fd_ret[0] = fd_ret[1] = master;
|
||||||
|
fd_ret[3] = fd[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nParms > 0) {
|
||||||
|
pParms = malloc(sizeof(char *) * (nParms + 1));
|
||||||
|
for (i = 0; i < nParms; ++i) {
|
||||||
|
jobject item = (*env)->GetObjectArrayElement(env, cmdArray, i);
|
||||||
|
const char *str = (*env)->GetStringUTFChars(env, item, 0);
|
||||||
|
if (i == 0)
|
||||||
|
pCommand = strdup(str);
|
||||||
|
pParms[i] = strdup(str);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, item, str);
|
||||||
|
}
|
||||||
|
pParms[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nEnvs = (*env) -> GetArrayLength(env, envp);
|
||||||
|
if (nEnvs > 0) {
|
||||||
|
pEnvs = malloc(sizeof(char *) * (nEnvs + 1));
|
||||||
|
for (i = 0; i < nEnvs; ++i) {
|
||||||
|
jobject item = (*env)->GetObjectArrayElement(env, envp, i);
|
||||||
|
const char *str = (*env)->GetStringUTFChars(env, item, 0);
|
||||||
|
pEnvs[i] = strdup(str);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, item, str);
|
||||||
|
}
|
||||||
|
pEnvs[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir != 0) {
|
||||||
|
char *item = (char *)(*env)->GetStringUTFChars(env, dir, 0);
|
||||||
|
getcwd(cwd, sizeof(cwd));
|
||||||
|
chdir(item);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, dir, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nothing for now. */
|
||||||
|
memset(&inherit, 0, sizeof(inherit));
|
||||||
|
inherit.flags = SPAWN_SETGROUP;
|
||||||
|
inherit.pgroup = SPAWN_NEWPGROUP;
|
||||||
|
|
||||||
|
pid = spawnp(pCommand, 3, fd_map, &inherit, pParms, pEnvs);
|
||||||
|
|
||||||
|
if (dir != 0) /* Restore working directory. */
|
||||||
|
chdir(cwd);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
close(fd_map[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-1 == pid) { /* Failed - close pipes. */
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
close(fd_ret[i]);
|
||||||
|
}
|
||||||
|
} else { /* Success - return pipes to Java. */
|
||||||
|
(*env) -> SetIntArrayRegion(env, channels, 0, 3, fd_ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free Parameters. */
|
||||||
|
if (pParms != NULL) {
|
||||||
|
int j;
|
||||||
|
for (j = 0; pParms[j] != NULL; j++) {
|
||||||
|
if (pParms[j] != NULL) {
|
||||||
|
free(pParms[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(pParms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free Environment variables. */
|
||||||
|
if (pEnvs != NULL) {
|
||||||
|
int j;
|
||||||
|
for (j = 0; pEnvs[j] != NULL; j++) {
|
||||||
|
if (pEnvs[j] != NULL) {
|
||||||
|
free(pEnvs[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(pEnvs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free Command to execute. */
|
||||||
|
if (pCommand != NULL) {
|
||||||
|
free(pCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pid;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_qnx_tools_utils_spawner_Spawner
|
* Class: com_qnx_tools_utils_spawner_Spawner
|
||||||
* Method: raise
|
* Method: raise
|
||||||
|
@ -224,7 +345,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise
|
||||||
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor
|
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor
|
||||||
(JNIEnv * env, jobject proc, jint pid)
|
(JNIEnv * env, jobject proc, jint pid)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, stat_loc;
|
||||||
int val = -1;
|
int val = -1;
|
||||||
|
|
||||||
ret = waitpid(pid, &stat_loc, WEXITED);
|
ret = waitpid(pid, &stat_loc, WEXITED);
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Add table
Reference in a new issue