From e20f39193f9093965a715ff8a23da02fe5a670ae Mon Sep 17 00:00:00 2001 From: David Inglis Date: Fri, 24 Dec 2004 17:26:22 +0000 Subject: [PATCH] fixed qnx spawner --- .../org.eclipse.cdt.core.qnx/build.properties | 3 +- .../library/spawner/openpty.c | 104 ++++++++++++++++++ .../library/spawner/openpty.h | 10 ++ .../os/qnx/x86/libpty.so | Bin 5412 -> 7151 bytes .../os/qnx/x86/libspawner.so | Bin 9840 -> 12561 bytes 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 core/org.eclipse.cdt.core.qnx/library/spawner/openpty.c create mode 100644 core/org.eclipse.cdt.core.qnx/library/spawner/openpty.h diff --git a/core/org.eclipse.cdt.core.qnx/build.properties b/core/org.eclipse.cdt.core.qnx/build.properties index 5cd7cfcdef7..2649f3a5fc7 100644 --- a/core/org.eclipse.cdt.core.qnx/build.properties +++ b/core/org.eclipse.cdt.core.qnx/build.properties @@ -5,4 +5,5 @@ bin.includes = fragment.xml,\ cdt_qnx.jar source.cdt_qnx.jar = src/ src.includes = about.html,\ - library/ + library/,\ + build.properties diff --git a/core/org.eclipse.cdt.core.qnx/library/spawner/openpty.c b/core/org.eclipse.cdt.core.qnx/library/spawner/openpty.c new file mode 100644 index 00000000000..b1660a13b78 --- /dev/null +++ b/core/org.eclipse.cdt.core.qnx/library/spawner/openpty.c @@ -0,0 +1,104 @@ +/* + * (c) Copyright QNX Software Systems Ltd. 2002. + * All Rights Reserved. + * + */ +#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) +{ + char *ptr1, *ptr2; + int fdm; + + strcpy(pts_name, "/dev/ptyXY"); + /* array index: 012345689 (for references in following code) */ + for (ptr1 = "pqrstuvwxyzPQRST"; *ptr1 != 0; ptr1++) { + pts_name[8] = *ptr1; + for (ptr2 = "0123456789abcdef"; *ptr2 != 0; ptr2++) { + pts_name[9] = *ptr2; + /* try to open master */ + fdm = open(pts_name, O_RDWR); + if (fdm < 0) { + if (errno == ENOENT) {/* different from EIO */ + return -1; /* out of pty devices */ + } else { + continue; /* try next pty device */ + } + } + pts_name[5] = 't'; /* chage "pty" to "tty" */ + return fdm; /* got it, return fd of master */ + } + } + return -1; /* out of pty devices */ +} + +int +ptys_open(int fdm, char * pts_name) +{ + int gid, fds; + struct group *grptr; + + grptr = getgrnam("tty"); + if (grptr != NULL) { + gid = grptr->gr_gid; + } else { + gid = -1; /* group tty is not in the group file */ + } + + /* following two functions don't work unless we're root */ + chown(pts_name, getuid(), gid); + chmod(pts_name, S_IRUSR | S_IWUSR | S_IWGRP); + fds = open(pts_name, O_RDWR); + if (fds < 0) { + close(fdm); + return -1; + } + return fds; +} diff --git a/core/org.eclipse.cdt.core.qnx/library/spawner/openpty.h b/core/org.eclipse.cdt.core.qnx/library/spawner/openpty.h new file mode 100644 index 00000000000..fd7b7be1b2f --- /dev/null +++ b/core/org.eclipse.cdt.core.qnx/library/spawner/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.qnx/os/qnx/x86/libpty.so b/core/org.eclipse.cdt.core.qnx/os/qnx/x86/libpty.so index 7e8be555ff2d834538b6200ab36bc8f64272b6ad..74a41b7d1237815e8fa9cc9ecf4faf9399981bff 100644 GIT binary patch literal 7151 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 M3^dP1l%)&eKcD*QPyhe` literal 5412 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 diff --git a/core/org.eclipse.cdt.core.qnx/os/qnx/x86/libspawner.so b/core/org.eclipse.cdt.core.qnx/os/qnx/x86/libspawner.so index 61f6c9d9ef6b62f1d30bbcc8170d5a49893524f0..0de48acc84853fa43a2134a24115db8a071efab5 100644 GIT binary patch literal 12561 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