cdt/cdt_5_0_x/org.eclipse.cdt.core.aix/library/openpty.c
changeset 0 0e6d23e2b466
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cdt/cdt_5_0_x/org.eclipse.cdt.core.aix/library/openpty.c	Fri Apr 03 17:12:41 2009 +0100
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2008 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *	   IBM Corporation - initial API and implementation
+ *     QNX Software Systems
+ *******************************************************************************/
+
+#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);
+void set_noecho(int fd);
+
+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;
+}
+
+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)
+{
+	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;
+}