1/* Test for grantpt, unlockpt error corner cases.
2 Copyright (C) 2001-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <sys/types.h>
20#include <sys/stat.h>
21#include <fcntl.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <errno.h>
25#include <string.h>
26#include <unistd.h>
27#include <support/check.h>
28#include <support/temp_file.h>
29#include <support/xunistd.h>
30
31/* Test grantpt, unlockpt with a closed descriptor. */
32static void
33test_ebadf (void)
34{
35 int fd, ret, err;
36
37 fd = posix_openpt (O_RDWR);
38 if (fd == -1)
39 FAIL_EXIT1 ("posix_openpt(O_RDWR) failed\nerrno %d (%m)\n", errno);
40 TEST_COMPARE (unlockpt (fd), 0);
41
42 xclose (fd);
43 ret = grantpt (fd);
44 err = errno;
45 if (ret != -1 || err != EBADF)
46 {
47 support_record_failure ();
48 printf (format: "grantpt(): expected: return = %d, errno = %d\n", -1, EBADF);
49 printf (format: " got: return = %d, errno = %d\n", ret, err);
50 }
51
52 TEST_COMPARE (unlockpt (fd), -1);
53 TEST_COMPARE (errno, EBADF);
54}
55
56/* Test grantpt, unlockpt on a regular file. */
57static void
58test_einval (void)
59{
60 int fd, ret, err;
61
62 fd = create_temp_file (base: "tst-grantpt-", NULL);
63 TEST_VERIFY_EXIT (fd >= 0);
64
65 ret = grantpt (fd);
66 err = errno;
67 if (ret != -1 || err != EINVAL)
68 {
69 support_record_failure ();
70 printf (format: "grantpt(): expected: return = %d, errno = %d\n", -1, EINVAL);
71 printf (format: " got: return = %d, errno = %d\n", ret, err);
72 }
73
74 TEST_COMPARE (unlockpt (fd), -1);
75 TEST_COMPARE (errno, EINVAL);
76
77 xclose (fd);
78}
79
80/* Test grantpt, unlockpt on a non-ptmx pseudo-terminal. */
81static void
82test_not_ptmx (void)
83{
84 int ptmx = posix_openpt (O_RDWR);
85 TEST_VERIFY_EXIT (ptmx >= 0);
86 TEST_COMPARE (grantpt (ptmx), 0);
87 TEST_COMPARE (unlockpt (ptmx), 0);
88
89 /* A second unlock succeeds as well. */
90 TEST_COMPARE (unlockpt (ptmx), 0);
91
92 const char *name = ptsname (fd: ptmx);
93 TEST_VERIFY_EXIT (name != NULL);
94 int pts = open (file: name, O_RDWR | O_NOCTTY);
95 TEST_VERIFY_EXIT (pts >= 0);
96
97 TEST_COMPARE (grantpt (pts), -1);
98 TEST_COMPARE (errno, EINVAL);
99
100 TEST_COMPARE (unlockpt (pts), -1);
101 TEST_COMPARE (errno, EINVAL);
102
103 xclose (pts);
104 xclose (ptmx);
105}
106
107static int
108do_test (void)
109{
110 test_ebadf ();
111 test_einval ();
112 test_not_ptmx ();
113 return 0;
114}
115
116#include <support/test-driver.c>
117

source code of glibc/login/tst-grantpt.c