Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlain Magloire2002-09-05 23:39:19 -0400
committerAlain Magloire2002-09-05 23:39:19 -0400
commit7edb51d4cc34b6683562170428b5d31bfbe5d6f4 (patch)
tree25ae93696b809fb5a8a7e585b140e4c41baa6075 /core/org.eclipse.cdt.core.linux/library
parentfe4c884ab47953807d352f77d18d48394b157539 (diff)
downloadorg.eclipse.cdt-7edb51d4cc34b6683562170428b5d31bfbe5d6f4.tar.gz
org.eclipse.cdt-7edb51d4cc34b6683562170428b5d31bfbe5d6f4.tar.xz
org.eclipse.cdt-7edb51d4cc34b6683562170428b5d31bfbe5d6f4.zip
Add support to create a pseudo master terminal for the debugger.
Diffstat (limited to 'core/org.eclipse.cdt.core.linux/library')
-rw-r--r--core/org.eclipse.cdt.core.linux/library/.cvsignore1
-rw-r--r--core/org.eclipse.cdt.core.linux/library/Makefile25
-rw-r--r--core/org.eclipse.cdt.core.linux/library/PTY.h21
-rw-r--r--core/org.eclipse.cdt.core.linux/library/PTYInputStream.h32
-rw-r--r--core/org.eclipse.cdt.core.linux/library/PTYOutputStream.h29
-rw-r--r--core/org.eclipse.cdt.core.linux/library/openpty.c105
-rw-r--r--core/org.eclipse.cdt.core.linux/library/openpty.h10
-rw-r--r--core/org.eclipse.cdt.core.linux/library/pty.c36
-rw-r--r--core/org.eclipse.cdt.core.linux/library/ptyio.c103
9 files changed, 356 insertions, 6 deletions
diff --git a/core/org.eclipse.cdt.core.linux/library/.cvsignore b/core/org.eclipse.cdt.core.linux/library/.cvsignore
new file mode 100644
index 00000000000..5761abcfdf0
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/.cvsignore
@@ -0,0 +1 @@
+*.o
diff --git a/core/org.eclipse.cdt.core.linux/library/Makefile b/core/org.eclipse.cdt.core.linux/library/Makefile
index 5f6639b0a00..4c971acb856 100644
--- a/core/org.eclipse.cdt.core.linux/library/Makefile
+++ b/core/org.eclipse.cdt.core.linux/library/Makefile
@@ -5,14 +5,27 @@ JDK_INCLUDES=/usr/local/jdk/include
JDK_OS_INCLUDES=/usr/local/jdk/include/linux
CC=gcc
-LIB_NAME = libspawner.so
-LIB_NAME_FULL = ../os/linux/x86/libspawner.so
-OBJS=spawner.o io.o exec_unix.o pfind.o
CPPFLAGS = -I. -I$(JDK_INCLUDES) -I$(JDK_OS_INCLUDES)
CFLAGS +=-fpic -D_REENTRANT
-spawner : $(OBJS)
- $(CC) -g -shared -Wl,-soname,$(LIB_NAME) -o $(LIB_NAME_FULL) $(OBJS) -lc
+LIB_NAME_SPAWNER = libspawner.so
+LIB_NAME_FULL_SPAWNER = ../os/linux/x86/libspawner.so
+OBJS_SPAWNER=spawner.o io.o exec_unix.o pfind.o
+
+LIB_NAME_PTY = libpty.so
+LIB_NAME_FULL_PTY = ../os/linux/x86/libpty.so
+OBJS_PTY= openpty.o pty.o ptyio.o
+
+OBJS = $(OBJS_SPAWNER) $(OBJS_PTY)
+
+all: $(LIB_NAME_FULL_SPAWNER) $(LIB_NAME_FULL_PTY)
+
+$(LIB NAME_FULL_SPAWNER) : $(OBJS_SPAWNER)
+ $(CC) -g -shared -Wl,-soname,$(LIB_NAME_SPAWNER) -o $(LIB_NAME_FULL_SPAWNER) $(OBJS_SPAWNER) -lc
+
+$(LIB_NAME_FULL_PTY): $(OBJS_PTY)
+ $(CC) -g -shared -Wl,-soname,$(LIB_NAME_PTY) -o $(LIB_NAME_FULL_PTY) $(OBJS_PTY)
clean :
- rm $(OBJS)
+ echo -rm $(OBJS_SPAWNER) $(LIB_NAME_FULL_SPAWNER)
+ -rm $(OBJS_PTY) $(LIB_NAME_FULL_PTY)
diff --git a/core/org.eclipse.cdt.core.linux/library/PTY.h b/core/org.eclipse.cdt.core.linux/library/PTY.h
new file mode 100644
index 00000000000..fabf58152d0
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/PTY.h
@@ -0,0 +1,21 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* 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.linux/library/PTYInputStream.h b/core/org.eclipse.cdt.core.linux/library/PTYInputStream.h
new file mode 100644
index 00000000000..e7349272b56
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/PTYInputStream.h
@@ -0,0 +1,32 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* 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.linux/library/PTYOutputStream.h b/core/org.eclipse.cdt.core.linux/library/PTYOutputStream.h
new file mode 100644
index 00000000000..fb28491060e
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/PTYOutputStream.h
@@ -0,0 +1,29 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* 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.linux/library/openpty.c b/core/org.eclipse.cdt.core.linux/library/openpty.c
new file mode 100644
index 00000000000..28f5363cf1d
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/openpty.c
@@ -0,0 +1,105 @@
+/*
+ * (c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ *
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <grp.h>
+
+#include <stdlib.h>
+#include <stropts.h>
+
+/**
+ * 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.linux/library/openpty.h b/core/org.eclipse.cdt.core.linux/library/openpty.h
new file mode 100644
index 00000000000..fd7b7be1b2f
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/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.linux/library/pty.c b/core/org.eclipse.cdt.core.linux/library/pty.c
new file mode 100644
index 00000000000..3e1c55f123b
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/pty.c
@@ -0,0 +1,36 @@
+#include "PTY.h"
+#include "openpty.h"
+
+/*
+ * Class: org_eclipse_cdt_utils_pty_PTY
+ * Method: forkpty
+ * Signature: ()I
+ */
+JNIEXPORT jstring JNICALL
+Java_org_eclipse_cdt_utils_pty_PTY_forkpty (JNIEnv *env, jobject jobj) {
+ jfieldID fid; /* Store the field ID */
+ jstring jstr = NULL;
+ int master = -1;
+ char line[1024]; /* FIXME: Should be enough */
+ int err;
+ jclass cls;
+
+ line[0] = '\0';
+
+ master = ptym_open(line);
+ if (err >= 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.linux/library/ptyio.c b/core/org.eclipse.cdt.core.linux/library/ptyio.c
new file mode 100644
index 00000000000..fbf4b314dcf
--- /dev/null
+++ b/core/org.eclipse.cdt.core.linux/library/ptyio.c
@@ -0,0 +1,103 @@
+#include <jni.h>
+#include <stdio.h>
+#include <PTYInputStream.h>
+#include <PTYOutputStream.h>
+#include <unistd.h>
+
+/* 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 */
+ 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_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);
+}

Back to the top