diff options
Diffstat (limited to 'login')
-rw-r--r-- | login/Makefile | 2 | ||||
-rw-r--r-- | login/tst-ptsname.c | 108 |
2 files changed, 109 insertions, 1 deletions
diff --git a/login/Makefile b/login/Makefile index ca55808127..d758ac5f71 100644 --- a/login/Makefile +++ b/login/Makefile @@ -43,7 +43,7 @@ endif subdir-dirs = programs vpath %.c programs -tests := tst-utmp tst-utmpx tst-grantpt +tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname # Build the -lutil library with these extra functions. extra-libs := libutil diff --git a/login/tst-ptsname.c b/login/tst-ptsname.c new file mode 100644 index 0000000000..edcdbc5ec5 --- /dev/null +++ b/login/tst-ptsname.c @@ -0,0 +1,108 @@ +/* Test for ptsname/ptsname_r. + Copyright (C) 2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Aurelien Jarno <aurelien@aurel32.net>, 2014. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define DEV_TTY "/dev/tty" +#define PTSNAME_EINVAL "./ptsname-einval" + +static int +do_single_test (int fd, char *buf, size_t buflen, int expected_err) +{ + + int ret = ptsname_r (fd, buf, buflen); + int err = errno; + + if (expected_err == 0) + { + if (ret != 0) + { + printf ("ptsname_r: expected: return = 0\n"); + printf (" got: return = %d, errno = %d (%s)\n", + ret, err, strerror (err)); + return 1; + } + } + else + { + if (ret == 0 || errno != expected_err) + { + printf ("ptsname_r: expected: return = %d, errno = %d (%s)\n", + -1, expected_err, strerror (expected_err)); + printf (" got: return = %d, errno = %d (%s)\n", + ret, err, strerror (err)); + return 1; + } + } + + return 0; +} + +static int +do_test (void) +{ + char buf[512]; + int result = 0; + + /* Tests with a real PTS master. */ + int fd = posix_openpt (O_RDWR); + if (fd != -1) + { + result |= do_single_test (fd, buf, sizeof (buf), 0); + result |= do_single_test (fd, NULL, sizeof (buf), EINVAL); + result |= do_single_test (fd, buf, 1, ERANGE); + close (fd); + } + else + printf ("posix_openpt (O_RDWR) failed\nerrno %d (%s)\n", + errno, strerror (errno)); + + /* Test with a terminal device which is not a PTS master. */ + fd = open (DEV_TTY, O_RDONLY); + if (fd != -1) + { + result |= do_single_test (fd, buf, sizeof (buf), ENOTTY); + close (fd); + } + else + printf ("open (\"%s\", O_RDWR) failed\nerrno %d (%s)\n", + DEV_TTY, errno, strerror (errno)); + + /* Test with a file. */ + fd = open (PTSNAME_EINVAL, O_RDWR | O_CREAT, 0600); + if (fd != -1) + { + result |= do_single_test (fd, buf, sizeof (buf), ENOTTY); + close (fd); + unlink (PTSNAME_EINVAL); + } + else + printf ("open (\"%s\", O_RDWR | OCREAT) failed\nerrno %d (%s)\n", + PTSNAME_EINVAL, errno, strerror (errno)); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |