Bug #9144
closedptys on AIX version 4 through 7
Description
The best way to open a pty on AIX version 4 through 7 is using what they call "AT&T" mode. The steps are to first open "/dev/ptc" which opens the master side. Then to a ttyname on the file descriptor and open the string that is returned to open the slave side.
cat q.c
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int master = open("/dev/ptc", O_RDWR);
char *slave_name = ttyname(master);
int slave = open(slave_name, O_RDWR);
int n;
char buf[128];
printf("slave name is %s\n", slave_name);
printf("master fd is %d, slave fd is %d\n", master, slave);
write(master, "blah\n", 5);
n = read(slave, buf, sizeof(buf));
printf("n = %d\n", n);
printf("%*.s", n, n, buf);
write(slave, "foodog\n", 7);
n = read(master, buf, sizeof(buf));
printf("n = %d\n", n);
printf("%.*s", n, n, buf);
return 0;
}
make q
cc q.c -o q
./q
slave name is /dev/pts/9
master fd is 3, slave fd is 5
n = 5
blah
n = 14
blah
foodog
(Note that ECHO is set on the tty which is why we see 'blah' when the slave is read.)
You can also use what the ruby code calls BSD 4.2 ptys. On my build that I did as simply as possible, I'm not sure which code I got but it is not working. I have several versions of Ruby and all fail with "can't get Master/Slave device (RuntimeError)" While "BSD" mode is supported and works, the "AT&T" mode is much nicer.
For AIX version 3, there was a similar approach but instead of /dev/ptc, the master was called /dev/ptm.
The _IBMESA code in ext/pty/pty.c (which mentions AIX) I don't recognize those names.
There is no need to push any streams modules, etc. Everything is autopushed. You might want to add in a grantpt but I'm still not clear when and if that is needed.
Files
Updated by Anonymous over 10 years ago
- File signature.asc signature.asc added
Doing more research, the existing ruby code is 99% there.
I got it to work by changing line 248 of ext/pty/pty.c from:
#if defined(I_PUSH) && !defined(linux)
to
#if defined(I_PUSH) && !defined(linux) && !defined(_AIX)
AIX has autopush which is really what the second half of the && should be testing.
Perry
On Nov 23, 2013, at 1:14 PM, pedz (Perry Smith) pedz@easesoftware.com wrote:
Issue #9144 has been reported by pedz (Perry Smith).
Bug #9144: ptys on AIX version 4 through 7
https://bugs.ruby-lang.org/issues/9144Author: pedz (Perry Smith)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 2.0.0p247 (2013-06-27 revision 41674) [powerpc-aix6.1.0.0]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWNThe best way to open a pty on AIX version 4 through 7 is using what they call "AT&T" mode. The steps are to first open "/dev/ptc" which opens the master side. Then to a ttyname on the file descriptor and open the string that is returned to open the slave side.
cat q.c
#include <stdio.h>
#include <fcntl.h>int main(int argc, char *argv[])
{
int master = open("/dev/ptc", O_RDWR);
char *slave_name = ttyname(master);
int slave = open(slave_name, O_RDWR);
int n;
char buf[128];printf("slave name is %s\n", slave_name);
printf("master fd is %d, slave fd is %d\n", master, slave);
write(master, "blah\n", 5);
n = read(slave, buf, sizeof(buf));
printf("n = %d\n", n);
printf("%*.s", n, n, buf);
write(slave, "foodog\n", 7);
n = read(master, buf, sizeof(buf));
printf("n = %d\n", n);
printf("%.*s", n, n, buf);
return 0;
}make q
cc q.c -o q./q
slave name is /dev/pts/9
master fd is 3, slave fd is 5
n = 5
blah
n = 14
blah
foodog(Note that ECHO is set on the tty which is why we see 'blah' when the slave is read.)
You can also use what the ruby code calls BSD 4.2 ptys. On my build that I did as simply as possible, I'm not sure which code I got but it is not working. I have several versions of Ruby and all fail with "can't get Master/Slave device (RuntimeError)" While "BSD" mode is supported and works, the "AT&T" mode is much nicer.
For AIX version 3, there was a similar approach but instead of /dev/ptc, the master was called /dev/ptm.
The _IBMESA code in ext/pty/pty.c (which mentions AIX) I don't recognize those names.
There is no need to push any streams modules, etc. Everything is autopushed. You might want to add in a grantpt but I'm still not clear when and if that is needed.
Updated by Anonymous about 9 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r49776.
- ext/pty/pty.c: AIX supports autopush. Patch by Perry Smith [ruby-core:58539] [Bug #9144]
Updated by nagachika (Tomoyuki Chikanaga) about 9 years ago
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) almost 9 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: DONE
Backported into ruby_2_2
branch at r50564.
Updated by usa (Usaku NAKAMURA) almost 9 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: DONE to 2.0.0: REQUIRED, 2.1: DONE, 2.2: DONE
ruby_2_1 r50570 merged revision(s) 49776.