[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: port 'openpty' to all Unix platforms
From: |
Bruno Haible |
Subject: |
Re: port 'openpty' to all Unix platforms |
Date: |
Mon, 22 Mar 2010 00:15:05 +0100 |
User-agent: |
KMail/1.9.9 |
And here's an update of the tests.
2010-03-21 Bruno Haible <address@hidden>
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 <address@hidden>, 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 <address@hidden>, 2009
! and Bruno Haible <address@hidden>, 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@