diff --git a/core/org.eclipse.cdt.core.aix/.classpath b/core/org.eclipse.cdt.core.aix/.classpath new file mode 100644 index 00000000000..2f498f50b33 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/.classpath @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/core/org.eclipse.cdt.core.aix/.project b/core/org.eclipse.cdt.core.aix/.project new file mode 100644 index 00000000000..8c2ed1f29a4 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/.project @@ -0,0 +1,38 @@ + + + org.eclipse.cdt.core.aix + + + org.apache.xerces + org.eclipse.cdt.core + org.eclipse.compare + org.eclipse.core.boot + org.eclipse.core.resources + org.eclipse.core.runtime + org.eclipse.debug.core + org.eclipse.search + org.eclipse.team.core + org.eclipse.ui + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/core/org.eclipse.cdt.core.aix/.template b/core/org.eclipse.cdt.core.aix/.template new file mode 100644 index 00000000000..d65e0f4481d --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/.template @@ -0,0 +1,4 @@ + +
+

Tips on working with this plug-in project

  • For the view of the new plug-in at a glance, go to the Overview.
  • You can test the contributions of this plug-in by launching another instance of the workbench. On the Run menu, click Run As and choose Run-time Workbench from the available choices.
  • You can add more functionality to this plug-in by adding extensions using the New Extension Wizard.
  • The plug-in project contains Java code that you can debug. Place breakpoints in Java classes. On the Run menu, select Debug As and choose Run-time Workbench from the available choices.
  • +
    diff --git a/core/org.eclipse.cdt.core.aix/build.properties b/core/org.eclipse.cdt.core.aix/build.properties new file mode 100644 index 00000000000..cd23d6f7e18 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/build.properties @@ -0,0 +1,4 @@ +source.cdtaix.jar = src/ +bin.includes = fragment.xml,\ + *.jar,\ + cdtaix.jar diff --git a/core/org.eclipse.cdt.core.aix/fragment.properties b/core/org.eclipse.cdt.core.aix/fragment.properties new file mode 100644 index 00000000000..e4c8f54ee81 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/fragment.properties @@ -0,0 +1,2 @@ +fragmentName=C/C++ Development Tools Core AIX Fragment +providerName=Eclipse.org diff --git a/core/org.eclipse.cdt.core.aix/fragment.xml b/core/org.eclipse.cdt.core.aix/fragment.xml new file mode 100644 index 00000000000..8b6277e754b --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/fragment.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/core/org.eclipse.cdt.core.aix/library/.cvsignore b/core/org.eclipse.cdt.core.aix/library/.cvsignore new file mode 100644 index 00000000000..5761abcfdf0 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/.cvsignore @@ -0,0 +1 @@ +*.o diff --git a/core/org.eclipse.cdt.core.aix/library/Makefile b/core/org.eclipse.cdt.core.aix/library/Makefile new file mode 100644 index 00000000000..cd384722c65 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/Makefile @@ -0,0 +1,29 @@ +# makefile for libspawner.so + +#set JDK_INCLUDES +JDK_INCLUDES=/usr/java131/include + +CC=xlc +CFLAGS = -I. -I$(JDK_INCLUDES) +#CFLAGS +=-fpic -D_REENTRANT + +LIB_NAME_SPAWNER = libspawner.so +LIB_NAME_FULL_SPAWNER = ../os/aix/ppc/libspawner.so +OBJS_SPAWNER=spawner.o io.o exec_unix.o pfind.o + +LIB_NAME_PTY = libpty.so +LIB_NAME_FULL_PTY = ../os/aix/ppc/libpty.so +OBJS_PTY=openpty.o pty.o ptyio.o + +all: $(LIB_NAME_FULL_SPAWNER) $(LIB_NAME_FULL_PTY) + +$(LIB_NAME_FULL_SPAWNER): $(OBJS_SPAWNER) + mkdir -p ../os/aix/ppc + $(CC) -G -o $(LIB_NAME_FULL_SPAWNER) $(OBJS_SPAWNER) -lc + +$(LIB_NAME_FULL_PTY): $(OBJS_PTY) + $(CC) -G -o $(LIB_NAME_FULL_PTY) $(OBJS_PTY) + +clean : + $(RM) $(OBJS_SPAWNER) $(LIB_NAME_FULL_SPAWNER) + $(RM) $(OBJS_PTY) $(LIB_NAME_FULL_PTY) diff --git a/core/org.eclipse.cdt.core.aix/library/PTY.h b/core/org.eclipse.cdt.core.aix/library/PTY.h new file mode 100644 index 00000000000..fabf58152d0 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/PTY.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_eclipse_cdt_utils_pty_PTY */ + +#ifndef _Included_org_eclipse_cdt_utils_pty_PTY +#define _Included_org_eclipse_cdt_utils_pty_PTY +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_eclipse_cdt_utils_pty_PTY + * Method: forkpty + * Signature: ()I + */ +JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_forkpty + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.aix/library/PTYInputStream.h b/core/org.eclipse.cdt.core.aix/library/PTYInputStream.h new file mode 100644 index 00000000000..e7349272b56 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/PTYInputStream.h @@ -0,0 +1,32 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_eclipse_cdt_utils_pty_PTYInputStream */ + +#ifndef _Included_org_eclipse_cdt_utils_pty_PTYInputStream +#define _Included_org_eclipse_cdt_utils_pty_PTYInputStream +#ifdef __cplusplus +extern "C" { +#endif +#undef org_eclipse_cdt_utils_pty_PTYInputStream_SKIP_BUFFER_SIZE +#define org_eclipse_cdt_utils_pty_PTYInputStream_SKIP_BUFFER_SIZE 2048L +/* Inaccessible static: skipBuffer */ +/* + * Class: org_eclipse_cdt_utils_pty_PTYInputStream + * Method: read0 + * Signature: (I[BI)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0 + (JNIEnv *, jobject, jint, jbyteArray, jint); + +/* + * Class: org_eclipse_cdt_utils_pty_PTYInputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0 + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.aix/library/PTYOutputStream.h b/core/org.eclipse.cdt.core.aix/library/PTYOutputStream.h new file mode 100644 index 00000000000..fb28491060e --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/PTYOutputStream.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_eclipse_cdt_utils_pty_PTYOutputStream */ + +#ifndef _Included_org_eclipse_cdt_utils_pty_PTYOutputStream +#define _Included_org_eclipse_cdt_utils_pty_PTYOutputStream +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_eclipse_cdt_utils_pty_PTYOutputStream + * Method: write0 + * Signature: (I[BI)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0 + (JNIEnv *, jobject, jint, jbyteArray, jint); + +/* + * Class: org_eclipse_cdt_utils_pty_PTYOutputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0 + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.aix/library/Spawner.h b/core/org.eclipse.cdt.core.aix/library/Spawner.h new file mode 100644 index 00000000000..01ffb3cc1b2 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/Spawner.h @@ -0,0 +1,45 @@ +/* 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 diff --git a/core/org.eclipse.cdt.core.aix/library/SpawnerInputStream.h b/core/org.eclipse.cdt.core.aix/library/SpawnerInputStream.h new file mode 100644 index 00000000000..3b32d2b2806 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/SpawnerInputStream.h @@ -0,0 +1,32 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_qnx_tools_utils_spawner_SpawnerInputStream */ + +#ifndef _Included_com_qnx_tools_utils_spawner_SpawnerInputStream +#define _Included_com_qnx_tools_utils_spawner_SpawnerInputStream +#ifdef __cplusplus +extern "C" { +#endif +#undef com_qnx_tools_utils_spawner_SpawnerInputStream_SKIP_BUFFER_SIZE +#define com_qnx_tools_utils_spawner_SpawnerInputStream_SKIP_BUFFER_SIZE 2048L +/* Inaccessible static: skipBuffer */ +/* + * Class: org_elipse_cdt_utils_spawner_SpawnerInputStream + * Method: read0 + * Signature: (I[BI)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0 + (JNIEnv *, jobject, jint, jbyteArray, jint); + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0 + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.aix/library/SpawnerOutputStream.h b/core/org.eclipse.cdt.core.aix/library/SpawnerOutputStream.h new file mode 100644 index 00000000000..f835947e060 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/SpawnerOutputStream.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_qnx_tools_utils_spawner_SpawnerOutputStream */ + +#ifndef _Included_com_qnx_tools_utils_spawner_SpawnerOutputStream +#define _Included_com_qnx_tools_utils_spawner_SpawnerOutputStream +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream + * Method: write0 + * Signature: (I[BI)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0 + (JNIEnv *, jobject, jint, jbyteArray, jint); + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0 + (JNIEnv *, jobject, jint); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/core/org.eclipse.cdt.core.aix/library/exec0.h b/core/org.eclipse.cdt.core.aix/library/exec0.h new file mode 100644 index 00000000000..abfadb1fe82 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/exec0.h @@ -0,0 +1,11 @@ +#include +#include +#include +#include +#include + +extern pid_t exec0(const char *path, char *const argv[], + char *const envp[], const char *dirpath, + int channels[3] ); + +extern int wait0(pid_t pid); diff --git a/core/org.eclipse.cdt.core.aix/library/exec_unix.c b/core/org.eclipse.cdt.core.aix/library/exec_unix.c new file mode 100644 index 00000000000..14bb203b93a --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/exec_unix.c @@ -0,0 +1,135 @@ +#include "exec0.h" +#include +#include +#include +#include +#include +#include +#include + +/* from pfind.c */ +extern char *pfind(const char *name); + +pid_t +exec0(const char *path, char *const argv[], char *const envp[], + const char *dirpath, int channels[3]) +{ + int pipe0[2], pipe1[2], 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(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) { + fprintf(stderr, "%s(%d): returning due to error.\n", + __FUNCTION__, __LINE__); + 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 */ + char *ptr; + + chdir(dirpath); + + if (channels != NULL) { + /* Close the write end of pipe0 */ + if (close(pipe0[1]) == -1) + perror("close(pipe0[1])"); + + /* Close the read end of pipe1 */ + if (close(pipe1[0]) == -1) + perror("close(pipe1[0])"); + + /* Close the read end of pipe2 */ + if (close(pipe2[0]) == -1) + perror("close(pipe2[0]))"); + + /* redirections */ + dup2(pipe0[0], STDIN_FILENO); /* dup stdin */ + dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */ + dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ + } + + /* 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 */ + + char b; + + if (channels != NULL) { + /* close the read end of pipe1 */ + if (close(pipe0[0]) == -1) + perror("close(pipe0[0])"); + + /* close the write end of pipe2 */ + if (close(pipe1[1]) == -1) + perror("close(pipe1[1])"); + + /* close the write end of pipe2 */ + if (close(pipe2[1]) == -1) + perror("close(pipe2[1])"); + + channels[0] = pipe0[1]; /* Output Stream. */ + channels[1] = pipe1[0]; /* Input Stream. */ + channels[2] = pipe2[0]; /* Input Stream. */ + } + + free(full_path); + return childpid; + } + + free(full_path); + return -1; /*NOT REACHED */ +} + + +int wait0(pid_t pid) +{ + int status; + int val = -1; + + if (pid < 0 || waitpid(pid, &status, 0) < 0) + return -1; + + if (WIFEXITED(status)) { + val = WEXITSTATUS(status); + } + + return val; +} diff --git a/core/org.eclipse.cdt.core.aix/library/io.c b/core/org.eclipse.cdt.core.aix/library/io.c new file mode 100644 index 00000000000..aa98d55429b --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/io.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include + +/* Header for class _org_eclipse_cdt_utils_spawner_SpawnerInputStream */ +/* Header for class _org_eclipse_cdt_utils_spawner_SpawnerOutputStream */ + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream + * Method: read0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv * env, + jobject jobj, + jint jfd, + jbyteArray buf, + jint buf_len) +{ + int fd; + int status; + jbyte *data; + int data_len; + + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = jfd; + + status = read( fd, data, data_len ); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); + + if (status == 0) { + /* EOF. */ + status = -1; + } else if (status == -1) { + /* Error, toss an exception */ + jclass exception = (*env)->FindClass(env, "java/io/IOException"); + if (exception == NULL) { + /* Give up. */ + return -1; + } + (*env)->ThrowNew(env, exception, "read error"); + } + + return status; +} + + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv * env, + jobject jobj, + jint fd) +{ + return close(fd); +} + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream + * Method: write0 + * Signature: (II)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv * env, + jobject jobj, + jint jfd, + jbyteArray buf, + jint buf_len) +{ + int status; + int fd; + jbyte *data; + int data_len; + + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = jfd; + + status = write(fd, data, data_len); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); + + return status; +} + + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv * env, + jobject jobj, + jint fd) +{ + return close(fd); +} diff --git a/core/org.eclipse.cdt.core.aix/library/openpty.c b/core/org.eclipse.cdt.core.aix/library/openpty.c new file mode 100644 index 00000000000..28f5363cf1d --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/openpty.c @@ -0,0 +1,105 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/** + * This is taken from R. W. Stevens book. + * Alain Magloire. + */ + +int ptym_open (char *pts_name); +int ptys_open (int fdm, char * pts_name); + +int +openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) +{ + char line[20]; + line[0]=0; + *amaster = ptym_open(line); + if (*amaster < 0) + return -1; + *aslave = ptys_open(*amaster, line); + if (*aslave < 0) { + close(*amaster); + return -1; + } + if (name) + strcpy(name, line); +#ifndef TCSAFLUSH +#define TCSAFLUSH TCSETAF +#endif + if (termp) + (void) tcsetattr(*aslave, TCSAFLUSH, termp); +#ifdef TIOCSWINSZ + if (winp) + (void) ioctl(*aslave, TIOCSWINSZ, (char *)winp); +#endif + return 0; +} + +int +ptym_open(char * pts_name) +{ + int fdm; + char *ptr; + + strcpy(pts_name, "/dev/ptmx"); + fdm = getpt(); + if (fdm < 0) + return -1; + if (grantpt(fdm) < 0) { /* grant access to slave */ + close(fdm); + return -2; + } + if (unlockpt(fdm) < 0) { /* clear slave's lock flag */ + close(fdm); + return -3; + } + ptr = ptsname(fdm); + if (ptr == NULL) { /* get slave's name */ + close (fdm); + return -4; + } + strcpy(pts_name, ptr); /* return name of slave */ + return fdm; /* return fd of master */ +} + +int +ptys_open(int fdm, char * pts_name) +{ + int fds; + /* following should allocate controlling terminal */ + fds = open(pts_name, O_RDWR); + if (fds < 0) { + close(fdm); + return -5; + } + if (ioctl(fds, I_PUSH, "ptem") < 0) { + printf("pterm:%s\n", strerror(errno)); + close(fdm); + close(fds); + return -6; + } + if (ioctl(fds, I_PUSH, "ldterm") < 0) { + printf("ldterm %s\n", strerror(errno)); + close(fdm); + close(fds); + return -7; + } + return fds; +} diff --git a/core/org.eclipse.cdt.core.aix/library/openpty.h b/core/org.eclipse.cdt.core.aix/library/openpty.h new file mode 100644 index 00000000000..fd7b7be1b2f --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/openpty.h @@ -0,0 +1,10 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +#ifndef _OPENPTY_H +#define _OPENPTY_H +int ptym_open (char *pts_name); +int ptys_open (int fdm, char * pts_name); +#endif diff --git a/core/org.eclipse.cdt.core.aix/library/pfind.c b/core/org.eclipse.cdt.core.aix/library/pfind.c new file mode 100644 index 00000000000..d13dae5f0e2 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/pfind.c @@ -0,0 +1,78 @@ +/* + * pfind.c - Search for a binary in $PATH. + */ + +#include +#include +#include +#include +#include + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + + +char * pfind(const char *name) +{ + char *tok; + char *sp; + char *path; + char fullpath[PATH_MAX+1]; + + /* Sanity check. */ + if (name == NULL) { + fprintf(stderr, "pfind(): Null argument.\n"); + return NULL; + } + + /* For absolute name or name with a path, check if it is an executable. */ + if (name[0] == '/' || name[0] == '.') { + if (access(name, X_OK | R_OK) == 0) { + return strdup(name); + } + return NULL; + } + + /* Search in the PATH environment. */ + path = getenv("PATH" ); + + if (path == NULL || strlen(path) <= 0) { + fprintf(stderr, "Unable to get $PATH.\n"); + return NULL; + } + + /* The value return by getenv() is readonly */ + path = strdup(path); + + tok = strtok_r(path, ":", &sp); + while (tok != NULL) { + snprintf(fullpath, sizeof(fullpath) - 1, "%s/%s", tok, name); + + if (access(fullpath, X_OK | R_OK) == 0) { + free(path); + return strdup(fullpath); + } + + tok = strtok_r( NULL, ":", &sp ); + } + + free(path); + return NULL; +} + +#ifdef BUILD_WITH_MAIN +int main(int argc, char **argv) +{ + int i; + char *fullpath; + + for (i=1; i= 0) { + /* Get a reference to the obj's class */ + cls = (*env)->GetObjectClass(env, jobj); + + /* Set the master fd. */ + fid = (*env)->GetFieldID(env, cls, "master", "I"); + if (fid == NULL) { + return NULL; + } + (*env)->SetIntField(env, jobj, fid, (jint)master); + + /* Create a new String for the slave. */ + jstr = (*env)->NewStringUTF(env, line); + } + return jstr; +} diff --git a/core/org.eclipse.cdt.core.aix/library/ptyio.c b/core/org.eclipse.cdt.core.aix/library/ptyio.c new file mode 100644 index 00000000000..67d7594154d --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/ptyio.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include + +/* Header for class _org_eclipse_cdt_utils_pty_PTYInputStream */ +/* Header for class _org_eclipse_cdt_utils_pty_PTYOutputStream */ + +/* + * Class: org_eclipse_cdt_utils_pty_PTYInputStream + * Method: read0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv * env, + jobject jobj, + jint jfd, + jbyteArray buf, + jint buf_len) +{ + int fd; + int status; + jbyte *data; + int data_len; + + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = jfd; + + status = read( fd, data, data_len ); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); + + if (status == 0) { + /* EOF. */ + status = -1; + } else if (status == -1) { + /* Error, toss an exception */ + /* Ignore the error for now, the debugger will attempt + * to close this multiple time. */ +#if 0 + jclass exception = (*env)->FindClass(env, "java/io/IOException"); + if (exception == NULL) { + /* Give up. */ + return -1; + } + (*env)->ThrowNew(env, exception, "read error"); +#endif + } + + return status; +} + + +/* + * Class: org_eclipse_cdt_utils_pty_PTYInputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv * env, + jobject jobj, + jint fd) +{ + return close(fd); +} + +/* + * Class: org_eclipse_cdt_utils_pty_PTYOutputStream + * Method: write0 + * Signature: (II)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv * env, + jobject jobj, + jint jfd, + jbyteArray buf, + jint buf_len) +{ + int status; + int fd; + jbyte *data; + int data_len; + + data = (*env)->GetByteArrayElements(env, buf, 0); + data_len = buf_len; + fd = jfd; + + status = write(fd, data, data_len); + (*env)->ReleaseByteArrayElements(env, buf, data, 0); + + return status; +} + + +/* + * Class: org_eclipse_cdt_utils_pty_PTYOutputStream + * Method: close0 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv * env, + jobject jobj, + jint fd) +{ + return close(fd); +} diff --git a/core/org.eclipse.cdt.core.aix/library/spawner.c b/core/org.eclipse.cdt.core.aix/library/spawner.c new file mode 100644 index 00000000000..58bf85a74ed --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/library/spawner.c @@ -0,0 +1,218 @@ +#include +#include +#include +#include +#include +#include + +#include "exec0.h" +#include + + +#define DEBUGIT 0 + + +/* + * Header for class org_eclipse_cdt_utils_spawner_Spawner + */ + + +#if DEBUGIT +static void print_array(char **c_array) +{ + if (c_array) { + char **p = c_array; + for (; *p; p++) { + if (*p) { + fprintf(stderr, " %s", *p); + } + } + } else { + fprintf(stderr, "null"); + } + fprintf(stderr, "\n"); +} +#endif + + +static char **alloc_c_array(JNIEnv * env, jobjectArray j_array) +{ + int i; + jint c_array_size = (*env)->GetArrayLength(env, j_array); + char **c_array = calloc(c_array_size + 1, sizeof(*c_array)); + + if (c_array == NULL) + return NULL; + + for (i = 0; i < c_array_size; i++) { + jstring j_str = + (jstring) (*env)->GetObjectArrayElement(env, j_array, i); + const char *c_str = (*env)->GetStringUTFChars(env, j_str, NULL); + c_array[i] = (char *) strdup(c_str); + (*env)->ReleaseStringUTFChars(env, j_str, c_str); + (*env)->DeleteLocalRef(env, j_str); + } + + return c_array; +} + + +static void free_c_array(char **c_array) +{ + if (c_array) { + char **p = c_array; + for (; *p; p++) { + if (*p) { + free(*p); + } + } + free(c_array); + } +} + + +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, + jobjectArray jcmd, + jobjectArray jenv, + jstring jdir) +{ + const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); + char **cmd; + char **envp; + pid_t pid = -1; + + 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); +#endif + + pid = exec0(cmd[0], cmd, envp, dirpath, NULL); + if (pid < 0) + goto bail_out; + + bail_out: + (*env)->ReleaseStringUTFChars(env, jdir, dirpath); + if (cmd) + free_c_array(cmd); + if (envp) + free_c_array(envp); + return pid; +} + +/* + * 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 * env, jobject jobj, + jobjectArray jcmd, + jobjectArray jenv, + jstring jdir, + jintArray jchannels) +{ + jint *channels = (*env)->GetIntArrayElements(env, jchannels, 0); + const char *dirpath = (*env)->GetStringUTFChars(env, jdir, 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); +#endif + + pid = exec0(cmd[0], cmd, envp, dirpath, fd); + 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); + if (cmd) + free_c_array(cmd); + if (envp) + free_c_array(envp); + return pid; +} + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: raise + * Signature: (II)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv * env, jobject jobj, + jint pid, jint sig) +{ + int status = -1; + + switch (sig) { + case 0: /* NOOP */ + status = kill(pid, 0); + break; + + case 2: /* INTERRUPT */ + status = kill(pid, SIGINT); + break; + + case 9: /* KILL */ + status = kill(pid, SIGKILL); + break; + + case 15: /* TERM */ + status = kill(pid, SIGTERM); + break; + + default: + status = kill(pid, sig); /* WHAT ?? */ + break; + } + + return status; +} + + + +/* + * Class: org_eclipse_cdt_utils_spawner_Spawner + * Method: waitFor + * Signature: (I)I + */ +JNIEXPORT jint JNICALL +Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv * env, + jobject jobj, jint pid) +{ + return wait0(pid); +} diff --git a/core/org.eclipse.cdt.core.aix/src/org/eclipse/cdt/internal/core/aix/ProcessInfo.java b/core/org.eclipse.cdt.core.aix/src/org/eclipse/cdt/internal/core/aix/ProcessInfo.java new file mode 100644 index 00000000000..11556bf5859 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/src/org/eclipse/cdt/internal/core/aix/ProcessInfo.java @@ -0,0 +1,45 @@ +package org.eclipse.cdt.internal.core.aix; + +import org.eclipse.cdt.core.IProcessInfo; + +/** + * @author alain + * + * To change this generated comment edit the template variable "typecomment": + * Window>Preferences>Java>Templates. + * To enable and disable the creation of type comments go to + * Window>Preferences>Java>Code Generation. + */ +public class ProcessInfo implements IProcessInfo { + + int pid; + String name; + + public ProcessInfo(String pidString, String name) { + try { + pid = Integer.parseInt(pidString); + } catch (NumberFormatException e) { + } + this.name = name; + } + + public ProcessInfo(int pid, String name) { + this.pid = pid; + this.name = name; + } + + /** + * @see org.eclipse.cdt.core.IProcessInfo#getName() + */ + public String getName() { + return name; + } + + /** + * @see org.eclipse.cdt.core.IProcessInfo#getPid() + */ + public int getPid() { + return pid; + } + +} diff --git a/core/org.eclipse.cdt.core.aix/src/org/eclipse/cdt/internal/core/aix/ProcessList.java b/core/org.eclipse.cdt.core.aix/src/org/eclipse/cdt/internal/core/aix/ProcessList.java new file mode 100644 index 00000000000..9f58364d9a9 --- /dev/null +++ b/core/org.eclipse.cdt.core.aix/src/org/eclipse/cdt/internal/core/aix/ProcessList.java @@ -0,0 +1,72 @@ +package org.eclipse.cdt.internal.core.aix; + +import java.io.File; +import java.io.FileReader; +import java.io.FilenameFilter; +import java.io.IOException; + +import org.eclipse.cdt.core.IProcessInfo; +import org.eclipse.cdt.core.IProcessList; + +/** + * Insert the type's description here. + * @see IProcessList + */ +public class ProcessList implements IProcessList { + + ProcessInfo[] empty = new ProcessInfo[0]; + + public ProcessList() { + } + + /** + * Insert the method's description here. + * @see IProcessList#getProcessList + */ + public IProcessInfo [] getProcessList() { + File proc = new File("/proc"); + File[] pidFiles = null; + + // We are only interrested in the pid so filter the rest out. + try { + FilenameFilter filter = new FilenameFilter() { + public boolean accept(File dir, String name) { + boolean isPID = false; + try { + Integer.parseInt(name); + isPID = true; + } catch (NumberFormatException e) { + } + return isPID; + } + }; + pidFiles = proc.listFiles(filter); + } catch (SecurityException e) { + } + + ProcessInfo[] processInfo = empty; + if (pidFiles != null) { + processInfo = new ProcessInfo[pidFiles.length]; + for (int i = 0; i < pidFiles.length; i++) { + File cmdLine = new File(pidFiles[i], "cmdline"); + StringBuffer line = new StringBuffer(); + try { + FileReader reader = new FileReader(cmdLine); + int c; + while ((c = reader.read()) > 0) { + line.append((char)c); + } + } catch (IOException e) { + } + String name = line.toString(); + if (name.length() == 0) { + name = "Unknown"; + } + processInfo[i] = new ProcessInfo(pidFiles[i].getName(), name); + } + } else { + pidFiles = new File[0]; + } + return processInfo; + } +}