| /* Test for ptsname/ptsname_r. |
| Copyright (C) 2014-2018 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, 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" |