--- canfep-1.0/pty.C.orig 2002-05-09 17:42:38.000000000 +0900 +++ canfep-1.0/pty.C 2008-03-08 22:43:52.000000000 +0900 @@ -258,6 +258,23 @@ } } +#if defined(_POSIX_C_SOURCE) + // BSD pty が開けないので、POSIX の方法を試す + if ((master = posix_openpt(O_RDWR)) >= 0) { + if (grantpt(master) == 0 && unlockpt(master) == 0) { + // マスタデバイス名は固定 + strcpy(line, "/dev/ptmx"); + tcgetattr(0, &tt); + tt.c_iflag &= ~ISTRIP; + ioctl(0, TIOCGWINSZ, (char*) &win); + return; + } + close(master); + } else { + perror("/dev/ptmx"); + } +#endif // _POSIX_C_SOURCE + printf("Out of pty's\n"); fail(); } @@ -266,12 +283,36 @@ void Pty::getslave() { +#if defined(_POSIX_C_SOURCE) + // マスタデバイスが POSIX 方式の場合 + if (strcmp(line, "/dev/ptmx") == 0) { + char *slave_devname = ptsname(master); + if (slave_devname == NULL) { + perror("ptsname"); + fail(); + } + slave = open(slave_devname, O_RDWR); + if (slave < 0) { + perror(slave_devname); + fail(); + } + strcpy(line, slave_devname); + } else { + line[strlen("/dev/")] = 't'; + slave = open(line, O_RDWR); + if (slave < 0) { + perror(line); + fail(); + } + } +#else // ! _POSIX_C_SOURCE line[strlen("/dev/")] = 't'; slave = open(line, O_RDWR); if (slave < 0) { perror(line); fail(); } +#endif // _POSIX_C_SOURCE tcsetattr(slave, TCSAFLUSH, &tt); if (!hs) win.ws_row--;