And here's an update of the tests.
2010-03-21 Bruno Haible <br...@clisp.org> Tests for openpty: Make stricter. * tests/test-openpty.c (main): Add test of canonical processing and erase. * modules/openpty-tests (test_openpty_LDADD): Verify that PTY_LIB is defined. *** tests/test-openpty.c.orig Mon Mar 22 00:12:49 2010 --- tests/test-openpty.c Sun Mar 21 23:47:05 2010 *************** *** 14,20 **** You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ ! /* Written by Simon Josefsson <si...@josefsson.org>, 2009. */ #include <config.h> --- 14,21 ---- You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ ! /* Written by Simon Josefsson <si...@josefsson.org>, 2009 ! and Bruno Haible <br...@clisp.org>, 2010. */ #include <config.h> *************** *** 25,44 **** struct winsize const *)); #include <stdio.h> int main () { ! int res; ! int amaster; ! int aslave; ! res = openpty (&amaster, &aslave, NULL, NULL, NULL); ! if (res != 0) { ! printf ("openpty returned %d\n", res); ! return 1; } return 0; } --- 26,105 ---- struct winsize const *)); #include <stdio.h> + #include <string.h> + #include <termios.h> + #include <unistd.h> int main () { ! { ! int master; ! int slave; ! /* Open a pseudo-terminal, as a master-slave pair. */ { ! int res = openpty (&master, &slave, NULL, NULL, NULL); ! if (res != 0) ! { ! fprintf (stderr, "openpty returned %d\n", res); ! return 1; ! } } + /* Set the terminal characteristics. + On Linux or MacOS X, they can be set on either the master or the slave; + the effect is the same. But on Solaris, they have to be set on the + master; tcgetattr on the slave fails. */ + { + int tcfd = slave; /* You can try tcfd = master; here. */ + struct termios attributes; + + if (tcgetattr (tcfd, &attributes) < 0) + { + fprintf (stderr, "tcgetattr failed\n"); + return 1; + } + /* Enable canonical processing, including erase. */ + attributes.c_lflag |= ECHO | ICANON | ECHOE; + attributes.c_cc[VERASE] = '\177'; + if (tcsetattr (tcfd, TCSANOW, &attributes) < 0) + { + fprintf (stderr, "tcsetattr failed\n"); + return 1; + } + } + + /* Write into the master side. */ + { + static const char input[] = "Hello worst\177\177ld!\n"; + + if (write (master, input, strlen (input)) < (int) strlen (input)) + { + fprintf (stderr, "write failed\n"); + return 1; + } + } + + /* Read from the slave side. */ + { + char buf[100]; + int res = read (slave, buf, sizeof (buf)); + static const char expected[] = "Hello world!\n"; + + if (res < 0) + { + fprintf (stderr, "read failed\n"); + return 1; + } + if (!(res == strlen (expected) + && memcmp (buf, expected, strlen (expected)) == 0)) + { + fprintf (stderr, "read result unexpected\n"); + return 1; + } + } + } + return 0; } *** modules/openpty-tests.orig Mon Mar 22 00:12:49 2010 --- modules/openpty-tests Sun Mar 21 23:47:05 2010 *************** *** 5,8 **** Makefile.am: TESTS += test-openpty check_PROGRAMS += test-openpty ! test_openpty_LDADD = $(LDADD) $(PTY_LIB) --- 5,8 ---- Makefile.am: TESTS += test-openpty check_PROGRAMS += test-openpty ! test_openpty_LDADD = $(LDADD) @PTY_LIB@