--- GNUmakefile +++ GNUmakefile @@ -44,7 +44,10 @@ \ Label.m -Terminal_LDFLAGS = -lutil +ifeq ($(findstring gnu, $(GNUSTEP_TARGET_OS)), gnu) + # for forkpty on Linux + Terminal_LDFLAGS = -lutil +endif Terminal_LOCALIZED_RESOURCE_FILES = Localizable.strings Terminal_LANGUAGES = English Swedish German French Spanish Hungarian Turkish \ --- TerminalView.m +++ TerminalView.m @@ -38,9 +38,11 @@ #include #ifndef freebsd #ifndef __NetBSD__ +#if !defined(solaris2) # include #endif #endif +#endif #include #include @@ -1692,6 +1692,91 @@ master_fd=-1; } +#if defined(solaris2) +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define forkpty my_forkpty + +/** + * fork_pty() remplacement for Solaris, it ignores the last two + * arguments for the moment. + * http://bugs.mysql.com/bug.php?id=22429 + */ +static int my_forkpty (int *amaster, + char *name, + void *unused1, + void *unused2) +{ + int master, slave; + char *slave_name; + pid_t pid; + + master = open("/dev/ptmx", O_RDWR); + if (master < 0) + return -1; + + if (grantpt(master) < 0) { + close (master); + return -1; + } + + if (unlockpt(master) < 0) { + close (master); + return -1; + } + + slave_name = ptsname(master); + if (slave_name == NULL) { + close (master); + return -1; + } + + slave = open(slave_name, O_RDWR); + if (slave < 0) { + close (master); + return -1; + } + + if (ioctl(slave, I_PUSH, "ptem") < 0 || + ioctl(slave, I_PUSH, "ldterm") < 0) + { + close (slave); + close (master); + return -1; + } + + if (amaster) + *amaster = master; + + if (name) + strcpy (name, slave_name); + + pid = fork(); + switch (pid) { + case -1: /* Error */ + return -1; + case 0: /* Child */ + close(master); + dup2(slave, STDIN_FILENO); + dup2(slave, STDOUT_FILENO); + dup2(slave, STDERR_FILENO); + return 0; + default: /* Parent */ + close (slave); + return pid; + } + + return -1; +} +#endif -(void) runProgram: (NSString *)path withArguments: (NSArray *)args